По какой-то причине мне нужно настроить регистр:
- , когда гость работает в операциях, отличных от root, мне нужно изменить состояние активности из гость в состоянии выключения.
- Мне нужно создать прерывание таймера прерывания (считается до 0) и разбудить гостя в активное состояние.
- Мне нужно добавить некоторый код в "handle_preemption_timer ()" в vmx. c, чтобы убедиться, что состояние активности гостя является выключенным или активным.
И я попробовал некоторые коды в соответствии с этими 3 требованиями:
- изменить гостевое состояние на выключенное состояние в не-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, но я не знаю, что делать может помочь в следующем.
Кто-нибудь может мне помочь?