lkml.org 
[lkml]   [2023]   [Nov]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v17 103/116] KVM: TDX: Add methods to ignore guest instruction emulation
    Date
    From: Isaku Yamahata <isaku.yamahata@intel.com>

    Because TDX protects TDX guest state from VMM, instructions in guest memory
    cannot be emulated. Implement methods to ignore guest instruction
    emulator.

    Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
    ---
    arch/x86/kvm/vmx/main.c | 28 ++++++++++++++++++++++++++--
    1 file changed, 26 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/kvm/vmx/main.c b/arch/x86/kvm/vmx/main.c
    index 9c70a9ebcffb..f09c4a0df11a 100644
    --- a/arch/x86/kvm/vmx/main.c
    +++ b/arch/x86/kvm/vmx/main.c
    @@ -331,6 +331,30 @@ static void vt_enable_smi_window(struct kvm_vcpu *vcpu)
    }
    #endif

    +static int vt_check_emulate_instruction(struct kvm_vcpu *vcpu, int emul_type,
    + void *insn, int insn_len)
    +{
    + if (is_td_vcpu(vcpu))
    + return X86EMUL_RETRY_INSTR;
    +
    + return vmx_check_emulate_instruction(vcpu, emul_type, insn, insn_len);
    +}
    +
    +static int vt_check_intercept(struct kvm_vcpu *vcpu,
    + struct x86_instruction_info *info,
    + enum x86_intercept_stage stage,
    + struct x86_exception *exception)
    +{
    + /*
    + * This call back is triggered by the x86 instruction emulator. TDX
    + * doesn't allow guest memory inspection.
    + */
    + if (KVM_BUG_ON(is_td_vcpu(vcpu), vcpu->kvm))
    + return X86EMUL_UNHANDLEABLE;
    +
    + return vmx_check_intercept(vcpu, info, stage, exception);
    +}
    +
    static bool vt_apic_init_signal_blocked(struct kvm_vcpu *vcpu)
    {
    if (is_td_vcpu(vcpu))
    @@ -954,7 +978,7 @@ struct kvm_x86_ops vt_x86_ops __initdata = {

    .load_mmu_pgd = vt_load_mmu_pgd,

    - .check_intercept = vmx_check_intercept,
    + .check_intercept = vt_check_intercept,
    .handle_exit_irqoff = vt_handle_exit_irqoff,

    .request_immediate_exit = vt_request_immediate_exit,
    @@ -983,7 +1007,7 @@ struct kvm_x86_ops vt_x86_ops __initdata = {
    .enable_smi_window = vt_enable_smi_window,
    #endif

    - .check_emulate_instruction = vmx_check_emulate_instruction,
    + .check_emulate_instruction = vt_check_emulate_instruction,
    .apic_init_signal_blocked = vt_apic_init_signal_blocked,
    .migrate_timers = vmx_migrate_timers,

    --
    2.25.1
    \
     
     \ /
      Last update: 2023-11-20 13:51    [W:4.025 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site