Patch "x86/entry: Rename SYSENTER_stack to CPU_ENTRY_AREA_entry_stack" has been added to the 4.14-stable tree
Subsystems (4)
This is a note to let you know that I've just added the patch titled
x86/entry: Rename SYSENTER_stack to CPU_ENTRY_AREA_entry_stack
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-entry-rename-sysenter_stack-to-cpu_entry_area_entry_stack.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
4fe2d8b11a370af286287a2661de9d4e6c9a145aMon Sep 17 00:00:00 2001
From: Dave Hansen <[email protected]>
Date: Mon, 4 Dec 2017 17:25:07 -0800
Subject: x86/entry: Rename SYSENTER_stack to CPU_ENTRY_AREA_entry_stack
From: Dave Hansen <[email protected]>
commit 4fe2d8b11a370af286287a2661de9d4e6c9a145a upstream.
If the kernel oopses while on the trampoline stack, it will print "<SYSENTER>" even if SYSENTER is not involved. That is rather confusing.
The "SYSENTER" stack is used for a lot more than SYSENTER now. Give it a better string to display in stack dumps, and rename the kernel code to match.
Also move the 32-bit code over to the new naming even though it still uses the entry stack only for SYSENTER.
--- arch/x86/entry/entry_32.S | 12 ++++++------ arch/x86/entry/entry_64.S | 4 ++-- arch/x86/include/asm/fixmap.h | 8 ++++---- arch/x86/include/asm/processor.h | 6 +++--- arch/x86/include/asm/stacktrace.h | 4 ++-- arch/x86/kernel/asm-offsets.c | 4 ++-- arch/x86/kernel/asm-offsets_32.c | 2 +- arch/x86/kernel/cpu/common.c | 14 +++++++------- arch/x86/kernel/dumpstack.c | 10 +++++----- arch/x86/kernel/dumpstack_32.c | 6 +++--- arch/x86/kernel/dumpstack_64.c | 12 +++++++++--- 11 files changed, 44 insertions(+), 38 deletions(-)
arch/x86/entry/entry_32.S +6 -6
@@ -942,9 +942,9 @@ ENTRY(debug) /* Are we currently on the SYSENTER stack? */ movl PER_CPU_VAR(cpu_entry_area), %ecx - addl $CPU_ENTRY_AREA_SYSENTER_stack + SIZEOF_SYSENTER_stack, %ecx - subl %eax, %ecx /* ecx = (end of SYSENTER_stack) - esp */ - cmpl $SIZEOF_SYSENTER_stack, %ecx + addl $CPU_ENTRY_AREA_entry_stack + SIZEOF_entry_stack, %ecx + subl %eax, %ecx /* ecx = (end of entry_stack) - esp */ + cmpl $SIZEOF_entry_stack, %ecx jb .Ldebug_from_sysenter_stack TRACE_IRQS_OFF
@@ -986,9 +986,9 @@ ENTRY(nmi) /* Are we currently on the SYSENTER stack? */ movl PER_CPU_VAR(cpu_entry_area), %ecx - addl $CPU_ENTRY_AREA_SYSENTER_stack + SIZEOF_SYSENTER_stack, %ecx - subl %eax, %ecx /* ecx = (end of SYSENTER_stack) - esp */ - cmpl $SIZEOF_SYSENTER_stack, %ecx + addl $CPU_ENTRY_AREA_entry_stack + SIZEOF_entry_stack, %ecx + subl %eax, %ecx /* ecx = (end of entry_stack) - esp */ + cmpl $SIZEOF_entry_stack, %ecx jb .Lnmi_from_sysenter_stack /* Not on SYSENTER stack. */
arch/x86/entry/entry_64.S +2 -2
@@ -154,8 +154,8 @@ END(native_usergs_sysret64) _entry_trampoline - CPU_ENTRY_AREA_entry_trampoline(%rip) /* The top word of the SYSENTER stack is hot and is usable as scratch space. */ -#define RSP_SCRATCH CPU_ENTRY_AREA_SYSENTER_stack + \ - SIZEOF_SYSENTER_stack - 8 + CPU_ENTRY_AREA +#define RSP_SCRATCH CPU_ENTRY_AREA_entry_stack + \ + SIZEOF_entry_stack - 8 + CPU_ENTRY_AREA ENTRY(entry_SYSCALL_64_trampoline) UNWIND_HINT_EMPTY
arch/x86/include/asm/fixmap.h +4 -4
@@ -56,10 +56,10 @@ struct cpu_entry_area {char gdt[PAGE_SIZE ];/* -* The GDT is just below SYSENTER_stack and thus serves (on x86_64) as +* The GDT is just below entry_stack and thus serves (on x86_64) as * a a read-only guard page. */ -struct SYSENTER_stack_page SYSENTER_stack_page; +struct entry_stack_page entry_stack_page;/* * On x86_64, the TSS is mapped RO. On x86_32, it's mapped RW because
@@ -250,9 +250,9 @@ static inline struct cpu_entry_area *get return (struct cpu_entry_area *)__fix_to_virt(__get_cpu_entry_area_page_index(cpu, 0)); } -static inline struct SYSENTER_stack *cpu_SYSENTER_stack (int cpu) +static inline struct entry_stack *cpu_entry_stack (int cpu) { -return &get_cpu_entry_area (cpu)->SYSENTER_stack_page.stack; +return &get_cpu_entry_area (cpu)->entry_stack_page.stack; }#endif /* !__ASSEMBLY__ */
arch/x86/include/asm/processor.h +3 -3
@@ -336,12 +336,12 @@ struct x86_hw_tss {#define IO_BITMAP_OFFSET (offsetof(struct tss_struct, io_bitmap) - offsetof(struct tss_struct, x86_tss))#define INVALID_IO_BITMAP_OFFSET 0x8000 -struct SYSENTER_stack { +struct entry_stack {unsigned long words[64 ]; }; -struct SYSENTER_stack_page { -struct SYSENTER_stack stack; +struct entry_stack_page { +struct entry_stack stack; }__aligned(PAGE_SIZE) ;struct tss_struct {
arch/x86/include/asm/stacktrace.h +2 -2
@@ -16,7 +16,7 @@ enum stack_type {STACK_TYPE_TASK ,STACK_TYPE_IRQ ,STACK_TYPE_SOFTIRQ , -STACK_TYPE_SYSENTER , +STACK_TYPE_ENTRY ,STACK_TYPE_EXCEPTION , STACK_TYPE_EXCEPTION_LAST = STACK_TYPE_EXCEPTION + N_EXCEPTION_STACKS-1, };
@@ -29,7 +29,7 @@ struct stack_info {bool in_task_stack (unsigned long *stack,struct task_struct *task,struct stack_info *info); -bool in_sysenter_stack (unsigned long *stack,struct stack_info *info); +bool in_entry_stack (unsigned long *stack,struct stack_info *info);int get_stack_info (unsigned long *stack,struct task_struct *task,struct stack_info *info,unsigned long *visit_mask);
arch/x86/kernel/asm-offsets.c +2 -2
@@ -97,6 +97,6 @@ void common(void) {/* Layout info for cpu_entry_area */ OFFSET (CPU_ENTRY_AREA_tss, cpu_entry_area, tss);OFFSET (CPU_ENTRY_AREA_entry_trampoline, cpu_entry_area, entry_trampoline); -OFFSET (CPU_ENTRY_AREA_SYSENTER_stack, cpu_entry_area, SYSENTER_stack_page); -DEFINE (SIZEOF_SYSENTER_stack,sizeof (struct SYSENTER_stack )); +OFFSET (CPU_ENTRY_AREA_entry_stack, cpu_entry_area, entry_stack_page); +DEFINE (SIZEOF_entry_stack,sizeof (struct entry_stack )); }
arch/x86/kernel/asm-offsets_32.c +1 -1
@@ -48,7 +48,7 @@ void foo(void)/* Offset from the sysenter stack to tss.sp0 */ DEFINE(TSS_sysenter_sp0, offsetof(struct cpu_entry_area, tss.x86_tss.sp0) - - offsetofend(struct cpu_entry_area, SYSENTER_stack_page.stack)); + offsetofend(struct cpu_entry_area, entry_stack_page.stack));#ifdef CONFIG_CC_STACKPROTECTOR BLANK ();
arch/x86/kernel/cpu/common.c +7 -7
@@ -487,8 +487,8 @@ static DEFINE_PER_CPU_PAGE_ALIGNED(char, [(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + DEBUG_STKSZ]);#endif -static DEFINE_PER_CPU_PAGE_ALIGNED(struct SYSENTER_stack_page, - SYSENTER_stack_storage); +static DEFINE_PER_CPU_PAGE_ALIGNED(struct entry_stack_page, + entry_stack_storage);static void __init set_percpu_fixmap_pages (int idx,void *ptr,int pages,pgprot_t prot)
@@ -523,8 +523,8 @@ static void __init setup_cpu_entry_area(#endif __set_fixmap (get_cpu_entry_area_index (cpu, gdt),get_cpu_gdt_paddr (cpu), gdt_prot); -set_percpu_fixmap_pages (get_cpu_entry_area_index (cpu, SYSENTER_stack_page), -per_cpu_ptr (&SYSENTER_stack_storage, cpu),1 , +set_percpu_fixmap_pages (get_cpu_entry_area_index (cpu, entry_stack_page), +per_cpu_ptr (&entry_stack_storage, cpu),1 ,PAGE_KERNEL );/*
@@ -1323,7 +1323,7 @@ void enable_sep_cpu(void) tss->x86_tss.ss1 = __KERNEL_CS;wrmsr (MSR_IA32_SYSENTER_CS , tss->x86_tss.ss1,0 ); -wrmsr (MSR_IA32_SYSENTER_ESP , (unsigned long )(cpu_SYSENTER_stack (cpu) +1 ),0 ); +wrmsr (MSR_IA32_SYSENTER_ESP , (unsigned long )(cpu_entry_stack (cpu) +1 ),0 );wrmsr (MSR_IA32_SYSENTER_EIP , (unsigned long )entry_SYSENTER_32,0 );put_cpu ();
@@ -1440,7 +1440,7 @@ void syscall_init(void)* AMD doesn't allow SYSENTER in long mode (either 32- or 64-bit). */ wrmsrl_safe (MSR_IA32_SYSENTER_CS , (u64 )__KERNEL_CS); -wrmsrl_safe (MSR_IA32_SYSENTER_ESP , (unsigned long )(cpu_SYSENTER_stack (cpu) +1 )); +wrmsrl_safe (MSR_IA32_SYSENTER_ESP , (unsigned long )(cpu_entry_stack (cpu) +1 ));wrmsrl_safe (MSR_IA32_SYSENTER_EIP , (u64 )entry_SYSENTER_compat);#else wrmsrl (MSR_CSTAR , (unsigned long )ignore_sysret);
@@ -1655,7 +1655,7 @@ void cpu_init(void)*/ set_tss_desc (cpu, &get_cpu_entry_area (cpu)->tss.x86_tss);load_TR_desc (); -load_sp0 ((unsigned long )(cpu_SYSENTER_stack (cpu) +1 )); +load_sp0 ((unsigned long )(cpu_entry_stack (cpu) +1 ));load_mm_ldt (&init_mm);
arch/x86/kernel/dumpstack.c +5 -5
@@ -43,9 +43,9 @@ bool in_task_stack(unsigned long *stack,return true; } -bool in_sysenter_stack (unsigned long *stack,struct stack_info *info) +bool in_entry_stack (unsigned long *stack,struct stack_info *info) { -struct SYSENTER_stack *ss =cpu_SYSENTER_stack (smp_processor_id ()); +struct entry_stack *ss =cpu_entry_stack (smp_processor_id ());void *begin = ss;void *end = ss +1 ;
@@ -53,7 +53,7 @@ bool in_sysenter_stack(unsigned long *stif ((void *)stack < begin || (void *)stack >= end)return false; - info->type =STACK_TYPE_SYSENTER ; + info->type =STACK_TYPE_ENTRY ; info->begin = begin; info->end = end; info->next_sp =NULL ;
@@ -111,13 +111,13 @@ void show_trace_log_lvl(struct task_stru* - task stack * - interrupt stack * - HW exception stacks (double fault, nmi, debug, mce) -* - SYSENTER stack +* - entry stack * * x86-32 can have up to four stacks: * - task stack * - softirq stack * - hardirq stack -* - SYSENTER stack +* - entry stack */ for (regs =NULL ; stack; stack =PTR_ALIGN (stack_info.next_sp,sizeof (long ))) {const char *stack_name;
arch/x86/kernel/dumpstack_32.c +3 -3
@@ -26,8 +26,8 @@ const char *stack_type_name(enum stack_tif (type ==STACK_TYPE_SOFTIRQ )return "SOFTIRQ" ; -if (type ==STACK_TYPE_SYSENTER ) -return "SYSENTER" ; +if (type ==STACK_TYPE_ENTRY ) +return "ENTRY_TRAMPOLINE" ;return NULL ; }
@@ -96,7 +96,7 @@ int get_stack_info(unsigned long *stack,if (task != current) goto unknown; -if (in_sysenter_stack (stack, info)) +if (in_entry_stack (stack, info)) goto recursion_check;if (in_hardirq_stack (stack, info))
arch/x86/kernel/dumpstack_64.c +9 -3
@@ -37,8 +37,14 @@ const char *stack_type_name(enum stack_tif (type ==STACK_TYPE_IRQ )return "IRQ" ; -if (type ==STACK_TYPE_SYSENTER ) -return "SYSENTER" ; +if (type ==STACK_TYPE_ENTRY ) { +/* +* On 64-bit, we have a generic entry stack that we +* use for all the kernel entry points, including +* SYSENTER. +*/ +return "ENTRY_TRAMPOLINE" ; + }if (type >=STACK_TYPE_EXCEPTION && type <=STACK_TYPE_EXCEPTION_LAST )return exception_stack_names[type -STACK_TYPE_EXCEPTION ];
@@ -118,7 +124,7 @@ int get_stack_info(unsigned long *stack,if (in_irq_stack (stack, info)) goto recursion_check; -if (in_sysenter_stack (stack, info)) +if (in_entry_stack (stack, info)) goto recursion_check; goto unknown;
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/x86-entry-rename-sysenter_stack-to-cpu_entry_area_entry_stack.patch queue-4.14/x86-mm-put-mmu-to-hardware-asid-translation-in-one-place.patch queue-4.14/x86-vsyscall-64-explicitly-set-_page_user-in-the-pagetable-hierarchy.patch queue-4.14/x86-uv-use-the-right-tlb-flush-api.patch queue-4.14/x86-mm-dump_pagetables-check-page_present-for-real.patch queue-4.14/x86-ldt-prevent-ldt-inheritance-on-exec.patch queue-4.14/x86-microcode-dont-abuse-the-tlb-flush-interface.patch queue-4.14/x86-doc-remove-obvious-weirdnesses-from-the-x86-mm-layout-documentation.patch queue-4.14/init-invoke-init_espfix_bsp-from-mm_init.patch queue-4.14/x86-cpu_entry_area-move-it-to-a-separate-unit.patch queue-4.14/x86-vsyscall-64-warn-and-fail-vsyscall-emulation-in-native-mode.patch queue-4.14/x86-mm-create-asm-invpcid.h.patch queue-4.14/x86-mm-remove-superfluous-barriers.patch queue-4.14/x86-ldt-rework-locking.patch queue-4.14/arch-mm-allow-arch_dup_mmap-to-fail.patch queue-4.14/x86-cpu_entry_area-move-it-out-of-the-fixmap.patch queue-4.14/x86-mm-remove-hard-coded-asid-limit-checks.patch queue-4.14/x86-kconfig-limit-nr_cpus-on-32-bit-to-a-sane-amount.patch queue-4.14/x86-mm-add-comments-to-clarify-which-tlb-flush-functions-are-supposed-to-flush-what.patch queue-4.14/x86-mm-move-the-cr3-construction-functions-to-tlbflush.h.patch queue-4.14/x86-mm-dump_pagetables-make-the-address-hints-correct-and-readable.patch queue-4.14/x86-insn-eval-add-utility-functions-to-get-segment-selector.patch queue-4.14/x86-mm-use-__flush_tlb_one-for-kernel-memory.patch queue-4.14/x86-mm-64-improve-the-memory-map-documentation.patch