2 * Copyright 2003 PathScale, Inc.
4 * Licensed under the GPL
7 #define __FRAME_OFFSETS
8 #include "asm/ptrace.h"
9 #include "linux/sched.h"
10 #include "linux/errno.h"
18 #define SC_SS(r) (not_ss)
19 #define SC_DS(r) (not_ds)
20 #define SC_ES(r) (not_es)
22 /* determines which flags the user has access to. */
23 /* 1 = access 0 = no access */
24 #define FLAG_MASK 0x44dd5UL
26 int putreg(struct task_struct
*child
, int regno
, unsigned long value
)
31 /* Some code in the 64bit emulation may not be 64bit clean.
32 Don't take any chances. */
33 if (test_tsk_thread_flag(child
, TIF_IA32
))
43 if (value
&& (value
& 3) != 3)
50 if (!((value
>> 48) == 0 || (value
>> 48) == 0xffff))
56 tmp
= PT_REGS_EFLAGS(&child
->thread
.regs
) & ~FLAG_MASK
;
61 PT_REGS_SET(&child
->thread
.regs
, regno
, value
);
65 int poke_user(struct task_struct
*child
, long addr
, long data
)
67 if ((addr
& 3) || addr
< 0)
70 if (addr
< MAX_REG_OFFSET
)
71 return putreg(child
, addr
, data
);
73 #if 0 /* Need x86_64 debugregs handling */
74 else if((addr
>= offsetof(struct user
, u_debugreg
[0])) &&
75 (addr
<= offsetof(struct user
, u_debugreg
[7]))){
76 addr
-= offsetof(struct user
, u_debugreg
[0]);
78 if((addr
== 4) || (addr
== 5)) return -EIO
;
79 child
->thread
.arch
.debugregs
[addr
] = data
;
86 unsigned long getreg(struct task_struct
*child
, int regno
)
88 unsigned long retval
= ~0UL;
99 retval
&= PT_REG(&child
->thread
.regs
, regno
);
101 if (test_tsk_thread_flag(child
, TIF_IA32
))
102 retval
&= 0xffffffff;
108 int peek_user(struct task_struct
*child
, long addr
, long data
)
110 /* read the word at location addr in the USER area. */
113 if ((addr
& 3) || addr
< 0)
116 tmp
= 0; /* Default return condition */
117 if(addr
< MAX_REG_OFFSET
){
118 tmp
= getreg(child
, addr
);
120 #if 0 /* Need x86_64 debugregs handling */
121 else if((addr
>= offsetof(struct user
, u_debugreg
[0])) &&
122 (addr
<= offsetof(struct user
, u_debugreg
[7]))){
123 addr
-= offsetof(struct user
, u_debugreg
[0]);
125 tmp
= child
->thread
.arch
.debugregs
[addr
];
128 return put_user(tmp
, (unsigned long *) data
);
131 void arch_switch(void)
134 printk("arch_switch\n");
138 int is_syscall(unsigned long addr
)
143 int dump_fpu(struct pt_regs
*regs
, elf_fpregset_t
*fpu
)
149 int get_fpregs(unsigned long buf
, struct task_struct
*child
)
155 int set_fpregs(unsigned long buf
, struct task_struct
*child
)
161 int get_fpxregs(unsigned long buf
, struct task_struct
*tsk
)
163 panic("get_fpxregs");
167 int set_fpxregs(unsigned long buf
, struct task_struct
*tsk
)
169 panic("set_fxpregs");
174 * Overrides for Emacs so that we follow Linus's tabbing style.
175 * Emacs will notice this stuff at the end of the file and automatically
176 * adjust the settings for this buffer only. This must remain at the end
178 * ---------------------------------------------------------------------------
180 * c-file-style: "linux"