12 #include <linux/errno.h>
13 #include <linux/signal.h>
14 #include <linux/personality.h>
17 #include <linux/elf.h>
20 #include <asm/cacheflush.h>
21 #include <asm/ucontext.h>
26 #define SWI_SYS_SIGRETURN (0xff000000)
27 #define SWI_SYS_RT_SIGRETURN (0xff000000 | (__NR_rt_sigreturn))
28 #define SWI_SYS_RESTART (0xff000000 | (__NR_restart_syscall))
30 #define KERN_SIGRETURN_CODE (KUSER_VECPAGE_BASE + 0x00000500)
31 #define KERN_RESTART_CODE (KERN_SIGRETURN_CODE + sizeof(sigreturn_codes))
64 err |=
__get_user(regs->UCreg_00, &sf->uc.uc_mcontext.
regs.UCreg_00);
65 err |=
__get_user(regs->UCreg_01, &sf->uc.uc_mcontext.
regs.UCreg_01);
66 err |=
__get_user(regs->UCreg_02, &sf->uc.uc_mcontext.
regs.UCreg_02);
67 err |=
__get_user(regs->UCreg_03, &sf->uc.uc_mcontext.
regs.UCreg_03);
68 err |=
__get_user(regs->UCreg_04, &sf->uc.uc_mcontext.
regs.UCreg_04);
69 err |=
__get_user(regs->UCreg_05, &sf->uc.uc_mcontext.
regs.UCreg_05);
70 err |=
__get_user(regs->UCreg_06, &sf->uc.uc_mcontext.
regs.UCreg_06);
71 err |=
__get_user(regs->UCreg_07, &sf->uc.uc_mcontext.
regs.UCreg_07);
72 err |=
__get_user(regs->UCreg_08, &sf->uc.uc_mcontext.
regs.UCreg_08);
73 err |=
__get_user(regs->UCreg_09, &sf->uc.uc_mcontext.
regs.UCreg_09);
74 err |=
__get_user(regs->UCreg_10, &sf->uc.uc_mcontext.
regs.UCreg_10);
75 err |=
__get_user(regs->UCreg_11, &sf->uc.uc_mcontext.
regs.UCreg_11);
76 err |=
__get_user(regs->UCreg_12, &sf->uc.uc_mcontext.
regs.UCreg_12);
77 err |=
__get_user(regs->UCreg_13, &sf->uc.uc_mcontext.
regs.UCreg_13);
78 err |=
__get_user(regs->UCreg_14, &sf->uc.uc_mcontext.
regs.UCreg_14);
79 err |=
__get_user(regs->UCreg_15, &sf->uc.uc_mcontext.
regs.UCreg_15);
80 err |=
__get_user(regs->UCreg_16, &sf->uc.uc_mcontext.
regs.UCreg_16);
81 err |=
__get_user(regs->UCreg_17, &sf->uc.uc_mcontext.
regs.UCreg_17);
82 err |=
__get_user(regs->UCreg_18, &sf->uc.uc_mcontext.
regs.UCreg_18);
83 err |=
__get_user(regs->UCreg_19, &sf->uc.uc_mcontext.
regs.UCreg_19);
84 err |=
__get_user(regs->UCreg_20, &sf->uc.uc_mcontext.
regs.UCreg_20);
85 err |=
__get_user(regs->UCreg_21, &sf->uc.uc_mcontext.
regs.UCreg_21);
86 err |=
__get_user(regs->UCreg_22, &sf->uc.uc_mcontext.
regs.UCreg_22);
87 err |=
__get_user(regs->UCreg_23, &sf->uc.uc_mcontext.
regs.UCreg_23);
88 err |=
__get_user(regs->UCreg_24, &sf->uc.uc_mcontext.
regs.UCreg_24);
89 err |=
__get_user(regs->UCreg_25, &sf->uc.uc_mcontext.
regs.UCreg_25);
90 err |=
__get_user(regs->UCreg_26, &sf->uc.uc_mcontext.
regs.UCreg_26);
91 err |=
__get_user(regs->UCreg_fp, &sf->uc.uc_mcontext.
regs.UCreg_fp);
92 err |=
__get_user(regs->UCreg_ip, &sf->uc.uc_mcontext.
regs.UCreg_ip);
93 err |=
__get_user(regs->UCreg_sp, &sf->uc.uc_mcontext.
regs.UCreg_sp);
94 err |=
__get_user(regs->UCreg_lr, &sf->uc.uc_mcontext.
regs.UCreg_lr);
95 err |=
__get_user(regs->UCreg_pc, &sf->uc.uc_mcontext.
regs.UCreg_pc);
96 err |=
__get_user(regs->UCreg_asr, &sf->uc.uc_mcontext.
regs.UCreg_asr);
98 err |= !valid_user_regs(regs);
115 if (regs->UCreg_sp & 7)
118 frame = (
struct rt_sigframe __user *)regs->UCreg_sp;
123 if (restore_sigframe(regs, &frame->
sig))
130 return regs->UCreg_00;
137 static int setup_sigframe(
struct sigframe __user *sf,
struct pt_regs *regs,
142 err |=
__put_user(regs->UCreg_00, &sf->uc.uc_mcontext.
regs.UCreg_00);
143 err |=
__put_user(regs->UCreg_01, &sf->uc.uc_mcontext.
regs.UCreg_01);
144 err |=
__put_user(regs->UCreg_02, &sf->uc.uc_mcontext.
regs.UCreg_02);
145 err |=
__put_user(regs->UCreg_03, &sf->uc.uc_mcontext.
regs.UCreg_03);
146 err |=
__put_user(regs->UCreg_04, &sf->uc.uc_mcontext.
regs.UCreg_04);
147 err |=
__put_user(regs->UCreg_05, &sf->uc.uc_mcontext.
regs.UCreg_05);
148 err |=
__put_user(regs->UCreg_06, &sf->uc.uc_mcontext.
regs.UCreg_06);
149 err |=
__put_user(regs->UCreg_07, &sf->uc.uc_mcontext.
regs.UCreg_07);
150 err |=
__put_user(regs->UCreg_08, &sf->uc.uc_mcontext.
regs.UCreg_08);
151 err |=
__put_user(regs->UCreg_09, &sf->uc.uc_mcontext.
regs.UCreg_09);
152 err |=
__put_user(regs->UCreg_10, &sf->uc.uc_mcontext.
regs.UCreg_10);
153 err |=
__put_user(regs->UCreg_11, &sf->uc.uc_mcontext.
regs.UCreg_11);
154 err |=
__put_user(regs->UCreg_12, &sf->uc.uc_mcontext.
regs.UCreg_12);
155 err |=
__put_user(regs->UCreg_13, &sf->uc.uc_mcontext.
regs.UCreg_13);
156 err |=
__put_user(regs->UCreg_14, &sf->uc.uc_mcontext.
regs.UCreg_14);
157 err |=
__put_user(regs->UCreg_15, &sf->uc.uc_mcontext.
regs.UCreg_15);
158 err |=
__put_user(regs->UCreg_16, &sf->uc.uc_mcontext.
regs.UCreg_16);
159 err |=
__put_user(regs->UCreg_17, &sf->uc.uc_mcontext.
regs.UCreg_17);
160 err |=
__put_user(regs->UCreg_18, &sf->uc.uc_mcontext.
regs.UCreg_18);
161 err |=
__put_user(regs->UCreg_19, &sf->uc.uc_mcontext.
regs.UCreg_19);
162 err |=
__put_user(regs->UCreg_20, &sf->uc.uc_mcontext.
regs.UCreg_20);
163 err |=
__put_user(regs->UCreg_21, &sf->uc.uc_mcontext.
regs.UCreg_21);
164 err |=
__put_user(regs->UCreg_22, &sf->uc.uc_mcontext.
regs.UCreg_22);
165 err |=
__put_user(regs->UCreg_23, &sf->uc.uc_mcontext.
regs.UCreg_23);
166 err |=
__put_user(regs->UCreg_24, &sf->uc.uc_mcontext.
regs.UCreg_24);
167 err |=
__put_user(regs->UCreg_25, &sf->uc.uc_mcontext.
regs.UCreg_25);
168 err |=
__put_user(regs->UCreg_26, &sf->uc.uc_mcontext.
regs.UCreg_26);
169 err |=
__put_user(regs->UCreg_fp, &sf->uc.uc_mcontext.
regs.UCreg_fp);
170 err |=
__put_user(regs->UCreg_ip, &sf->uc.uc_mcontext.
regs.UCreg_ip);
171 err |=
__put_user(regs->UCreg_sp, &sf->uc.uc_mcontext.
regs.UCreg_sp);
172 err |=
__put_user(regs->UCreg_lr, &sf->uc.uc_mcontext.
regs.UCreg_lr);
173 err |=
__put_user(regs->UCreg_pc, &sf->uc.uc_mcontext.
regs.UCreg_pc);
174 err |=
__put_user(regs->UCreg_asr, &sf->uc.uc_mcontext.
regs.UCreg_asr);
177 &sf->uc.uc_mcontext.trap_no);
179 &sf->uc.uc_mcontext.error_code);
181 &sf->uc.uc_mcontext.fault_address);
190 struct pt_regs *regs,
int framesize)
192 unsigned long sp = regs->UCreg_sp;
198 if ((ka->
sa.sa_flags &
SA_ONSTACK) && !sas_ss_flags(sp))
204 frame = (
void __user *)((sp - framesize) & ~7);
216 unsigned long __user *
rc,
void __user *frame,
int usig)
220 unsigned long asr = regs->UCreg_asr & ~
PSR_f;
222 unsigned int idx = 0;
233 regs->UCreg_00 = usig;
234 regs->UCreg_sp = (
unsigned long)frame;
236 regs->UCreg_pc = handler;
237 regs->UCreg_asr =
asr;
242 static int setup_frame(
int usig,
struct k_sigaction *ka,
256 err |= setup_sigframe(frame, regs,
set);
258 err |= setup_return(regs, ka, frame->
retcode, frame, usig);
279 memset(&stack, 0,
sizeof(stack));
281 stack.
ss_flags = sas_ss_flags(regs->UCreg_sp);
285 err |= setup_sigframe(&frame->
sig, regs,
set);
287 err |= setup_return(regs, ka, frame->
sig.retcode, frame, usig);
294 regs->UCreg_01 = (
unsigned long)&frame->
info;
295 regs->UCreg_02 = (
unsigned long)&frame->
sig.uc;
301 static inline void setup_syscall_restart(
struct pt_regs *regs)
303 regs->UCreg_00 = regs->UCreg_ORIG_00;
310 static void handle_signal(
unsigned long sig,
struct k_sigaction *ka,
315 sigset_t *oldset = sigmask_to_save();
323 switch (regs->UCreg_00) {
326 regs->UCreg_00 = -
EINTR;
330 regs->UCreg_00 = -
EINTR;
335 setup_syscall_restart(regs);
350 ret = setup_rt_frame(usig, ka, info, oldset, regs);
352 ret = setup_frame(usig, ka, oldset, regs);
357 ret |= !valid_user_regs(regs);
393 handle_signal(signr, &ka, &info, regs, syscall);
417 setup_syscall_restart(regs);
423 restore_saved_sigmask();
427 unsigned int thread_flags,
int syscall)
434 tracehook_notify_resume(regs);