Lines Matching +full:ia32 +full:- +full:3 +full:a
1 // SPDX-License-Identifier: GPL-2.0
5 * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson
6 * 2000-06-20 Pentium III FXSR, SSE support by Gareth Hughes
7 * 2000-12-* x86-64 compatibility mode signal handling by Andi Kleen
44 if ((sc->gs | 0x03) != cur) in reload_segments()
45 load_gs_index(sc->gs | 0x03); in reload_segments()
47 if ((sc->fs | 0x03) != cur) in reload_segments()
48 loadsegment(fs, sc->fs | 0x03); in reload_segments()
50 if ((sc->ds | 0x03) != cur) in reload_segments()
51 loadsegment(ds, sc->ds | 0x03); in reload_segments()
53 if ((sc->es | 0x03) != cur) in reload_segments()
54 loadsegment(es, sc->es | 0x03); in reload_segments()
75 * Do a signal return; undo the signal stack.
82 /* Always make any pending restarted system calls return -EINTR */ in ia32_restore_sigcontext()
83 current->restart_block.fn = do_no_restart_syscall; in ia32_restore_sigcontext()
88 /* Get only the ia32 registers. */ in ia32_restore_sigcontext()
89 regs->bx = sc.bx; in ia32_restore_sigcontext()
90 regs->cx = sc.cx; in ia32_restore_sigcontext()
91 regs->dx = sc.dx; in ia32_restore_sigcontext()
92 regs->si = sc.si; in ia32_restore_sigcontext()
93 regs->di = sc.di; in ia32_restore_sigcontext()
94 regs->bp = sc.bp; in ia32_restore_sigcontext()
95 regs->ax = sc.ax; in ia32_restore_sigcontext()
96 regs->sp = sc.sp; in ia32_restore_sigcontext()
97 regs->ip = sc.ip; in ia32_restore_sigcontext()
100 regs->cs = sc.cs | 0x03; in ia32_restore_sigcontext()
101 regs->ss = sc.ss | 0x03; in ia32_restore_sigcontext()
103 regs->flags = (regs->flags & ~FIX_EFLAGS) | (sc.flags & FIX_EFLAGS); in ia32_restore_sigcontext()
105 regs->orig_ax = -1; in ia32_restore_sigcontext()
117 regs->fs = sc.fs; in ia32_restore_sigcontext()
118 regs->es = sc.es; in ia32_restore_sigcontext()
119 regs->ds = sc.ds; in ia32_restore_sigcontext()
128 struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8); in SYSCALL32_DEFINE0()
133 if (__get_user(set.sig[0], &frame->sc.oldmask) in SYSCALL32_DEFINE0()
134 || __get_user(((__u32 *)&set)[1], &frame->extramask[0])) in SYSCALL32_DEFINE0()
139 if (!ia32_restore_sigcontext(regs, &frame->sc)) in SYSCALL32_DEFINE0()
141 return regs->ax; in SYSCALL32_DEFINE0()
154 frame = (struct rt_sigframe_ia32 __user *)(regs->sp - 4); in SYSCALL32_DEFINE0()
158 if (__get_user(*(__u64 *)&set, (__u64 __user *)&frame->uc.uc_sigmask)) in SYSCALL32_DEFINE0()
163 if (!ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext)) in SYSCALL32_DEFINE0()
166 if (restore_altstack32(&frame->uc.uc_stack)) in SYSCALL32_DEFINE0()
169 return regs->ax; in SYSCALL32_DEFINE0()
177 * Set up a signal frame.
187 unsafe_put_user(get_user_seg(gs), (unsigned int __user *)&sc->gs, Efault); in __unsafe_setup_sigcontext32()
189 unsafe_put_user(get_user_seg(fs), (unsigned int __user *)&sc->fs, Efault); in __unsafe_setup_sigcontext32()
190 unsafe_put_user(get_user_seg(ds), (unsigned int __user *)&sc->ds, Efault); in __unsafe_setup_sigcontext32()
191 unsafe_put_user(get_user_seg(es), (unsigned int __user *)&sc->es, Efault); in __unsafe_setup_sigcontext32()
193 unsafe_put_user(regs->fs, (unsigned int __user *)&sc->fs, Efault); in __unsafe_setup_sigcontext32()
194 unsafe_put_user(regs->es, (unsigned int __user *)&sc->es, Efault); in __unsafe_setup_sigcontext32()
195 unsafe_put_user(regs->ds, (unsigned int __user *)&sc->ds, Efault); in __unsafe_setup_sigcontext32()
198 unsafe_put_user(regs->di, &sc->di, Efault); in __unsafe_setup_sigcontext32()
199 unsafe_put_user(regs->si, &sc->si, Efault); in __unsafe_setup_sigcontext32()
200 unsafe_put_user(regs->bp, &sc->bp, Efault); in __unsafe_setup_sigcontext32()
201 unsafe_put_user(regs->sp, &sc->sp, Efault); in __unsafe_setup_sigcontext32()
202 unsafe_put_user(regs->bx, &sc->bx, Efault); in __unsafe_setup_sigcontext32()
203 unsafe_put_user(regs->dx, &sc->dx, Efault); in __unsafe_setup_sigcontext32()
204 unsafe_put_user(regs->cx, &sc->cx, Efault); in __unsafe_setup_sigcontext32()
205 unsafe_put_user(regs->ax, &sc->ax, Efault); in __unsafe_setup_sigcontext32()
206 unsafe_put_user(current->thread.trap_nr, &sc->trapno, Efault); in __unsafe_setup_sigcontext32()
207 unsafe_put_user(current->thread.error_code, &sc->err, Efault); in __unsafe_setup_sigcontext32()
208 unsafe_put_user(regs->ip, &sc->ip, Efault); in __unsafe_setup_sigcontext32()
209 unsafe_put_user(regs->cs, (unsigned int __user *)&sc->cs, Efault); in __unsafe_setup_sigcontext32()
210 unsafe_put_user(regs->flags, &sc->flags, Efault); in __unsafe_setup_sigcontext32()
211 unsafe_put_user(regs->sp, &sc->sp_at_signal, Efault); in __unsafe_setup_sigcontext32()
212 unsafe_put_user(regs->ss, (unsigned int __user *)&sc->ss, Efault); in __unsafe_setup_sigcontext32()
214 unsafe_put_user(ptr_to_compat(fpstate), &sc->fpstate, Efault); in __unsafe_setup_sigcontext32()
216 /* non-iBCS2 extensions.. */ in __unsafe_setup_sigcontext32()
217 unsafe_put_user(mask, &sc->oldmask, Efault); in __unsafe_setup_sigcontext32()
218 unsafe_put_user(current->thread.cr2, &sc->cr2, Efault); in __unsafe_setup_sigcontext32()
222 return -EFAULT; in __unsafe_setup_sigcontext32()
227 if (__unsafe_setup_sigcontext32(sc, fp, regs, set->sig[0])) \
238 /* copy_to_user optimizes that into a single 8 byte store */ in ia32_setup_frame()
251 if (ksig->ka.sa.sa_flags & SA_RESTORER) { in ia32_setup_frame()
252 restorer = ksig->ka.sa.sa_restorer; in ia32_setup_frame()
255 if (current->mm->context.vdso) in ia32_setup_frame()
256 restorer = current->mm->context.vdso + in ia32_setup_frame()
259 restorer = &frame->retcode; in ia32_setup_frame()
263 return -EFAULT; in ia32_setup_frame()
265 unsafe_put_user(ksig->sig, &frame->sig, Efault); in ia32_setup_frame()
266 unsafe_put_sigcontext32(&frame->sc, fp, regs, set, Efault); in ia32_setup_frame()
267 unsafe_put_user(set->sig[1], &frame->extramask[0], Efault); in ia32_setup_frame()
268 unsafe_put_user(ptr_to_compat(restorer), &frame->pretcode, Efault); in ia32_setup_frame()
271 * gdb versions depend on them as a marker. in ia32_setup_frame()
273 unsafe_put_user(*((u64 *)&code), (u64 __user *)frame->retcode, Efault); in ia32_setup_frame()
277 regs->sp = (unsigned long) frame; in ia32_setup_frame()
278 regs->ip = (unsigned long) ksig->ka.sa.sa_handler; in ia32_setup_frame()
280 /* Make -mregparm=3 work */ in ia32_setup_frame()
281 regs->ax = ksig->sig; in ia32_setup_frame()
282 regs->dx = 0; in ia32_setup_frame()
283 regs->cx = 0; in ia32_setup_frame()
289 regs->ds = __USER_DS; in ia32_setup_frame()
290 regs->es = __USER_DS; in ia32_setup_frame()
293 regs->cs = __USER32_CS; in ia32_setup_frame()
294 regs->ss = __USER_DS; in ia32_setup_frame()
299 return -EFAULT; in ia32_setup_frame()
309 /* unsafe_put_user optimizes that into a single 8 byte store */ in ia32_setup_rt_frame()
325 return -EFAULT; in ia32_setup_rt_frame()
327 unsafe_put_user(ksig->sig, &frame->sig, Efault); in ia32_setup_rt_frame()
328 unsafe_put_user(ptr_to_compat(&frame->info), &frame->pinfo, Efault); in ia32_setup_rt_frame()
329 unsafe_put_user(ptr_to_compat(&frame->uc), &frame->puc, Efault); in ia32_setup_rt_frame()
333 unsafe_put_user(UC_FP_XSTATE, &frame->uc.uc_flags, Efault); in ia32_setup_rt_frame()
335 unsafe_put_user(0, &frame->uc.uc_flags, Efault); in ia32_setup_rt_frame()
336 unsafe_put_user(0, &frame->uc.uc_link, Efault); in ia32_setup_rt_frame()
337 unsafe_save_altstack32(&frame->uc.uc_stack, regs->sp, Efault); in ia32_setup_rt_frame()
339 if (ksig->ka.sa.sa_flags & SA_RESTORER) in ia32_setup_rt_frame()
340 restorer = ksig->ka.sa.sa_restorer; in ia32_setup_rt_frame()
342 restorer = current->mm->context.vdso + in ia32_setup_rt_frame()
344 unsafe_put_user(ptr_to_compat(restorer), &frame->pretcode, Efault); in ia32_setup_rt_frame()
350 unsafe_put_user(*((u64 *)&code), (u64 __user *)frame->retcode, Efault); in ia32_setup_rt_frame()
351 unsafe_put_sigcontext32(&frame->uc.uc_mcontext, fp, regs, set, Efault); in ia32_setup_rt_frame()
352 unsafe_put_user(*(__u64 *)set, (__u64 __user *)&frame->uc.uc_sigmask, Efault); in ia32_setup_rt_frame()
355 if (__copy_siginfo_to_user32(&frame->info, &ksig->info)) in ia32_setup_rt_frame()
356 return -EFAULT; in ia32_setup_rt_frame()
359 regs->sp = (unsigned long) frame; in ia32_setup_rt_frame()
360 regs->ip = (unsigned long) ksig->ka.sa.sa_handler; in ia32_setup_rt_frame()
362 /* Make -mregparm=3 work */ in ia32_setup_rt_frame()
363 regs->ax = ksig->sig; in ia32_setup_rt_frame()
364 regs->dx = (unsigned long) &frame->info; in ia32_setup_rt_frame()
365 regs->cx = (unsigned long) &frame->uc; in ia32_setup_rt_frame()
371 regs->ds = __USER_DS; in ia32_setup_rt_frame()
372 regs->es = __USER_DS; in ia32_setup_rt_frame()
375 regs->cs = __USER32_CS; in ia32_setup_rt_frame()
376 regs->ss = __USER_DS; in ia32_setup_rt_frame()
381 return -EFAULT; in ia32_setup_rt_frame()
389 * (arch-independent) copy_siginfo_to_user() is updated.
391 * It is also easy to put a new member in the siginfo_t
394 * for instance, put a plain 64-bit value in there.
398 * If adding a new si_code, there is probably new data in
414 /* This is a part of the ABI and can never change in alignment */
422 static_assert(offsetof(siginfo32_t, _sifields) == 3 * sizeof(int));
430 * If it does, it is a sign that the
457 CHECK_SI_SIZE (_timer, 3*sizeof(int));
466 CHECK_SI_SIZE (_rt, 3*sizeof(int));
502 CHECK_SI_SIZE (_sigsys, 3*sizeof(int));