OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [x86/] [kernel/] [ptrace_32.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/* By Ross Biro 1/23/92 */
2
/*
3
 * Pentium III FXSR, SSE support
4
 *      Gareth Hughes <gareth@valinux.com>, May 2000
5
 */
6
 
7
#include <linux/kernel.h>
8
#include <linux/sched.h>
9
#include <linux/mm.h>
10
#include <linux/smp.h>
11
#include <linux/errno.h>
12
#include <linux/ptrace.h>
13
#include <linux/user.h>
14
#include <linux/security.h>
15
#include <linux/audit.h>
16
#include <linux/seccomp.h>
17
#include <linux/signal.h>
18
 
19
#include <asm/uaccess.h>
20
#include <asm/pgtable.h>
21
#include <asm/system.h>
22
#include <asm/processor.h>
23
#include <asm/i387.h>
24
#include <asm/debugreg.h>
25
#include <asm/ldt.h>
26
#include <asm/desc.h>
27
 
28
/*
29
 * does not yet catch signals sent when the child dies.
30
 * in exit.c or in signal.c.
31
 */
32
 
33
/*
34
 * Determines which flags the user has access to [1 = access, 0 = no access].
35
 * Prohibits changing ID(21), VIP(20), VIF(19), VM(17), NT(14), IOPL(12-13), IF(9).
36
 * Also masks reserved bits (31-22, 15, 5, 3, 1).
37
 */
38
#define FLAG_MASK 0x00050dd5
39
 
40
/* set's the trap flag. */
41
#define TRAP_FLAG 0x100
42
 
43
/*
44
 * Offset of eflags on child stack..
45
 */
46
#define EFL_OFFSET offsetof(struct pt_regs, eflags)
47
 
48
static inline struct pt_regs *get_child_regs(struct task_struct *task)
49
{
50
        void *stack_top = (void *)task->thread.esp0;
51
        return stack_top - sizeof(struct pt_regs);
52
}
53
 
54
/*
55
 * This routine will get a word off of the processes privileged stack.
56
 * the offset is bytes into the pt_regs structure on the stack.
57
 * This routine assumes that all the privileged stacks are in our
58
 * data space.
59
 */
60
static inline int get_stack_long(struct task_struct *task, int offset)
61
{
62
        unsigned char *stack;
63
 
64
        stack = (unsigned char *)task->thread.esp0 - sizeof(struct pt_regs);
65
        stack += offset;
66
        return (*((int *)stack));
67
}
68
 
69
/*
70
 * This routine will put a word on the processes privileged stack.
71
 * the offset is bytes into the pt_regs structure on the stack.
72
 * This routine assumes that all the privileged stacks are in our
73
 * data space.
74
 */
75
static inline int put_stack_long(struct task_struct *task, int offset,
76
        unsigned long data)
77
{
78
        unsigned char * stack;
79
 
80
        stack = (unsigned char *)task->thread.esp0 - sizeof(struct pt_regs);
81
        stack += offset;
82
        *(unsigned long *) stack = data;
83
        return 0;
84
}
85
 
86
static int putreg(struct task_struct *child,
87
        unsigned long regno, unsigned long value)
88
{
89
        switch (regno >> 2) {
90
                case GS:
91
                        if (value && (value & 3) != 3)
92
                                return -EIO;
93
                        child->thread.gs = value;
94
                        return 0;
95
                case DS:
96
                case ES:
97
                case FS:
98
                        if (value && (value & 3) != 3)
99
                                return -EIO;
100
                        value &= 0xffff;
101
                        break;
102
                case SS:
103
                case CS:
104
                        if ((value & 3) != 3)
105
                                return -EIO;
106
                        value &= 0xffff;
107
                        break;
108
                case EFL:
109
                        value &= FLAG_MASK;
110
                        value |= get_stack_long(child, EFL_OFFSET) & ~FLAG_MASK;
111
                        break;
112
        }
113
        if (regno > FS*4)
114
                regno -= 1*4;
115
        put_stack_long(child, regno, value);
116
        return 0;
117
}
118
 
119
static unsigned long getreg(struct task_struct *child,
120
        unsigned long regno)
121
{
122
        unsigned long retval = ~0UL;
123
 
124
        switch (regno >> 2) {
125
                case GS:
126
                        retval = child->thread.gs;
127
                        break;
128
                case DS:
129
                case ES:
130
                case FS:
131
                case SS:
132
                case CS:
133
                        retval = 0xffff;
134
                        /* fall through */
135
                default:
136
                        if (regno > FS*4)
137
                                regno -= 1*4;
138
                        retval &= get_stack_long(child, regno);
139
        }
140
        return retval;
141
}
142
 
143
#define LDT_SEGMENT 4
144
 
145
static unsigned long convert_eip_to_linear(struct task_struct *child, struct pt_regs *regs)
146
{
147
        unsigned long addr, seg;
148
 
149
        addr = regs->eip;
150
        seg = regs->xcs & 0xffff;
151
        if (regs->eflags & VM_MASK) {
152
                addr = (addr & 0xffff) + (seg << 4);
153
                return addr;
154
        }
155
 
156
        /*
157
         * We'll assume that the code segments in the GDT
158
         * are all zero-based. That is largely true: the
159
         * TLS segments are used for data, and the PNPBIOS
160
         * and APM bios ones we just ignore here.
161
         */
162
        if (seg & LDT_SEGMENT) {
163
                u32 *desc;
164
                unsigned long base;
165
 
166
                seg &= ~7UL;
167
 
168
                mutex_lock(&child->mm->context.lock);
169
                if (unlikely((seg >> 3) >= child->mm->context.size))
170
                        addr = -1L; /* bogus selector, access would fault */
171
                else {
172
                        desc = child->mm->context.ldt + seg;
173
                        base = ((desc[0] >> 16) |
174
                                ((desc[1] & 0xff) << 16) |
175
                                (desc[1] & 0xff000000));
176
 
177
                        /* 16-bit code segment? */
178
                        if (!((desc[1] >> 22) & 1))
179
                                addr &= 0xffff;
180
                        addr += base;
181
                }
182
                mutex_unlock(&child->mm->context.lock);
183
        }
184
        return addr;
185
}
186
 
187
static inline int is_setting_trap_flag(struct task_struct *child, struct pt_regs *regs)
188
{
189
        int i, copied;
190
        unsigned char opcode[15];
191
        unsigned long addr = convert_eip_to_linear(child, regs);
192
 
193
        copied = access_process_vm(child, addr, opcode, sizeof(opcode), 0);
194
        for (i = 0; i < copied; i++) {
195
                switch (opcode[i]) {
196
                /* popf and iret */
197
                case 0x9d: case 0xcf:
198
                        return 1;
199
                /* opcode and address size prefixes */
200
                case 0x66: case 0x67:
201
                        continue;
202
                /* irrelevant prefixes (segment overrides and repeats) */
203
                case 0x26: case 0x2e:
204
                case 0x36: case 0x3e:
205
                case 0x64: case 0x65:
206
                case 0xf0: case 0xf2: case 0xf3:
207
                        continue;
208
 
209
                /*
210
                 * pushf: NOTE! We should probably not let
211
                 * the user see the TF bit being set. But
212
                 * it's more pain than it's worth to avoid
213
                 * it, and a debugger could emulate this
214
                 * all in user space if it _really_ cares.
215
                 */
216
                case 0x9c:
217
                default:
218
                        return 0;
219
                }
220
        }
221
        return 0;
222
}
223
 
224
static void set_singlestep(struct task_struct *child)
225
{
226
        struct pt_regs *regs = get_child_regs(child);
227
 
228
        /*
229
         * Always set TIF_SINGLESTEP - this guarantees that
230
         * we single-step system calls etc..  This will also
231
         * cause us to set TF when returning to user mode.
232
         */
233
        set_tsk_thread_flag(child, TIF_SINGLESTEP);
234
 
235
        /*
236
         * If TF was already set, don't do anything else
237
         */
238
        if (regs->eflags & TRAP_FLAG)
239
                return;
240
 
241
        /* Set TF on the kernel stack.. */
242
        regs->eflags |= TRAP_FLAG;
243
 
244
        /*
245
         * ..but if TF is changed by the instruction we will trace,
246
         * don't mark it as being "us" that set it, so that we
247
         * won't clear it by hand later.
248
         */
249
        if (is_setting_trap_flag(child, regs))
250
                return;
251
 
252
        child->ptrace |= PT_DTRACE;
253
}
254
 
255
static void clear_singlestep(struct task_struct *child)
256
{
257
        /* Always clear TIF_SINGLESTEP... */
258
        clear_tsk_thread_flag(child, TIF_SINGLESTEP);
259
 
260
        /* But touch TF only if it was set by us.. */
261
        if (child->ptrace & PT_DTRACE) {
262
                struct pt_regs *regs = get_child_regs(child);
263
                regs->eflags &= ~TRAP_FLAG;
264
                child->ptrace &= ~PT_DTRACE;
265
        }
266
}
267
 
268
/*
269
 * Called by kernel/ptrace.c when detaching..
270
 *
271
 * Make sure the single step bit is not set.
272
 */
273
void ptrace_disable(struct task_struct *child)
274
{
275
        clear_singlestep(child);
276
        clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
277
}
278
 
279
/*
280
 * Perform get_thread_area on behalf of the traced child.
281
 */
282
static int
283
ptrace_get_thread_area(struct task_struct *child,
284
                       int idx, struct user_desc __user *user_desc)
285
{
286
        struct user_desc info;
287
        struct desc_struct *desc;
288
 
289
/*
290
 * Get the current Thread-Local Storage area:
291
 */
292
 
293
#define GET_BASE(desc) ( \
294
        (((desc)->a >> 16) & 0x0000ffff) | \
295
        (((desc)->b << 16) & 0x00ff0000) | \
296
        ( (desc)->b        & 0xff000000)   )
297
 
298
#define GET_LIMIT(desc) ( \
299
        ((desc)->a & 0x0ffff) | \
300
         ((desc)->b & 0xf0000) )
