Merge master.kernel.org:/pub/scm/linux/kernel/git/paulus/powerpc-merge
[linux-2.6] / arch / um / sys-ppc / ptrace.c
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
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
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
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 /*
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  */