Message ID | 20230913124227.12574-3-binbin.wu@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | LAM and LASS KVM Enabling | expand |
On Wed, Sep 13, 2023, Binbin Wu wrote: > Use the new flag X86EMUL_F_BRANCH instead of X86EMUL_F_FETCH in assign_eip() > to distinguish instruction fetch and branch target computation for features > that handle differently on them, e.g. Linear Address Space Separation (LASS). A slightly different shortlog+changelog: KVM: x86: Add an emulator flag to differntiate branch targets from fetches Add an emulator flag, X86EMUL_F_BRANCH, and use it instead of X86EMUL_F_FETCH in assign_eip() to distinguish between instruction fetch and branch target computation for features that handle them differently, e.g. Intel's upcoming Linear Address Space Separation (LASS) applies to code fetches but not branch target calculations. The shortlog in particular is far too vague. > As of this patch, X86EMUL_F_BRANCH and X86EMUL_F_FETCH are identical as far > as KVM is concerned. This patch looks good, but I'm going to skip it for now as it's not needed until LASS is supported, since LAM doesn't differentiate between the two. I.e. this should have been the first patch in the LASS portion of the series. No need to repost, it's trivially easy to tweak vmx_get_untagged_addr().
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 87ee1802166a..274d6e7aa0c1 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -721,7 +721,8 @@ static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt, (flags & X86EMUL_F_WRITE)) goto bad; /* unreadable code segment */ - if (!(flags & X86EMUL_F_FETCH) && (desc.type & 8) && !(desc.type & 2)) + if (!(flags & (X86EMUL_F_FETCH | X86EMUL_F_BRANCH)) && + (desc.type & 8) && !(desc.type & 2)) goto bad; lim = desc_limit_scaled(&desc); if (!(desc.type & 8) && (desc.type & 4)) { @@ -772,7 +773,7 @@ static inline int assign_eip(struct x86_emulate_ctxt *ctxt, ulong dst) if (ctxt->op_bytes != sizeof(unsigned long)) addr.ea = dst & ((1UL << (ctxt->op_bytes << 3)) - 1); rc = __linearize(ctxt, addr, &max_size, 1, ctxt->mode, &linear, - X86EMUL_F_FETCH); + X86EMUL_F_BRANCH); if (rc == X86EMUL_CONTINUE) ctxt->_eip = addr.ea; return rc; diff --git a/arch/x86/kvm/kvm_emulate.h b/arch/x86/kvm/kvm_emulate.h index e24c8ac7b930..e1fd83908334 100644 --- a/arch/x86/kvm/kvm_emulate.h +++ b/arch/x86/kvm/kvm_emulate.h @@ -91,6 +91,7 @@ struct x86_instruction_info { /* x86-specific emulation flags */ #define X86EMUL_F_WRITE BIT(0) #define X86EMUL_F_FETCH BIT(1) +#define X86EMUL_F_BRANCH BIT(2) struct x86_emulate_ops { void (*vm_bugged)(struct x86_emulate_ctxt *ctxt);