linux-pinenote/arch/x86/kernel/cpu
Andy Lutomirski 58a5aac533 x86/entry/32: Introduce and use X86_BUG_ESPFIX instead of paravirt_enabled
x86_64 has very clean espfix handling on paravirt: espfix64 is set
up in native_iret, so paravirt systems that override iret bypass
espfix64 automatically.  This is robust and straightforward.

x86_32 is messier.  espfix is set up before the IRET paravirt patch
point, so it can't be directly conditionalized on whether we use
native_iret.  We also can't easily move it into native_iret without
regressing performance due to a bizarre consideration.  Specifically,
on 64-bit kernels, the logic is:

  if (regs->ss & 0x4)
          setup_espfix;

On 32-bit kernels, the logic is:

  if ((regs->ss & 0x4) && (regs->cs & 0x3) == 3 &&
      (regs->flags & X86_EFLAGS_VM) == 0)
          setup_espfix;

The performance of setup_espfix itself is essentially irrelevant, but
the comparison happens on every IRET so its performance matters.  On
x86_64, there's no need for any registers except flags to implement
the comparison, so we fold the whole thing into native_iret.  On
x86_32, we don't do that because we need a free register to
implement the comparison efficiently.  We therefore do espfix setup
before restoring registers on x86_32.

This patch gets rid of the explicit paravirt_enabled check by
introducing X86_BUG_ESPFIX on 32-bit systems and using an ALTERNATIVE
to skip espfix on paravirt systems where iret != native_iret.  This is
also messy, but it's at least in line with other things we do.

