Blame view

kernel/linux-imx6_3.14.28/arch/um/sys-ppc/ptrace.c 1.4 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
  #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);
  }