Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ptrace.c
Go to the documentation of this file.
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