void v3_init_svm_cpu(int cpu_id);
int v3_is_svm_capable();
-int v3_init_svm_vmcb(struct guest_info * info, v3_vm_class_t vm_class);
+int v3_init_svm_vmcb(struct guest_info * core, v3_vm_class_t vm_class);
+int v3_deinit_svm_vmcb(struct guest_info * core);
int v3_svm_enter(struct guest_info * info);
int v3_start_svm_guest(struct guest_info *info);
int v3_init_vm(struct v3_vm_info * vm);
int v3_init_core(struct guest_info * core);
+int v3_free_vm_internal(struct v3_vm_info * vm);
+int v3_free_core(struct guest_info * core);
+
uint_t v3_get_addr_width(struct guest_info * info);
v3_cpu_mode_t v3_get_vm_cpu_mode(struct guest_info * info);
int v3_vmx_enter(struct guest_info * info);
int v3_init_vmx_vmcs(struct guest_info * info, v3_vm_class_t vm_class);
+int v3_deinit_vmx_vmcs(struct guest_info * core);
#endif // ! __V3VEE__
}
-int v3_init_svm_vmcb(struct guest_info * info, v3_vm_class_t vm_class) {
+int v3_init_svm_vmcb(struct guest_info * core, v3_vm_class_t vm_class) {
PrintDebug("Allocating VMCB\n");
- info->vmm_data = (void*)Allocate_VMCB();
+ core->vmm_data = (void*)Allocate_VMCB();
- if (info->vmm_data == NULL) {
+ if (core->vmm_data == NULL) {
PrintError("Could not allocate VMCB, Exiting...\n");
return -1;
}
if (vm_class == V3_PC_VM) {
- PrintDebug("Initializing VMCB (addr=%p)\n", (void *)info->vmm_data);
- Init_VMCB_BIOS((vmcb_t*)(info->vmm_data), info);
+ PrintDebug("Initializing VMCB (addr=%p)\n", (void *)core->vmm_data);
+ Init_VMCB_BIOS((vmcb_t*)(core->vmm_data), core);
} else {
PrintError("Invalid VM class\n");
return -1;
}
+int v3_deinit_svm_vmcb(struct guest_info * core) {
+ V3_FreePages(core->vmm_data, 1);
+ return 0;
+}
+
static int update_irq_exit_state(struct guest_info * info) {
vmcb_ctrl_t * guest_ctrl = GET_VMCB_CTRL_AREA((vmcb_t*)(info->vmm_data));
v3_reg_t * reg_ptr;
char * reg_names[] = { "RDI", "RSI", "RBP", "RSP", "RBX", "RDX", "RCX", "RAX", NULL};
- reg_ptr= (v3_reg_t *)regs;
+ reg_ptr = (v3_reg_t *)regs;
V3_Print("32 bit GPRs:\n");
return 0;
}
+
+
+
+int v3_free_core(struct guest_info * core) {
+ v3_cpu_arch_t cpu_type = v3_get_cpu_type(V3_Get_CPU());
+
+ switch (cpu_type) {
+#ifdef CONFIG_SVM
+ case V3_SVM_CPU:
+ case V3_SVM_REV3_CPU:
+ if (v3_deinit_svm_vmcb(core) == -1) {
+ PrintError("Error in SVM initialization\n");
+ return -1;
+ }
+ break;
+#endif
+#ifdef CONFIG_VMX
+ case V3_VMX_CPU:
+ case V3_VMX_EPT_CPU:
+ if (v3_deinit_vmx_vmcs(core) == -1) {
+ PrintError("Error in VMX initialization\n");
+ return -1;
+ }
+ break;
+#endif
+ default:
+ PrintError("Invalid CPU Type 0x%x\n", cpu_type);
+ return -1;
+ }
+
+ return 0;
+}
+
+
+
+int v3_free_vm_internal(struct v3_vm_info * vm) {
+
+
+ return 0;
+}
// force exit all cores via a cross call/IPI
-
while (1) {
int i = 0;
int still_running = 0;
int v3_free_vm(struct v3_vm_info * vm) {
+ int i = 0;
// deinitialize guest (free memory, etc...)
v3_dev_mgr_deinit(vm);
+ for (i = 0; i < vm->num_cores; i++) {
+ // free cores
+
+ v3_free_core(&(vm->cores[i]));
+
+ }
+
+ v3_free_vm_internal(vm);
+
+ // free vm
+
return 0;
}
return 0;
}
+
+int v3_deinit_vmx_vmcs(struct guest_info * core) {
+ struct vmx_data * vmx_state = core->vmm_data;
+
+ V3_FreePages((void *)(vmx_state->vmcs_ptr_phys), 1);
+
+ V3_Free(vmx_state);
+
+ return 0;
+}
+
+
static int update_irq_exit_state(struct guest_info * info) {
struct vmx_exit_idt_vec_info idt_vec_info;