Commit 631aa744 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'x86-misc-2022-12-10' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull misc x86 updates from Thomas Gleixner:
 "Updates for miscellaneous x86 areas:

   - Reserve a new boot loader type for barebox which is usally used on
     ARM and MIPS, but can also be utilized as EFI payload on x86 to
     provide watchdog-supervised boot up.

   - Consolidate the native and compat 32bit signal handling code and
     split the 64bit version out into a separate source file

   - Switch the ESPFIX random usage to get_random_long()"

* tag 'x86-misc-2022-12-10' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/espfix: Use get_random_long() rather than archrandom
  x86/signal/64: Move 64-bit signal code to its own file
  x86/signal/32: Merge native and compat 32-bit signal code
  x86/signal: Add ABI prefixes to frame setup functions
  x86/signal: Merge get_sigframe()
  x86: Remove __USER32_DS
  signal/compat: Remove compat_sigset_t override
  x86/signal: Remove sigset_t parameter from frame setup functions
  x86/signal: Remove sig parameter from frame setup functions
  Documentation/x86/boot: Reserve type_of_loader=13 for barebox
parents 0a1d4434 00ed1eab
...@@ -455,6 +455,7 @@ Protocol: 2.00+ ...@@ -455,6 +455,7 @@ Protocol: 2.00+
11 Minimal Linux Bootloader 11 Minimal Linux Bootloader
<http://sebastian-plotz.blogspot.de> <http://sebastian-plotz.blogspot.de>
12 OVMF UEFI virtualization stack 12 OVMF UEFI virtualization stack
13 barebox
== ======================================= == =======================================
Please contact <hpa@zytor.com> if you need a bootloader ID value assigned. Please contact <hpa@zytor.com> if you need a bootloader ID value assigned.
......
...@@ -61,7 +61,7 @@ SYM_CODE_START(entry_SYSENTER_compat) ...@@ -61,7 +61,7 @@ SYM_CODE_START(entry_SYSENTER_compat)
movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp
/* Construct struct pt_regs on stack */ /* Construct struct pt_regs on stack */
pushq $__USER32_DS /* pt_regs->ss */ pushq $__USER_DS /* pt_regs->ss */
pushq $0 /* pt_regs->sp = 0 (placeholder) */ pushq $0 /* pt_regs->sp = 0 (placeholder) */
/* /*
...@@ -197,7 +197,7 @@ SYM_INNER_LABEL(entry_SYSCALL_compat_safe_stack, SYM_L_GLOBAL) ...@@ -197,7 +197,7 @@ SYM_INNER_LABEL(entry_SYSCALL_compat_safe_stack, SYM_L_GLOBAL)
ANNOTATE_NOENDBR ANNOTATE_NOENDBR
/* Construct struct pt_regs on stack */ /* Construct struct pt_regs on stack */
pushq $__USER32_DS /* pt_regs->ss */ pushq $__USER_DS /* pt_regs->ss */
pushq %r8 /* pt_regs->sp */ pushq %r8 /* pt_regs->sp */
pushq %r11 /* pt_regs->flags */ pushq %r11 /* pt_regs->flags */
pushq $__USER32_CS /* pt_regs->cs */ pushq $__USER32_CS /* pt_regs->cs */
......
...@@ -3,7 +3,5 @@ ...@@ -3,7 +3,5 @@
# Makefile for the ia32 kernel emulation subsystem. # Makefile for the ia32 kernel emulation subsystem.
# #
obj-$(CONFIG_IA32_EMULATION) := ia32_signal.o
audit-class-$(CONFIG_AUDIT) := audit.o audit-class-$(CONFIG_AUDIT) := audit.o
obj-$(CONFIG_IA32_EMULATION) += $(audit-class-y) obj-$(CONFIG_IA32_EMULATION) += $(audit-class-y)
...@@ -152,10 +152,6 @@ do { \ ...@@ -152,10 +152,6 @@ do { \
(elf_check_arch_ia32(x) || \ (elf_check_arch_ia32(x) || \
(IS_ENABLED(CONFIG_X86_X32_ABI) && (x)->e_machine == EM_X86_64)) (IS_ENABLED(CONFIG_X86_X32_ABI) && (x)->e_machine == EM_X86_64))
#if __USER32_DS != __USER_DS
# error "The following code assumes __USER32_DS == __USER_DS"
#endif
static inline void elf_common_init(struct thread_struct *t, static inline void elf_common_init(struct thread_struct *t,
struct pt_regs *regs, const u16 ds) struct pt_regs *regs, const u16 ds)
{ {
......
...@@ -13,16 +13,9 @@ ...@@ -13,16 +13,9 @@
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
# include <uapi/asm/sigcontext.h> # include <uapi/asm/sigcontext.h>
# include <asm/user32.h> # include <asm/user32.h>
struct ksignal;
int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
compat_sigset_t *set, struct pt_regs *regs);
int ia32_setup_frame(int sig, struct ksignal *ksig,
compat_sigset_t *set, struct pt_regs *regs);
#else #else
# define user_i387_ia32_struct user_i387_struct # define user_i387_ia32_struct user_i387_struct
# define user32_fxsr_struct user_fxsr_struct # define user32_fxsr_struct user_fxsr_struct
# define ia32_setup_frame __setup_frame
# define ia32_setup_rt_frame __setup_rt_frame
#endif #endif
extern void convert_from_fxsr(struct user_i387_ia32_struct *env, extern void convert_from_fxsr(struct user_i387_ia32_struct *env,
......
...@@ -135,6 +135,7 @@ ...@@ -135,6 +135,7 @@
#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS*8) #define __KERNEL_DS (GDT_ENTRY_KERNEL_DS*8)
#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS*8 + 3) #define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS*8 + 3)
#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8 + 3) #define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8 + 3)
#define __USER32_CS __USER_CS
#define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS*8) #define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS*8)
/* segment for calling fn: */ /* segment for calling fn: */
...@@ -210,7 +211,6 @@ ...@@ -210,7 +211,6 @@
#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS*8) #define __KERNEL_DS (GDT_ENTRY_KERNEL_DS*8)
#define __USER32_CS (GDT_ENTRY_DEFAULT_USER32_CS*8 + 3) #define __USER32_CS (GDT_ENTRY_DEFAULT_USER32_CS*8 + 3)
#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS*8 + 3) #define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS*8 + 3)
#define __USER32_DS __USER_DS
#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8 + 3) #define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS*8 + 3)
#define __CPUNODE_SEG (GDT_ENTRY_CPUNODE*8 + 3) #define __CPUNODE_SEG (GDT_ENTRY_CPUNODE*8 + 3)
......
...@@ -15,4 +15,13 @@ ...@@ -15,4 +15,13 @@
void signal_fault(struct pt_regs *regs, void __user *frame, char *where); void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
void __user *
get_sigframe(struct ksignal *ksig, struct pt_regs *regs, size_t frame_size,
void __user **fpstate);
int ia32_setup_frame(struct ksignal *ksig, struct pt_regs *regs);
int ia32_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs);
int x64_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs);
int x32_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs);
#endif /* _ASM_X86_SIGHANDLING_H */ #endif /* _ASM_X86_SIGHANDLING_H */
...@@ -28,11 +28,6 @@ typedef struct { ...@@ -28,11 +28,6 @@ typedef struct {
#define SA_IA32_ABI 0x02000000u #define SA_IA32_ABI 0x02000000u
#define SA_X32_ABI 0x01000000u #define SA_X32_ABI 0x01000000u
#ifndef CONFIG_COMPAT
#define compat_sigset_t compat_sigset_t
typedef sigset_t compat_sigset_t;
#endif
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#include <uapi/asm/signal.h> #include <uapi/asm/signal.h>
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
......
...@@ -44,7 +44,7 @@ obj-y += head_$(BITS).o ...@@ -44,7 +44,7 @@ obj-y += head_$(BITS).o
obj-y += head$(BITS).o obj-y += head$(BITS).o
obj-y += ebda.o obj-y += ebda.o
obj-y += platform-quirks.o obj-y += platform-quirks.o
obj-y += process_$(BITS).o signal.o obj-y += process_$(BITS).o signal.o signal_$(BITS).o
obj-$(CONFIG_COMPAT) += signal_compat.o obj-$(CONFIG_COMPAT) += signal_compat.o
obj-y += traps.o idt.o irq.o irq_$(BITS).o dumpstack_$(BITS).o obj-y += traps.o idt.o irq.o irq_$(BITS).o dumpstack_$(BITS).o
obj-y += time.o ioport.o dumpstack.o nmi.o obj-y += time.o ioport.o dumpstack.o nmi.o
...@@ -54,7 +54,7 @@ obj-$(CONFIG_JUMP_LABEL) += jump_label.o ...@@ -54,7 +54,7 @@ obj-$(CONFIG_JUMP_LABEL) += jump_label.o
obj-$(CONFIG_IRQ_WORK) += irq_work.o obj-$(CONFIG_IRQ_WORK) += irq_work.o
obj-y += probe_roms.o obj-y += probe_roms.o
obj-$(CONFIG_X86_32) += sys_ia32.o obj-$(CONFIG_X86_32) += sys_ia32.o
obj-$(CONFIG_IA32_EMULATION) += sys_ia32.o obj-$(CONFIG_IA32_EMULATION) += sys_ia32.o signal_32.o
obj-$(CONFIG_X86_64) += sys_x86_64.o obj-$(CONFIG_X86_64) += sys_x86_64.o
obj-$(CONFIG_X86_ESPFIX64) += espfix_64.o obj-$(CONFIG_X86_ESPFIX64) += espfix_64.o
obj-$(CONFIG_SYSFS) += ksysfs.o obj-$(CONFIG_SYSFS) += ksysfs.o
......
...@@ -94,17 +94,7 @@ static inline unsigned long espfix_base_addr(unsigned int cpu) ...@@ -94,17 +94,7 @@ static inline unsigned long espfix_base_addr(unsigned int cpu)
static void init_espfix_random(void) static void init_espfix_random(void)
{ {
unsigned long rand; unsigned long rand = get_random_long();
/*
* This is run before the entropy pools are initialized,
* but this is hopefully better than nothing.
*/
if (!arch_get_random_longs(&rand, 1)) {
/* The constant is an arbitrary large prime */
rand = rdtsc();
rand *= 0xc345c6b72fd16123UL;
}
slot_random = rand % ESPFIX_STACKS_PER_PAGE; slot_random = rand % ESPFIX_STACKS_PER_PAGE;
page_random = (rand / ESPFIX_STACKS_PER_PAGE) page_random = (rand / ESPFIX_STACKS_PER_PAGE)
......
This diff is collapsed.
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
/* /*
* linux/arch/x86_64/ia32/ia32_signal.c
*
* Copyright (C) 1991, 1992 Linus Torvalds * Copyright (C) 1991, 1992 Linus Torvalds
* *
* 1997-11-28 Modified for POSIX.1b signals by Richard Henderson * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson
...@@ -26,7 +24,6 @@ ...@@ -26,7 +24,6 @@
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <asm/fpu/signal.h> #include <asm/fpu/signal.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/ia32_unistd.h>
#include <asm/user32.h> #include <asm/user32.h>
#include <uapi/asm/sigcontext.h> #include <uapi/asm/sigcontext.h>
#include <asm/proto.h> #include <asm/proto.h>
...@@ -35,6 +32,9 @@ ...@@ -35,6 +32,9 @@
#include <asm/sighandling.h> #include <asm/sighandling.h>
#include <asm/smap.h> #include <asm/smap.h>
#ifdef CONFIG_IA32_EMULATION
#include <asm/ia32_unistd.h>
static inline void reload_segments(struct sigcontext_32 *sc) static inline void reload_segments(struct sigcontext_32 *sc)
{ {
unsigned int cur; unsigned int cur;
...@@ -53,6 +53,21 @@ static inline void reload_segments(struct sigcontext_32 *sc) ...@@ -53,6 +53,21 @@ static inline void reload_segments(struct sigcontext_32 *sc)
loadsegment(es, sc->es | 0x03); loadsegment(es, sc->es | 0x03);
} }
#define sigset32_t compat_sigset_t
#define restore_altstack32 compat_restore_altstack
#define unsafe_save_altstack32 unsafe_compat_save_altstack
#else
#define sigset32_t sigset_t
#define __NR_ia32_sigreturn __NR_sigreturn
#define __NR_ia32_rt_sigreturn __NR_rt_sigreturn
#define restore_altstack32 restore_altstack
#define unsafe_save_altstack32 unsafe_save_altstack
#define __copy_siginfo_to_user32 copy_siginfo_to_user
#endif
/* /*
* Do a signal return; undo the signal stack. * Do a signal return; undo the signal stack.
*/ */
...@@ -86,6 +101,7 @@ static bool ia32_restore_sigcontext(struct pt_regs *regs, ...@@ -86,6 +101,7 @@ static bool ia32_restore_sigcontext(struct pt_regs *regs,
/* disable syscall checks */ /* disable syscall checks */
regs->orig_ax = -1; regs->orig_ax = -1;
#ifdef CONFIG_IA32_EMULATION
/* /*
* Reload fs and gs if they have changed in the signal * Reload fs and gs if they have changed in the signal
* handler. This does not handle long fs/gs base changes in * handler. This does not handle long fs/gs base changes in
...@@ -93,10 +109,17 @@ static bool ia32_restore_sigcontext(struct pt_regs *regs, ...@@ -93,10 +109,17 @@ static bool ia32_restore_sigcontext(struct pt_regs *regs,
* normal case. * normal case.
*/ */
reload_segments(&sc); reload_segments(&sc);
#else
loadsegment(gs, sc.gs);
regs->fs = sc.fs;
regs->es = sc.es;
regs->ds = sc.ds;
#endif
return fpu__restore_sig(compat_ptr(sc.fpstate), 1); return fpu__restore_sig(compat_ptr(sc.fpstate), 1);
} }
COMPAT_SYSCALL_DEFINE0(sigreturn) SYSCALL32_DEFINE0(sigreturn)
{ {
struct pt_regs *regs = current_pt_regs(); struct pt_regs *regs = current_pt_regs();
struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8); struct sigframe_ia32 __user *frame = (struct sigframe_ia32 __user *)(regs->sp-8);
...@@ -119,7 +142,7 @@ COMPAT_SYSCALL_DEFINE0(sigreturn) ...@@ -119,7 +142,7 @@ COMPAT_SYSCALL_DEFINE0(sigreturn)
return 0; return 0;
} }
COMPAT_SYSCALL_DEFINE0(rt_sigreturn) SYSCALL32_DEFINE0(rt_sigreturn)
{ {
struct pt_regs *regs = current_pt_regs(); struct pt_regs *regs = current_pt_regs();
struct rt_sigframe_ia32 __user *frame; struct rt_sigframe_ia32 __user *frame;
...@@ -129,7 +152,7 @@ COMPAT_SYSCALL_DEFINE0(rt_sigreturn) ...@@ -129,7 +152,7 @@ COMPAT_SYSCALL_DEFINE0(rt_sigreturn)
if (!access_ok(frame, sizeof(*frame))) if (!access_ok(frame, sizeof(*frame)))
goto badframe; goto badframe;
if (__get_user(set.sig[0], (__u64 __user *)&frame->uc.uc_sigmask)) if (__get_user(*(__u64 *)&set, (__u64 __user *)&frame->uc.uc_sigmask))
goto badframe; goto badframe;
set_current_blocked(&set); set_current_blocked(&set);
...@@ -137,7 +160,7 @@ COMPAT_SYSCALL_DEFINE0(rt_sigreturn) ...@@ -137,7 +160,7 @@ COMPAT_SYSCALL_DEFINE0(rt_sigreturn)
if (!ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext)) if (!ia32_restore_sigcontext(regs, &frame->uc.uc_mcontext))
goto badframe; goto badframe;
if (compat_restore_altstack(&frame->uc.uc_stack)) if (restore_altstack32(&frame->uc.uc_stack))
goto badframe; goto badframe;
return regs->ax; return regs->ax;
...@@ -159,9 +182,15 @@ __unsafe_setup_sigcontext32(struct sigcontext_32 __user *sc, ...@@ -159,9 +182,15 @@ __unsafe_setup_sigcontext32(struct sigcontext_32 __user *sc,
struct pt_regs *regs, unsigned int mask) struct pt_regs *regs, unsigned int mask)
{ {
unsafe_put_user(get_user_seg(gs), (unsigned int __user *)&sc->gs, Efault); unsafe_put_user(get_user_seg(gs), (unsigned int __user *)&sc->gs, Efault);
#ifdef CONFIG_IA32_EMULATION
unsafe_put_user(get_user_seg(fs), (unsigned int __user *)&sc->fs, Efault); unsafe_put_user(get_user_seg(fs), (unsigned int __user *)&sc->fs, Efault);
unsafe_put_user(get_user_seg(ds), (unsigned int __user *)&sc->ds, Efault); unsafe_put_user(get_user_seg(ds), (unsigned int __user *)&sc->ds, Efault);
unsafe_put_user(get_user_seg(es), (unsigned int __user *)&sc->es, Efault); unsafe_put_user(get_user_seg(es), (unsigned int __user *)&sc->es, Efault);
#else
unsafe_put_user(regs->fs, (unsigned int __user *)&sc->fs, Efault);
unsafe_put_user(regs->es, (unsigned int __user *)&sc->es, Efault);
unsafe_put_user(regs->ds, (unsigned int __user *)&sc->ds, Efault);
#endif
unsafe_put_user(regs->di, &sc->di, Efault); unsafe_put_user(regs->di, &sc->di, Efault);
unsafe_put_user(regs->si, &sc->si, Efault); unsafe_put_user(regs->si, &sc->si, Efault);
...@@ -196,43 +225,9 @@ do { \ ...@@ -196,43 +225,9 @@ do { \
goto label; \ goto label; \
} while(0) } while(0)
/* int ia32_setup_frame(struct ksignal *ksig, struct pt_regs *regs)
* Determine which stack to use..
*/
static void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,
size_t frame_size,
void __user **fpstate)
{
unsigned long sp, fx_aligned, math_size;
/* Default to using normal stack */
sp = regs->sp;
/* This is the X/Open sanctioned signal stack switching. */
if (ksig->ka.sa.sa_flags & SA_ONSTACK)
sp = sigsp(sp, ksig);
/* This is the legacy signal stack switching. */
else if (regs->ss != __USER32_DS &&
!(ksig->ka.sa.sa_flags & SA_RESTORER) &&
ksig->ka.sa.sa_restorer)
sp = (unsigned long) ksig->ka.sa.sa_restorer;
sp = fpu__alloc_mathframe(sp, 1, &fx_aligned, &math_size);
*fpstate = (struct _fpstate_32 __user *) sp;
if (!copy_fpstate_to_sigframe(*fpstate, (void __user *)fx_aligned,
math_size))
return (void __user *) -1L;
sp -= frame_size;
/* Align the stack pointer according to the i386 ABI,
* i.e. so that on function entry ((sp + 4) & 15) == 0. */
sp = ((sp + 4) & -16ul) - 4;
return (void __user *) sp;
}
int ia32_setup_frame(int sig, struct ksignal *ksig,
compat_sigset_t *set, struct pt_regs *regs)
{ {
sigset32_t *set = (sigset32_t *) sigmask_to_save();
struct sigframe_ia32 __user *frame; struct sigframe_ia32 __user *frame;
void __user *restorer; void __user *restorer;
void __user *fp = NULL; void __user *fp = NULL;
...@@ -264,7 +259,7 @@ int ia32_setup_frame(int sig, struct ksignal *ksig, ...@@ -264,7 +259,7 @@ int ia32_setup_frame(int sig, struct ksignal *ksig,
if (!user_access_begin(frame, sizeof(*frame))) if (!user_access_begin(frame, sizeof(*frame)))
return -EFAULT; return -EFAULT;
unsafe_put_user(sig, &frame->sig, Efault); unsafe_put_user(ksig->sig, &frame->sig, Efault);
unsafe_put_sigcontext32(&frame->sc, fp, regs, set, Efault); unsafe_put_sigcontext32(&frame->sc, fp, regs, set, Efault);
unsafe_put_user(set->sig[1], &frame->extramask[0], Efault); unsafe_put_user(set->sig[1], &frame->extramask[0], Efault);
unsafe_put_user(ptr_to_compat(restorer), &frame->pretcode, Efault); unsafe_put_user(ptr_to_compat(restorer), &frame->pretcode, Efault);
...@@ -280,15 +275,20 @@ int ia32_setup_frame(int sig, struct ksignal *ksig, ...@@ -280,15 +275,20 @@ int ia32_setup_frame(int sig, struct ksignal *ksig,
regs->ip = (unsigned long) ksig->ka.sa.sa_handler; regs->ip = (unsigned long) ksig->ka.sa.sa_handler;
/* Make -mregparm=3 work */ /* Make -mregparm=3 work */
regs->ax = sig; regs->ax = ksig->sig;
regs->dx = 0; regs->dx = 0;
regs->cx = 0; regs->cx = 0;
loadsegment(ds, __USER32_DS); #ifdef CONFIG_IA32_EMULATION
loadsegment(es, __USER32_DS); loadsegment(ds, __USER_DS);
loadsegment(es, __USER_DS);
#else
regs->ds = __USER_DS;
regs->es = __USER_DS;
#endif
regs->cs = __USER32_CS; regs->cs = __USER32_CS;
regs->ss = __USER32_DS; regs->ss = __USER_DS;
return 0; return 0;
Efault: Efault:
...@@ -296,9 +296,9 @@ int ia32_setup_frame(int sig, struct ksignal *ksig, ...@@ -296,9 +296,9 @@ int ia32_setup_frame(int sig, struct ksignal *ksig,
return -EFAULT; return -EFAULT;
} }
int ia32_setup_rt_frame(int sig, struct ksignal *ksig, int ia32_setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs)
compat_sigset_t *set, struct pt_regs *regs)
{ {
sigset32_t *set = (sigset32_t *) sigmask_to_save();
struct rt_sigframe_ia32 __user *frame; struct rt_sigframe_ia32 __user *frame;
void __user *restorer; void __user *restorer;
void __user *fp = NULL; void __user *fp = NULL;
...@@ -321,7 +321,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig, ...@@ -321,7 +321,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
if (!user_access_begin(frame, sizeof(*frame))) if (!user_access_begin(frame, sizeof(*frame)))
return -EFAULT; return -EFAULT;
unsafe_put_user(sig, &frame->sig, Efault); unsafe_put_user(ksig->sig, &frame->sig, Efault);
unsafe_put_user(ptr_to_compat(&frame->info), &frame->pinfo, Efault); unsafe_put_user(ptr_to_compat(&frame->info), &frame->pinfo, Efault);
unsafe_put_user(ptr_to_compat(&frame->uc), &frame->puc, Efault); unsafe_put_user(ptr_to_compat(&frame->uc), &frame->puc, Efault);
...@@ -331,7 +331,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig, ...@@ -331,7 +331,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
else else
unsafe_put_user(0, &frame->uc.uc_flags, Efault); unsafe_put_user(0, &frame->uc.uc_flags, Efault);
unsafe_put_user(0, &frame->uc.uc_link, Efault); unsafe_put_user(0, &frame->uc.uc_link, Efault);
unsafe_compat_save_altstack(&frame->uc.uc_stack, regs->sp, Efault); unsafe_save_altstack32(&frame->uc.uc_stack, regs->sp, Efault);
if (ksig->ka.sa.sa_flags & SA_RESTORER) if (ksig->ka.sa.sa_flags & SA_RESTORER)
restorer = ksig->ka.sa.sa_restorer; restorer = ksig->ka.sa.sa_restorer;
...@@ -357,15 +357,20 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig, ...@@ -357,15 +357,20 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
regs->ip = (unsigned long) ksig->ka.sa.sa_handler; regs->ip = (unsigned long) ksig->ka.sa.sa_handler;
/* Make -mregparm=3 work */ /* Make -mregparm=3 work */
regs->ax = sig; regs->ax = ksig->sig;
regs->dx = (unsigned long) &frame->info; regs->dx = (unsigned long) &frame->info;
regs->cx = (unsigned long) &frame->uc; regs->cx = (unsigned long) &frame->uc;
loadsegment(ds, __USER32_DS); #ifdef CONFIG_IA32_EMULATION
loadsegment(es, __USER32_DS); loadsegment(ds, __USER_DS);
loadsegment(es, __USER_DS);
#else
regs->ds = __USER_DS;
regs->es = __USER_DS;
#endif
regs->cs = __USER32_CS; regs->cs = __USER32_CS;
regs->ss = __USER32_DS; regs->ss = __USER_DS;
return 0; return 0;
Efault: Efault:
......
This diff is collapsed.
...@@ -262,10 +262,10 @@ SYM_CODE_START(xen_entry_SYSCALL_compat) ...@@ -262,10 +262,10 @@ SYM_CODE_START(xen_entry_SYSCALL_compat)
/* /*
* Neither Xen nor the kernel really knows what the old SS and * Neither Xen nor the kernel really knows what the old SS and
* CS were. The kernel expects __USER32_DS and __USER32_CS, so * CS were. The kernel expects __USER_DS and __USER32_CS, so
* report those values even though Xen will guess its own values. * report those values even though Xen will guess its own values.
*/ */
movq $__USER32_DS, 4*8(%rsp) movq $__USER_DS, 4*8(%rsp)
movq $__USER32_CS, 1*8(%rsp) movq $__USER32_CS, 1*8(%rsp)
jmp entry_SYSCALL_compat_after_hwframe jmp entry_SYSCALL_compat_after_hwframe
...@@ -284,10 +284,10 @@ SYM_CODE_START(xen_entry_SYSENTER_compat) ...@@ -284,10 +284,10 @@ SYM_CODE_START(xen_entry_SYSENTER_compat)
/* /*
* Neither Xen nor the kernel really knows what the old SS and * Neither Xen nor the kernel really knows what the old SS and
* CS were. The kernel expects __USER32_DS and __USER32_CS, so * CS were. The kernel expects __USER_DS and __USER32_CS, so
* report those values even though Xen will guess its own values. * report those values even though Xen will guess its own values.
*/ */
movq $__USER32_DS, 4*8(%rsp) movq $__USER_DS, 4*8(%rsp)
movq $__USER32_CS, 1*8(%rsp) movq $__USER32_CS, 1*8(%rsp)
jmp entry_SYSENTER_compat_after_hwframe jmp entry_SYSENTER_compat_after_hwframe
......
...@@ -126,11 +126,9 @@ struct compat_tms { ...@@ -126,11 +126,9 @@ struct compat_tms {
#define _COMPAT_NSIG_WORDS (_COMPAT_NSIG / _COMPAT_NSIG_BPW) #define _COMPAT_NSIG_WORDS (_COMPAT_NSIG / _COMPAT_NSIG_BPW)
#ifndef compat_sigset_t
typedef struct { typedef struct {
compat_sigset_word sig[_COMPAT_NSIG_WORDS]; compat_sigset_word sig[_COMPAT_NSIG_WORDS];
} compat_sigset_t; } compat_sigset_t;
#endif
int set_compat_user_sigmask(const compat_sigset_t __user *umask, int set_compat_user_sigmask(const compat_sigset_t __user *umask,
size_t sigsetsize); size_t sigsetsize);
......
...@@ -264,6 +264,7 @@ static inline int is_syscall_trace_event(struct trace_event_call *tp_event) ...@@ -264,6 +264,7 @@ static inline int is_syscall_trace_event(struct trace_event_call *tp_event)
#define SC_VAL64(type, name) ((type) name##_hi << 32 | name##_lo) #define SC_VAL64(type, name) ((type) name##_hi << 32 | name##_lo)
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
#define SYSCALL32_DEFINE0 COMPAT_SYSCALL_DEFINE0
#define SYSCALL32_DEFINE1 COMPAT_SYSCALL_DEFINE1 #define SYSCALL32_DEFINE1 COMPAT_SYSCALL_DEFINE1
#define SYSCALL32_DEFINE2 COMPAT_SYSCALL_DEFINE2 #define SYSCALL32_DEFINE2 COMPAT_SYSCALL_DEFINE2
#define SYSCALL32_DEFINE3 COMPAT_SYSCALL_DEFINE3 #define SYSCALL32_DEFINE3 COMPAT_SYSCALL_DEFINE3
...@@ -271,6 +272,7 @@ static inline int is_syscall_trace_event(struct trace_event_call *tp_event) ...@@ -271,6 +272,7 @@ static inline int is_syscall_trace_event(struct trace_event_call *tp_event)
#define SYSCALL32_DEFINE5 COMPAT_SYSCALL_DEFINE5 #define SYSCALL32_DEFINE5 COMPAT_SYSCALL_DEFINE5
#define SYSCALL32_DEFINE6 COMPAT_SYSCALL_DEFINE6 #define SYSCALL32_DEFINE6 COMPAT_SYSCALL_DEFINE6
#else #else
#define SYSCALL32_DEFINE0 SYSCALL_DEFINE0
#define SYSCALL32_DEFINE1 SYSCALL_DEFINE1 #define SYSCALL32_DEFINE1 SYSCALL_DEFINE1
#define SYSCALL32_DEFINE2 SYSCALL_DEFINE2 #define SYSCALL32_DEFINE2 SYSCALL_DEFINE2
#define SYSCALL32_DEFINE3 SYSCALL_DEFINE3 #define SYSCALL32_DEFINE3 SYSCALL_DEFINE3
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment