On Tue, Apr 04, 2023 at 09:09:22PM +0800, Binbin Wu wrote: >Untag address for 64-bit memory/mmio operand in instruction emulations >and vmexit handlers when LAM is applicable. > >For instruction emulation, untag address in __linearize() before >canonical check. LAM doesn't apply to instruction fetch and invlpg, >use KVM_X86_UNTAG_ADDR_SKIP_LAM to skip LAM untag. > >For vmexit handlings related to 64-bit linear address: >- Cases need to untag address > Operand(s) of VMX instructions and INVPCID > Operand(s) of SGX ENCLS > Linear address in INVVPID descriptor. >- Cases LAM doesn't apply to (no change needed) > Operand of INVLPG > Linear address in INVPCID descriptor > >Co-developed-by: Robert Hoo <robert.hu@xxxxxxxxxxxxxxx> >Signed-off-by: Robert Hoo <robert.hu@xxxxxxxxxxxxxxx> >Signed-off-by: Binbin Wu <binbin.wu@xxxxxxxxxxxxxxx> >Tested-by: Xuelian Guo <xuelian.guo@xxxxxxxxx> >--- > arch/x86/kvm/emulate.c | 23 ++++++++++++++++++----- > arch/x86/kvm/kvm_emulate.h | 2 ++ > arch/x86/kvm/vmx/nested.c | 4 ++++ > arch/x86/kvm/vmx/sgx.c | 1 + > arch/x86/kvm/x86.c | 10 ++++++++++ > 5 files changed, 35 insertions(+), 5 deletions(-) > >diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c >index a20bec931764..b7df465eccf2 100644 >--- a/arch/x86/kvm/emulate.c >+++ b/arch/x86/kvm/emulate.c >@@ -688,7 +688,8 @@ static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt, > struct segmented_address addr, > unsigned *max_size, unsigned size, > bool write, bool fetch, >- enum x86emul_mode mode, ulong *linear) >+ enum x86emul_mode mode, ulong *linear, >+ u64 untag_flags) @write and @fetch are like flags. I think we can consolidate them into the @flags first as a cleanup patch and then add a flag for LAM.