301
 
302
#define GET_32BIT(desc)         (((desc)->b >> 22) & 1)
303
#define GET_CONTENTS(desc)      (((desc)->b >> 10) & 3)
304
#define GET_WRITABLE(desc)      (((desc)->b >>  9) & 1)
305
#define GET_LIMIT_PAGES(desc)   (((desc)->b >> 23) & 1)
306
#define GET_PRESENT(desc)       (((desc)->b >> 15) & 1)
307
#define GET_USEABLE(desc)       (((desc)->b >> 20) & 1)
308
 
309
        if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX)
310
                return -EINVAL;
311
 
312
        desc = child->thread.tls_array + idx - GDT_ENTRY_TLS_MIN;
313
 
314
        info.entry_number = idx;
315
        info.base_addr = GET_BASE(desc);
316
        info.limit = GET_LIMIT(desc);
317
        info.seg_32bit = GET_32BIT(desc);
318
        info.contents = GET_CONTENTS(desc);
319
        info.read_exec_only = !GET_WRITABLE(desc);
320
        info.limit_in_pages = GET_LIMIT_PAGES(desc);
321
        info.seg_not_present = !GET_PRESENT(desc);
322
        info.useable = GET_USEABLE(desc);
323
 
324
        if (copy_to_user(user_desc, &info, sizeof(info)))
