| #include "linux/sched.h" | |
| #include "asm/ptrace.h" | |
| int putreg(struct task_struct *child, unsigned long regno, | |
| unsigned long value) | |
| { | |
| child->thread.process_regs.regs[regno >> 2] = value; | |
| return 0; | |
| } | |
| int poke_user(struct task_struct *child, long addr, long data) | |
| { | |
| if ((addr & 3) || addr < 0) | |
| return -EIO; | |
| if (addr < MAX_REG_OFFSET) | |
| return putreg(child, addr, data); | |
| else if((addr >= offsetof(struct user, u_debugreg[0])) && | |
| (addr <= offsetof(struct user, u_debugreg[7]))){ | |
| addr -= offsetof(struct user, u_debugreg[0]); | |
| addr = addr >> 2; | |
| if((addr == 4) || (addr == 5)) return -EIO; | |
| child->thread.arch.debugregs[addr] = data; | |
| return 0; | |
| } | |
| return -EIO; | |
| } | |
| unsigned long getreg(struct task_struct *child, unsigned long regno) | |
| { | |
| unsigned long retval = ~0UL; | |
| retval &= child->thread.process_regs.regs[regno >> 2]; | |
| return retval; | |
| } | |
| int peek_user(struct task_struct *child, long addr, long data) | |
| { | |
| /* read the word at location addr in the USER area. */ | |
| unsigned long tmp; | |
| if ((addr & 3) || addr < 0) | |
| return -EIO; | |
| tmp = 0; /* Default return condition */ | |
| if(addr < MAX_REG_OFFSET){ | |
| tmp = getreg(child, addr); | |
| } | |
| else if((addr >= offsetof(struct user, u_debugreg[0])) && | |
| (addr <= offsetof(struct user, u_debugreg[7]))){ | |
| addr -= offsetof(struct user, u_debugreg[0]); | |
| addr = addr >> 2; | |
| tmp = child->thread.arch.debugregs[addr]; | |
| } | |
| return put_user(tmp, (unsigned long *) data); | |
| } | |