···302302extern void maybe_sigio_broken(int fd, int read);303303extern void sigio_broken(int fd, int read);304304305305-/* sys-x86_64/prctl.c */306306-extern int os_arch_prctl(int pid, int code, unsigned long *addr);305305+/* prctl.c */306306+extern int os_arch_prctl(int pid, int option, unsigned long *arg2);307307308308/* tty.c */309309extern int get_pty(void);
···888888extern int get_tsc_mode(unsigned long adr);889889extern int set_tsc_mode(unsigned int val);890890891891+DECLARE_PER_CPU(u64, msr_misc_features_shadow);892892+891893/* Register/unregister a process' MPX related resource */892894#define MPX_ENABLE_MANAGEMENT() mpx_enable_management()893895#define MPX_DISABLE_MANAGEMENT() mpx_disable_management()
+3-1
arch/x86/include/asm/proto.h
···991010#ifdef CONFIG_X86_641111void entry_SYSCALL_64(void);1212+long do_arch_prctl_64(struct task_struct *task, int option, unsigned long arg2);1213#endif13141415#ifdef CONFIG_X86_32···31303231extern int reboot_force;33323434-long do_arch_prctl(struct task_struct *task, int code, unsigned long addr);3333+long do_arch_prctl_common(struct task_struct *task, int option,3434+ unsigned long cpuid_enabled);35353636#endif /* _ASM_X86_PROTO_H */
+5-1
arch/x86/include/asm/thread_info.h
···8787#define TIF_SECCOMP 8 /* secure computing */8888#define TIF_USER_RETURN_NOTIFY 11 /* notify kernel of userspace return */8989#define TIF_UPROBE 12 /* breakpointed or singlestepping */9090+#define TIF_NOCPUID 15 /* CPUID is not accessible in userland */9091#define TIF_NOTSC 16 /* TSC is not accessible in userland */9192#define TIF_IA32 17 /* IA32 compatibility process */9293#define TIF_NOHZ 19 /* in adaptive nohz mode */···111110#define _TIF_SECCOMP (1 << TIF_SECCOMP)112111#define _TIF_USER_RETURN_NOTIFY (1 << TIF_USER_RETURN_NOTIFY)113112#define _TIF_UPROBE (1 << TIF_UPROBE)113113+#define _TIF_NOCPUID (1 << TIF_NOCPUID)114114#define _TIF_NOTSC (1 << TIF_NOTSC)115115#define _TIF_IA32 (1 << TIF_IA32)116116#define _TIF_NOHZ (1 << TIF_NOHZ)···140138141139/* flags to check in __switch_to() */142140#define _TIF_WORK_CTXSW \143143- (_TIF_IO_BITMAP|_TIF_NOTSC|_TIF_BLOCKSTEP)141141+ (_TIF_IO_BITMAP|_TIF_NOCPUID|_TIF_NOTSC|_TIF_BLOCKSTEP)144142145143#define _TIF_WORK_CTXSW_PREV (_TIF_WORK_CTXSW|_TIF_USER_RETURN_NOTIFY)146144#define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW)···241239extern void arch_task_cache_init(void);242240extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src);243241extern void arch_release_task_struct(struct task_struct *tsk);242242+extern void arch_setup_new_exec(void);243243+#define arch_setup_new_exec arch_setup_new_exec244244#endif /* !__ASSEMBLY__ */245245246246#endif /* _ASM_X86_THREAD_INFO_H */
+10
arch/x86/include/asm/tlbflush.h
···110110 }111111}112112113113+static inline void cr4_toggle_bits(unsigned long mask)114114+{115115+ unsigned long cr4;116116+117117+ cr4 = this_cpu_read(cpu_tlbstate.cr4);118118+ cr4 ^= mask;119119+ this_cpu_write(cpu_tlbstate.cr4, cr4);120120+ __write_cr4(cr4);121121+}122122+113123/* Read the CR4 shadow. */114124static inline unsigned long cr4_read_shadow(void)115125{
···3737#include <linux/uaccess.h>3838#include <linux/io.h>3939#include <linux/ftrace.h>4040+#include <linux/syscalls.h>40414142#include <asm/pgtable.h>4243#include <asm/processor.h>···205204 (struct user_desc __user *)tls, 0);206205 else207206#endif208208- err = do_arch_prctl(p, ARCH_SET_FS, tls);207207+ err = do_arch_prctl_64(p, ARCH_SET_FS, tls);209208 if (err)210209 goto out;211210 }···548547}549548#endif550549551551-long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)550550+long do_arch_prctl_64(struct task_struct *task, int option, unsigned long arg2)552551{553552 int ret = 0;554553 int doit = task == current;555554 int cpu;556555557557- switch (code) {556556+ switch (option) {558557 case ARCH_SET_GS:559559- if (addr >= TASK_SIZE_MAX)558558+ if (arg2 >= TASK_SIZE_MAX)560559 return -EPERM;561560 cpu = get_cpu();562561 task->thread.gsindex = 0;563563- task->thread.gsbase = addr;562562+ task->thread.gsbase = arg2;564563 if (doit) {565564 load_gs_index(0);566566- ret = wrmsrl_safe(MSR_KERNEL_GS_BASE, addr);565565+ ret = wrmsrl_safe(MSR_KERNEL_GS_BASE, arg2);567566 }568567 put_cpu();569568 break;570569 case ARCH_SET_FS:571570 /* Not strictly needed for fs, but do it for symmetry572571 with gs */573573- if (addr >= TASK_SIZE_MAX)572572+ if (arg2 >= TASK_SIZE_MAX)574573 return -EPERM;575574 cpu = get_cpu();576575 task->thread.fsindex = 0;577577- task->thread.fsbase = addr;576576+ task->thread.fsbase = arg2;578577 if (doit) {579578 /* set the selector to 0 to not confuse __switch_to */580579 loadsegment(fs, 0);581581- ret = wrmsrl_safe(MSR_FS_BASE, addr);580580+ ret = wrmsrl_safe(MSR_FS_BASE, arg2);582581 }583582 put_cpu();584583 break;585584 case ARCH_GET_FS: {586585 unsigned long base;586586+587587 if (doit)588588 rdmsrl(MSR_FS_BASE, base);589589 else590590 base = task->thread.fsbase;591591- ret = put_user(base, (unsigned long __user *)addr);591591+ ret = put_user(base, (unsigned long __user *)arg2);592592 break;593593 }594594 case ARCH_GET_GS: {595595 unsigned long base;596596+596597 if (doit)597598 rdmsrl(MSR_KERNEL_GS_BASE, base);598599 else599600 base = task->thread.gsbase;600600- ret = put_user(base, (unsigned long __user *)addr);601601+ ret = put_user(base, (unsigned long __user *)arg2);601602 break;602603 }603604604605#ifdef CONFIG_CHECKPOINT_RESTORE605606# ifdef CONFIG_X86_X32_ABI606607 case ARCH_MAP_VDSO_X32:607607- return prctl_map_vdso(&vdso_image_x32, addr);608608+ return prctl_map_vdso(&vdso_image_x32, arg2);608609# endif609610# if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION610611 case ARCH_MAP_VDSO_32:611611- return prctl_map_vdso(&vdso_image_32, addr);612612+ return prctl_map_vdso(&vdso_image_32, arg2);612613# endif613614 case ARCH_MAP_VDSO_64:614614- return prctl_map_vdso(&vdso_image_64, addr);615615+ return prctl_map_vdso(&vdso_image_64, arg2);615616#endif616617617618 default:···624621 return ret;625622}626623627627-long sys_arch_prctl(int code, unsigned long addr)624624+SYSCALL_DEFINE2(arch_prctl, int, option, unsigned long, arg2)628625{629629- return do_arch_prctl(current, code, addr);626626+ long ret;627627+628628+ ret = do_arch_prctl_64(current, option, arg2);629629+ if (ret == -EINVAL)630630+ ret = do_arch_prctl_common(current, option, arg2);631631+632632+ return ret;630633}634634+635635+#ifdef CONFIG_IA32_EMULATION636636+COMPAT_SYSCALL_DEFINE2(arch_prctl, int, option, unsigned long, arg2)637637+{638638+ return do_arch_prctl_common(current, option, arg2);639639+}640640+#endif631641632642unsigned long KSTK_ESP(struct task_struct *task)633643{
+4-4
arch/x86/kernel/ptrace.c
···396396 if (value >= TASK_SIZE_MAX)397397 return -EIO;398398 /*399399- * When changing the segment base, use do_arch_prctl399399+ * When changing the segment base, use do_arch_prctl_64400400 * to set either thread.fs or thread.fsindex and the401401 * corresponding GDT slot.402402 */403403 if (child->thread.fsbase != value)404404- return do_arch_prctl(child, ARCH_SET_FS, value);404404+ return do_arch_prctl_64(child, ARCH_SET_FS, value);405405 return 0;406406 case offsetof(struct user_regs_struct,gs_base):407407 /*···410410 if (value >= TASK_SIZE_MAX)411411 return -EIO;412412 if (child->thread.gsbase != value)413413- return do_arch_prctl(child, ARCH_SET_GS, value);413413+ return do_arch_prctl_64(child, ARCH_SET_GS, value);414414 return 0;415415#endif416416 }···869869 Works just like arch_prctl, except that the arguments870870 are reversed. */871871 case PTRACE_ARCH_PRCTL:872872- ret = do_arch_prctl(child, data, addr);872872+ ret = do_arch_prctl_64(child, data, addr);873873 break;874874#endif875875
···7878 return -ENOSYS;7979}80808181-extern long arch_prctl(struct task_struct *task, int code,8181+extern long arch_prctl(struct task_struct *task, int option,8282 unsigned long __user *addr);83838484#endif
+2-2
arch/x86/um/os-Linux/prctl.c
···66#include <sys/ptrace.h>77#include <asm/ptrace.h>8899-int os_arch_prctl(int pid, int code, unsigned long *addr)99+int os_arch_prctl(int pid, int option, unsigned long *arg2)1010{1111- return ptrace(PTRACE_ARCH_PRCTL, pid, (unsigned long) addr, code);1111+ return ptrace(PTRACE_ARCH_PRCTL, pid, (unsigned long) arg2, option);1212}
···7788#include <linux/sched.h>99#include <linux/sched/mm.h>1010+#include <linux/syscalls.h>1011#include <linux/uaccess.h>1112#include <asm/prctl.h> /* XXX This should get the constants from libc */1213#include <os.h>13141414-long arch_prctl(struct task_struct *task, int code, unsigned long __user *addr)1515+long arch_prctl(struct task_struct *task, int option,1616+ unsigned long __user *arg2)1517{1616- unsigned long *ptr = addr, tmp;1818+ unsigned long *ptr = arg2, tmp;1719 long ret;1820 int pid = task->mm->context.id.u.pid;1921···3230 * arch_prctl is run on the host, then the registers are read3331 * back.3432 */3535- switch (code) {3333+ switch (option) {3634 case ARCH_SET_FS:3735 case ARCH_SET_GS:3836 ret = restore_registers(pid, ¤t->thread.regs.regs);···5250 ptr = &tmp;5351 }54525555- ret = os_arch_prctl(pid, code, ptr);5353+ ret = os_arch_prctl(pid, option, ptr);5654 if (ret)5755 return ret;58565959- switch (code) {5757+ switch (option) {6058 case ARCH_SET_FS:6159 current->thread.arch.fs = (unsigned long) ptr;6260 ret = save_registers(pid, ¤t->thread.regs.regs);···6563 ret = save_registers(pid, ¤t->thread.regs.regs);6664 break;6765 case ARCH_GET_FS:6868- ret = put_user(tmp, addr);6666+ ret = put_user(tmp, arg2);6967 break;7068 case ARCH_GET_GS:7171- ret = put_user(tmp, addr);6969+ ret = put_user(tmp, arg2);7270 break;7371 }74727573 return ret;7674}77757878-long sys_arch_prctl(int code, unsigned long addr)7676+SYSCALL_DEFINE2(arch_prctl, int, option, unsigned long, arg2)7977{8080- return arch_prctl(current, code, (unsigned long __user *) addr);7878+ return arch_prctl(current, option, (unsigned long __user *) arg2);8179}82808381void arch_switch_to(struct task_struct *to)
···723723asmlinkage long compat_sys_fanotify_mark(int, unsigned int, __u32, __u32,724724 int, const char __user *);725725726726+asmlinkage long compat_sys_arch_prctl(int option, unsigned long arg2);727727+726728/*727729 * For most but not all architectures, "am I in a compat syscall?" and728730 * "am I a compat task?" are the same question. For architectures on which