mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86/shstk: Introduce Supervisor Shadow Stack support
Introduce CONFIG_HAS_AS_CET_SS to determine whether CET Shadow Stack
instructions are supported in the assembler, and CONFIG_XEN_SHSTK as the main
build option.
Introduce cet={no-,}shstk to for a user to select whether or not to use shadow
stacks at runtime, and X86_FEATURE_XEN_SHSTK to determine Xen's overall
enablement of shadow stacks.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
c65da4f721
commit
d3fb3ed32f
6 files changed
+71
No files matched your search
@@ -270,6 +270,23 @@ and not running softirqs. Reduce this if softirqs are not being run frequently
|
||||
enough. Setting this to a high value may cause boot failure, particularly if
|
||||
the NMI watchdog is also enabled.
|
||||
|
||||
### cet
|
||||
= List of [ shstk=<bool> ]
|
||||
|
||||
Applicability: x86
|
||||
|
||||
Controls for the use of Control-flow Enforcement Technology. CET is group a
|
||||
of hardware features designed to combat Return-oriented Programming (ROP, also
|
||||
call/jmp COP/JOP) attacks.
|
||||
|
||||
* The `shstk=` boolean controls whether Xen uses Shadow Stacks for its own
|
||||
protection.
|
||||
|
||||
The option is available when `CONFIG_XEN_SHSTK` is compiled in, and
|
||||
defaults to `true` on hardware supporting CET-SS. Specifying
|
||||
`cet=no-shstk` will cause Xen not to use Shadow Stacks even when support
|
||||
is available in hardware.
|
||||
|
||||
### clocksource (x86)
|
||||
> `= pit | hpet | acpi | tsc`
|
||||
|
||||
|
||||
@@ -34,6 +34,10 @@ config ARCH_DEFCONFIG
|
||||
config INDIRECT_THUNK
|
||||
def_bool $(cc-option,-mindirect-branch-register)
|
||||
|
||||
config HAS_AS_CET_SS
|
||||
# binutils >= 2.29 or LLVM >= 6
|
||||
def_bool $(as-instr,wrssq %rax$(comma)0;setssbsy)
|
||||
|
||||
menu "Architecture Features"
|
||||
|
||||
source "arch/Kconfig"
|
||||
@@ -97,6 +101,20 @@ config HVM
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config XEN_SHSTK
|
||||
bool "Supervisor Shadow Stacks"
|
||||
depends on HAS_AS_CET_SS && EXPERT
|
||||
default y
|
||||
---help---
|
||||
Control-flow Enforcement Technology (CET) is a set of features in
|
||||
hardware designed to combat Return-oriented Programming (ROP, also
|
||||
call/jump COP/JOP) attacks. Shadow Stacks are one CET feature
|
||||
designed to provide return address protection.
|
||||
|
||||
This option arranges for Xen to use CET-SS for its own protection.
|
||||
When CET-SS is active, 32bit PV guests cannot be used. Backwards
|
||||
compatiblity can be provided vai the PV Shim mechanism.
|
||||
|
||||
config SHADOW_PAGING
|
||||
bool "Shadow Paging"
|
||||
default y
|
||||
|
||||
@@ -95,6 +95,36 @@ unsigned long __initdata highmem_start;
|
||||
size_param("highmem-start", highmem_start);
|
||||
#endif
|
||||
|
||||
static bool __initdata opt_xen_shstk = true;
|
||||
|
||||
static int __init parse_cet(const char *s)
|
||||
{
|
||||
const char *ss;
|
||||
int val, rc = 0;
|
||||
|
||||
do {
|
||||
ss = strchr(s, ',');
|
||||
if ( !ss )
|
||||
ss = strchr(s, '\0');
|
||||
|
||||
if ( (val = parse_boolean("shstk", s, ss)) >= 0 )
|
||||
{
|
||||
#ifdef CONFIG_XEN_SHSTK
|
||||
opt_xen_shstk = val;
|
||||
#else
|
||||
no_config_param("XEN_SHSTK", "cet", s, ss);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
rc = -EINVAL;
|
||||
|
||||
s = ss + 1;
|
||||
} while ( *ss );
|
||||
|
||||
return rc;
|
||||
}
|
||||
custom_param("cet", parse_cet);
|
||||
|
||||
cpumask_t __read_mostly cpu_present_map;
|
||||
|
||||
unsigned long __read_mostly xen_phys_start;
|
||||
|
||||
@@ -140,6 +140,7 @@
|
||||
#define cpu_has_aperfmperf boot_cpu_has(X86_FEATURE_APERFMPERF)
|
||||
#define cpu_has_lfence_dispatch boot_cpu_has(X86_FEATURE_LFENCE_DISPATCH)
|
||||
#define cpu_has_xen_lbr boot_cpu_has(X86_FEATURE_XEN_LBR)
|
||||
#define cpu_has_xen_shstk boot_cpu_has(X86_FEATURE_XEN_SHSTK)
|
||||
|
||||
#define cpu_has_msr_tsc_aux (cpu_has_rdtscp || cpu_has_rdpid)
|
||||
|
||||
|
||||
@@ -38,6 +38,7 @@ XEN_CPUFEATURE(XEN_LBR, X86_SYNTH(22)) /* Xen uses MSR_DEBUGCTL.LBR */
|
||||
XEN_CPUFEATURE(SC_VERW_PV, X86_SYNTH(23)) /* VERW used by Xen for PV */
|
||||
XEN_CPUFEATURE(SC_VERW_HVM, X86_SYNTH(24)) /* VERW used by Xen for HVM */
|
||||
XEN_CPUFEATURE(SC_VERW_IDLE, X86_SYNTH(25)) /* VERW used by Xen for idle */
|
||||
XEN_CPUFEATURE(XEN_SHSTK, X86_SYNTH(26)) /* Xen uses CET Shadow Stacks */
|
||||
|
||||
/* Bug words follow the synthetic words. */
|
||||
#define X86_NR_BUG 1
|
||||
|
||||
@@ -31,6 +31,10 @@ cc-option = $(success,$(CC) -Werror $(CLANG_FLAGS) $(1) -E -x c /dev/null -o /de
|
||||
# Return y if the linker supports <flag>, n otherwise
|
||||
ld-option = $(success,$(LD) -v $(1))
|
||||
|
||||
# $(as-instr,<instr>)
|
||||
# Return y if the assembler supports <instr>, n otherwise
|
||||
as-instr = $(success,printf "%b\n" "$(1)" | $(CC) $(CLANG_FLAGS) -c -x assembler -o /dev/null -)
|
||||
|
||||
# check if $(CC) and $(LD) exist
|
||||
$(error-if,$(failure,command -v $(CC)),compiler '$(CC)' not found)
|
||||
$(error-if,$(failure,command -v $(LD)),linker '$(LD)' not found)
|
||||
|
||||