static addr_t allocate_vmcs() {
+ void *temp;
struct vmcs_data * vmcs_page = NULL;
PrintDebug("Allocating page\n");
- vmcs_page = (struct vmcs_data *)V3_VAddr(V3_AllocPages(1));
+ temp = V3_AllocPages(1);
+ if (!temp) {
+ PrintError("Cannot allocate VMCS\n");
+ return -1;
+ }
+ vmcs_page = (struct vmcs_data *)V3_VAddr(temp);
memset(vmcs_page, 0, 4096);
vmcs_page->revision = hw_info.basic_info.revision;
vmx_state->pin_ctrls.ext_int_exit = 1;
+
/* We enable the preemption timer by default to measure accurate guest time */
if (avail_pin_ctrls.active_preempt_timer) {
V3_Print("VMX Preemption Timer is available\n");
// Setup Guests initial PAT field
vmx_ret |= check_vmcs_write(VMCS_GUEST_PAT, 0x0007040600070406LL);
+ // Capture CR8 mods so that we can keep the apic_tpr correct
+ vmx_state->pri_proc_ctrls.cr8_ld_exit = 1;
+ vmx_state->pri_proc_ctrls.cr8_str_exit = 1;
+
+
/* Setup paging */
if (core->shdw_pg_mode == SHADOW_PAGING) {
PrintDebug("Creating initial shadow page table\n");
#endif
+
if (v3_update_vmcs_ctrl_fields(core)) {
int vmx_ret = 0;
vmx_state = (struct vmx_data *)V3_Malloc(sizeof(struct vmx_data));
+
+ if (!vmx_state) {
+ PrintError("Unable to allocate in initializing vmx vmcs\n");
+ return;
+ }
+
memset(vmx_state, 0, sizeof(struct vmx_data));
PrintDebug("vmx_data pointer: %p\n", (void *)vmx_state);
uint64_t guest_cycles = 0;
// Conditionally yield the CPU if the timeslice has expired
- v3_yield_cond(info);
+ v3_yield_cond(info,-1);
// 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
v3_enable_ints();
// Conditionally yield the CPU if the timeslice has expired
- v3_yield_cond(info);
+ v3_yield_cond(info,-1);
v3_advance_time(info, NULL);
v3_update_timers(info);
return 0;
}
- v3_yield(info);
+ v3_yield(info,-1);
//PrintDebug("VMX core %u: still waiting for INIT\n",info->vcpu_id);
}