public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: Yang Weijiang <weijiang.yang@intel.com>
To: seanjc@google.com, pbonzini@redhat.com, dave.hansen@intel.com,
	kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	x86@kernel.org, yuan.yao@linux.intel.com
Cc: peterz@infradead.org, chao.gao@intel.com,
	rick.p.edgecombe@intel.com, mlevitsk@redhat.com,
	john.allen@amd.com, weijiang.yang@intel.com
Subject: [PATCH v9 27/27] KVM: x86: Stop emulating for CET protected branch instructions
Date: Tue, 23 Jan 2024 18:42:00 -0800	[thread overview]
Message-ID: <20240124024200.102792-28-weijiang.yang@intel.com> (raw)
In-Reply-To: <20240124024200.102792-1-weijiang.yang@intel.com>

Don't emulate the branch instructions, e.g., CALL/RET/JMP etc., when CET
is active in guest, return KVM_INTERNAL_ERROR_EMULATION to userspace to
handle it.

KVM doesn't emulate CPU behaviors to check CET protected stuffs while
emulating guest instructions, instead it stops emulation on detecting
the instructions in process are CET protected. By doing so, it can avoid
generating bogus #CP in guest and preventing CET protected execution flow
subversion from guest side.

Suggested-by: Chao Gao <chao.gao@intel.com>
Signed-off-by: Yang Weijiang <weijiang.yang@intel.com>
---
 arch/x86/kvm/emulate.c | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index e223043ef5b2..ad15ce055a1d 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -178,6 +178,7 @@
 #define IncSP       ((u64)1 << 54)  /* SP is incremented before ModRM calc */
 #define TwoMemOp    ((u64)1 << 55)  /* Instruction has two memory operand */
 #define IsBranch    ((u64)1 << 56)  /* Instruction is considered a branch. */
+#define IsProtected ((u64)1 << 57)  /* Instruction is protected by CET. */
 
 #define DstXacc     (DstAccLo | SrcAccHi | SrcWrite)
 
