*/
+
#include <palacios/svm.h>
#include <palacios/vmm.h>
#include <palacios/vmm_rbtree.h>
#include <palacios/vmm_barrier.h>
+#include <palacios/vmm_debug.h>
+
+
#ifdef V3_CONFIG_CHECKPOINT
#include <palacios/vmm_checkpoint.h>
#ifdef V3_CONFIG_CHECKPOINT
int v3_svm_save_core(struct guest_info * core, void * ctx){
- v3_chkpt_save_8(ctx, "cpl", &(core->cpl));
- v3_chkpt_save(ctx, "vmcb_data", PAGE_SIZE, core->vmm_data);
+ if (v3_chkpt_save_8(ctx, "cpl", &(core->cpl)) == -1) {
+ PrintError("Could not save SVM cpl\n");
+ return -1;
+ }
+
+ if (v3_chkpt_save(ctx, "vmcb_data", PAGE_SIZE, core->vmm_data) == -1) {
+ PrintError("Could not save SVM vmcb\n");
+ return -1;
+ }
return 0;
}
int v3_svm_load_core(struct guest_info * core, void * ctx){
- v3_chkpt_load_8(ctx, "cpl", &(core->cpl));
+ if (v3_chkpt_load_8(ctx, "cpl", &(core->cpl)) == -1) {
+ PrintError("Could not load SVM cpl\n");
+ return -1;
+ }
if (v3_chkpt_load(ctx, "vmcb_data", PAGE_SIZE, core->vmm_data) == -1) {
return -1;
v3_svm_config_tsc_virtualization(struct guest_info * info) {
vmcb_ctrl_t * ctrl_area = GET_VMCB_CTRL_AREA((vmcb_t*)(info->vmm_data));
+
if (info->time_state.flags & VM_TIME_TRAP_RDTSC) {
ctrl_area->instrs.RDTSC = 1;
ctrl_area->svm_instrs.RDTSCP = 1;
} else {
ctrl_area->instrs.RDTSC = 0;
ctrl_area->svm_instrs.RDTSCP = 0;
+
if (info->time_state.flags & VM_TIME_TSC_PASSTHROUGH) {
ctrl_area->TSC_OFFSET = 0;
} else {
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 after being in the VM before doing
// IRQ updates, so that any interrupts they raise get seen
v3_stgi();
// Conditionally yield the CPU if the timeslice has expired
- v3_yield_cond(info);
+ v3_yield_cond(info,-1);
// This update timers is for time-dependent handlers
// if we're slaved to host time
return 0;
}
- v3_yield(info);
+ v3_yield(info,-1);
//PrintDebug("SVM core %u: still waiting for INIT\n", info->vcpu_id);
}
// Setup the host state save area
host_vmcbs[cpu_id] = (addr_t)V3_AllocPages(4);
+ if (!host_vmcbs[cpu_id]) {
+ PrintError("Failed to allocate VMCB\n");
+ return;
+ }
+
/* 64-BIT-ISSUE */
// msr.e_reg.high = 0;
//msr.e_reg.low = (uint_t)host_vmcb;
ctrl_area->instrs.IOIO_PROT = 1;
ctrl_area->IOPM_BASE_PA = (uint_t)V3_AllocPages(3);
+
+ if (!ctrl_area->IOPM_BASE_PA) {
+ PrintError("Cannot allocate IO bitmap\n");
+ return;
+ }
{
reg_ex_t tmp_reg;