Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #include "linux/sched.h" |
2 | #include "asm/ptrace.h" | |
3 | ||
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 | ||
82c1c11b BS |
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 | ||
1da177e4 LT |
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 | ||
82c1c11b BS |
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 |