Skip to content

Commit d6c387f

Browse files
yang-weijiangsean-jc
authored andcommitted
KVM: VMX: Introduce CET VMCS fields and control bits
Control-flow Enforcement Technology (CET) is a kind of CPU feature used to prevent Return/CALL/Jump-Oriented Programming (ROP/COP/JOP) attacks. It provides two sub-features(SHSTK,IBT) to defend against ROP/COP/JOP style control-flow subversion attacks. Shadow Stack (SHSTK): A shadow stack is a second stack used exclusively for control transfer operations. The shadow stack is separate from the data/normal stack and can be enabled individually in user and kernel mode. When shadow stack is enabled, CALL pushes the return address on both the data and shadow stack. RET pops the return address from both stacks and compares them. If the return addresses from the two stacks do not match, the processor generates a #CP. Indirect Branch Tracking (IBT): IBT introduces instruction(ENDBRANCH)to mark valid target addresses of indirect branches (CALL, JMP etc...). If an indirect branch is executed and the next instruction is _not_ an ENDBRANCH, the processor generates a #CP. These instruction behaves as a NOP on platforms that have no CET. Several new CET MSRs are defined to support CET: MSR_IA32_{U,S}_CET: CET settings for {user,supervisor} CET respectively. MSR_IA32_PL{0,1,2,3}_SSP: SHSTK pointer linear address for CPL{0,1,2,3}. MSR_IA32_INT_SSP_TAB: Linear address of SHSTK pointer table, whose entry is indexed by IST of interrupt gate desc. Two XSAVES state bits are introduced for CET: IA32_XSS:[bit 11]: Control saving/restoring user mode CET states IA32_XSS:[bit 12]: Control saving/restoring supervisor mode CET states. Six VMCS fields are introduced for CET: {HOST,GUEST}_S_CET: Stores CET settings for kernel mode. {HOST,GUEST}_SSP: Stores current active SSP. {HOST,GUEST}_INTR_SSP_TABLE: Stores current active MSR_IA32_INT_SSP_TAB. On Intel platforms, two additional bits are defined in VM_EXIT and VM_ENTRY control fields: If VM_EXIT_LOAD_CET_STATE = 1, host CET states are loaded from following VMCS fields at VM-Exit: HOST_S_CET HOST_SSP HOST_INTR_SSP_TABLE If VM_ENTRY_LOAD_CET_STATE = 1, guest CET states are loaded from following VMCS fields at VM-Entry: GUEST_S_CET GUEST_SSP GUEST_INTR_SSP_TABLE Co-developed-by: Zhang Yi Z <yi.z.zhang@linux.intel.com> Signed-off-by: Zhang Yi Z <yi.z.zhang@linux.intel.com> Signed-off-by: Yang Weijiang <weijiang.yang@intel.com> Reviewed-by: Chao Gao <chao.gao@intel.com> Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com> Tested-by: Mathias Krause <minipli@grsecurity.net> Tested-by: John Allen <john.allen@amd.com> Tested-by: Rick Edgecombe <rick.p.edgecombe@intel.com> Signed-off-by: Chao Gao <chao.gao@intel.com> Reviewed-by: Binbin Wu <binbin.wu@linux.intel.com> Reviewed-by: Xiaoyao Li <xiaoyao.li@intel.com> Link: https://lore.kernel.org/r/20250919223258.1604852-13-seanjc@google.com Signed-off-by: Sean Christopherson <seanjc@google.com>
1 parent 6a11c86 commit d6c387f

1 file changed

Lines changed: 8 additions & 0 deletions

File tree

  • arch/x86/include/asm

arch/x86/include/asm/vmx.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@
106106
#define VM_EXIT_CLEAR_BNDCFGS 0x00800000
107107
#define VM_EXIT_PT_CONCEAL_PIP 0x01000000
108108
#define VM_EXIT_CLEAR_IA32_RTIT_CTL 0x02000000
109+
#define VM_EXIT_LOAD_CET_STATE 0x10000000
109110

110111
#define VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR 0x00036dff
111112

@@ -119,6 +120,7 @@
119120
#define VM_ENTRY_LOAD_BNDCFGS 0x00010000
120121
#define VM_ENTRY_PT_CONCEAL_PIP 0x00020000
121122
#define VM_ENTRY_LOAD_IA32_RTIT_CTL 0x00040000
123+
#define VM_ENTRY_LOAD_CET_STATE 0x00100000
122124

123125
#define VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR 0x000011ff
124126

@@ -369,6 +371,9 @@ enum vmcs_field {
369371
GUEST_PENDING_DBG_EXCEPTIONS = 0x00006822,
370372
GUEST_SYSENTER_ESP = 0x00006824,
371373
GUEST_SYSENTER_EIP = 0x00006826,
374+
GUEST_S_CET = 0x00006828,
375+
GUEST_SSP = 0x0000682a,
376+
GUEST_INTR_SSP_TABLE = 0x0000682c,
372377
HOST_CR0 = 0x00006c00,
373378
HOST_CR3 = 0x00006c02,
374379
HOST_CR4 = 0x00006c04,
@@ -381,6 +386,9 @@ enum vmcs_field {
381386
HOST_IA32_SYSENTER_EIP = 0x00006c12,
382387
HOST_RSP = 0x00006c14,
383388
HOST_RIP = 0x00006c16,
389+
HOST_S_CET = 0x00006c18,
390+
HOST_SSP = 0x00006c1a,
391+
HOST_INTR_SSP_TABLE = 0x00006c1c
384392
};
385393

386394
/*

0 commit comments

Comments
 (0)