Commit 405f868f authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'x86_cleanups_for_v5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull x86 cleanups from Borislav Petkov:
 "Another branch with a nicely negative diffstat, just the way I
  like 'em:

   - Remove all uses of TIF_IA32 and TIF_X32 and reclaim the two bits in
     the end (Gabriel Krisman Bertazi)

   - All kinds of minor cleanups all over the tree"

* tag 'x86_cleanups_for_v5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (24 commits)
  x86/ia32_signal: Propagate __user annotation properly
  x86/alternative: Update text_poke_bp() kernel-doc comment
  x86/PCI: Make a kernel-doc comment a normal one
  x86/asm: Drop unused RDPID macro
  x86/boot/compressed/64: Use TEST %reg,%reg instead of CMP $0,%reg
  x86/head64: Remove duplicate include
  x86/mm: Declare 'start' variable where it is used
  x86/head/64: Remove unused GET_CR2_INTO() macro
  x86/boot: Remove unused finalize_identity_maps()
  x86/uaccess: Document copy_from_user_nmi()
  x86/dumpstack: Make show_trace_log_lvl() static
  x86/mtrr: Fix a kernel-doc markup
  x86/setup: Remove unused MCA variables
  x86, libnvdimm/test: Remove COPY_MC_TEST
  x86: Reclaim TIF_IA32 and TIF_X32
  x86/mm: Convert mmu context ia32_compat into a proper flags field
  x86/elf: Use e_machine to check for x32/ia32 in setup_additional_pages()
  elf: Expose ELF header on arch_setup_additional_pages()
  x86/elf: Use e_machine to select start_thread for x32
  elf: Expose ELF header in compat_start_thread()
  ...
