Lines Matching +full:sh4 +full:- +full:linux +full:- +full:user

2  *  Emulation of Linux signals
21 #include "user-internals.h"
22 #include "signal-common.h"
23 #include "linux-user/trace.h"
26 * code and data structures from linux kernel:
27 * include/asm-sh/sigcontext.h
54 target_ulong extramask[TARGET_NSIG_WORDS-1];
73 #define MOVW(n) (0x9300|((n)-2)) /* Move mem word at PC+n to R3 */
81 return (sp - frame_size) & -8ul; in get_sigframe()
93 /* ??? The SH4 kernel checks for and address above 0xC0000000. in unwind_gusa()
94 However, the page mappings in qemu linux-user aren't as restricted in unwind_gusa()
99 if (regs->gregs[15] >= -128u && regs->pc < regs->gregs[0]) { in unwind_gusa()
101 R0 = region end, SP = -(region size), plus one more for the in unwind_gusa()
103 regs->pc = regs->gregs[0] + regs->gregs[15] - 2; in unwind_gusa()
106 regs->gregs[15] = regs->gregs[1]; in unwind_gusa()
107 } else if (regs->gregs[15] >= -128u && regs->pc == regs->gregs[0]) { in unwind_gusa()
111 regs->gregs[15] = regs->gregs[1]; in unwind_gusa()
112 } else if (regs->flags & TB_FLAG_DELAY_SLOT) { in unwind_gusa()
114 regs->pc -= 2; in unwind_gusa()
123 #define COPY(x) __put_user(regs->x, &sc->sc_##x) in setup_sigcontext()
138 __put_user(regs->fregs[i], &sc->sc_fpregs[i]); in setup_sigcontext()
140 __put_user(regs->fpscr, &sc->sc_fpscr); in setup_sigcontext()
141 __put_user(regs->fpul, &sc->sc_fpul); in setup_sigcontext()
143 /* non-iBCS2 extensions.. */ in setup_sigcontext()
144 __put_user(mask, &sc->oldmask); in setup_sigcontext()
151 #define COPY(x) __get_user(regs->x, &sc->sc_##x) in restore_sigcontext()
166 __get_user(regs->fregs[i], &sc->sc_fpregs[i]); in restore_sigcontext()
168 __get_user(regs->fpscr, &sc->sc_fpscr); in restore_sigcontext()
169 __get_user(regs->fpul, &sc->sc_fpul); in restore_sigcontext()
171 regs->tra = -1; /* disable syscall checks */ in restore_sigcontext()
172 regs->flags = 0; in restore_sigcontext()
184 frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame)); in setup_frame()
190 setup_sigcontext(&frame->sc, regs, set->sig[0]); in setup_frame()
192 for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) { in setup_frame()
193 __put_user(set->sig[i + 1], &frame->extramask[i]); in setup_frame()
198 if (ka->sa_flags & TARGET_SA_RESTORER) { in setup_frame()
199 regs->pr = ka->sa_restorer; in setup_frame()
201 regs->pr = default_sigreturn; in setup_frame()
205 regs->gregs[15] = frame_addr; in setup_frame()
206 regs->gregs[4] = sig; /* Arg for signal handler */ in setup_frame()
207 regs->gregs[5] = 0; in setup_frame()
208 regs->gregs[6] = frame_addr += offsetof(typeof(*frame), sc); in setup_frame()
209 regs->pc = (unsigned long) ka->_sa_handler; in setup_frame()
210 regs->flags &= ~(TB_FLAG_DELAY_SLOT_MASK | TB_FLAG_GUSA_MASK); in setup_frame()
230 frame_addr = get_sigframe(ka, regs->gregs[15], sizeof(*frame)); in setup_rt_frame()
236 frame->info = *info; in setup_rt_frame()
239 __put_user(0, &frame->uc.tuc_flags); in setup_rt_frame()
240 __put_user(0, (unsigned long *)&frame->uc.tuc_link); in setup_rt_frame()
241 target_save_altstack(&frame->uc.tuc_stack, regs); in setup_rt_frame()
242 setup_sigcontext(&frame->uc.tuc_mcontext, in setup_rt_frame()
243 regs, set->sig[0]); in setup_rt_frame()
245 __put_user(set->sig[i], &frame->uc.tuc_sigmask.sig[i]); in setup_rt_frame()
250 if (ka->sa_flags & TARGET_SA_RESTORER) { in setup_rt_frame()
251 regs->pr = ka->sa_restorer; in setup_rt_frame()
253 regs->pr = default_rt_sigreturn; in setup_rt_frame()
257 regs->gregs[15] = frame_addr; in setup_rt_frame()
258 regs->gregs[4] = sig; /* Arg for signal handler */ in setup_rt_frame()
259 regs->gregs[5] = frame_addr + offsetof(typeof(*frame), info); in setup_rt_frame()
260 regs->gregs[6] = frame_addr + offsetof(typeof(*frame), uc); in setup_rt_frame()
261 regs->pc = (unsigned long) ka->_sa_handler; in setup_rt_frame()
262 regs->flags &= ~(TB_FLAG_DELAY_SLOT_MASK | TB_FLAG_GUSA_MASK); in setup_rt_frame()
280 frame_addr = regs->gregs[15]; in do_sigreturn()
286 __get_user(target_set.sig[0], &frame->sc.oldmask); in do_sigreturn()
288 __get_user(target_set.sig[i], &frame->extramask[i - 1]); in do_sigreturn()
294 restore_sigcontext(regs, &frame->sc); in do_sigreturn()
297 return -QEMU_ESIGRETURN; in do_sigreturn()
302 return -QEMU_ESIGRETURN; in do_sigreturn()
311 frame_addr = regs->gregs[15]; in do_rt_sigreturn()
317 target_to_host_sigset(&blocked, &frame->uc.tuc_sigmask); in do_rt_sigreturn()
320 restore_sigcontext(regs, &frame->uc.tuc_mcontext); in do_rt_sigreturn()
321 target_restore_altstack(&frame->uc.tuc_stack, regs); in do_rt_sigreturn()
324 return -QEMU_ESIGRETURN; in do_rt_sigreturn()
329 return -QEMU_ESIGRETURN; in do_rt_sigreturn()