V3_init_vnet();
#endif
+
+#ifdef CONFIG_MULTITHREAD_OS
if ((hooks) && (hooks->call_on_cpu)) {
for (i = 0; i < num_cpus; i++) {
hooks->call_on_cpu(i, &init_cpu, (void *)(addr_t)i);
}
}
+#else
+ init_cpu(0);
+#endif
+
}
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:
return 0;
}
-
+#ifdef CONFIG_MULTITHREAD_OS
// For the moment very ugly. Eventually we will shift the cpu_mask to an arbitrary sized type...
#define MAX_CORES 32
-int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) {
+
+static int start_vm_multicore(struct v3_vm_info * vm, unsigned int cpu_mask) {
uint32_t i;
char tname[16];
int vcore_id = 0;
/// 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++) {
return 0;
}
+#endif
+
+
+int v3_start_vm(struct v3_vm_info * vm, unsigned int cpu_mask) {
+#ifdef CONFIG_MULTITHREAD_OS
+ return start_vm_multicore(vm, cpu_mask);
+#else
+ return start_core(&(vm->cores[0]));
+#endif
+}
+
+
+int v3_stop_vm(struct v3_vm_info * vm) {
+
+ vm->run_state = VM_STOPPED;
+
+
+ // force exit all cores via a cross call/IPI
+
+ // Wait for all cores to enter CORE_STOPPED state
+
+ // deinitialize guest (free memory, etc...)
+
+ return 0;
+}
#ifdef __V3_32BIT__
}
-
+#ifdef CONFIG_MULTITHREAD_OS
void v3_interrupt_cpu(struct v3_vm_info * vm, int logical_cpu, int vector) {
extern struct v3_os_hooks * os_hooks;
(os_hooks)->interrupt_cpu(vm, logical_cpu, vector);
}
}
-
-
-
-unsigned int v3_get_cpu_id() {
- extern struct v3_os_hooks * os_hooks;
- unsigned int ret = (unsigned int)-1;
-
- if ((os_hooks) && (os_hooks)->get_cpu) {
- ret = os_hooks->get_cpu();
- }
-
- return ret;
-}
+#endif