325
                return -EFAULT;
326
 
327
        return 0;
328
}
329
 
330
/*
331
 * Perform set_thread_area on behalf of the traced child.
332
 */
333
static int
334
ptrace_set_thread_area(struct task_struct *child,
335
                       int idx, struct user_desc __user *user_desc)
336
{
337
        struct user_desc info;
338
        struct desc_struct *desc;
339
 
340
        if (copy_from_user(&info, user_desc, sizeof(info)))
341
                return -EFAULT;
342
 
343
        if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX)
344
                return -EINVAL;
345
 
346
        desc = child->thread.tls_array + idx - GDT_ENTRY_TLS_MIN;
347
        if (LDT_empty(&info)) {
348
                desc->a = 0;
349
                desc->b = 0;
350
        } else {
351
                desc->a = LDT_entry_a(&info);
352
                desc->b = LDT_entry_b(&info);
353
        }
354
 
355
        return 0;
356
}
357
 
358
long arch_ptrace(struct task_struct *child, long request, long addr, long data)
359
{
360
        struct user * dummy = NULL;
361
        int i, ret;
362
        unsigned long __user *datap = (unsigned long __user *)data;
363
 
364
        switch (request) {
365
        /* when I and D space are separate, these will need to be fixed. */
366
        case PTRACE_PEEKTEXT: /* read word at location addr. */
367
        case PTRACE_PEEKDATA:
368
                ret = generic_ptrace_peekdata(child, addr, data);
369
                break;
370
 
371
        /* read the word at location addr in the USER area. */
372
        case PTRACE_PEEKUSR: {
373
                unsigned long tmp;
374
 
375
                ret = -EIO;
376
                if ((addr & 3) || addr < 0 ||
377
                    addr > sizeof(struct user) - 3)
378
                        break;
379
 
380
                tmp = 0;  /* Default return condition */
381
                if(addr < FRAME_SIZE*sizeof(long))
382
                        tmp = getreg(child, addr);
383
                if(addr >= (long) &dummy->u_debugreg[0] &&
384
                   addr <= (long) &dummy->u_debugreg[7]){
385
                        addr -= (long) &dummy->u_debugreg[0];
386
                        addr = addr >> 2;
387
                        tmp = child->thread.debugreg[addr];
388
                }
389
                ret = put_user(tmp, datap);
390
                break;
391
        }
392
 
393
        /* when I and D space are separate, this will have to be fixed. */
394
        case PTRACE_POKETEXT: /* write the word at location addr. */
395
        case PTRACE_POKEDATA:
396
                ret = generic_ptrace_pokedata(child, addr, data);
397
                break;
398
 
399
        case PTRACE_POKEUSR: /* write the word at location addr in the USER area */
400
                ret = -EIO;
401
                if ((addr & 3) || addr < 0 ||
402
                    addr > sizeof(struct user) - 3)
403
                        break;
404
 
405
                if (addr < FRAME_SIZE*sizeof(long)) {
406
                        ret = putreg(child, addr, data);
407
                        break;
408
                }
409
                /* We need to be very careful here.  We implicitly
410
                   want to modify a portion of the task_struct, and we
411
                   have to be selective about what portions we allow someone
412
                   to modify. */
413
 
414
                  ret = -EIO;
415
                  if(addr >= (long) &dummy->u_debugreg[0] &&
416
                     addr <= (long) &dummy->u_debugreg[7]){
417
 
418
                          if(addr == (long) &dummy->u_debugreg[4]) break;
419
                          if(addr == (long) &dummy->u_debugreg[5]) break;
420
                          if(addr < (long) &dummy->u_debugreg[4] &&
421
                             ((unsigned long) data) >= TASK_SIZE-3) break;
422
 
423
                          /* Sanity-check data. Take one half-byte at once with
424
                           * check = (val >> (16 + 4*i)) & 0xf. It contains the
425
                           * R/Wi and LENi bits; bits 0 and 1 are R/Wi, and bits
426
                           * 2 and 3 are LENi. Given a list of invalid values,
427
                           * we do mask |= 1 << invalid_value, so that
428
                           * (mask >> check) & 1 is a correct test for invalid
429
                           * values.
430
                           *
431
                           * R/Wi contains the type of the breakpoint /
432
                           * watchpoint, LENi contains the length of the watched
433
                           * data in the watchpoint case.
434
                           *
435
                           * The invalid values are:
436
                           * - LENi == 0x10 (undefined), so mask |= 0x0f00.
437
                           * - R/Wi == 0x10 (break on I/O reads or writes), so
438
                           *   mask |= 0x4444.
439
                           * - R/Wi == 0x00 && LENi != 0x00, so we have mask |=
440
                           *   0x1110.
441
                           *
442
                           * Finally, mask = 0x0f00 | 0x4444 | 0x1110 == 0x5f54.
443
                           *
444
                           * See the Intel Manual "System Programming Guide",
445
                           * 15.2.4
446
                           *
447
                           * Note that LENi == 0x10 is defined on x86_64 in long
448
                           * mode (i.e. even for 32-bit userspace software, but
449
                           * 64-bit kernel), so the x86_64 mask value is 0x5454.
450
                           * See the AMD manual no. 24593 (AMD64 System
451
                           * Programming)*/
452
 
453
                          if(addr == (long) &dummy->u_debugreg[7]) {
454
                                  data &= ~DR_CONTROL_RESERVED;
455
                                  for(i=0; i<4; i++)
456
                                          if ((0x5f54 >> ((data >> (16 + 4*i)) & 0xf)) & 1)
457
                                                  goto out_tsk;
458
                                  if (data)
459
                                          set_tsk_thread_flag(child, TIF_DEBUG);
460
                                  else
461
                                          clear_tsk_thread_flag(child, TIF_DEBUG);
462
                          }
463
                          addr -= (long) &dummy->u_debugreg;
464
                          addr = addr >> 2;
465
                          child->thread.debugreg[addr] = data;
466
                          ret = 0;
467
                  }
468
                  break;
469
 
470
        case PTRACE_SYSEMU: /* continue and stop at next syscall, which will not be executed */
471
        case PTRACE_SYSCALL:    /* continue and stop at next (return from) syscall */
472
        case PTRACE_CONT:       /* restart after signal. */
473
                ret = -EIO;
474
                if (!valid_signal(data))
475
                        break;
476
                if (request == PTRACE_SYSEMU) {
477
                        set_tsk_thread_flag(child, TIF_SYSCALL_EMU);
478
                        clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
479
                } else if (request == PTRACE_SYSCALL) {
480
                        set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
481
                        clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
482
                } else {
483
                        clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
484
                        clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
485
                }
486
                child->exit_code = data;
487
                /* make sure the single step bit is not set. */
488
                clear_singlestep(child);
489
                wake_up_process(child);
490
                ret = 0;
491
                break;
492
 
493
/*
494
 * make the child exit.  Best I can do is send it a sigkill.
495
 * perhaps it should be put in the status that it wants to
496
 * exit.
497
 */
498
        case PTRACE_KILL:
499
                ret = 0;
500
                if (child->exit_state == EXIT_ZOMBIE)   /* already dead */
501
                        break;
502
                child->exit_code = SIGKILL;
503
                /* make sure the single step bit is not set. */
504
                clear_singlestep(child);
505
                wake_up_process(child);
506
                break;
507
 
508
        case PTRACE_SYSEMU_SINGLESTEP: /* Same as SYSEMU, but singlestep if not syscall */
509
        case PTRACE_SINGLESTEP: /* set the trap flag. */
510
                ret = -EIO;
511
                if (!valid_signal(data))
512
                        break;
513
 
514
                if (request == PTRACE_SYSEMU_SINGLESTEP)
515
                        set_tsk_thread_flag(child, TIF_SYSCALL_EMU);
516
                else
517
                        clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
518
 
519
                clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
520
                set_singlestep(child);
521
                child->exit_code = data;
522
                /* give it a chance to run. */
523
                wake_up_process(child);
524
                ret = 0;
525
                break;
526
 
527
        case PTRACE_GETREGS: { /* Get all gp regs from the child. */
528
                if (!access_ok(VERIFY_WRITE, datap, FRAME_SIZE*sizeof(long))) {
529
                        ret = -EIO;
530
                        break;
531
                }
532
                for ( i = 0; i < FRAME_SIZE*sizeof(long); i += sizeof(long) ) {
533
                        __put_user(getreg(child, i), datap);
534
                        datap++;
535
                }
536
                ret = 0;
537
                break;
538
        }
539
 
540
        case PTRACE_SETREGS: { /* Set all gp regs in the child. */
541
                unsigned long tmp;
542
                if (!access_ok(VERIFY_READ, datap, FRAME_SIZE*sizeof(long))) {
543
                        ret = -EIO;
544
                        break;
545
                }
546
                for ( i = 0; i < FRAME_SIZE*sizeof(long); i += sizeof(long) ) {
547
                        __get_user(tmp, datap);
548
                        putreg(child, i, tmp);
549
                        datap++;
550
                }
551
                ret = 0;
552
                break;
553
        }
554
 
555
        case PTRACE_GETFPREGS: { /* Get the child FPU state. */
556
                if (!access_ok(VERIFY_WRITE, datap,
557
                               sizeof(struct user_i387_struct))) {
558
                        ret = -EIO;
559
                        break;
560
                }
561
                ret = 0;
562
                if (!tsk_used_math(child))
563
                        init_fpu(child);
564
                get_fpregs((struct user_i387_struct __user *)data, child);
565
                break;
566
        }
567
 
568
        case PTRACE_SETFPREGS: { /* Set the child FPU state. */
569
                if (!access_ok(VERIFY_READ, datap,
570
                               sizeof(struct user_i387_struct))) {
571
                        ret = -EIO;
572
                        break;
573
                }
574
                set_stopped_child_used_math(child);
575
                set_fpregs(child, (struct user_i387_struct __user *)data);
576
                ret = 0;
577
                break;
578
        }
579
 
580
        case PTRACE_GETFPXREGS: { /* Get the child extended FPU state. */
581
                if (!access_ok(VERIFY_WRITE, datap,
582
                               sizeof(struct user_fxsr_struct))) {
583
                        ret = -EIO;
584
                        break;
585
                }
586
                if (!tsk_used_math(child))
587
                        init_fpu(child);
588
                ret = get_fpxregs((struct user_fxsr_struct __user *)data, child);
589
                break;
590
        }
591
 
592
        case PTRACE_SETFPXREGS: { /* Set the child extended FPU state. */
593
                if (!access_ok(VERIFY_READ, datap,
594
                               sizeof(struct user_fxsr_struct))) {
595
                        ret = -EIO;
596
                        break;
597
                }
598
                set_stopped_child_used_math(child);
599
                ret = set_fpxregs(child, (struct user_fxsr_struct __user *)data);
600
                break;
601
        }
602
 
603
        case PTRACE_GET_THREAD_AREA:
604
                ret = ptrace_get_thread_area(child, addr,
605
                                        (struct user_desc __user *) data);
606
                break;
607
 
608
        case PTRACE_SET_THREAD_AREA:
609
                ret = ptrace_set_thread_area(child, addr,
610
                                        (struct user_desc __user *) data);
611
                break;
612
 
613
        default:
614
                ret = ptrace_request(child, request, addr, data);
615
                break;
616
        }
617
 out_tsk:
618
        return ret;
619
}
620
 
