1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #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);
- }
|