From: Patrick G. Bridges Date: Mon, 25 Oct 2010 19:25:58 +0000 (-0600) Subject: Minor changes to debugging, change to Makefile to support building TAGS files, added... X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=208c31198a01d66589ff6e50d77da14c8dd91d71;p=palacios.git Minor changes to debugging, change to Makefile to support building TAGS files, added initial support for INIT/SIPI modes to vmx.c but multicore VMX still not yet working --- diff --git a/Makefile b/Makefile index bb5c155..9d77f82 100644 --- a/Makefile +++ b/Makefile @@ -818,7 +818,7 @@ endif ALLSOURCE_ARCHS := $(ARCH) define all-sources - ( find $(__srctree)/palacios $(RCS_FIND_IGNORE) \ + ( find $(__srctree)palacios $(RCS_FIND_IGNORE) \ \( -name lib \) -prune -o \ -name '*.[chS]' -print; ) endef diff --git a/palacios/src/devices/icc_bus.c b/palacios/src/devices/icc_bus.c index 79f9159..e9fe95c 100644 --- a/palacios/src/devices/icc_bus.c +++ b/palacios/src/devices/icc_bus.c @@ -135,7 +135,7 @@ static int deliver(uint32_t src_apic, struct apic_data *dest_apic, struct int_cm // Sanity check if (core->cpu_mode != INIT) { - PrintError("icc_bus: Warning: core %u is not in INIT state, ignored\n",core->cpu_id); + PrintError("icc_bus: Warning: core %u is not in INIT state (mode = %d), ignored\n",core->cpu_id, core->cpu_mode); // Only a warning, since INIT INIT SIPI is common break; } @@ -159,7 +159,7 @@ static int deliver(uint32_t src_apic, struct apic_data *dest_apic, struct int_cm // Sanity check if (core->cpu_mode!=SIPI) { - PrintError("icc_bus: core %u is not in SIPI state, ignored!\n",core->cpu_id); + PrintError("icc_bus: core %u is not in SIPI state (mode = %d), ignored!\n",core->cpu_id, core->cpu_mode); break; } @@ -204,8 +204,6 @@ static int deliver(uint32_t src_apic, struct apic_data *dest_apic, struct int_cm int v3_icc_send_ipi(struct vm_device * icc_bus, uint32_t src_apic, uint64_t icr_data, uint32_t extirq) { - PrintDebug("icc_bus: icc_bus=%p, src_apic=%u, icr_data=%llx, extirq=%u\n",icc_bus,src_apic,icr_data,extirq); - struct int_cmd_reg *icr = (struct int_cmd_reg *)&icr_data; struct icc_bus_state * state = (struct icc_bus_state *)icc_bus->private_data; diff --git a/palacios/src/palacios/vmx.c b/palacios/src/palacios/vmx.c index 332e6ad..7cea8a1 100644 --- a/palacios/src/palacios/vmx.c +++ b/palacios/src/palacios/vmx.c @@ -679,8 +679,6 @@ int v3_vmx_enter(struct guest_info * info) { check_vmcs_write(VMCS_TSC_OFFSET_HIGH, tsc_offset_high); check_vmcs_write(VMCS_TSC_OFFSET, tsc_offset_low); - PrintDebug("Stored 0x%x_%x into vmcs TSC offset.\n", - tsc_offset_high, tsc_offset_low); if (info->vm_info->run_state == VM_STOPPED) { info->vm_info->run_state = VM_RUNNING; ret = v3_vmx_launch(&(info->vm_regs), info, &(info->ctrl_regs)); @@ -748,8 +746,36 @@ int v3_vmx_enter(struct guest_info * info) { int v3_start_vmx_guest(struct guest_info* info) { + PrintDebug("Starting VMX core %u\n",info->cpu_id); + if (info->cpu_mode==INIT) { + PrintDebug("VMX core %u: I am an AP in INIT mode, waiting for that to change\n",info->cpu_id); + while (info->cpu_mode==INIT) { + v3_yield(info); + //PrintDebug("VMX core %u: still waiting for INIT\n",info->cpu_id); + } + PrintDebug("VMX core %u: I am out of INIT\n",info->cpu_id); + if (info->cpu_mode==SIPI) { + PrintDebug("VMX core %u: I am waiting on a SIPI to set my starting address\n",info->cpu_id); + while (info->cpu_mode==SIPI) { + v3_yield(info); + //PrintDebug("VMX core %u: still waiting for SIPI\n",info->cpu_id); + } + } + PrintDebug("VMX core %u: I have my SIPI\n", info->cpu_id); + } + + if (info->cpu_mode!=REAL) { + PrintError("VMX core %u: I am not in REAL mode at launch! Huh?!\n", info->cpu_id); + return -1; + } + + PrintDebug("VMX 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)); + + - PrintDebug("Launching VMX guest\n"); + PrintDebug("VMX core %u: Launching VMX VM\n", info->cpu_id); v3_start_time(info);