x86/pti fixes
Subsystems (3)
Linus,
Please pull the latest x86-pti-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-pti-urgent-for-linus
# HEAD: 6f6060a5c9cc76fdbc22748264e6aa3779ec2427 x86/apm: Don't access __preempt_count with zeroed fs
An APM fix, and a BTS hardware-tracing fix related to PTI changes.
Thanks,
Ingo
------------------>
Hugh Dickins (1):
x86/events/intel/ds: Fix bts_interrupt_threshold alignment
Ville Syrjälä (1):
x86/apm: Don't access __preempt_count with zeroed fs
arch/x86/events/intel/ds.c | 8 +++++--- arch/x86/include/asm/apm.h | 6 ------ arch/x86/kernel/apm_32.c | 5 +++++ 3 files changed, 10 insertions(+), 9 deletions(-)
arch/x86/events/intel/ds.c +5 -3
@@ -408,9 +408,11 @@ static int alloc_bts_buffer(int cpu) ds->bts_buffer_base = (unsigned long ) cea;ds_update_cea (cea, buffer,BTS_BUFFER_SIZE ,PAGE_KERNEL ); ds->bts_index = ds->bts_buffer_base; - max =BTS_RECORD_SIZE * (BTS_BUFFER_SIZE /BTS_RECORD_SIZE ); - ds->bts_absolute_maximum = ds->bts_buffer_base + max; - ds->bts_interrupt_threshold = ds->bts_absolute_maximum - (max /16 ); + max =BTS_BUFFER_SIZE /BTS_RECORD_SIZE ; + ds->bts_absolute_maximum = ds->bts_buffer_base + + max *BTS_RECORD_SIZE ; + ds->bts_interrupt_threshold = ds->bts_absolute_maximum - + (max /16 ) *BTS_RECORD_SIZE ;return 0 ; }
arch/x86/include/asm/apm.h +0 -6
@@ -7,8 +7,6 @@#ifndef _ASM_X86_MACH_DEFAULT_APM_H#define _ASM_X86_MACH_DEFAULT_APM_H -#include <asm/nospec-branch.h> -#ifdef APM_ZERO_SEGS # define APM_DO_ZERO_SEGS \ "pushl %%ds\n\t" \
@@ -34,7 +32,6 @@ static inline void apm_bios_call_asm(u32 func, u32 ebx_in, u32 ecx_in,* N.B. We do NOT need a cld after the BIOS call * because we always save and restore the flags. */ -firmware_restrict_branch_speculation_start (); __asm__ __volatile__(APM_DO_ZERO_SEGS "pushl %%edi\n\t" "pushl %%ebp\n\t"
@@ -47,7 +44,6 @@ static inline void apm_bios_call_asm(u32 func, u32 ebx_in, u32 ecx_in, "=S" (*esi) : "a" (func), "b" (ebx_in), "c" (ecx_in) : "memory", "cc"); -firmware_restrict_branch_speculation_end (); } static inline bool apm_bios_call_simple_asm(u32 func, u32 ebx_in,
@@ -60,7 +56,6 @@ static inline bool apm_bios_call_simple_asm(u32 func, u32 ebx_in,* N.B. We do NOT need a cld after the BIOS call * because we always save and restore the flags. */ -firmware_restrict_branch_speculation_start (); __asm__ __volatile__(APM_DO_ZERO_SEGS "pushl %%edi\n\t" "pushl %%ebp\n\t"
@@ -73,7 +68,6 @@ static inline bool apm_bios_call_simple_asm(u32 func, u32 ebx_in, "=S" (si) : "a" (func), "b" (ebx_in), "c" (ecx_in) : "memory", "cc"); -firmware_restrict_branch_speculation_end ();return error; }
arch/x86/kernel/apm_32.c +5 -0
@@ -240,6 +240,7 @@#include <asm/olpc.h> #include <asm/paravirt.h> #include <asm/reboot.h> +#include <asm/nospec-branch.h> #if defined(CONFIG_APM_DISPLAY_BLANK ) && defined(CONFIG_VT )extern int (*console_blank_hook)(int );
@@ -614,11 +615,13 @@ static long __apm_bios_call(void *_call) gdt[0x40 /8 ] = bad_bios_desc;apm_irq_save (flags); +firmware_restrict_branch_speculation_start ();APM_DO_SAVE_SEGS ;apm_bios_call_asm (call->func, call->ebx, call->ecx, &call->eax, &call->ebx, &call->ecx, &call->edx, &call->esi);APM_DO_RESTORE_SEGS ; +firmware_restrict_branch_speculation_end ();apm_irq_restore (flags); gdt[0x40 /8 ] = save_desc_40;put_cpu ();
@@ -690,10 +693,12 @@ static long __apm_bios_call_simple(void *_call) gdt[0x40 /8 ] = bad_bios_desc;apm_irq_save (flags); +firmware_restrict_branch_speculation_start ();APM_DO_SAVE_SEGS ; error =apm_bios_call_simple_asm (call->func, call->ebx, call->ecx, &call->eax);APM_DO_RESTORE_SEGS ; +firmware_restrict_branch_speculation_end ();apm_irq_restore (flags); gdt[0x40 /8 ] = save_desc_40;put_cpu ();