- 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
|
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
/* 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)
|
||||||
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)
|
||||||
|
|
||||||
#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 = {
|
||||||
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
|
||||||
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)
|
||||||
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)
|
||||||
* 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,
|
||||||
*/
|
*/
|
||||||
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;
|
||||||
|
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) \
|
#define COMPAT_ELF_PLAT_INIT(regs, load_addr) \
|
||||||
elf_common_init(¤t->thread, regs, __USER_DS)
|
elf_common_init(¤t->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 { \
|
||||||
#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;
|
||||||
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 @@
|
||||||
.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 @@
|
||||||
#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 {
|
||||||
#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)
|
||||||
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);
|
||||||
#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)
|
||||||
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 {
|
||||||
#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 {
|
||||||
#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 {
|
||||||
#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 {
|
||||||
#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
|
||||||
* @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)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 @@
|
||||||
#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 @@
|
||||||
#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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
/* 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)
|
||||||
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)
|
||||||
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);
|
||||||
|
|
||||||
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 @@
|
||||||
#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 @@
|
||||||
/* 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)
|
||||||
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)
|
||||||
|
|
||||||
.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)
|
||||||
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)
|
||||||
.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 @@
|
||||||
|
|
||||||
#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)
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
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,
|
||||||
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,
|
||||||
* 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)
|
||||||
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)
|
||||||
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 @@ out_free_interp:
|
||||||
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 @@ out_free_interp:
|
||||||
#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 @@
|
||||||
#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
|
#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
|
#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 @@
|
||||||
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 @@
|
||||||
#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 = {
|
||||||
.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 = ©_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)
|
static __init int nfit_test_init(void)
|
||||||
{
|
{
|
||||||
int rc, i;
|
int rc, i;
|
||||||
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue