1#include "linux/sched.h" 2#include "asm/ptrace.h" 3 4int putreg(struct task_struct *child, unsigned long regno, 5 unsigned long value) 6{ 7 child->thread.process_regs.regs[regno >> 2] = value; 8 return 0; 9} 10 11int poke_user(struct task_struct *child, long addr, long data) 12{ 13 if ((addr & 3) || addr < 0) 14 return -EIO; 15 16 if (addr < MAX_REG_OFFSET) 17 return putreg(child, addr, data); 18 19 else if((addr >= offsetof(struct user, u_debugreg[0])) && 20 (addr <= offsetof(struct user, u_debugreg[7]))){ 21 addr -= offsetof(struct user, u_debugreg[0]); 22 addr = addr >> 2; 23 if((addr == 4) || (addr == 5)) return -EIO; 24 child->thread.arch.debugregs[addr] = data; 25 return 0; 26 } 27 return -EIO; 28} 29 30unsigned long getreg(struct task_struct *child, unsigned long regno) 31{ 32 unsigned long retval = ~0UL; 33 34 retval &= child->thread.process_regs.regs[regno >> 2]; 35 return retval; 36} 37 38int peek_user(struct task_struct *child, long addr, long data) 39{ 40 /* read the word at location addr in the USER area. */ 41 unsigned long tmp; 42 43 if ((addr & 3) || addr < 0) 44 return -EIO; 45 46 tmp = 0; /* Default return condition */ 47 if(addr < MAX_REG_OFFSET){ 48 tmp = getreg(child, addr); 49 } 50 else if((addr >= offsetof(struct user, u_debugreg[0])) && 51 (addr <= offsetof(struct user, u_debugreg[7]))){ 52 addr -= offsetof(struct user, u_debugreg[0]); 53 addr = addr >> 2; 54 tmp = child->thread.arch.debugregs[addr]; 55 } 56 return put_user(tmp, (unsigned long *) data); 57} 58 59/* 60 * Overrides for Emacs so that we follow Linus's tabbing style. 61 * Emacs will notice this stuff at the end of the file and automatically 62 * adjust the settings for this buffer only. This must remain at the end 63 * of the file. 64 * --------------------------------------------------------------------------- 65 * Local variables: 66 * c-file-style: "linux" 67 * End: 68 */ 69