[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251110180131.28264-13-chang.seok.bae@intel.com>
Date: Mon, 10 Nov 2025 18:01:23 +0000
From: "Chang S. Bae" <chang.seok.bae@...el.com>
To: kvm@...r.kernel.org,
linux-kernel@...r.kernel.org
Cc: pbonzini@...hat.com,
seanjc@...gle.com,
chao.gao@...el.com,
zhao1.liu@...el.com,
chang.seok.bae@...el.com
Subject: [PATCH RFC v1 12/20] KVM: x86: Support REX2-extended register index in the decoder
Update register index decoding to account for the additional bit fields
introduced by the REX2 prefix.
Both ModR/M and opcode register decoding paths now consider the extended
index bits (R4, X4, B4) in addition to the legacy REX bits (R3, X3, B3).
Signed-off-by: Chang S. Bae <chang.seok.bae@...el.com>
---
arch/x86/kvm/emulate.c | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 9c98843094a1..ed3a8c0bca20 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -1084,7 +1084,8 @@ static void decode_register_operand(struct x86_emulate_ctxt *ctxt,
reg = ctxt->modrm_reg;
} else {
reg = (ctxt->b & 7) |
- (ctxt->rex.bits.b3 * BIT(3));
+ (ctxt->rex.bits.b3 * BIT(3)) |
+ (ctxt->rex.bits.b4 * BIT(4));
}
if (ctxt->d & Sse) {
@@ -1124,9 +1125,12 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
int rc = X86EMUL_CONTINUE;
ulong modrm_ea = 0;
- ctxt->modrm_reg = ctxt->rex.bits.r3 * BIT(3);
- index_reg = ctxt->rex.bits.x3 * BIT(3);
- base_reg = ctxt->rex.bits.b3 * BIT(3);
+ ctxt->modrm_reg = (ctxt->rex.bits.r3 * BIT(3)) |
+ (ctxt->rex.bits.r4 * BIT(4));
+ index_reg = (ctxt->rex.bits.x3 * BIT(3)) |
+ (ctxt->rex.bits.x4 * BIT(4));
+ base_reg = (ctxt->rex.bits.b3 * BIT(3)) |
+ (ctxt->rex.bits.b4 * BIT(4));
ctxt->modrm_mod = (ctxt->modrm & 0xc0) >> 6;
ctxt->modrm_reg |= (ctxt->modrm & 0x38) >> 3;
--
2.51.0
Powered by blists - more mailing lists