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
38 * and 1 of a segment selector, i.e., the RPL bits, are NOT used to index
39 * GDT, selector values 0~3 all point to the NULL descriptor, thus values
40 * 0, 1, 2 and 3 are all valid NULL selector values.
44 * userspace in pre-FRED systems to spot any interrupt/exception by loading
45 * a nonzero NULL selector and waiting for it to become zero. Before FRED
52 * As such, leave NULL selector values 0~3 unchanged.
56 return sel <= 3 ? sel : sel | 3; in fixup_rpl()
73 if (fixup_rpl(sc->gs) != cur) in reload_segments()
74 load_gs_index(fixup_rpl(sc->gs)); in reload_segments()
76 if (fixup_rpl(sc->fs) != cur) in reload_segments()
77 loadsegment(fs, fixup_rpl(sc->fs)); in reload_segments()
80 if (fixup_rpl(sc->ds) != cur) in reload_segments()
81 loadsegment(ds, fixup_rpl(sc->ds)); in reload_segments()
83 if (fixup_rpl(sc->es) != cur) in reload_segments()
84 loadsegment(es, fixup_rpl(sc->es)); in reload_segments()
105 * Do a signal return; undo the signal stack.
112 /* Always make any pending restarted system calls return -EINTR */ in ia32_restore_sigcontext()
113 current->restart_block.fn = do_no_restart_syscall; in ia32_restore_sigcontext()
118 /* Get only the ia32 registers. */ in ia32_restore_sigcontext()
119 regs->bx = sc.bx; in ia32_restore_sigcontext()
120 regs->cx = sc.cx; in ia32_restore_sigcontext()
121 regs->dx = sc.dx; in ia32_restore_sigcontext()
122 regs->si = sc.si; in ia32_restore_sigcontext()
123 regs->di = sc.di; in ia32_restore_sigcontext()
124 regs->bp = sc.bp; in ia32_restore_sigcontext()
125 regs->ax = sc.ax; in ia32_restore_sigcontext()
126 regs->sp = sc.sp; in ia32_restore_sigcontext()
127 regs->ip = sc.ip; in ia32_restore_sigcontext()
130 regs->cs = sc.cs | 0x03; in ia32_restore_sigcontext()
131 regs->ss = sc.ss | 0x03; in ia32_restore_sigcontext()
133 regs->flags = (regs->flags & ~FIX_EFLAGS) | (sc.flags & FIX_EFLAGS); in ia32_restore_sigcontext()
135 regs->orig_ax = -1; in ia32_restore_sigcontext()
141 regs->fs = fixup_rpl(sc.fs); in ia32_restore_sigcontext()
142 regs->es = fixup_rpl(sc.es); in ia32_restore_sigcontext()
143 regs->ds = fixup_rpl(sc.ds); in ia32_restore_sigcontext()
152 struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8); in SYSCALL32_DEFINE0()
157 if (__get_user(set.sig[0], &frame->sc.oldmask) in SYSCALL32_DEFINE0()
158 || __get_user(((__u32 *)&set)[1], &frame->extramask[0])) in SYSCALL32_DEFINE0()
163 if (!ia32_restore_sigcontext(regs, &frame->sc)) in SYSCALL32_DEFINE0()
165 return regs->ax; in SYSCALL32_DEFINE0()
178 frame = (struct rt_sigframe_ia32 __user *)(regs->sp - 4); in SYSCALL32_DEFINE0()
182 if (__get_user(*(__u64 *)&set, (__u64 __user *)&frame->uc.uc_sigmask)) in SYSCALL32_DEFINE0()
187 if (!ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext)) in SYSCALL32_DEFINE0()
190 if (restore_altstack32(&frame->uc.uc_stack)) in SYSCALL32_DEFINE0()
193 return regs->ax; in SYSCALL32_DEFINE0()
201 * Set up a signal frame.
211 unsafe_put_user(get_user_seg(gs), (unsigned int __user *)&sc->gs, Efault); in __unsafe_setup_sigcontext32()
213 unsafe_put_user(get_user_seg(fs), (unsigned int __user *)&sc->fs, Efault); in __unsafe_setup_sigcontext32()
214 unsafe_put_user(get_user_seg(ds), (unsigned int __user *)&sc->ds, Efault); in __unsafe_setup_sigcontext32()
215 unsafe_put_user(get_user_seg(es), (unsigned int __user *)&sc->es, Efault); in __unsafe_setup_sigcontext32()
217 unsafe_put_user(regs->fs, (unsigned int __user *)&sc->fs, Efault); in __unsafe_setup_sigcontext32()
218 unsafe_put_user(regs->es, (unsigned int __user *)&sc->es, Efault); in __unsafe_setup_sigcontext32()
219 unsafe_put_user(regs->ds, (unsigned int __user *)&sc->ds, Efault); in __unsafe_setup_sigcontext32()
222 unsafe_put_user(regs->di, &sc->di, Efault); in __unsafe_setup_sigcontext32()
223 unsafe_put_user(regs->si, &sc->si, Efault); in __unsafe_setup_sigcontext32()
224 unsafe_put_user(regs->bp, &sc->bp, Efault); in __unsafe_setup_sigcontext32()
225 unsafe_put_user(regs->sp, &sc->sp, Efault); in __unsafe_setup_sigcontext32()
226 unsafe_put_user(regs->bx, &sc->bx, Efault); in __unsafe_setup_sigcontext32()
227 unsafe_put_user(regs->dx, &sc->dx, Efault); in __unsafe_setup_sigcontext32()
228 unsafe_put_user(regs->cx, &sc->cx, Efault); in __unsafe_setup_sigcontext32()
229 unsafe_put_user(regs->ax, &sc->ax, Efault); in __unsafe_setup_sigcontext32()
230 unsafe_put_user(current->thread.trap_nr, &sc->trapno, Efault); in __unsafe_setup_sigcontext32()
231 unsafe_put_user(current->thread.error_code, &sc->err, Efault); in __unsafe_setup_sigcontext32()
232 unsafe_put_user(regs->ip, &sc->ip, Efault); in __unsafe_setup_sigcontext32()
233 unsafe_put_user(regs->cs, (unsigned int __user *)&sc->cs, Efault); in __unsafe_setup_sigcontext32()
234 unsafe_put_user(regs->flags, &sc->flags, Efault); in __unsafe_setup_sigcontext32()
235 unsafe_put_user(regs->sp, &sc->sp_at_signal, Efault); in __unsafe_setup_sigcontext32()
236 unsafe_put_user(regs->ss, (unsigned int __user *)&sc->ss, Efault); in __unsafe_setup_sigcontext32()
238 unsafe_put_user(ptr_to_compat(fpstate), &sc->fpstate, Efault); in __unsafe_setup_sigcontext32()
240 /* non-iBCS2 extensions.. */ in __unsafe_setup_sigcontext32()
241 unsafe_put_user(mask, &sc->oldmask, Efault); in __unsafe_setup_sigcontext32()
242 unsafe_put_user(current->thread.cr2, &sc->cr2, Efault); in __unsafe_setup_sigcontext32()
246 return -EFAULT; in __unsafe_setup_sigcontext32()
251 if (__unsafe_setup_sigcontext32(sc, fp, regs, set->sig[0])) \
262 /* copy_to_user optimizes that into a single 8 byte store */ in ia32_setup_frame()
275 if (ksig->ka.sa.sa_flags & SA_RESTORER) { in ia32_setup_frame()
276 restorer = ksig->ka.sa.sa_restorer; in ia32_setup_frame()
279 if (current->mm->context.vdso) in ia32_setup_frame()
280 restorer = current->mm->context.vdso + in ia32_setup_frame()
283 restorer = &frame->retcode; in ia32_setup_frame()
287 return -EFAULT; in ia32_setup_frame()
289 unsafe_put_user(ksig->sig, &frame->sig, Efault); in ia32_setup_frame()
290 unsafe_put_sigcontext32(&frame->sc, fp, regs, set, Efault); in ia32_setup_frame()
291 unsafe_put_user(set->sig[1], &frame->extramask[0], Efault); in ia32_setup_frame()
292 unsafe_put_user(ptr_to_compat(restorer), &frame->pretcode, Efault); in ia32_setup_frame()
295 * gdb versions depend on them as a marker. in ia32_setup_frame()
297 unsafe_put_user(*((u64 *)&code), (u64 __user *)frame->retcode, Efault); in ia32_setup_frame()
301 regs->sp = (unsigned long) frame; in ia32_setup_frame()
302 regs->ip = (unsigned long) ksig->ka.sa.sa_handler; in ia32_setup_frame()
304 /* Make -mregparm=3 work */ in ia32_setup_frame()
305 regs->ax = ksig->sig; in ia32_setup_frame()
306 regs->dx = 0; in ia32_setup_frame()
307 regs->cx = 0; in ia32_setup_frame()
313 regs->ds = __USER_DS; in ia32_setup_frame()
314 regs->es = __USER_DS; in ia32_setup_frame()
317 regs->cs = __USER32_CS; in ia32_setup_frame()
318 regs->ss = __USER_DS; in ia32_setup_frame()
323 return -EFAULT; in ia32_setup_frame()
333 /* unsafe_put_user optimizes that into a single 8 byte store */ in ia32_setup_rt_frame()
349 return -EFAULT; in ia32_setup_rt_frame()
351 unsafe_put_user(ksig->sig, &frame->sig, Efault); in ia32_setup_rt_frame()
352 unsafe_put_user(ptr_to_compat(&frame->info), &frame->pinfo, Efault); in ia32_setup_rt_frame()
353 unsafe_put_user(ptr_to_compat(&frame->uc), &frame->puc, Efault); in ia32_setup_rt_frame()
357 unsafe_put_user(UC_FP_XSTATE, &frame->uc.uc_flags, Efault); in ia32_setup_rt_frame()
359 unsafe_put_user(0, &frame->uc.uc_flags, Efault); in ia32_setup_rt_frame()
360 unsafe_put_user(0, &frame->uc.uc_link, Efault); in ia32_setup_rt_frame()
361 unsafe_save_altstack32(&frame->uc.uc_stack, regs->sp, Efault); in ia32_setup_rt_frame()
363 if (ksig->ka.sa.sa_flags & SA_RESTORER) in ia32_setup_rt_frame()
364 restorer = ksig->ka.sa.sa_restorer; in ia32_setup_rt_frame()
366 restorer = current->mm->context.vdso + in ia32_setup_rt_frame()
368 unsafe_put_user(ptr_to_compat(restorer), &frame->pretcode, Efault); in ia32_setup_rt_frame()
374 unsafe_put_user(*((u64 *)&code), (u64 __user *)frame->retcode, Efault); in ia32_setup_rt_frame()
375 unsafe_put_sigcontext32(&frame->uc.uc_mcontext, fp, regs, set, Efault); in ia32_setup_rt_frame()
376 unsafe_put_user(*(__u64 *)set, (__u64 __user *)&frame->uc.uc_sigmask, Efault); in ia32_setup_rt_frame()
379 if (__copy_siginfo_to_user32(&frame->info, &ksig->info)) in ia32_setup_rt_frame()
380 return -EFAULT; in ia32_setup_rt_frame()
383 regs->sp = (unsigned long) frame; in ia32_setup_rt_frame()
384 regs->ip = (unsigned long) ksig->ka.sa.sa_handler; in ia32_setup_rt_frame()
386 /* Make -mregparm=3 work */ in ia32_setup_rt_frame()
387 regs->ax = ksig->sig; in ia32_setup_rt_frame()
388 regs->dx = (unsigned long) &frame->info; in ia32_setup_rt_frame()
389 regs->cx = (unsigned long) &frame->uc; in ia32_setup_rt_frame()
395 regs->ds = __USER_DS; in ia32_setup_rt_frame()
396 regs->es = __USER_DS; in ia32_setup_rt_frame()
399 regs->cs = __USER32_CS; in ia32_setup_rt_frame()
400 regs->ss = __USER_DS; in ia32_setup_rt_frame()
405 return -EFAULT; in ia32_setup_rt_frame()
413 * (arch-independent) copy_siginfo_to_user() is updated.
415 * It is also easy to put a new member in the siginfo_t
418 * for instance, put a plain 64-bit value in there.
422 * If adding a new si_code, there is probably new data in
438 /* This is a part of the ABI and can never change in alignment */
446 static_assert(offsetof(siginfo32_t, _sifields) == 3 * sizeof(int));
454 * If it does, it is a sign that the
481 CHECK_SI_SIZE (_timer, 3*sizeof(int));
490 CHECK_SI_SIZE (_rt, 3*sizeof(int));
526 CHECK_SI_SIZE (_sigsys, 3*sizeof(int));