|  | #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); | 
|  | } | 
|  |  | 
|  | /* | 
|  | * Overrides for Emacs so that we follow Linus's tabbing style. | 
|  | * Emacs will notice this stuff at the end of the file and automatically | 
|  | * adjust the settings for this buffer only.  This must remain at the end | 
|  | * of the file. | 
|  | * --------------------------------------------------------------------------- | 
|  | * Local variables: | 
|  | * c-file-style: "linux" | 
|  | * End: | 
|  | */ |