1 #ifndef _ASMAXP_PTRACE_H 2 #define _ASMAXP_PTRACE_H 3 4 5 /* 6 * This struct defines the way the registers are stored on the 7 * kernel stack during a system call or other kernel entry 8 * 9 * NOTE! I want to minimize the overhead of system calls, so this 10 * struct has as little information as possible. I does not have 11 * 12 * - floating point regs: the kernel doesn't change those 13 * - r9-15: saved by the C compiler 14 * 15 * This makes "fork()" and "exec()" a bit more complex, but should 16 * give us low system call latency. 17 */ 18 19 struct pt_regs { 20 unsigned long r0; 21 unsigned long r1; 22 unsigned long r2; 23 unsigned long r3; 24 unsigned long r4; 25 unsigned long r5; 26 unsigned long r6; 27 unsigned long r7; 28 unsigned long r8; 29 unsigned long r19; 30 unsigned long r20; 31 unsigned long r21; 32 unsigned long r22; 33 unsigned long r23; 34 unsigned long r24; 35 unsigned long r25; 36 unsigned long r26; 37 unsigned long r27; 38 unsigned long r28; 39 unsigned long hae; 40 /* JRP - These are the values provided to a0-a2 by PALcode */ 41 unsigned long trap_a0; 42 unsigned long trap_a1; 43 unsigned long trap_a2; 44 /* These are saved by PAL-code: */ 45 unsigned long ps; 46 unsigned long pc; 47 unsigned long gp; 48 unsigned long r16; 49 unsigned long r17; 50 unsigned long r18; 51 }; 52 53 /* 54 * This is the extended stack used by signal handlers and the context 55 * switcher: it's pushed after the normal "struct pt_regs". 56 */ 57 struct switch_stack { 58 unsigned long r9; 59 unsigned long r10; 60 unsigned long r11; 61 unsigned long r12; 62 unsigned long r13; 63 unsigned long r14; 64 unsigned long r15; 65 unsigned long r26; 66 unsigned long fp[32]; /* fp[31] is fpcr */ 67 }; 68 69 #ifdef __KERNEL__ 70 71 #define arch_has_single_step() (1) 72 #define user_mode(regs) (((regs)->ps & 8) != 0) 73 #define instruction_pointer(regs) ((regs)->pc) 74 #define profile_pc(regs) instruction_pointer(regs) 75 76 #define task_pt_regs(task) \ 77 ((struct pt_regs *) (task_stack_page(task) + 2*PAGE_SIZE) - 1) 78 79 #define current_pt_regs() \ 80 ((struct pt_regs *) ((char *)current_thread_info() + 2*PAGE_SIZE) - 1) 81 82 #define force_successful_syscall_return() (current_pt_regs()->r0 = 0) 83 84 #endif 85 86 #endif 87