Получить состояние активности гостя KVM - PullRequest
0 голосов
/ 12 марта 2020

По какой-то причине мне нужно настроить регистр:

  1. , когда гость работает в операциях, отличных от root, мне нужно изменить состояние активности из гость в состоянии выключения.
  2. Мне нужно создать прерывание таймера прерывания (считается до 0) и разбудить гостя в активное состояние.
  3. Мне нужно добавить некоторый код в "handle_preemption_timer ()" в vmx. c, чтобы убедиться, что состояние активности гостя является выключенным или активным.

И я попробовал некоторые коды в соответствии с этими 3 требованиями:

  1. изменить гостевое состояние на выключенное состояние в не-root операции
    // source: arch/x86/kvm/vmx/vmx.c: vmx_vcpu_run()

    vmx->fail = __vmx_vcpu_run(vmx, (unsigned long *)&vcpu->arch.regs,
                   vmx->loaded_vmcs->launched);
    // vmcs launch success
    if (vmx->loaded_vmcs->launched && !changed_to_shutdown)
    {
        printk(KERN_ALERT "VMCS has been launched\n");
        printk(KERN_ALERT "now the guest activity state is: %ld\n", vmcs_read32(GUEST_ACTIVITY_STATE));


        // change guest state
        vmcs_write32(GUEST_ACTIVITY_STATE, GUEST_ACTIVITY_SHUTDOWN);
        if (vmcs_read32(GUEST_ACTIVITY_STATE) == GUEST_ACTIVITY_SHUTDOWN)
            printk(KERN_ALERT "guest activity state entering shutdown Success\n");
        else
            printk(KERN_ALERT "guest activity state entering shutdown Failed\n");

        changed_to_shutdown = 1;
    }

производит прерывание таймера прерывания и пробуждает гостя.

2.1 производит:

// // source: arch/x86/kvm/vmx/vmx.c: vmx_vcpu_run() follow the above codes

// enable preemption_timer
    enable_preemption_timer = TRUE;
    u32 pin_based_exec_ctrl = vmcs_config.pin_based_exec_ctrl;
    pin_based_exec_ctrl |= PIN_BASED_VMX_PREEMPTION_TIMER;
    vmcs_write32(VMX_PREEMPTION_TIMER_VALUE, 0x00001000); 
2.2 wake up 

в соответствии с Intel SDM прерывание по таймеру приоритетного прерывания вызовет состояние гостевого состояния.

получить состояние активности guest в handle_preemption_timer ().
// source: arch/x86/kvm/vmx/vmx.c: handle_preemption_timer()
static int handle_preemption_timer(struct kvm_vcpu *vcpu)
{
    struct vcpu_vmx *vmx = to_vmx(vcpu);
    // I added
    printk(KERN_ALERT "received the preemption timer, the guest activity state is: %ld\n", vmcs_read32(GUEST_ACTIVITY_STATE));

    if (!vmx->req_immediate_exit &&
        !unlikely(vmx->loaded_vmcs->hv_timer_soft_disabled))
        kvm_lapic_expired_hv_timer(vcpu);

    return 1;
}

Когда я проверяю все сделанные мной изменения, результат в dmsg : 1043 *

kvm [3411]: vcpu0, guest rIP: 0xe05b vmx: непредвиденная причина выхода 0x3

Я знаю, 0x3 - это сигнал INIT, но я не знаю, что делать может помочь в следующем.

Кто-нибудь может мне помочь?

...