parents 54d79483 9a02fd8b
...@@ -62,9 +62,6 @@ config EARLY_PRINTK_USB_XDBC ...@@ -62,9 +62,6 @@ config EARLY_PRINTK_USB_XDBC
You should normally say N here, unless you want to debug early You should normally say N here, unless you want to debug early
crashes or need a very simple printk logging facility. crashes or need a very simple printk logging facility.
config COPY_MC_TEST
def_bool n
config EFI_PGT_DUMP config EFI_PGT_DUMP
bool "Dump the EFI pagetable" bool "Dump the EFI pagetable"
depends on EFI depends on EFI
......
...@@ -241,12 +241,12 @@ SYM_FUNC_START(startup_32) ...@@ -241,12 +241,12 @@ SYM_FUNC_START(startup_32)
leal rva(startup_64)(%ebp), %eax leal rva(startup_64)(%ebp), %eax
#ifdef CONFIG_EFI_MIXED #ifdef CONFIG_EFI_MIXED
movl rva(efi32_boot_args)(%ebp), %edi movl rva(efi32_boot_args)(%ebp), %edi
cmp $0, %edi testl %edi, %edi
jz 1f jz 1f
leal rva(efi64_stub_entry)(%ebp), %eax leal rva(efi64_stub_entry)(%ebp), %eax
movl rva(efi32_boot_args+4)(%ebp), %esi movl rva(efi32_boot_args+4)(%ebp), %esi
movl rva(efi32_boot_args+8)(%ebp), %edx // saved bootparams pointer movl rva(efi32_boot_args+8)(%ebp), %edx // saved bootparams pointer
cmpl $0, %edx testl %edx, %edx
jnz 1f jnz 1f
/* /*
* efi_pe_entry uses MS calling convention, which requires 32 bytes of * efi_pe_entry uses MS calling convention, which requires 32 bytes of
...@@ -592,7 +592,7 @@ SYM_CODE_START(trampoline_32bit_src) ...@@ -592,7 +592,7 @@ SYM_CODE_START(trampoline_32bit_src)
movl %eax, %cr0 movl %eax, %cr0
/* Check what paging mode we want to be in after the trampoline */ /* Check what paging mode we want to be in after the trampoline */
cmpl $0, %edx testl %edx, %edx
jz 1f jz 1f
/* We want 5-level paging: don't touch CR3 if it already points to 5-level page tables */ /* We want 5-level paging: don't touch CR3 if it already points to 5-level page tables */
...@@ -622,7 +622,7 @@ SYM_CODE_START(trampoline_32bit_src) ...@@ -622,7 +622,7 @@ SYM_CODE_START(trampoline_32bit_src)
/* Enable PAE and LA57 (if required) paging modes */ /* Enable PAE and LA57 (if required) paging modes */
movl $X86_CR4_PAE, %eax movl $X86_CR4_PAE, %eax
cmpl $0, %edx testl %edx, %edx
jz 1f jz 1f
orl $X86_CR4_LA57, %eax orl $X86_CR4_LA57, %eax
1: 1:
......
...@@ -168,16 +168,6 @@ void initialize_identity_maps(void *rmode) ...@@ -168,16 +168,6 @@ void initialize_identity_maps(void *rmode)
write_cr3(top_level_pgt); write_cr3(top_level_pgt);
} }
/*
* This switches the page tables to the new level4 that has been built
* via calls to add_identity_map() above. If booted via startup_32(),
* this is effectively a no-op.
*/
void finalize_identity_maps(void)
{
write_cr3(top_level_pgt);
}
static pte_t *split_large_pmd(struct x86_mapping_info *info, static pte_t *split_large_pmd(struct x86_mapping_info *info,
pmd_t *pmdp, unsigned long __address) pmd_t *pmdp, unsigned long __address)
{ {
......
...@@ -413,10 +413,10 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) ...@@ -413,10 +413,10 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
int compat_arch_setup_additional_pages(struct linux_binprm *bprm, int compat_arch_setup_additional_pages(struct linux_binprm *bprm,
int uses_interp) int uses_interp, bool x32)
{ {
#ifdef CONFIG_X86_X32_ABI #ifdef CONFIG_X86_X32_ABI
if (test_thread_flag(TIF_X32)) { if (x32) {
if (!vdso64_enabled) if (!vdso64_enabled)
return 0; return 0;
return map_vdso_randomized(&vdso_image_x32); return map_vdso_randomized(&vdso_image_x32);
......
...@@ -316,7 +316,7 @@ static struct vm_area_struct gate_vma __ro_after_init = { ...@@ -316,7 +316,7 @@ static struct vm_area_struct gate_vma __ro_after_init = {
struct vm_area_struct *get_gate_vma(struct mm_struct *mm) struct vm_area_struct *get_gate_vma(struct mm_struct *mm)
{ {
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
if (!mm || mm->context.ia32_compat) if (!mm || !(mm->context.flags & MM_CONTEXT_HAS_VSYSCALL))
return NULL; return NULL;
#endif #endif
if (vsyscall_mode == NONE) if (vsyscall_mode == NONE)
......
...@@ -2602,7 +2602,7 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent ...@@ -2602,7 +2602,7 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent
struct stack_frame_ia32 frame; struct stack_frame_ia32 frame;
const struct stack_frame_ia32 __user *fp; const struct stack_frame_ia32 __user *fp;
if (!test_thread_flag(TIF_IA32)) if (user_64bit_mode(regs))
return 0; return 0;
cs_base = get_segment_base(regs->cs); cs_base = get_segment_base(regs->cs);
......
...@@ -1261,7 +1261,7 @@ static int intel_pmu_pebs_fixup_ip(struct pt_regs *regs) ...@@ -1261,7 +1261,7 @@ static int intel_pmu_pebs_fixup_ip(struct pt_regs *regs)
old_to = to; old_to = to;
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
is_64bit = kernel_ip(to) || !test_thread_flag(TIF_IA32); is_64bit = kernel_ip(to) || any_64bit_mode(regs);
#endif #endif
insn_init(&insn, kaddr, size, is_64bit); insn_init(&insn, kaddr, size, is_64bit);
insn_get_length(&insn); insn_get_length(&insn);
......
...@@ -1221,7 +1221,7 @@ static int branch_type(unsigned long from, unsigned long to, int abort) ...@@ -1221,7 +1221,7 @@ static int branch_type(unsigned long from, unsigned long to, int abort)
* on 64-bit systems running 32-bit apps * on 64-bit systems running 32-bit apps
*/ */
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
is64 = kernel_ip((unsigned long)addr) || !test_thread_flag(TIF_IA32); is64 = kernel_ip((unsigned long)addr) || any_64bit_mode(current_pt_regs());
#endif #endif
insn_init(&insn, addr, bytes_read, is64); insn_init(&insn, addr, bytes_read, is64);
insn_get_opcode(&insn); insn_get_opcode(&insn);
......
...@@ -347,7 +347,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig, ...@@ -347,7 +347,7 @@ int ia32_setup_rt_frame(int sig, struct ksignal *ksig,
*/ */
unsafe_put_user(*((u64 *)&code), (u64 __user *)frame->retcode, Efault); unsafe_put_user(*((u64 *)&code), (u64 __user *)frame->retcode, Efault);
unsafe_put_sigcontext32(&frame->uc.uc_mcontext, fp, regs, set, Efault); unsafe_put_sigcontext32(&frame->uc.uc_mcontext, fp, regs, set, Efault);
unsafe_put_user(*(__u64 *)set, (__u64 *)&frame->uc.uc_sigmask, Efault); unsafe_put_user(*(__u64 *)set, (__u64 __user *)&frame->uc.uc_sigmask, Efault);
user_access_end(); user_access_end();
if (__copy_siginfo_to_user32(&frame->info, &ksig->info)) if (__copy_siginfo_to_user32(&frame->info, &ksig->info))
......
...@@ -177,14 +177,13 @@ typedef struct user_regs_struct compat_elf_gregset_t; ...@@ -177,14 +177,13 @@ typedef struct user_regs_struct compat_elf_gregset_t;
static inline void __user *arch_compat_alloc_user_space(long len) static inline void __user *arch_compat_alloc_user_space(long len)
{ {
compat_uptr_t sp; compat_uptr_t sp = task_pt_regs(current)->sp;
if (test_thread_flag(TIF_IA32)) { /*
sp = task_pt_regs(current)->sp; * -128 for the x32 ABI redzone. For IA32, it is not strictly
} else { * necessary, but not harmful.
/* -128 for the x32 ABI redzone */ */
sp = task_pt_regs(current)->sp - 128; sp -= 128;
}
return (void __user *)round_down(sp - len, 16); return (void __user *)round_down(sp - len, 16);
} }
......
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _COPY_MC_TEST_H_
#define _COPY_MC_TEST_H_
#ifndef __ASSEMBLY__
#ifdef CONFIG_COPY_MC_TEST
extern unsigned long copy_mc_test_src;
extern unsigned long copy_mc_test_dst;
static inline void copy_mc_inject_src(void *addr)
{
if (addr)
copy_mc_test_src = (unsigned long) addr;
else
copy_mc_test_src = ~0UL;
}
static inline void copy_mc_inject_dst(void *addr)
{
if (addr)
copy_mc_test_dst = (unsigned long) addr;
else
copy_mc_test_dst = ~0UL;
}
#else /* CONFIG_COPY_MC_TEST */
static inline void copy_mc_inject_src(void *addr)
{
}
static inline void copy_mc_inject_dst(void *addr)
{
}
#endif /* CONFIG_COPY_MC_TEST */
#else /* __ASSEMBLY__ */
#include <asm/export.h>
#ifdef CONFIG_COPY_MC_TEST
.macro COPY_MC_TEST_CTL
.pushsection .data
.align 8
.globl copy_mc_test_src
copy_mc_test_src:
.quad 0
EXPORT_SYMBOL_GPL(copy_mc_test_src)
.globl copy_mc_test_dst
copy_mc_test_dst:
.quad 0
EXPORT_SYMBOL_GPL(copy_mc_test_dst)
.popsection
.endm
.macro COPY_MC_TEST_SRC reg count target
leaq \count(\reg), %r9
cmp copy_mc_test_src, %r9
ja \target
.endm
.macro COPY_MC_TEST_DST reg count target
leaq \count(\reg), %r9
cmp copy_mc_test_dst, %r9
ja \target
.endm
#else
.macro COPY_MC_TEST_CTL
.endm
.macro COPY_MC_TEST_SRC reg count target
.endm
.macro COPY_MC_TEST_DST reg count target
.endm
#endif /* CONFIG_COPY_MC_TEST */
#endif /* __ASSEMBLY__ */
#endif /* _COPY_MC_TEST_H_ */
...@@ -186,8 +186,9 @@ static inline void elf_common_init(struct thread_struct *t, ...@@ -186,8 +186,9 @@ static inline void elf_common_init(struct thread_struct *t,
#define COMPAT_ELF_PLAT_INIT(regs, load_addr) \ #define COMPAT_ELF_PLAT_INIT(regs, load_addr) \
elf_common_init(&current->thread, regs, __USER_DS) elf_common_init(&current->thread, regs, __USER_DS)
void compat_start_thread(struct pt_regs *regs, u32 new_ip, u32 new_sp); void compat_start_thread(struct pt_regs *regs, u32 new_ip, u32 new_sp, bool x32);
#define compat_start_thread compat_start_thread #define COMPAT_START_THREAD(ex, regs, new_ip, new_sp) \
compat_start_thread(regs, new_ip, new_sp, ex->e_machine == EM_X86_64)
void set_personality_ia32(bool); void set_personality_ia32(bool);
#define COMPAT_SET_PERSONALITY(ex) \ #define COMPAT_SET_PERSONALITY(ex) \
...@@ -361,7 +362,7 @@ do { \ ...@@ -361,7 +362,7 @@ do { \
#define AT_SYSINFO 32 #define AT_SYSINFO 32
#define COMPAT_ARCH_DLINFO \ #define COMPAT_ARCH_DLINFO \
if (test_thread_flag(TIF_X32)) \ if (exec->e_machine == EM_X86_64) \
ARCH_DLINFO_X32; \ ARCH_DLINFO_X32; \
else \ else \
ARCH_DLINFO_IA32 ARCH_DLINFO_IA32
...@@ -382,8 +383,10 @@ struct linux_binprm; ...@@ -382,8 +383,10 @@ struct linux_binprm;
extern int arch_setup_additional_pages(struct linux_binprm *bprm, extern int arch_setup_additional_pages(struct linux_binprm *bprm,
int uses_interp); int uses_interp);
extern int compat_arch_setup_additional_pages(struct linux_binprm *bprm, extern int compat_arch_setup_additional_pages(struct linux_binprm *bprm,
int uses_interp); int uses_interp, bool x32);
#define compat_arch_setup_additional_pages compat_arch_setup_additional_pages #define COMPAT_ARCH_SETUP_ADDITIONAL_PAGES(bprm, ex, interpreter) \
compat_arch_setup_additional_pages(bprm, interpreter, \
(ex->e_machine == EM_X86_64))
/* Do not change the values. See get_align_mask() */ /* Do not change the values. See get_align_mask() */
enum align_flags { enum align_flags {
......
...@@ -143,21 +143,6 @@ ...@@ -143,21 +143,6 @@
.macro MODRM mod opd1 opd2 .macro MODRM mod opd1 opd2
.byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3) .byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3)
.endm .endm
.macro RDPID opd
REG_TYPE rdpid_opd_type \opd
.if rdpid_opd_type == REG_TYPE_R64
R64_NUM rdpid_opd \opd
.else
R32_NUM rdpid_opd \opd
.endif
.byte 0xf3
.if rdpid_opd > 7
PFX_REX rdpid_opd 0
.endif
.byte 0x0f, 0xc7
MODRM 0xc0 rdpid_opd 0x7
.endm
#endif #endif
#endif #endif
...@@ -6,6 +6,12 @@ ...@@ -6,6 +6,12 @@
#include <linux/rwsem.h> #include <linux/rwsem.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/atomic.h> #include <linux/atomic.h>
#include <linux/bits.h>
/* Uprobes on this MM assume 32-bit code */
#define MM_CONTEXT_UPROBE_IA32 BIT(0)
/* vsyscall page is accessible on this MM */
#define MM_CONTEXT_HAS_VSYSCALL BIT(1)
/* /*
* x86 has arch-specific MMU state beyond what lives in mm_struct. * x86 has arch-specific MMU state beyond what lives in mm_struct.
...@@ -33,8 +39,7 @@ typedef struct { ...@@ -33,8 +39,7 @@ typedef struct {
#endif #endif
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
/* True if mm supports a task running in 32 bit compatibility mode. */ unsigned short flags;
unsigned short ia32_compat;
#endif #endif
struct mutex lock; struct mutex lock;
......
...@@ -177,7 +177,7 @@ static inline void arch_exit_mmap(struct mm_struct *mm) ...@@ -177,7 +177,7 @@ static inline void arch_exit_mmap(struct mm_struct *mm)
static inline bool is_64bit_mm(struct mm_struct *mm) static inline bool is_64bit_mm(struct mm_struct *mm)
{ {
return !IS_ENABLED(CONFIG_IA32_EMULATION) || return !IS_ENABLED(CONFIG_IA32_EMULATION) ||
!(mm->context.ia32_compat == TIF_IA32); !(mm->context.flags & MM_CONTEXT_UPROBE_IA32);
} }
#else #else
static inline bool is_64bit_mm(struct mm_struct *mm) static inline bool is_64bit_mm(struct mm_struct *mm)
......
...@@ -812,17 +812,6 @@ extern void default_banner(void); ...@@ -812,17 +812,6 @@ extern void default_banner(void);
#endif /* CONFIG_PARAVIRT_XXL */ #endif /* CONFIG_PARAVIRT_XXL */
#endif /* CONFIG_X86_64 */ #endif /* CONFIG_X86_64 */
#ifdef CONFIG_PARAVIRT_XXL
#define GET_CR2_INTO_AX \
PARA_SITE(PARA_PATCH(PV_MMU_read_cr2), \
ANNOTATE_RETPOLINE_SAFE; \
call PARA_INDIRECT(pv_ops+PV_MMU_read_cr2); \
)
#endif /* CONFIG_PARAVIRT_XXL */
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#else /* CONFIG_PARAVIRT */ #else /* CONFIG_PARAVIRT */
# define default_banner x86_init_noop # define default_banner x86_init_noop
......
...@@ -88,9 +88,6 @@ get_stack_pointer(struct task_struct *task, struct pt_regs *regs) ...@@ -88,9 +88,6 @@ get_stack_pointer(struct task_struct *task, struct pt_regs *regs)
return (unsigned long *)task->thread.sp; return (unsigned long *)task->thread.sp;
} }
void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
unsigned long *stack, const char *log_lvl);
/* The form of the top of the frame on the stack */ /* The form of the top of the frame on the stack */
struct stack_frame { struct stack_frame {
struct stack_frame *next_frame; struct stack_frame *next_frame;
......
...@@ -91,7 +91,6 @@ struct thread_info { ...@@ -91,7 +91,6 @@ struct thread_info {
#define TIF_NEED_FPU_LOAD 14 /* load FPU on return to userspace */ #define TIF_NEED_FPU_LOAD 14 /* load FPU on return to userspace */
#define TIF_NOCPUID 15 /* CPUID is not accessible in userland */ #define TIF_NOCPUID 15 /* CPUID is not accessible in userland */
#define TIF_NOTSC 16 /* TSC is not accessible in userland */ #define TIF_NOTSC 16 /* TSC is not accessible in userland */
#define TIF_IA32 17 /* IA32 compatibility process */
#define TIF_SLD 18 /* Restore split lock detection on context switch */ #define TIF_SLD 18 /* Restore split lock detection on context switch */
#define TIF_MEMDIE 20 /* is terminating due to OOM killer */ #define TIF_MEMDIE 20 /* is terminating due to OOM killer */
#define TIF_POLLING_NRFLAG 21 /* idle is polling for TIF_NEED_RESCHED */ #define TIF_POLLING_NRFLAG 21 /* idle is polling for TIF_NEED_RESCHED */
...@@ -101,7 +100,6 @@ struct thread_info { ...@@ -101,7 +100,6 @@ struct thread_info {
#define TIF_LAZY_MMU_UPDATES 27 /* task is updating the mmu lazily */ #define TIF_LAZY_MMU_UPDATES 27 /* task is updating the mmu lazily */
#define TIF_SYSCALL_TRACEPOINT 28 /* syscall tracepoint instrumentation */ #define TIF_SYSCALL_TRACEPOINT 28 /* syscall tracepoint instrumentation */
#define TIF_ADDR32 29 /* 32-bit address space on 64 bits */ #define TIF_ADDR32 29 /* 32-bit address space on 64 bits */
#define TIF_X32 30 /* 32-bit native x86-64 binary */
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
...@@ -120,7 +118,6 @@ struct thread_info { ...@@ -120,7 +118,6 @@ struct thread_info {
#define _TIF_NEED_FPU_LOAD (1 << TIF_NEED_FPU_LOAD) #define _TIF_NEED_FPU_LOAD (1 << TIF_NEED_FPU_LOAD)
#define _TIF_NOCPUID (1 << TIF_NOCPUID) #define _TIF_NOCPUID (1 << TIF_NOCPUID)
#define _TIF_NOTSC (1 << TIF_NOTSC) #define _TIF_NOTSC (1 << TIF_NOTSC)
#define _TIF_IA32 (1 << TIF_IA32)
#define _TIF_SLD (1 << TIF_SLD) #define _TIF_SLD (1 << TIF_SLD)
#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
#define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP) #define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP)
...@@ -129,7 +126,6 @@ struct thread_info { ...@@ -129,7 +126,6 @@ struct thread_info {
#define _TIF_LAZY_MMU_UPDATES (1 << TIF_LAZY_MMU_UPDATES) #define _TIF_LAZY_MMU_UPDATES (1 << TIF_LAZY_MMU_UPDATES)
#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) #define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT)
#define _TIF_ADDR32 (1 << TIF_ADDR32) #define _TIF_ADDR32 (1 << TIF_ADDR32)
#define _TIF_X32 (1 << TIF_X32)
/* flags to check in __switch_to() */ /* flags to check in __switch_to() */
#define _TIF_WORK_CTXSW_BASE \ #define _TIF_WORK_CTXSW_BASE \
......
...@@ -1374,7 +1374,7 @@ void __ref text_poke_queue(void *addr, const void *opcode, size_t len, const voi ...@@ -1374,7 +1374,7 @@ void __ref text_poke_queue(void *addr, const void *opcode, size_t len, const voi
* @addr: address to patch * @addr: address to patch
* @opcode: opcode of new instruction * @opcode: opcode of new instruction
* @len: length to copy * @len: length to copy
* @handler: address to jump to when the temporary breakpoint is hit * @emulate: instruction to be emulated
* *
* Update a single instruction with the vector in the stack, avoiding * Update a single instruction with the vector in the stack, avoiding
* dynamically allocated memory. This function should be used when it is * dynamically allocated memory. This function should be used when it is
......
...@@ -66,7 +66,6 @@ static void __used common(void) ...@@ -66,7 +66,6 @@ static void __used common(void)
OFFSET(PV_IRQ_irq_disable, paravirt_patch_template, irq.irq_disable); OFFSET(PV_IRQ_irq_disable, paravirt_patch_template, irq.irq_disable);
OFFSET(PV_IRQ_irq_enable, paravirt_patch_template, irq.irq_enable); OFFSET(PV_IRQ_irq_enable, paravirt_patch_template, irq.irq_enable);
OFFSET(PV_CPU_iret, paravirt_patch_template, cpu.iret); OFFSET(PV_CPU_iret, paravirt_patch_template, cpu.iret);
OFFSET(PV_MMU_read_cr2, paravirt_patch_template, mmu.read_cr2);
#endif #endif
#ifdef CONFIG_XEN #ifdef CONFIG_XEN
......
...@@ -813,7 +813,8 @@ void mtrr_ap_init(void) ...@@ -813,7 +813,8 @@ void mtrr_ap_init(void)
} }
/** /**
* Save current fixed-range MTRR state of the first cpu in cpu_online_mask. * mtrr_save_state - Save current fixed-range MTRR state of the first
* cpu in cpu_online_mask.
*/ */
void mtrr_save_state(void) void mtrr_save_state(void)
{ {
......
...@@ -183,7 +183,7 @@ static void show_regs_if_on_stack(struct stack_info *info, struct pt_regs *regs, ...@@ -183,7 +183,7 @@ static void show_regs_if_on_stack(struct stack_info *info, struct pt_regs *regs,
} }
} }
void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs, static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
unsigned long *stack, const char *log_lvl) unsigned long *stack, const char *log_lvl)
{ {
struct unwind_state state; struct unwind_state state;
......
...@@ -37,7 +37,6 @@ ...@@ -37,7 +37,6 @@
#include <asm/kasan.h> #include <asm/kasan.h>
#include <asm/fixmap.h> #include <asm/fixmap.h>
#include <asm/realmode.h> #include <asm/realmode.h>
#include <asm/desc.h>
#include <asm/extable.h> #include <asm/extable.h>
#include <asm/trapnr.h> #include <asm/trapnr.h>
#include <asm/sev-es.h> #include <asm/sev-es.h>
......
...@@ -26,15 +26,6 @@ ...@@ -26,15 +26,6 @@
#include <asm/nospec-branch.h> #include <asm/nospec-branch.h>
#include <asm/fixmap.h> #include <asm/fixmap.h>
#ifdef CONFIG_PARAVIRT_XXL
#include <asm/asm-offsets.h>
#include <asm/paravirt.h>
#define GET_CR2_INTO(reg) GET_CR2_INTO_AX ; _ASM_MOV %_ASM_AX, reg
#else
#define INTERRUPT_RETURN iretq
#define GET_CR2_INTO(reg) _ASM_MOV %cr2, reg
#endif
/* /*
* We are not able to switch in one step to the final KERNEL ADDRESS SPACE * We are not able to switch in one step to the final KERNEL ADDRESS SPACE
* because we need identity-mapped pages. * because we need identity-mapped pages.
......
...@@ -122,7 +122,7 @@ int perf_reg_validate(u64 mask) ...@@ -122,7 +122,7 @@ int perf_reg_validate(u64 mask)
u64 perf_reg_abi(struct task_struct *task) u64 perf_reg_abi(struct task_struct *task)
{ {
if (test_tsk_thread_flag(task, TIF_IA32)) if (!user_64bit_mode(task_pt_regs(task)))
return PERF_SAMPLE_REGS_ABI_32; return PERF_SAMPLE_REGS_ABI_32;
else else
return PERF_SAMPLE_REGS_ABI_64; return PERF_SAMPLE_REGS_ABI_64;
......
...@@ -511,11 +511,10 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp) ...@@ -511,11 +511,10 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
EXPORT_SYMBOL_GPL(start_thread); EXPORT_SYMBOL_GPL(start_thread);
#ifdef CONFIG_COMPAT #ifdef CONFIG_COMPAT
void compat_start_thread(struct pt_regs *regs, u32 new_ip, u32 new_sp) void compat_start_thread(struct pt_regs *regs, u32 new_ip, u32 new_sp, bool x32)
{ {
start_thread_common(regs, new_ip, new_sp, start_thread_common(regs, new_ip, new_sp,
test_thread_flag(TIF_X32) x32 ? __USER_CS : __USER32_CS,
? __USER_CS : __USER32_CS,
__USER_DS, __USER_DS); __USER_DS, __USER_DS);
} }
#endif #endif
...@@ -641,16 +640,12 @@ void set_personality_64bit(void) ...@@ -641,16 +640,12 @@ void set_personality_64bit(void)
/* inherit personality from parent */ /* inherit personality from parent */
/* Make sure to be in 64bit mode */ /* Make sure to be in 64bit mode */
clear_thread_flag(TIF_IA32);
clear_thread_flag(TIF_ADDR32); clear_thread_flag(TIF_ADDR32);
clear_thread_flag(TIF_X32);
/* Pretend that this comes from a 64bit execve */ /* Pretend that this comes from a 64bit execve */
task_pt_regs(current)->orig_ax = __NR_execve; task_pt_regs(current)->orig_ax = __NR_execve;
current_thread_info()->status &= ~TS_COMPAT; current_thread_info()->status &= ~TS_COMPAT;
/* Ensure the corresponding mm is not marked. */
if (current->mm) if (current->mm)
current->mm->context.ia32_compat = 0; current->mm->context.flags = MM_CONTEXT_HAS_VSYSCALL;
/* TBD: overwrites user setup. Should have two bits. /* TBD: overwrites user setup. Should have two bits.
But 64bit processes have always behaved this way, But 64bit processes have always behaved this way,
...@@ -662,10 +657,9 @@ void set_personality_64bit(void) ...@@ -662,10 +657,9 @@ void set_personality_64bit(void)
static void __set_personality_x32(void) static void __set_personality_x32(void)
{ {
#ifdef CONFIG_X86_X32 #ifdef CONFIG_X86_X32
clear_thread_flag(TIF_IA32);
set_thread_flag(TIF_X32);
if (current->mm) if (current->mm)
current->mm->context.ia32_compat = TIF_X32; current->mm->context.flags = 0;
current->personality &= ~READ_IMPLIES_EXEC; current->personality &= ~READ_IMPLIES_EXEC;
/* /*
* in_32bit_syscall() uses the presence of the x32 syscall bit * in_32bit_syscall() uses the presence of the x32 syscall bit
...@@ -683,10 +677,14 @@ static void __set_personality_x32(void) ...@@ -683,10 +677,14 @@ static void __set_personality_x32(void)
static void __set_personality_ia32(void) static void __set_personality_ia32(void)
{ {
#ifdef CONFIG_IA32_EMULATION #ifdef CONFIG_IA32_EMULATION
set_thread_flag(TIF_IA32); if (current->mm) {
clear_thread_flag(TIF_X32); /*
if (current->mm) * uprobes applied to this MM need to know this and
current->mm->context.ia32_compat = TIF_IA32; * cannot use user_64bit_mode() at that time.
*/
current->mm->context.flags = MM_CONTEXT_UPROBE_IA32;
}
current->personality |= force_personality32; current->personality |= force_personality32;
/* Prepare the first "return" to user space */ /* Prepare the first "return" to user space */
task_pt_regs(current)->orig_ax = __NR_ia32_execve; task_pt_regs(current)->orig_ax = __NR_ia32_execve;
......
...@@ -119,11 +119,6 @@ EXPORT_SYMBOL(boot_cpu_data); ...@@ -119,11 +119,6 @@ EXPORT_SYMBOL(boot_cpu_data);
unsigned int def_to_bigsmp; unsigned int def_to_bigsmp;
/* For MCA, but anyone else can use it if they want */
unsigned int machine_id;
unsigned int machine_submodel_id;
unsigned int BIOS_revision;
struct apm_info apm_info; struct apm_info apm_info;
EXPORT_SYMBOL(apm_info); EXPORT_SYMBOL(apm_info);
......
...@@ -10,10 +10,6 @@ ...@@ -10,10 +10,6 @@
#include <asm/mce.h> #include <asm/mce.h>
#ifdef CONFIG_X86_MCE #ifdef CONFIG_X86_MCE
/*
* See COPY_MC_TEST for self-test of the copy_mc_fragile()
* implementation.
*/
static DEFINE_STATIC_KEY_FALSE(copy_mc_fragile_key); static DEFINE_STATIC_KEY_FALSE(copy_mc_fragile_key);
void enable_copy_mc_fragile(void) void enable_copy_mc_fragile(void)
......
...@@ -2,14 +2,11 @@ ...@@ -2,14 +2,11 @@
/* Copyright(c) 2016-2020 Intel Corporation. All rights reserved. */ /* Copyright(c) 2016-2020 Intel Corporation. All rights reserved. */
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/copy_mc_test.h>
#include <asm/export.h>
#include <asm/asm.h> #include <asm/asm.h>
#ifndef CONFIG_UML #ifndef CONFIG_UML
#ifdef CONFIG_X86_MCE #ifdef CONFIG_X86_MCE
COPY_MC_TEST_CTL
/* /*
* copy_mc_fragile - copy memory with indication if an exception / fault happened * copy_mc_fragile - copy memory with indication if an exception / fault happened
...@@ -38,8 +35,6 @@ SYM_FUNC_START(copy_mc_fragile) ...@@ -38,8 +35,6 @@ SYM_FUNC_START(copy_mc_fragile)
subl %ecx, %edx subl %ecx, %edx
.L_read_leading_bytes: .L_read_leading_bytes:
movb (%rsi), %al movb (%rsi), %al
COPY_MC_TEST_SRC %rsi 1 .E_leading_bytes
COPY_MC_TEST_DST %rdi 1 .E_leading_bytes
.L_write_leading_bytes: .L_write_leading_bytes:
movb %al, (%rdi) movb %al, (%rdi)
incq %rsi incq %rsi
...@@ -55,8 +50,6 @@ SYM_FUNC_START(copy_mc_fragile) ...@@ -55,8 +50,6 @@ SYM_FUNC_START(copy_mc_fragile)
.L_read_words: .L_read_words:
movq (%rsi), %r8 movq (%rsi), %r8
COPY_MC_TEST_SRC %rsi 8 .E_read_words
COPY_MC_TEST_DST %rdi 8 .E_write_words
.L_write_words: .L_write_words:
movq %r8, (%rdi) movq %r8, (%rdi)
addq $8, %rsi addq $8, %rsi
...@@ -73,8 +66,6 @@ SYM_FUNC_START(copy_mc_fragile) ...@@ -73,8 +66,6 @@ SYM_FUNC_START(copy_mc_fragile)
movl %edx, %ecx movl %edx, %ecx
.L_read_trailing_bytes: .L_read_trailing_bytes:
movb (%rsi), %al movb (%rsi), %al
COPY_MC_TEST_SRC %rsi 1 .E_trailing_bytes
COPY_MC_TEST_DST %rdi 1 .E_trailing_bytes
.L_write_trailing_bytes: .L_write_trailing_bytes:
movb %al, (%rdi) movb %al, (%rdi)
incq %rsi incq %rsi
...@@ -88,7 +79,6 @@ SYM_FUNC_START(copy_mc_fragile) ...@@ -88,7 +79,6 @@ SYM_FUNC_START(copy_mc_fragile)
.L_done: .L_done:
ret ret
SYM_FUNC_END(copy_mc_fragile) SYM_FUNC_END(copy_mc_fragile)
EXPORT_SYMBOL_GPL(copy_mc_fragile)
.section .fixup, "ax" .section .fixup, "ax"
/* /*
......
...@@ -9,9 +9,23 @@ ...@@ -9,9 +9,23 @@
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
/* /**
* We rely on the nested NMI work to allow atomic faults from the NMI path; the * copy_from_user_nmi - NMI safe copy from user
* nested NMI paths are careful to preserve CR2. * @to: Pointer to the destination buffer
* @from: Pointer to a user space address of the current task
* @n: Number of bytes to copy
*
* Returns: The number of not copied bytes. 0 is success, i.e. all bytes copied
*
* Contrary to other copy_from_user() variants this function can be called
* from NMI context. Despite the name it is not restricted to be called
* from NMI context. It is safe to be called from any other context as
* well. It disables pagefaults across the copy which means a fault will
* abort the copy.
*
* For NMI context invocations this relies on the nested NMI work to allow
* atomic faults from the NMI path; the nested NMI paths are careful to
* preserve CR2.
*/ */
unsigned long unsigned long
copy_from_user_nmi(void *to, const void __user *from, unsigned long n) copy_from_user_nmi(void *to, const void __user *from, unsigned long n)
...@@ -27,7 +41,7 @@ copy_from_user_nmi(void *to, const void __user *from, unsigned long n) ...@@ -27,7 +41,7 @@ copy_from_user_nmi(void *to, const void __user *from, unsigned long n)
/* /*
* Even though this function is typically called from NMI/IRQ context * Even though this function is typically called from NMI/IRQ context
* disable pagefaults so that its behaviour is consistent even when * disable pagefaults so that its behaviour is consistent even when
* called form other contexts. * called from other contexts.
*/ */
pagefault_disable(); pagefault_disable();
ret = __copy_from_user_inatomic(to, from, n); ret = __copy_from_user_inatomic(to, from, n);
......
...@@ -596,7 +596,7 @@ static unsigned long __init get_new_step_size(unsigned long step_size) ...@@ -596,7 +596,7 @@ static unsigned long __init get_new_step_size(unsigned long step_size)
static void __init memory_map_top_down(unsigned long map_start, static void __init memory_map_top_down(unsigned long map_start,
unsigned long map_end) unsigned long map_end)
{ {
unsigned long real_end, start, last_start; unsigned long real_end, last_start;
unsigned long step_size; unsigned long step_size;
unsigned long addr; unsigned long addr;
unsigned long mapped_ram_size = 0; unsigned long mapped_ram_size = 0;
...@@ -609,7 +609,7 @@ static void __init memory_map_top_down(unsigned long map_start, ...@@ -609,7 +609,7 @@ static void __init memory_map_top_down(unsigned long map_start,
step_size = PMD_SIZE; step_size = PMD_SIZE;
max_pfn_mapped = 0; /* will get exact value next */ max_pfn_mapped = 0; /* will get exact value next */
min_pfn_mapped = real_end >> PAGE_SHIFT; min_pfn_mapped = real_end >> PAGE_SHIFT;
last_start = start = real_end; last_start = real_end;
/* /*
* We start from the top (end of memory) and go to the bottom. * We start from the top (end of memory) and go to the bottom.
...@@ -618,6 +618,8 @@ static void __init memory_map_top_down(unsigned long map_start, ...@@ -618,6 +618,8 @@ static void __init memory_map_top_down(unsigned long map_start,
* for page table. * for page table.
*/ */
while (last_start > map_start) { while (last_start > map_start) {
unsigned long start;
if (last_start > step_size) { if (last_start > step_size) {
start = round_down(last_start - 1, step_size); start = round_down(last_start - 1, step_size);
if (start < map_start) if (start < map_start)
......
...@@ -49,7 +49,7 @@ x86_backtrace_32(struct pt_regs * const regs, unsigned int depth) ...@@ -49,7 +49,7 @@ x86_backtrace_32(struct pt_regs * const regs, unsigned int depth)
struct stack_frame_ia32 *head; struct stack_frame_ia32 *head;
/* User process is IA32 */ /* User process is IA32 */
if (!current || !test_thread_flag(TIF_IA32)) if (!current || user_64bit_mode(regs))
return 0; return 0;
head = (struct stack_frame_ia32 *) regs->bp; head = (struct stack_frame_ia32 *) regs->bp;
......
...@@ -366,9 +366,9 @@ static int __init pcibios_assign_resources(void) ...@@ -366,9 +366,9 @@ static int __init pcibios_assign_resources(void)
return 0; return 0;
} }
/** /*
* called in fs_initcall (one below subsys_initcall), * This is an fs_initcall (one below subsys_initcall) in order to reserve
* give a chance for motherboard reserve resources * resources properly.
*/ */
fs_initcall(pcibios_assign_resources); fs_initcall(pcibios_assign_resources);
......
...@@ -1246,7 +1246,7 @@ static int load_elf_binary(struct linux_binprm *bprm) ...@@ -1246,7 +1246,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
set_binfmt(&elf_format); set_binfmt(&elf_format);
#ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES #ifdef ARCH_HAS_SETUP_ADDITIONAL_PAGES
retval = arch_setup_additional_pages(bprm, !!interpreter); retval = ARCH_SETUP_ADDITIONAL_PAGES(bprm, elf_ex, !!interpreter);
if (retval < 0) if (retval < 0)
goto out; goto out;
#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */ #endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
...@@ -1307,7 +1307,7 @@ static int load_elf_binary(struct linux_binprm *bprm) ...@@ -1307,7 +1307,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
#endif #endif
finalize_exec(bprm); finalize_exec(bprm);
start_thread(regs, elf_entry, bprm->p); START_THREAD(elf_ex, regs, elf_entry, bprm->p);
retval = 0; retval = 0;
out: out:
return retval; return retval;
......
...@@ -106,15 +106,25 @@ ...@@ -106,15 +106,25 @@
#endif #endif
#ifdef compat_start_thread #ifdef compat_start_thread
#undef start_thread #define COMPAT_START_THREAD(ex, regs, new_ip, new_sp) \
#define start_thread compat_start_thread compat_start_thread(regs, new_ip, new_sp)
#endif
#ifdef COMPAT_START_THREAD
#undef START_THREAD
#define START_THREAD COMPAT_START_THREAD
#endif #endif
#ifdef compat_arch_setup_additional_pages #ifdef compat_arch_setup_additional_pages
#define COMPAT_ARCH_SETUP_ADDITIONAL_PAGES(bprm, ex, interpreter) \
compat_arch_setup_additional_pages(bprm, interpreter)
#endif
#ifdef COMPAT_ARCH_SETUP_ADDITIONAL_PAGES
#undef ARCH_HAS_SETUP_ADDITIONAL_PAGES #undef ARCH_HAS_SETUP_ADDITIONAL_PAGES
#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
#undef arch_setup_additional_pages #undef ARCH_SETUP_ADDITIONAL_PAGES
#define arch_setup_additional_pages compat_arch_setup_additional_pages #define ARCH_SETUP_ADDITIONAL_PAGES COMPAT_ARCH_SETUP_ADDITIONAL_PAGES
#endif #endif
#ifdef compat_elf_read_implies_exec #ifdef compat_elf_read_implies_exec
......
...@@ -22,6 +22,16 @@ ...@@ -22,6 +22,16 @@
SET_PERSONALITY(ex) SET_PERSONALITY(ex)
#endif #endif
#ifndef START_THREAD
#define START_THREAD(elf_ex, regs, elf_entry, start_stack) \
start_thread(regs, elf_entry, start_stack)
#endif
#if defined(ARCH_HAS_SETUP_ADDITIONAL_PAGES) && !defined(ARCH_SETUP_ADDITIONAL_PAGES)
#define ARCH_SETUP_ADDITIONAL_PAGES(bprm, ex, interpreter) \
arch_setup_additional_pages(bprm, interpreter)
#endif
#define ELF32_GNU_PROPERTY_ALIGN 4 #define ELF32_GNU_PROPERTY_ALIGN 4
#define ELF64_GNU_PROPERTY_ALIGN 8 #define ELF64_GNU_PROPERTY_ALIGN 8
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include "nfit_test.h" #include "nfit_test.h"
#include "../watermark.h" #include "../watermark.h"
#include <asm/copy_mc_test.h>
#include <asm/mce.h> #include <asm/mce.h>
/* /*
...@@ -3284,107 +3283,6 @@ static struct platform_driver nfit_test_driver = { ...@@ -3284,107 +3283,6 @@ static struct platform_driver nfit_test_driver = {
.id_table = nfit_test_id, .id_table = nfit_test_id,
}; };
static char copy_mc_buf[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));
enum INJECT {
INJECT_NONE,
INJECT_SRC,
INJECT_DST,
};
static void copy_mc_test_init(char *dst, char *src, size_t size)
{
size_t i;
memset(dst, 0xff, size);
for (i = 0; i < size; i++)
src[i] = (char) i;
}
static bool copy_mc_test_validate(unsigned char *dst, unsigned char *src,
size_t size, unsigned long rem)
{
size_t i;
for (i = 0; i < size - rem; i++)
if (dst[i] != (unsigned char) i) {
pr_info_once("%s:%d: offset: %zd got: %#x expect: %#x\n",
__func__, __LINE__, i, dst[i],
(unsigned char) i);
return false;
}
for (i = size - rem; i < size; i++)
if (dst[i] != 0xffU) {
pr_info_once("%s:%d: offset: %zd got: %#x expect: 0xff\n",
__func__, __LINE__, i, dst[i]);
return false;
}
return true;
}
void copy_mc_test(void)
{
char *inject_desc[] = { "none", "source", "destination" };
enum INJECT inj;
if (IS_ENABLED(CONFIG_COPY_MC_TEST)) {
pr_info("%s: run...\n", __func__);
} else {
pr_info("%s: disabled, skip.\n", __func__);
return;
}
for (inj = INJECT_NONE; inj <= INJECT_DST; inj++) {
int i;
pr_info("%s: inject: %s\n", __func__, inject_desc[inj]);
for (i = 0; i < 512; i++) {
unsigned long expect, rem;
void *src, *dst;
bool valid;
switch (inj) {
case INJECT_NONE:
copy_mc_inject_src(NULL);
copy_mc_inject_dst(NULL);
dst = &copy_mc_buf[2048];
src = &copy_mc_buf[1024 - i];
expect = 0;
break;
case INJECT_SRC:
copy_mc_inject_src(&copy_mc_buf[1024]);
copy_mc_inject_dst(NULL);
dst = &copy_mc_buf[2048];
src = &copy_mc_buf[1024 - i];
expect = 512 - i;
break;
case INJECT_DST:
copy_mc_inject_src(NULL);
copy_mc_inject_dst(&copy_mc_buf[2048]);
dst = &copy_mc_buf[2048 - i];
src = &copy_mc_buf[1024];
expect = 512 - i;
break;
}
copy_mc_test_init(dst, src, 512);
rem = copy_mc_fragile(dst, src, 512);
valid = copy_mc_test_validate(dst, src, 512, expect);
if (rem == expect && valid)
continue;
pr_info("%s: copy(%#lx, %#lx, %d) off: %d rem: %ld %s expect: %ld\n",
__func__,
((unsigned long) dst) & ~PAGE_MASK,
((unsigned long ) src) & ~PAGE_MASK,
512, i, rem, valid ? "valid" : "bad",
expect);
}
}
copy_mc_inject_src(NULL);
copy_mc_inject_dst(NULL);
}
static __init int nfit_test_init(void) static __init int nfit_test_init(void)
{ {
int rc, i; int rc, i;
...@@ -3393,7 +3291,6 @@ static __init int nfit_test_init(void) ...@@ -3393,7 +3291,6 @@ static __init int nfit_test_init(void)
libnvdimm_test(); libnvdimm_test();
acpi_nfit_test(); acpi_nfit_test();
device_dax_test(); device_dax_test();
copy_mc_test();
dax_pmem_test(); dax_pmem_test();
dax_pmem_core_test(); dax_pmem_core_test();
#ifdef CONFIG_DEV_DAX_PMEM_COMPAT #ifdef CONFIG_DEV_DAX_PMEM_COMPAT
......
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