621
void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code)
622
{
623
        struct siginfo info;
624
 
625
        tsk->thread.trap_no = 1;
626
        tsk->thread.error_code = error_code;
627
 
628
        memset(&info, 0, sizeof(info));
629
        info.si_signo = SIGTRAP;
630
        info.si_code = TRAP_BRKPT;
631
 
632
        /* User-mode eip? */
633
        info.si_addr = user_mode_vm(regs) ? (void __user *) regs->eip : NULL;
634
 
635
        /* Send us the fake SIGTRAP */
636
        force_sig_info(SIGTRAP, &info, tsk);
637
}
638
 
639
/* notification of system call entry/exit
640
 * - triggered by current->work.syscall_trace
641
 */
642
__attribute__((regparm(3)))
643
int do_syscall_trace(struct pt_regs *regs, int entryexit)
644
{
645
        int is_sysemu = test_thread_flag(TIF_SYSCALL_EMU);
646
        /*
647
         * With TIF_SYSCALL_EMU set we want to ignore TIF_SINGLESTEP for syscall
648
         * interception
649
         */
650
        int is_singlestep = !is_sysemu && test_thread_flag(TIF_SINGLESTEP);
651
        int ret = 0;
652
 
653
        /* do the secure computing check first */
654
        if (!entryexit)
655
                secure_computing(regs->orig_eax);
656
 
657
        if (unlikely(current->audit_context)) {
658
                if (entryexit)
659
                        audit_syscall_exit(AUDITSC_RESULT(regs->eax),
660
                                                regs->eax);
661
                /* Debug traps, when using PTRACE_SINGLESTEP, must be sent only
662
                 * on the syscall exit path. Normally, when TIF_SYSCALL_AUDIT is
663
                 * not used, entry.S will call us only on syscall exit, not
664
                 * entry; so when TIF_SYSCALL_AUDIT is used we must avoid
665
                 * calling send_sigtrap() on syscall entry.
666
                 *
667
                 * Note that when PTRACE_SYSEMU_SINGLESTEP is used,
668
                 * is_singlestep is false, despite his name, so we will still do
669
                 * the correct thing.
670
                 */
671
                else if (is_singlestep)
672
                        goto out;
673
        }
674
 
675
        if (!(current->ptrace & PT_PTRACED))
676
                goto out;
677
 
678
        /* If a process stops on the 1st tracepoint with SYSCALL_TRACE
679
         * and then is resumed with SYSEMU_SINGLESTEP, it will come in
680
         * here. We have to check this and return */
681
        if (is_sysemu && entryexit)
682
                return 0;
683
 
684
        /* Fake a debug trap */
685
        if (is_singlestep)
686
                send_sigtrap(current, regs, 0);
687
 
688
        if (!test_thread_flag(TIF_SYSCALL_TRACE) && !is_sysemu)
689
                goto out;
690
 
691
        /* the 0x80 provides a way for the tracing parent to distinguish
692
           between a syscall stop and SIGTRAP delivery */
693
        /* Note that the debugger could change the result of test_thread_flag!*/
694
        ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) ? 0x80:0));
695
 
696
        /*
697
         * this isn't the same as continuing with a signal, but it will do
698
         * for normal use.  strace only continues with a signal if the
699
         * stopping signal is not SIGTRAP.  -brl
700
         */
701
        if (current->exit_code) {
702
                send_sig(current->exit_code, current, 1);
703
                current->exit_code = 0;
704
        }
705
        ret = is_sysemu;
706
out:
707
        if (unlikely(current->audit_context) && !entryexit)
708
                audit_syscall_entry(AUDIT_ARCH_I386, regs->orig_eax,
709
                                    regs->ebx, regs->ecx, regs->edx, regs->esi);
710
        if (ret == 0)
711
                return 0;
712
 
713
        regs->orig_eax = -1; /* force skip of syscall restarting */
714
        if (unlikely(current->audit_context))
715
                audit_syscall_exit(AUDITSC_RESULT(regs->eax), regs->eax);
716
        return 1;
717
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.