1 #include "linux/sched.h"
2 #include "asm/ptrace.h"
3 
putreg(struct task_struct * child,unsigned long regno,unsigned long value)4 int 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 
poke_user(struct task_struct * child,long addr,long data)11 int 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 
getreg(struct task_struct * child,unsigned long regno)30 unsigned 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 
peek_user(struct task_struct * child,long addr,long data)38 int 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