* zero have no stack-slot and need to be treated specially (see * get_reg/put_reg below). */ enum { REG_R0 = 0, REG_F0 = 32, REG_FPCR = 63, REG_PC = 64 }; #define PT_REG(reg) \ (PAGE_SIZE*2 - sizeof(struct pt_regs) + offsetof(struct pt_regs, reg)) #define SW_REG(reg) \ (PAGE_SIZE*2 - sizeof(struct pt_regs) - sizeof(struct switch_stack) \ + offsetof(struct switch_stack, reg)) static int regoff[] = { PT_REG( r0), PT_REG( r1), PT_REG( r2), PT_REG( r3), PT_REG( r4), PT_REG( r5), PT_REG( r6), PT_REG( r7), PT_REG( r8), SW_REG( r9), SW_REG( r10), SW_REG( r11), SW_REG( r12), SW_REG( r13), SW_REG( r14), SW_REG( r15), PT_REG( r16), PT_REG( r17), PT_REG( r18), PT_REG( r19), PT_REG( r20), PT_REG( r21), PT_REG( r22), PT_REG( r23), PT_REG( r24), PT_REG( r25), PT_REG( r26), PT_REG( r27), PT_REG( r28), PT_REG( gp), -1, -1, SW_REG(fp[ 0]), SW_REG(fp[ 1]), SW_REG(fp[ 2]), SW_REG(fp[ 3]), SW_REG(fp[ 4]), SW_REG(fp[ 5]), SW_REG(fp[ 6]), SW_REG(fp[ 7]), SW_REG(fp[ 8]), SW_REG(fp[ 9]), SW_REG(fp[10]), SW_REG(fp[11]), SW_REG(fp[12]), SW_REG(fp[13]), SW_REG(fp[14]), SW_REG(fp[15]), SW_REG(fp[16]), SW_REG(fp[17]), SW_REG(fp[18]), SW_REG(fp[19]), SW_REG(fp[20]), SW_REG(fp[21]), SW_REG(fp[22]), SW_REG(fp[23]), SW_REG(fp[24]), SW_REG(fp[25]), SW_REG(fp[26]), SW_REG(fp[27]), SW_REG(fp[28]), SW_REG(fp[29]), SW_REG(fp[30]), SW_REG(fp[31]),
/* determines which bits in the SR the user has access to. */ /* 1 = access 0 = no access */ #define SR_MASK 0x001f /* sets the trace bits. */ #define TRACE_BITS 0x8000 /* Find the stack offset for a register, relative to tss.esp0. */ #define PT_REG(reg) ((long)&((struct pt_regs *)0)->reg) #define SW_REG(reg) ((long)&((struct switch_stack *)0)->reg \ - sizeof(struct switch_stack)) /* Mapping from PT_xxx to the stack offset at which the register is saved. Notice that usp has no stack-slot and needs to be treated specially (see get_reg/put_reg below). */ static int regoff[] = { PT_REG(d1), PT_REG(d2), PT_REG(d3), PT_REG(d4), PT_REG(d5), SW_REG(d6), SW_REG(d7), PT_REG(a0), PT_REG(a1), SW_REG(a2), SW_REG(a3), SW_REG(a4), SW_REG(a5), SW_REG(a6), PT_REG(d0), -1, PT_REG(orig_d0), PT_REG(sr), PT_REG(pc), }; /* change a pid into a task struct. */ static inline struct task_struct * get_task(int pid) { int i; for (i = 1; i < NR_TASKS; i++) { if (task[i] != NULL && (task[i]->pid == pid)) return task[i]; }
* Public License. See the file COPYING in the main directory of * this archive for more details. */ #include <linux/linkage.h> #include <linux/sched.h> #include <asm/ptrace.h> #define CCR_MASK 0x6f /* mode/imask not set */ #define BREAKINST 0x5730 /* trapa #3 */ /* Mapping from PT_xxx to the stack offset at which the register is saved. Notice that usp has no stack-slot and needs to be treated specially (see get_reg/put_reg below). */ static const int h8300_register_offset[] = { PT_REG(er1), PT_REG(er2), PT_REG(er3), PT_REG(er4), PT_REG(er5), PT_REG(er6), PT_REG(er0), PT_REG(orig_er0), PT_REG(ccr), PT_REG(pc) }; /* read register */ long h8300_get_reg(struct task_struct *task, int regno) { switch (regno) { case PT_USP: return task->thread.usp + sizeof(long)*2; case PT_CCR: return *(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]); default: return *(unsigned long *)(task->thread.esp0 + h8300_register_offset[regno]); }
* Public License. See the file COPYING in the main directory of * this archive for more details. */ #include <linux/linkage.h> #include <linux/sched.h> #include <asm/ptrace.h> #define CCR_MASK 0x6f #define EXR_TRACE 0x80 /* Mapping from PT_xxx to the stack offset at which the register is saved. Notice that usp has no stack-slot and needs to be treated specially (see get_reg/put_reg below). */ static const int h8300_register_offset[] = { PT_REG(er1), PT_REG(er2), PT_REG(er3), PT_REG(er4), PT_REG(er5), SW_REG(er6), PT_REG(er0), PT_REG(orig_er0), PT_REG(ccr), PT_REG(pc), 0, PT_REG(exr) }; /* read register */ long h8300_get_reg(struct task_struct *task, int regno) { switch (regno) { case PT_USP: return task->thread.usp + sizeof(long)*2 + 2; case PT_CCR: case PT_EXR: return *(unsigned short *)(task->thread.esp0 + h8300_register_offset[regno]); default: printk("get_reg %d=%08x\n",regno,*(unsigned long *)(task->thread.esp0 + h8300_register_offset[regno]));