PageRenderTime 25ms CodeModel.GetById 20ms app.highlight 3ms RepoModel.GetById 1ms app.codeStats 0ms

/arch/um/sys-ppc/ptrace.c

https://gitlab.com/tiler/tiler-omap4
C | 58 lines | 47 code | 10 blank | 1 comment | 14 complexity | ae6e58407df63b289033d6ee48c99015 MD5 | raw file
 1#include "linux/sched.h"
 2#include "asm/ptrace.h"
 3
 4int 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
11int 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
30unsigned 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
38int 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