#include <palacios/vmx.h>
#endif
-#ifdef V3_CONFIG_VNET
-#include <vnet/vnet.h>
-#endif
-
v3_cpu_arch_t v3_cpu_types[V3_CONFIG_MAX_CPUS];
struct v3_os_hooks * os_hooks = NULL;
+
static void init_cpu(void * arg) {
uint32_t cpu_id = (uint32_t)(addr_t)arg;
#endif
-#ifdef V3_CONFIG_VNET
- v3_init_vnet();
-#endif
-
#ifdef V3_CONFIG_MULTITHREAD_OS
if ((hooks) && (hooks->call_on_cpu)) {
#endif
-#ifdef V3_CONFIG_VNET
- v3_deinit_vnet();
-#endif
-
#ifdef V3_CONFIG_MULTITHREAD_OS
if ((os_hooks) && (os_hooks->call_on_cpu)) {
for (i = 0; i < V3_CONFIG_MAX_CPUS; i++) {
}
+
+
static int start_core(void * p)
{
struct guest_info * core = (struct guest_info *)p;
- PrintDebug("virtual core %u: in start_core (RIP=%p)\n",
- core->cpu_id, (void *)(addr_t)core->rip);
+ PrintDebug("virtual core %u (on logical core %u): in start_core (RIP=%p)\n",
+ core->vcpu_id, core->pcpu_id, (void *)(addr_t)core->rip);
switch (v3_cpu_types[0]) {
#ifdef V3_CONFIG_SVM
i--; // We reset the logical core idx. Not strictly necessary I guess...
} else {
- /* This assumes that the core 0 thread has been mapped to physical core 0 */
if (i == V3_Get_CPU()) {
// We skip the local CPU because it is reserved for vcore 0
continue;
core_idx, start_core, core, core->exec_name);
// TODO: actually manage these threads instead of just launching them
+ core->pcpu_id = core_idx;
core_thread = V3_CREATE_THREAD_ON_CPU(core_idx, start_core, core, core->exec_name);
if (core_thread == NULL) {
sprintf(vm->cores[0].exec_name, "%s", vm->name);
+ vm->cores[0].pcpu_id = V3_Get_CPU();
+
if (start_core(&(vm->cores[0])) != 0) {
PrintError("Error starting VM core 0\n");
v3_stop_vm(vm);
}
+int v3_reset_vm_core(struct guest_info * core, addr_t rip) {
+
+ switch (v3_cpu_types[core->pcpu_id]) {
+#ifdef V3_CONFIG_SVM
+ case V3_SVM_CPU:
+ case V3_SVM_REV3_CPU:
+ PrintDebug("Resetting SVM Guest CPU %d\n", core->vcpu_id);
+ return v3_reset_svm_vm_core(core, rip);
+#endif
+#ifdef V3_CONFIG_VMX
+ case V3_VMX_CPU:
+ case V3_VMX_EPT_CPU:
+ case V3_VMX_EPT_UG_CPU:
+ PrintDebug("Resetting VMX Guest CPU %d\n", core->vcpu_id);
+ return v3_reset_vmx_vm_core(core, rip);
+#endif
+ case V3_INVALID_CPU:
+ default:
+ PrintError("CPU has no virtualization Extensions\n");
+ break;
+ }
+
+ return -1;
+}
+
+
+
int v3_stop_vm(struct v3_vm_info * vm) {