#include <palacios/vmx_assist.h>
#include <palacios/vmx_hw_info.h>
+#ifdef V3_CONFIG_MEM_TRACK
+#include <palacios/vmm_mem_track.h>
+#endif
+
#ifndef V3_CONFIG_DEBUG_VMX
#undef PrintDebug
#define PrintDebug(fmt, args...)
- if (v3_init_ept(core, &hw_info) == -1) {
+ if (v3_init_nested_paging_core(core, &hw_info) == -1) {
PrintError(core->vm_info, core, "Error initializing EPT\n");
return -1;
}
((struct cr0_32 *)&(core->shdw_pg_state.guest_cr0))->ne = 1;
((struct cr0_32 *)&(core->shdw_pg_state.guest_cr0))->cd = 0;
- if (v3_init_ept(core, &hw_info) == -1) {
+ if (v3_init_nested_paging_core(core, &hw_info) == -1) {
PrintError(core->vm_info, core, "Error initializing EPT\n");
return -1;
}
vmx_ret |= check_vmcs_write(VMCS_LINK_PTR_HIGH, (addr_t)0xffffffffUL);
#endif
-
+ if (vmx_ret != VMX_SUCCESS) {
+ PrintError(core->vm_info, core, "Error configuring VMX\n");
+ return -1;
+ }
PrintDebug(core->vm_info, core, "Serializing VMCS: %p\n", (void *)vmx_state->vmcs_ptr_phys);
vmx_ret = vmcs_clear(vmx_state->vmcs_ptr_phys);
+ if (vmx_ret != VMX_SUCCESS) {
+ PrintError(core->vm_info,core,"VMCS Clear failed\n");
+ return;
+ }
+
core->core_run_state = CORE_STOPPED;
return;
}
// Conditionally yield the CPU if the timeslice has expired
v3_schedule(info);
+#ifdef V3_CONFIG_MEM_TRACK
+ v3_mem_track_entry(info);
+#endif
+
// Update timer devices late after being in the VM so that as much
// of the time in the VM is accounted for as possible. Also do it before
// updating IRQ entry state so that any interrupts the timers raise get
if (info->shdw_pg_mode == NESTED_PAGING) {
check_vmcs_read(VMCS_GUEST_PHYS_ADDR, &(exit_info.ept_fault_addr));
+ } else {
+ exit_info.ept_fault_addr = 0;
}
//PrintDebug(info->vm_info, info, "VMX Exit taken, id-qual: %u-%lu\n", exit_info.exit_reason, exit_info.exit_qual);
v3_handle_timeouts(info, guest_cycles);
}
+#ifdef V3_CONFIG_MEM_TRACK
+ v3_mem_track_exit(info);
+#endif
+
return 0;
}
PrintDebug(info->vm_info, info, "Starting VMX core %u\n", info->vcpu_id);
+#ifdef V3_CONFIG_MULTIBOOT
+ if (v3_setup_multiboot_core_for_boot(info)) {
+ PrintError(info->vm_info, info, "Failed to setup Multiboot core...\n");
+ return -1;
+ }
+#endif
+
+#ifdef V3_CONFIG_HVM
+ if (v3_setup_hvm_hrt_core_for_boot(info)) {
+ PrintError(info->vm_info, info, "Failed to setup HRT core...\n");
+ return -1;
+ }
+#endif
+
while (1) {
if (info->core_run_state == CORE_STOPPED) {
if (info->vcpu_id == 0) {
}
+#ifdef V3_CONFIG_HVM
+ if (v3_handle_hvm_reset(info) > 0) {
+ continue;
+ }
+#endif
+
+#ifdef V3_CONFIG_MULTIBOOT
+ if (v3_handle_multiboot_reset(info) > 0) {
+ continue;
+ }
+#endif
+
#ifdef V3_CONFIG_PMU_TELEMETRY
v3_pmu_telemetry_start(info);
#endif
linear_addr = get_addr_linear(info, info->rip, &(info->segments.cs));
if (info->mem_mode == PHYSICAL_MEM) {
- v3_gpa_to_hva(info, linear_addr, &host_addr);
+ if (v3_gpa_to_hva(info, linear_addr, &host_addr)) {
+ PrintError(info->vm_info, info, "Cannot translate address\n");
+ return -1;
+ }
} else if (info->mem_mode == VIRTUAL_MEM) {
- v3_gva_to_hva(info, linear_addr, &host_addr);
+ if (v3_gva_to_hva(info, linear_addr, &host_addr)) {
+ PrintError(info->vm_info, info, "Cannot translate address\n");
+ return -1;
+ }
}
V3_Print(info->vm_info, info, "VMX core %u: Host Address of rip = 0x%p\n", info->vcpu_id, (void *)host_addr);