This improves espfix performance by removing a branch, but no one
cares.  More importantly, it removes a paravirt_enabled user, which is
good because paravirt_enabled is ill-defined and is going away.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
Reviewed-by: Borislav Petkov <bp@suse.de>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Luis R. Rodriguez <mcgrof@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: boris.ostrovsky@oracle.com
Cc: david.vrabel@citrix.com
Cc: konrad.wilk@oracle.com
Cc: lguest@lists.ozlabs.org
Cc: xen-devel@lists.xensource.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2016-03-08 14:16:44 +01:00
..
mcheck x86/cpufeature: Create a new synthetic cpu capability for machine check recovery 2016-02-18 09:28:47 +01:00
microcode Merge branch 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2016-01-11 16:46:20 -08:00
mtrr x86/cpufeature: Carve out X86_FEATURE_* 2016-01-30 11:22:17 +01:00
.gitignore
amd.c x86/cpu/amd: Remove an unneeded condition in srat_detect_node() 2016-01-14 09:46:00 +01:00
bugs.c x86/fpu: Move various internal function prototypes to fpu/internal.h 2015-05-19 15:47:48 +02:00
bugs_64.c
centaur.c x86/cpufeature: Carve out X86_FEATURE_* 2016-01-30 11:22:17 +01:00
common.c x86/entry/32: Introduce and use X86_BUG_ESPFIX instead of paravirt_enabled 2016-03-08 14:16:44 +01:00
cpu.h x86/cpu: Restore MSR_IA32_ENERGY_PERF_BIAS after resume 2015-07-21 07:51:38 +02:00
cyrix.c x86/cpufeature: Carve out X86_FEATURE_* 2016-01-30 11:22:17 +01:00
hypervisor.c hypervisor/x86/xen: Unset X86_BUG_SYSRET_SS_ATTRS on Xen PV guests 2015-05-05 18:27:43 +01:00
intel.c x86/cpufeature: Carve out X86_FEATURE_* 2016-01-30 11:22:17 +01:00
intel_cacheinfo.c x86/cpufeature: Carve out X86_FEATURE_* 2016-01-30 11:22:17 +01:00
intel_pt.h perf/x86/intel/pt: Clean up files of Intel Processor Trace 2015-08-12 11:43:22 +02:00
Makefile x86/cpufeature: Carve out X86_FEATURE_* 2016-01-30 11:22:17 +01:00
match.c x86/cpufeature: Carve out X86_FEATURE_* 2016-01-30 11:22:17 +01:00
mkcapflags.sh x86/cpufeature: Carve out X86_FEATURE_* 2016-01-30 11:22:17 +01:00
mshyperv.c x86/hyperv: Fix the build in the !CONFIG_KEXEC_CORE case 2015-09-30 07:44:15 +02:00
perf_event.c perf/x86: Fix filter_events() bug with event mappings 2016-01-06 11:15:33 +01:00
perf_event.h perf/x86/intel: Add perf core PMU support for Intel Knights Landing 2016-01-06 11:15:37 +01:00
perf_event_amd.c Merge branch 'x86-cleanups-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip 2016-01-11 16:26:03 -08:00
perf_event_amd_ibs.c perf/x86/amd/ibs: Convert force_ibs_eilvt_setup() to void 2015-02-18 17:01:46 +01:00
perf_event_amd_iommu.c cpumask: factor out show_cpumap into separate helper function 2014-11-07 11:45:00 -08:00
perf_event_amd_iommu.h perf/x86/amd: AMD IOMMU Performance Counter PERF uncore PMU implementation 2013-06-19 13:04:53 +02:00
perf_event_amd_uncore.c perf/x86/amd/uncore: Plug reference leak 2016-02-17 08:36:09 +01:00
perf_event_intel.c perf/x86: De-obfuscate code 2016-01-29 08:35:24 +01:00
perf_event_intel_bts.c perf/x86/intel/bts: Disallow use by unprivileged users on paranoid systems 2015-09-13 11:27:22 +02:00
perf_event_intel_cqm.c perf/core: Robustify the perf_cgroup_from_task() RCU checks 2015-11-23 09:21:03 +01:00
perf_event_intel_cstate.c perf/x86: Add Intel cstate PMUs support 2015-10-06 17:31:51 +02:00
perf_event_intel_ds.c perf/x86: Enable cycles:pp for Intel Atom 2016-01-06 11:15:34 +01:00
perf_event_intel_lbr.c perf/x86/intel: Add perf core PMU support for Intel Knights Landing 2016-01-06 11:15:37 +01:00
perf_event_intel_pt.c perf/x86/intel/pt: Add interface to stop Intel PT logging 2015-11-23 09:58:26 +01:00
perf_event_intel_rapl.c perf/x86/rapl: Use unified perf_event_sysfs_show instead of special interface 2016-01-06 11:15:35 +01:00
perf_event_intel_uncore.c perf/x86: add Intel SkyLake uncore IMC PMU support 2016-01-21 18:54:26 +01:00
perf_event_intel_uncore.h perf/x86: add Intel SkyLake uncore IMC PMU support 2016-01-21 18:54:26 +01:00
perf_event_intel_uncore_nhmex.c perf/x86/uncore: Fix coccinelle warnings 2014-08-13 07:51:09 +02:00
perf_event_intel_uncore_snb.c perf/x86: add Intel SkyLake uncore IMC PMU support 2016-01-21 18:54:26 +01:00
perf_event_intel_uncore_snbep.c perf/x86/intel/uncore: Add Knights Landing uncore PMU support 2016-01-06 11:15:38 +01:00
perf_event_knc.c x86: Replace __get_cpu_var uses 2014-08-26 13:45:49 -04:00
perf_event_msr.c arch/x86/kernel/cpu/perf_event_msr.c: use sign_extend64() for sign extension 2015-11-06 17:50:42 -08:00
perf_event_p4.c x86: Replace __get_cpu_var uses 2014-08-26 13:45:49 -04:00
perf_event_p6.c perf/x86/intel/p6: Add userspace RDPMC quirk for PPro 2014-02-09 13:08:24 +01:00
perfctr-watchdog.c
powerflags.c update AMD powerflags comments 2013-05-28 12:02:10 +02:00
proc.c x86: Replace cpu_**_mask() with topology_**_cpumask() 2015-05-27 15:22:17 +02:00
rdrand.c x86: Replace RDRAND forced-reseed with simple sanity check 2015-11-25 22:46:43 +01:00
scattered.c x86/cpufeature: Move some of the scattered feature bits to x86_capability 2015-12-19 11:49:53 +01:00
topology.c x86: delete __cpuinit usage from all x86 files 2013-07-14 19:36:56 -04:00
transmeta.c x86/cpufeature: Carve out X86_FEATURE_* 2016-01-30 11:22:17 +01:00
umc.c x86: Delete non-required instances of include <linux/init.h> 2014-01-06 21:25:18 -08:00
vmware.c x86: Correctly detect hypervisor 2013-08-05 06:35:33 -07:00