@@ -4098,9 +4099,9 @@ static const struct opcode group4[] = {
 static const struct opcode group5[] = {
 	F(DstMem | SrcNone | Lock,		em_inc),
 	F(DstMem | SrcNone | Lock,		em_dec),
-	I(SrcMem | NearBranch | IsBranch,       em_call_near_abs),
-	I(SrcMemFAddr | ImplicitOps | IsBranch, em_call_far),
-	I(SrcMem | NearBranch | IsBranch,       em_jmp_abs),
+	I(SrcMem | NearBranch | IsBranch | IsProtected, em_call_near_abs),
+	I(SrcMemFAddr | ImplicitOps | IsBranch | IsProtected, em_call_far),
+	I(SrcMem | NearBranch | IsBranch | IsProtected, em_jmp_abs),
 	I(SrcMemFAddr | ImplicitOps | IsBranch, em_jmp_far),
 	I(SrcMem | Stack | TwoMemOp,		em_push), D(Undefined),
 };
@@ -4362,11 +4363,11 @@ static const struct opcode opcode_table[256] = {
 	/* 0xC8 - 0xCF */
 	I(Stack | SrcImmU16 | Src2ImmByte | IsBranch, em_enter),
 	I(Stack | IsBranch, em_leave),
-	I(ImplicitOps | SrcImmU16 | IsBranch, em_ret_far_imm),
-	I(ImplicitOps | IsBranch, em_ret_far),
-	D(ImplicitOps | IsBranch), DI(SrcImmByte | IsBranch, intn),
+	I(ImplicitOps | SrcImmU16 | IsBranch | IsProtected, em_ret_far_imm),
+	I(ImplicitOps | IsBranch | IsProtected, em_ret_far),
+	D(ImplicitOps | IsBranch), DI(SrcImmByte | IsBranch | IsProtected, intn),
 	D(ImplicitOps | No64 | IsBranch),
-	II(ImplicitOps | IsBranch, em_iret, iret),
+	II(ImplicitOps | IsBranch | IsProtected, em_iret, iret),
 	/* 0xD0 - 0xD7 */
 	G(Src2One | ByteOp, group2), G(Src2One, group2),
 	G(Src2CL | ByteOp, group2), G(Src2CL, group2),
@@ -4382,7 +4383,7 @@ static const struct opcode opcode_table[256] = {
 	I2bvIP(SrcImmUByte | DstAcc, em_in,  in,  check_perm_in),
 	I2bvIP(SrcAcc | DstImmUByte, em_out, out, check_perm_out),
 	/* 0xE8 - 0xEF */
-	I(SrcImm | NearBranch | IsBranch, em_call),
+	I(SrcImm | NearBranch | IsBranch | IsProtected, em_call),
 	D(SrcImm | ImplicitOps | NearBranch | IsBranch),
 	I(SrcImmFAddr | No64 | IsBranch, em_jmp_far),
 	D(SrcImmByte | ImplicitOps | NearBranch | IsBranch),
@@ -4401,7 +4402,7 @@ static const struct opcode opcode_table[256] = {
 static const struct opcode twobyte_table[256] = {
 	/* 0x00 - 0x0F */
 	G(0, group6), GD(0, &group7), N, N,
-	N, I(ImplicitOps | EmulateOnUD | IsBranch, em_syscall),
+	N, I(ImplicitOps | EmulateOnUD | IsBranch | IsProtected, em_syscall),
 	II(ImplicitOps | Priv, em_clts, clts), N,
 	DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N,
 	N, D(ImplicitOps | ModRM | SrcMem | NoAccess), N, N,
@@ -4432,8 +4433,8 @@ static const struct opcode twobyte_table[256] = {
 	IIP(ImplicitOps, em_rdtsc, rdtsc, check_rdtsc),
 	II(ImplicitOps | Priv, em_rdmsr, rdmsr),
 	IIP(ImplicitOps, em_rdpmc, rdpmc, check_rdpmc),
-	I(ImplicitOps | EmulateOnUD | IsBranch, em_sysenter),
-	I(ImplicitOps | Priv | EmulateOnUD | IsBranch, em_sysexit),
+	I(ImplicitOps | EmulateOnUD | IsBranch | IsProtected, em_sysenter),
+	I(ImplicitOps | Priv | EmulateOnUD | IsBranch | IsProtected, em_sysexit),
 	N, N,
 	N, N, N, N, N, N, N, N,
 	/* 0x40 - 0x4F */
@@ -4971,6 +4972,10 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len, int
 	if (ctxt->d == 0)
 		return EMULATION_FAILED;
 
+	if ((opcode.flags & IsProtected) &&
+	    (ctxt->ops->get_cr(ctxt, 4) & X86_CR4_CET))
+		return EMULATION_FAILED;
+
 	ctxt->execute = opcode.u.execute;
 
 	if (unlikely(emulation_type & EMULTYPE_TRAP_UD) &&
-- 
2.39.3


  parent reply	other threads:[~2024-01-24  2:42 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-01-24  2:41 [PATCH v9 00/27] Enable CET Virtualization Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 01/27] x86/fpu/xstate: Always preserve non-user xfeatures/flags in __state_perm Yang Weijiang
2024-01-30  1:29   ` Edgecombe, Rick P
2024-01-24  2:41 ` [PATCH v9 02/27] x86/fpu/xstate: Refine CET user xstate bit enabling Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 03/27] x86/fpu/xstate: Add CET supervisor mode state support Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 04/27] x86/fpu/xstate: Introduce XFEATURE_MASK_KERNEL_DYNAMIC xfeature set Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 05/27] x86/fpu/xstate: Introduce fpu_guest_cfg for guest FPU configuration Yang Weijiang
2024-01-30  1:29   ` Edgecombe, Rick P
2024-01-30 15:00     ` Yang, Weijiang
2024-01-24  2:41 ` [PATCH v9 06/27] x86/fpu/xstate: Create guest fpstate with guest specific config Yang Weijiang
2024-01-30  1:38   ` Edgecombe, Rick P
2024-01-30 14:54     ` Yang, Weijiang
2024-01-24  2:41 ` [PATCH v9 07/27] x86/fpu/xstate: Warn if kernel dynamic xfeatures detected in normal fpstate Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 08/27] KVM: x86: Rework cpuid_get_supported_xcr0() to operate on vCPU data Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 09/27] KVM: x86: Rename kvm_{g,s}et_msr() to menifest emulation operations Yang Weijiang
2024-01-25  3:43   ` Chao Gao
2024-01-24  2:41 ` [PATCH v9 10/27] KVM: x86: Refine xsave-managed guest register/MSR reset handling Yang Weijiang
2024-01-25 10:17   ` Chao Gao
2024-01-26  9:13     ` Yang, Weijiang
2024-01-24  2:41 ` [PATCH v9 11/27] KVM: x86: Add kvm_msr_{read,write}() helpers Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 12/27] KVM: x86: Report XSS as to-be-saved if there are supported features Yang Weijiang
2024-01-25 10:37   ` Chao Gao
2024-01-24  2:41 ` [PATCH v9 13/27] KVM: x86: Refresh CPUID on write to guest MSR_IA32_XSS Yang Weijiang
2024-01-25 10:57   ` Chao Gao
2024-01-26  9:30     ` Yang, Weijiang
2024-01-24  2:41 ` [PATCH v9 14/27] KVM: x86: Initialize kvm_caps.supported_xss Yang Weijiang
2024-01-26  1:35   ` Chao Gao
2024-01-24  2:41 ` [PATCH v9 15/27] KVM: x86: Load guest FPU state when access XSAVE-managed MSRs Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 16/27] KVM: x86: Add fault checks for guest CR4.CET setting Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 17/27] KVM: x86: Report KVM supported CET MSRs as to-be-saved Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 18/27] KVM: VMX: Introduce CET VMCS fields and control bits Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 19/27] KVM: x86: Use KVM-governed feature framework to track "SHSTK/IBT enabled" Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 20/27] KVM: VMX: Emulate read and write to CET MSRs Yang Weijiang
2024-01-24  2:41 ` [PATCH v9 21/27] KVM: x86: Save and reload SSP to/from SMRAM Yang Weijiang
2024-01-26  3:17   ` Chao Gao
2024-01-26  6:51     ` Chao Gao
2024-01-24  2:41 ` [PATCH v9 22/27] KVM: VMX: Set up interception for CET MSRs Yang Weijiang
2024-01-26  3:54   ` Chao Gao
2024-01-26  9:36     ` Yang, Weijiang
2024-01-24  2:41 ` [PATCH v9 23/27] KVM: VMX: Set host constant supervisor states to VMCS fields Yang Weijiang
2024-01-26  6:31   ` Chao Gao
2024-01-26  9:37     ` Yang, Weijiang
2024-01-24  2:41 ` [PATCH v9 24/27] KVM: x86: Enable CET virtualization for VMX and advertise to userspace Yang Weijiang
2024-01-26  7:50   ` Chao Gao
2024-01-26 12:54     ` Yang, Weijiang
2024-01-24  2:41 ` [PATCH v9 25/27] KVM: nVMX: Introduce new VMX_BASIC bit for event error_code delivery to L1 Yang Weijiang
2024-01-26  7:54   ` Chao Gao
2024-01-24  2:41 ` [PATCH v9 26/27] KVM: nVMX: Enable CET support for nested guest Yang Weijiang
2024-01-29  7:04   ` Chao Gao
2024-01-30  7:38     ` Yang, Weijiang
2024-01-24  2:42 ` Yang Weijiang [this message]
2024-01-26  8:53   ` [PATCH v9 27/27] KVM: x86: Stop emulating for CET protected branch instructions Chao Gao
2024-01-26 12:56     ` Yang, Weijiang
2024-01-30  1:40 ` [PATCH v9 00/27] Enable CET Virtualization Edgecombe, Rick P
2024-01-30 15:05   ` Yang, Weijiang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240124024200.102792-28-weijiang.yang@intel.com \
    --to=weijiang.yang@intel.com \
    --cc=chao.gao@intel.com \
    --cc=dave.hansen@intel.com \
    --cc=john.allen@amd.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mlevitsk@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rick.p.edgecombe@intel.com \
    --cc=seanjc@google.com \
    --cc=x86@kernel.org \
    --cc=yuan.yao@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox