Re: [PATCH v5 1/8] KVM: x86: Add helper to provide intercept linear addresses
From: Tina Zhang
Date: Sat Sep 05 2026 - 20:57:43 EST
On 9/5/2026 6:34 AM, Jim Mattson wrote:
+static u64 get_intercept_linear_addr(struct x86_emulate_ctxt *ctxt,
+ enum x86_intercept intercept)
+{
+ u64 la;
+
+ if (intercept != x86_intercept_invlpg)
+ return 0;
+
+ la = seg_base(ctxt, ctxt->src.addr.mem.seg) + ctxt->src.addr.mem.ea;
+ return ctxt->mode == X86EMUL_MODE_PROT64 ? la : (u32)la;
+}
The linear address calculation here is replicated from __linearize().
Perhaps something like:
static u64 get_invlpg_linear_addr(struct x86_emulate_ctxt *ctxt)
{
unsigned int max_size;
ulong linear;
if (intercept != x86_intercept_invlpg)
return 0;
__linearize(ctxt, ctxt->src.addr.mem, &max_size, 1,
ctxt->mode, &linear, X86EMUL_F_INVLPG);
return linear;
}
I initially used the minimal calculation needed for EXITINFO1 because I thought some of the additional processing in __linearize() was unnecessary when reporting the linear address to L1. However, reusing __linearize() keeps the intercepted path consistent with em_invlpg(). I will switch to __linearize() with X86EMUL_F_INVLPG.
static int emulator_check_intercept(struct x86_emulate_ctxt *ctxt,
enum x86_intercept intercept,
enum x86_intercept_stage stage)
@@ -427,6 +447,7 @@ static int emulator_check_intercept(struct x86_emulate_ctxt *ctxt,
.src_type = ctxt->src.type,
.dst_type = ctxt->dst.type,
.ad_bytes = ctxt->ad_bytes,
+ .intercept_linear_addr = get_intercept_linear_addr(ctxt, intercept),
Maybe:
+ .invlpg_linear_addr = get_invlpg_linear_addr(ctxt, intercept),
Yes, this is clearer.
Thanks,
Tina