mirror of https://gitee.com/openkylin/linux.git
- 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. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEzv7L6UO9uDPlPSfHEsHwGGHeVUoFAl/XgtoACgkQEsHwGGHe VUqGuA/9GqN2zNQdhgRvAQ+FLZiOYK9MfXcoayfMq8T61VRPDBWaQRfVYKmfmEjS 0l5OnYgZQ9n6vzqFy6pmgc/ix8Jr553dZp5NCamcOqjCTcuO/LwRRh+ZBeFSBTPi r2qFYKKRYvM7nbyUMm4WqvAakxJ18xsjNbIslr9Aqe8WtHBKKX3MOu8SOpFtGyXz aEc4rhsS45iZa5gTXhvOn73tr3yHGWU1rzyyAAAmDGTgAxRwsTna8v16C4+v+Bua Zg18Wiutj8ZjtFpzKJtGWGZoSBap3Jw2Ys64g42MBQUE56KY/99tQVo/SvbYvvlf PHWLH0f3rPNJ6J2qeKwhtNzPlEAH/6e416A1/6TVwsK+8pdfGmkfaQh2iDHLhJ5i CSwF61H44ZaE3pc1tHHbC5ALvydPlup7D4MKgztfq0mZ3OoV2Vg7dtyyr+Ybz72b G+Kl/tmyacQTXo0FiYbZKETo3/VfTdBXGyVax1rHkx3pt8zvhFg3kxb1TT/l/CoM eSTx53PtTdVtbGOq1CjnUm0FKlbh4+kLoNuo9DYKeXUQBs8PWOCZmL3wXmm4cqlZ mDZVWvll7CjToY8izzcE/AG279cWkgcL5Tcg7W7CR66+egfDdpuqOZ4tv4TyzoWq 0J7WeNj+TAo98b7RA0Ux8LOlszRxS2ykuI6uB2MgwCaRMbbaQao= =lLiH -----END PGP SIGNATURE----- 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() ...
This commit is contained in:
commit
405f868f13
|
@ -62,9 +62,6 @@ config EARLY_PRINTK_USB_XDBC
|
|||
You should normally say N here, unless you want to debug early
|
||||
crashes or need a very simple printk logging facility.
|
||||
|
||||
config COPY_MC_TEST
|
||||
def_bool n
|
||||
|
||||
config EFI_PGT_DUMP
|
||||
bool "Dump the EFI pagetable"
|
||||
depends on EFI
|
||||
|
|
|
@ -241,12 +241,12 @@ SYM_FUNC_START(startup_32)
|
|||
leal rva(startup_64)(%ebp), %eax
|
||||
#ifdef CONFIG_EFI_MIXED
|
||||
movl rva(efi32_boot_args)(%ebp), %edi
|
||||
cmp $0, %edi
|
||||
testl %edi, %edi
|
||||
jz 1f
|
||||
leal rva(efi64_stub_entry)(%ebp), %eax
|
||||
movl rva(efi32_boot_args+4)(%ebp), %esi
|
||||
movl rva(efi32_boot_args+8)(%ebp), %edx // saved bootparams pointer
|
||||
cmpl $0, %edx
|
||||
testl %edx, %edx
|
||||
jnz 1f
|
||||
/*
|
||||
* efi_pe_entry uses MS calling convention, which requires 32 bytes of
|
||||
|
@ -592,7 +592,7 @@ SYM_CODE_START(trampoline_32bit_src)
|
|||
movl %eax, %cr0
|
||||
|
||||
/* Check what paging mode we want to be in after the trampoline */
|
||||
cmpl $0, %edx
|
||||
testl %edx, %edx
|
||||
jz 1f
|
||||
|
||||
/* 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)
|
|||
|
||||
/* Enable PAE and LA57 (if required) paging modes */
|
||||
movl $X86_CR4_PAE, %eax
|
||||
cmpl $0, %edx
|
||||
testl %edx, %edx
|
||||
jz 1f
|
||||
orl $X86_CR4_LA57, %eax
|
||||
1:
|
||||
|
|
|
@ -168,16 +168,6 @@ void initialize_identity_maps(void *rmode)
|
|||
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,
|
||||
pmd_t *pmdp, unsigned long __address)
|
||||
{
|
||||
|
|
|
@ -413,10 +413,10 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
|
|||
|
||||
#ifdef CONFIG_COMPAT
|
||||
int compat_arch_setup_additional_pages(struct linux_binprm *bprm,
|
||||
int uses_interp)
|
||||
int uses_interp, bool x32)
|
||||
{
|
||||
#ifdef CONFIG_X86_X32_ABI
|
||||
if (test_thread_flag(TIF_X32)) {
|
||||
if (x32) {
|
||||
if (!vdso64_enabled)
|
||||
return 0;
|
||||
return map_vdso_randomized(&vdso_image_x32);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
#ifdef CONFIG_COMPAT
|
||||
if (!mm || mm->context.ia32_compat)
|
||||
if (!mm || !(mm->context.flags & MM_CONTEXT_HAS_VSYSCALL))
|
||||
return NULL;
|
||||
#endif
|
||||
if (vsyscall_mode == NONE)
|
||||
|
|
|
@ -2602,7 +2602,7 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent
|
|||
struct stack_frame_ia32 frame;
|
||||
const struct stack_frame_ia32 __user *fp;
|
||||
|
||||
if (!test_thread_flag(TIF_IA32))
|
||||
if (user_64bit_mode(regs))
|
||||
return 0;
|
||||
|
||||
cs_base = get_segment_base(regs->cs);
|
||||
|
|
|
@ -1261,7 +1261,7 @@ static int intel_pmu_pebs_fixup_ip(struct pt_regs *regs)
|
|||
old_to = to;
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
is_64bit = kernel_ip(to) || !test_thread_flag(TIF_IA32);
|
||||
is_64bit = kernel_ip(to) || any_64bit_mode(regs);
|
||||
#endif
|
||||
insn_init(&insn, kaddr, size, is_64bit);
|
||||
insn_get_length(&insn);
|
||||
|
|
|
@ -1221,7 +1221,7 @@ static int branch_type(unsigned long from, unsigned long to, int abort)
|
|||
* on 64-bit systems running 32-bit apps
|
||||
*/
|
||||
#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
|
||||
insn_init(&insn, addr, bytes_read, is64);
|
||||
insn_get_opcode(&insn);
|
||||
|
|
|
@ -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_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();
|
||||
|
||||
if (__copy_siginfo_to_user32(&frame->info, &ksig->info))
|
||||
|
|
|
@ -177,14 +177,13 @@ typedef struct user_regs_struct compat_elf_gregset_t;
|
|||
|
||||
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;
|
||||
} else {
|
||||
/* -128 for the x32 ABI redzone */
|
||||
sp = task_pt_regs(current)->sp - 128;
|
||||
}
|
||||
/*
|
||||
* -128 for the x32 ABI redzone. For IA32, it is not strictly
|
||||
* necessary, but not harmful.
|
||||
*/
|
||||
sp -= 128;
|
||||
|
||||
return (void __user *)round_down(sp - len, 16);
|
||||
}
|
||||
|
|
|
@ -1,75 +0,0 @@
|
|||
/* 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,
|
|||
#define COMPAT_ELF_PLAT_INIT(regs, load_addr) \
|
||||
elf_common_init(¤t->thread, regs, __USER_DS)
|
||||
|
||||
void compat_start_thread(struct pt_regs *regs, u32 new_ip, u32 new_sp);
|
||||
#define compat_start_thread compat_start_thread
|
||||
void compat_start_thread(struct pt_regs *regs, u32 new_ip, u32 new_sp, bool x32);
|
||||
#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);
|
||||
#define COMPAT_SET_PERSONALITY(ex) \
|
||||
|
@ -361,7 +362,7 @@ do { \
|
|||
#define AT_SYSINFO 32
|
||||
|
||||
#define COMPAT_ARCH_DLINFO \
|
||||
if (test_thread_flag(TIF_X32)) \
|
||||
if (exec->e_machine == EM_X86_64) \
|
||||
ARCH_DLINFO_X32; \
|
||||
else \
|
||||
ARCH_DLINFO_IA32
|
||||
|
@ -382,8 +383,10 @@ struct linux_binprm;
|
|||
extern int arch_setup_additional_pages(struct linux_binprm *bprm,
|
||||
int uses_interp);
|
||||
extern int compat_arch_setup_additional_pages(struct linux_binprm *bprm,
|
||||
int uses_interp);
|
||||
#define compat_arch_setup_additional_pages compat_arch_setup_additional_pages
|
||||
int uses_interp, bool x32);
|
||||
#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() */
|
||||
enum align_flags {
|
||||
|
|
|
@ -143,21 +143,6 @@
|
|||
.macro MODRM mod opd1 opd2
|
||||
.byte \mod | (\opd1 & 7) | ((\opd2 & 7) << 3)
|
||||
.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
|
||||
|
|
|
@ -6,6 +6,12 @@
|
|||
#include <linux/rwsem.h>
|
||||
#include <linux/mutex.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.
|
||||
|
@ -33,8 +39,7 @@ typedef struct {
|
|||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
/* True if mm supports a task running in 32 bit compatibility mode. */
|
||||
unsigned short ia32_compat;
|
||||
unsigned short flags;
|
||||
#endif
|
||||
|
||||
struct mutex lock;
|
||||
|
|
|
@ -177,7 +177,7 @@ static inline void arch_exit_mmap(struct mm_struct *mm)
|
|||
static inline bool is_64bit_mm(struct mm_struct *mm)
|
||||
{
|
||||
return !IS_ENABLED(CONFIG_IA32_EMULATION) ||
|
||||
!(mm->context.ia32_compat == TIF_IA32);
|
||||
!(mm->context.flags & MM_CONTEXT_UPROBE_IA32);
|
||||
}
|
||||
#else
|
||||
static inline bool is_64bit_mm(struct mm_struct *mm)
|
||||
|
|
|
@ -812,17 +812,6 @@ extern void default_banner(void);
|
|||
#endif /* CONFIG_PARAVIRT_XXL */
|
||||
#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__ */
|
||||
#else /* CONFIG_PARAVIRT */
|
||||
# define default_banner x86_init_noop
|
||||
|
|
|
@ -88,9 +88,6 @@ get_stack_pointer(struct task_struct *task, struct pt_regs *regs)
|
|||
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 */
|
||||
struct stack_frame {
|
||||
struct stack_frame *next_frame;
|
||||
|
|
|
@ -91,7 +91,6 @@ struct thread_info {
|
|||
#define TIF_NEED_FPU_LOAD 14 /* load FPU on return to userspace */
|
||||
#define TIF_NOCPUID 15 /* CPUID 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_MEMDIE 20 /* is terminating due to OOM killer */
|
||||
#define TIF_POLLING_NRFLAG 21 /* idle is polling for TIF_NEED_RESCHED */
|
||||
|
@ -101,7 +100,6 @@ struct thread_info {
|
|||
#define TIF_LAZY_MMU_UPDATES 27 /* task is updating the mmu lazily */
|
||||
#define TIF_SYSCALL_TRACEPOINT 28 /* syscall tracepoint instrumentation */
|
||||
#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_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
|
||||
|
@ -120,7 +118,6 @@ struct thread_info {
|
|||
#define _TIF_NEED_FPU_LOAD (1 << TIF_NEED_FPU_LOAD)
|
||||
#define _TIF_NOCPUID (1 << TIF_NOCPUID)
|
||||
#define _TIF_NOTSC (1 << TIF_NOTSC)
|
||||
#define _TIF_IA32 (1 << TIF_IA32)
|
||||
#define _TIF_SLD (1 << TIF_SLD)
|
||||
#define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG)
|
||||
#define _TIF_IO_BITMAP (1 << TIF_IO_BITMAP)
|
||||
|
@ -129,7 +126,6 @@ struct thread_info {
|
|||
#define _TIF_LAZY_MMU_UPDATES (1 << TIF_LAZY_MMU_UPDATES)
|
||||
#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT)
|
||||
#define _TIF_ADDR32 (1 << TIF_ADDR32)
|
||||
#define _TIF_X32 (1 << TIF_X32)
|
||||
|
||||
/* flags to check in __switch_to() */
|
||||
#define _TIF_WORK_CTXSW_BASE \
|
||||
|
|
|
@ -1374,7 +1374,7 @@ void __ref text_poke_queue(void *addr, const void *opcode, size_t len, const voi
|
|||
* @addr: address to patch
|
||||
* @opcode: opcode of new instruction
|
||||
* @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
|
||||
* dynamically allocated memory. This function should be used when it is
|
||||
|
|
|
@ -66,7 +66,6 @@ static void __used common(void)
|
|||
OFFSET(PV_IRQ_irq_disable, paravirt_patch_template, irq.irq_disable);
|
||||
OFFSET(PV_IRQ_irq_enable, paravirt_patch_template, irq.irq_enable);
|
||||
OFFSET(PV_CPU_iret, paravirt_patch_template, cpu.iret);
|
||||
OFFSET(PV_MMU_read_cr2, paravirt_patch_template, mmu.read_cr2);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_XEN
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
struct unwind_state state;
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
#include <asm/kasan.h>
|
||||
#include <asm/fixmap.h>
|
||||
#include <asm/realmode.h>
|
||||
#include <asm/desc.h>
|
||||
#include <asm/extable.h>
|
||||
#include <asm/trapnr.h>
|
||||
#include <asm/sev-es.h>
|
||||
|
|
|
@ -26,15 +26,6 @@
|
|||
#include <asm/nospec-branch.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
|
||||
* because we need identity-mapped pages.
|
||||
|
|
|
@ -122,7 +122,7 @@ int perf_reg_validate(u64 mask)
|
|||
|
||||
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;
|
||||
else
|
||||
return PERF_SAMPLE_REGS_ABI_64;
|
||||
|
|
|
@ -511,11 +511,10 @@ start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_sp)
|
|||
EXPORT_SYMBOL_GPL(start_thread);
|
||||
|
||||
#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,
|
||||
test_thread_flag(TIF_X32)
|
||||
? __USER_CS : __USER32_CS,
|
||||
x32 ? __USER_CS : __USER32_CS,
|
||||
__USER_DS, __USER_DS);
|
||||
}
|
||||
#endif
|
||||
|
@ -641,16 +640,12 @@ void set_personality_64bit(void)
|
|||
/* inherit personality from parent */
|
||||
|
||||
/* Make sure to be in 64bit mode */
|
||||
clear_thread_flag(TIF_IA32);
|
||||
clear_thread_flag(TIF_ADDR32);
|
||||
clear_thread_flag(TIF_X32);
|
||||
/* Pretend that this comes from a 64bit execve */
|
||||
task_pt_regs(current)->orig_ax = __NR_execve;
|
||||
current_thread_info()->status &= ~TS_COMPAT;
|
||||
|
||||
/* Ensure the corresponding mm is not marked. */
|
||||
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.
|
||||
But 64bit processes have always behaved this way,
|
||||
|
@ -662,10 +657,9 @@ void set_personality_64bit(void)
|
|||
static void __set_personality_x32(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_X32
|
||||
clear_thread_flag(TIF_IA32);
|
||||
set_thread_flag(TIF_X32);
|
||||
if (current->mm)
|
||||
current->mm->context.ia32_compat = TIF_X32;
|
||||
current->mm->context.flags = 0;
|
||||
|
||||
current->personality &= ~READ_IMPLIES_EXEC;
|
||||
/*
|
||||
* in_32bit_syscall() uses the presence of the x32 syscall bit
|
||||
|
@ -683,10 +677,14 @@ static void __set_personality_x32(void)
|
|||
static void __set_personality_ia32(void)
|
||||
{
|
||||
#ifdef CONFIG_IA32_EMULATION
|
||||
set_thread_flag(TIF_IA32);
|
||||
clear_thread_flag(TIF_X32);
|
||||
if (current->mm)
|
||||
current->mm->context.ia32_compat = TIF_IA32;
|
||||
if (current->mm) {
|
||||
/*
|
||||
* uprobes applied to this MM need to know this and
|
||||
* cannot use user_64bit_mode() at that time.
|
||||
*/
|
||||
current->mm->context.flags = MM_CONTEXT_UPROBE_IA32;
|
||||
}
|
||||
|
||||
current->personality |= force_personality32;
|
||||
/* Prepare the first "return" to user space */
|
||||
task_pt_regs(current)->orig_ax = __NR_ia32_execve;
|
||||
|
|
|
@ -119,11 +119,6 @@ EXPORT_SYMBOL(boot_cpu_data);
|
|||
|
||||
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;
|
||||
EXPORT_SYMBOL(apm_info);
|
||||
|
||||
|
|
|
@ -10,10 +10,6 @@
|
|||
#include <asm/mce.h>
|
||||
|
||||
#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);
|
||||
|
||||
void enable_copy_mc_fragile(void)
|
||||
|
|
|
@ -2,14 +2,11 @@
|
|||
/* Copyright(c) 2016-2020 Intel Corporation. All rights reserved. */
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/copy_mc_test.h>
|
||||
#include <asm/export.h>
|
||||
#include <asm/asm.h>
|
||||
|
||||
#ifndef CONFIG_UML
|
||||
|
||||
#ifdef CONFIG_X86_MCE
|
||||
COPY_MC_TEST_CTL
|
||||
|
||||
/*
|
||||
* copy_mc_fragile - copy memory with indication if an exception / fault happened
|
||||
|
@ -38,8 +35,6 @@ SYM_FUNC_START(copy_mc_fragile)
|
|||
subl %ecx, %edx
|
||||
.L_read_leading_bytes:
|
||||
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:
|
||||
movb %al, (%rdi)
|
||||
incq %rsi
|
||||
|
@ -55,8 +50,6 @@ SYM_FUNC_START(copy_mc_fragile)
|
|||
|
||||
.L_read_words:
|
||||
movq (%rsi), %r8
|
||||
COPY_MC_TEST_SRC %rsi 8 .E_read_words
|
||||
COPY_MC_TEST_DST %rdi 8 .E_write_words
|
||||
.L_write_words:
|
||||
movq %r8, (%rdi)
|
||||
addq $8, %rsi
|
||||
|
@ -73,8 +66,6 @@ SYM_FUNC_START(copy_mc_fragile)
|
|||
movl %edx, %ecx
|
||||
.L_read_trailing_bytes:
|
||||
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:
|
||||
movb %al, (%rdi)
|
||||
incq %rsi
|
||||
|
@ -88,7 +79,6 @@ SYM_FUNC_START(copy_mc_fragile)
|
|||
.L_done:
|
||||
ret
|
||||
SYM_FUNC_END(copy_mc_fragile)
|
||||
EXPORT_SYMBOL_GPL(copy_mc_fragile)
|
||||
|
||||
.section .fixup, "ax"
|
||||
/*
|
||||
|
|
|
@ -9,9 +9,23 @@
|
|||
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
/*
|
||||
* We rely on the nested NMI work to allow atomic faults from the NMI path; the
|
||||
* nested NMI paths are careful to preserve CR2.
|
||||
/**
|
||||
* copy_from_user_nmi - NMI safe copy from user
|
||||
* @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
|
||||
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
|
||||
* disable pagefaults so that its behaviour is consistent even when
|
||||
* called form other contexts.
|
||||
* called from other contexts.
|
||||
*/
|
||||
pagefault_disable();
|
||||
ret = __copy_from_user_inatomic(to, from, n);
|
||||
|
|
|
@ -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,
|
||||
unsigned long map_end)
|
||||
{
|
||||
unsigned long real_end, start, last_start;
|
||||
unsigned long real_end, last_start;
|
||||
unsigned long step_size;
|
||||
unsigned long addr;
|
||||
unsigned long mapped_ram_size = 0;
|
||||
|
@ -609,7 +609,7 @@ static void __init memory_map_top_down(unsigned long map_start,
|
|||
step_size = PMD_SIZE;
|
||||
max_pfn_mapped = 0; /* will get exact value next */
|
||||
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.
|
||||
|
@ -618,6 +618,8 @@ static void __init memory_map_top_down(unsigned long map_start,
|
|||
* for page table.
|
||||
*/
|
||||
while (last_start > map_start) {
|
||||
unsigned long start;
|
||||
|
||||
if (last_start > step_size) {
|
||||
start = round_down(last_start - 1, step_size);
|
||||
if (start < map_start)
|
||||
|
|
|
@ -49,7 +49,7 @@ x86_backtrace_32(struct pt_regs * const regs, unsigned int depth)
|
|||
struct stack_frame_ia32 *head;
|
||||
|
||||
/* User process is IA32 */
|
||||
if (!current || !test_thread_flag(TIF_IA32))
|
||||
if (!current || user_64bit_mode(regs))
|
||||
return 0;
|
||||
|
||||
head = (struct stack_frame_ia32 *) regs->bp;
|
||||
|
|
|
@ -366,9 +366,9 @@ static int __init pcibios_assign_resources(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* called in fs_initcall (one below subsys_initcall),
|
||||
* give a chance for motherboard reserve resources
|
||||
/*
|
||||
* This is an fs_initcall (one below subsys_initcall) in order to reserve
|
||||
* resources properly.
|
||||
*/
|
||||
fs_initcall(pcibios_assign_resources);
|
||||
|
||||
|
|
|
@ -1246,7 +1246,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|||
set_binfmt(&elf_format);
|
||||
|
||||
#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)
|
||||
goto out;
|
||||
#endif /* ARCH_HAS_SETUP_ADDITIONAL_PAGES */
|
||||
|
@ -1307,7 +1307,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
|
|||
#endif
|
||||
|
||||
finalize_exec(bprm);
|
||||
start_thread(regs, elf_entry, bprm->p);
|
||||
START_THREAD(elf_ex, regs, elf_entry, bprm->p);
|
||||
retval = 0;
|
||||
out:
|
||||
return retval;
|
||||
|
|
|
@ -106,15 +106,25 @@
|
|||
#endif
|
||||
|
||||
#ifdef compat_start_thread
|
||||
#undef start_thread
|
||||
#define start_thread compat_start_thread
|
||||
#define COMPAT_START_THREAD(ex, regs, new_ip, new_sp) \
|
||||
compat_start_thread(regs, new_ip, new_sp)
|
||||
#endif
|
||||
|
||||
#ifdef compat_arch_setup_additional_pages
|
||||
#ifdef COMPAT_START_THREAD
|
||||
#undef START_THREAD
|
||||
#define START_THREAD COMPAT_START_THREAD
|
||||
#endif
|
||||
|
||||
#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
|
||||
#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
|
||||
#undef arch_setup_additional_pages
|
||||
#define arch_setup_additional_pages compat_arch_setup_additional_pages
|
||||
#undef ARCH_SETUP_ADDITIONAL_PAGES
|
||||
#define ARCH_SETUP_ADDITIONAL_PAGES COMPAT_ARCH_SETUP_ADDITIONAL_PAGES
|
||||
#endif
|
||||
|
||||
#ifdef compat_elf_read_implies_exec
|
||||
|
|
|
@ -22,6 +22,16 @@
|
|||
SET_PERSONALITY(ex)
|
||||
#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 ELF64_GNU_PROPERTY_ALIGN 8
|
||||
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include "nfit_test.h"
|
||||
#include "../watermark.h"
|
||||
|
||||
#include <asm/copy_mc_test.h>
|
||||
#include <asm/mce.h>
|
||||
|
||||
/*
|
||||
|
@ -3284,107 +3283,6 @@ static struct platform_driver nfit_test_driver = {
|
|||
.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 = ©_mc_buf[2048];
|
||||
src = ©_mc_buf[1024 - i];
|
||||
expect = 0;
|
||||
break;
|
||||
case INJECT_SRC:
|
||||
copy_mc_inject_src(©_mc_buf[1024]);
|
||||
copy_mc_inject_dst(NULL);
|
||||
dst = ©_mc_buf[2048];
|
||||
src = ©_mc_buf[1024 - i];
|
||||
expect = 512 - i;
|
||||
break;
|
||||
case INJECT_DST:
|
||||
copy_mc_inject_src(NULL);
|
||||
copy_mc_inject_dst(©_mc_buf[2048]);
|
||||
dst = ©_mc_buf[2048 - i];
|
||||
src = ©_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)
|
||||
{
|
||||
int rc, i;
|
||||
|
@ -3393,7 +3291,6 @@ static __init int nfit_test_init(void)
|
|||
libnvdimm_test();
|
||||
acpi_nfit_test();
|
||||
device_dax_test();
|
||||
copy_mc_test();
|
||||
dax_pmem_test();
|
||||
dax_pmem_core_test();
|
||||
#ifdef CONFIG_DEV_DAX_PMEM_COMPAT
|
||||
|
|
Loading…
Reference in New Issue