PrintDebug("SVM core %u: I am starting at CS=0x%x (base=0x%p, limit=0x%x), RIP=0x%p\n",
info->cpu_id, info->segments.cs.selector, (void *)(info->segments.cs.base),
- info->segments.cs.limit,(void *)(info->rip));
+ info->segments.cs.limit, (void *)(info->rip));
int v3_init_core(struct guest_info * core) {
v3_cpu_arch_t cpu_type = v3_get_cpu_type(v3_get_cpu_id());
- int cpu_valid = 0;
struct v3_vm_info * vm = core->vm_info;
/*
#endif
// init SVM/VMX
+
+
+ switch (cpu_type) {
#ifdef CONFIG_SVM
- if ((cpu_type == V3_SVM_CPU) || (cpu_type == V3_SVM_REV3_CPU)) {
- if (v3_init_svm_vmcb(core, vm->vm_class) == -1) {
- PrintError("Error in SVM initialization\n");
- return -1;
- }
- cpu_valid = 1;
- }
+ case V3_SVM_CPU:
+ case V3_SVM_REV3_CPU:
+ if (v3_init_svm_vmcb(core, vm->vm_class) == -1) {
+ PrintError("Error in SVM initialization\n");
+ return -1;
+ }
+ break;
#endif
#ifdef CONFIG_VMX
- if ((cpu_type == V3_VMX_CPU) || (cpu_type == V3_VMX_EPT_CPU)) {
- if (v3_init_vmx_vmcs(core, vm->vm_class) == -1) {
- PrintError("Error in VMX initialization\n");
- return -1;
- }
- cpu_valid = 1;
- }
+ case V3_VMX_CPU:
+ case V3_VMX_EPT_CPU:
+ if (v3_init_vmx_vmcs(core, vm->vm_class) == -1) {
+ PrintError("Error in VMX initialization\n");
+ return -1;
+ }
+ break;
#endif
- if (!cpu_valid) {
- PrintError("Invalid CPU Type 0x%x\n", cpu_type);
- return -1;
+ default:
+ PrintError("Invalid CPU Type 0x%x\n", cpu_type);
+ return -1;
}
return 0;
struct v3_vm_info * v3_create_vm(void * cfg, void * priv_data) {
struct v3_vm_info * vm = v3_config_guest(cfg);
+ V3_Print("CORE 0 RIP=%p\n", (void *)(addr_t)(vm->cores[0].rip));
+
if (vm == NULL) {
PrintError("Could not configure guest\n");
return NULL;
static int start_core(void * p)
{
- struct guest_info * info = (struct guest_info *)p;
+ struct guest_info * core = (struct guest_info *)p;
- PrintDebug("core %u: in start_core\n", info->cpu_id);
-
- // we assume here that the APs are in INIT mode
- // and only the BSP is in REAL
- // the per-architecture code will rely on this
- // assumption
+ PrintDebug("core %u: in start_core (RIP=%p)\n",
+ core->cpu_id, (void *)(addr_t)core->rip);
- switch (v3_cpu_types[info->cpu_id]) {
+ // JRL: Whoa WTF? cpu_types are tied to the vcoreID????
+ switch (v3_cpu_types[core->cpu_id]) {
#ifdef CONFIG_SVM
case V3_SVM_CPU:
case V3_SVM_REV3_CPU:
- return v3_start_svm_guest(info);
+ return v3_start_svm_guest(core);
break;
#endif
#if CONFIG_VMX
case V3_VMX_CPU:
case V3_VMX_EPT_CPU:
- return v3_start_vmx_guest(info);
+ return v3_start_vmx_guest(core);
break;
#endif
default:
/// CHECK IF WE ARE MULTICORE ENABLED....
V3_Print("V3 -- Starting VM (%u cores)\n", vm->num_cores);
+ V3_Print("CORE 0 RIP=%p\n", (void *)(addr_t)(vm->cores[0].rip));
// Check that enough cores are present in the mask to handle vcores
for (i = 0; i < MAX_CORES; i++) {