aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-09-28 14:05:58 +0100
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>2005-09-28 14:05:58 +0100
commitae4846b8e4bd318add3553996dddd1b1ec0148f8 (patch)
tree41b0f64b9077ae9c6b54d79fae7b6ae98a69e6e5
parent69f773c57276c97ea79bbfa7324366b211d36e79 (diff)
downloadxen-ae4846b8e4bd318add3553996dddd1b1ec0148f8.tar.gz
xen-ae4846b8e4bd318add3553996dddd1b1ec0148f8.tar.bz2
xen-ae4846b8e4bd318add3553996dddd1b1ec0148f8.zip
With this patch, we can enable VMXAssist to bring up APs of SMP VMX
guest. On entry to VMXAssist: 1) %edx is the processor number, i.e. vcpu id, and for BSP it's 0. 2) %ebx is the vector number from SIPI. Also removed some ugly tailing space. Signed-off-by: Xin Li <xin.b.li@intel.com> Signed-off-by: Jun Nakajima <jun.nakajima@intel.com>
-rw-r--r--tools/firmware/vmxassist/gen.c2
-rw-r--r--tools/firmware/vmxassist/head.S5
-rw-r--r--tools/firmware/vmxassist/setup.c43
-rw-r--r--tools/firmware/vmxassist/vmxloader.c7
4 files changed, 41 insertions, 16 deletions
diff --git a/tools/firmware/vmxassist/gen.c b/tools/firmware/vmxassist/gen.c
index 298f3f5877..3cdea7240f 100644
--- a/tools/firmware/vmxassist/gen.c
+++ b/tools/firmware/vmxassist/gen.c
@@ -23,7 +23,7 @@
#include <vm86.h>
int
-main()
+main(void)
{
printf("/* MACHINE GENERATED; DO NOT EDIT */\n");
printf("#define VMX_ASSIST_CTX_GS_SEL 0x%x\n",
diff --git a/tools/firmware/vmxassist/head.S b/tools/firmware/vmxassist/head.S
index 1541a1c8e9..1410a730f0 100644
--- a/tools/firmware/vmxassist/head.S
+++ b/tools/firmware/vmxassist/head.S
@@ -110,6 +110,10 @@ rom_gdtr:
_start:
cli
+ /* save register parameters to C land */
+ movl %edx, booting_cpu
+ movl %ebx, booting_vector
+
/* clear bss */
cld
xorb %al, %al
@@ -129,7 +133,6 @@ _start:
call main
jmp halt
-
/*
* Something bad happened, print invoking %eip and loop forever
*/
diff --git a/tools/firmware/vmxassist/setup.c b/tools/firmware/vmxassist/setup.c
index a83705f449..dc253afec0 100644
--- a/tools/firmware/vmxassist/setup.c
+++ b/tools/firmware/vmxassist/setup.c
@@ -29,6 +29,9 @@
#define min(a, b) ((a) > (b) ? (b) : (a))
+/* Which CPU are we booting, and what is the initial CS segment? */
+int booting_cpu, booting_vector;
+
unsigned long long gdt[] __attribute__ ((aligned(32))) = {
0x0000000000000000ULL, /* 0x00: reserved */
0x0000890000000000ULL, /* 0x08: 32-bit TSS */
@@ -201,12 +204,17 @@ enter_real_mode(struct regs *regs)
initialize_real_mode = 0;
regs->eflags |= EFLAGS_VM | 0x02;
regs->ves = regs->vds = regs->vfs = regs->vgs = 0xF000;
- regs->cs = 0xF000; /* ROM BIOS POST entry point */
+ if (booting_cpu == 0) {
+ regs->cs = 0xF000; /* ROM BIOS POST entry point */
#ifdef TEST
- regs->eip = 0xFFE0;
+ regs->eip = 0xFFE0;
#else
- regs->eip = 0xFFF0;
+ regs->eip = 0xFFF0;
#endif
+ } else {
+ regs->cs = booting_vector << 8; /* AP entry point */
+ regs->eip = 0;
+ }
regs->uesp = 0;
regs->uss = 0;
printf("Starting emulated 16-bit real-mode: ip=%04x:%04x\n",
@@ -215,8 +223,8 @@ enter_real_mode(struct regs *regs)
mode = VM86_REAL; /* becomes previous mode */
set_mode(regs, VM86_REAL);
- /* this should get us into 16-bit mode */
- return;
+ /* this should get us into 16-bit mode */
+ return;
} else {
/* go from protected to real mode */
regs->eflags |= EFLAGS_VM;
@@ -334,7 +342,12 @@ start_bios(void)
{
unsigned long cr0;
- printf("Start BIOS ...\n");
+ if (booting_cpu == 0)
+ printf("Start BIOS ...\n");
+ else
+ printf("Start AP %d from %08x ...\n",
+ booting_cpu, booting_vector << 12);
+
initialize_real_mode = 1;
cr0 = get_cr0();
#ifndef TEST
@@ -345,20 +358,28 @@ start_bios(void)
}
int
-main()
+main(void)
{
- banner();
+ if (booting_cpu == 0)
+ banner();
+
#ifdef TEST
setup_paging();
#endif
+
setup_gdt();
setup_idt();
+
#ifndef TEST
- set_cr4(get_cr4() | CR4_VME);
+ set_cr4(get_cr4() | CR4_VME);
#endif
+
setup_ctx();
- setup_pic();
+
+ if (booting_cpu == 0)
+ setup_pic();
+
start_bios();
+
return 0;
}
-
diff --git a/tools/firmware/vmxassist/vmxloader.c b/tools/firmware/vmxassist/vmxloader.c
index 15aad0bf5f..2a2a17bc4f 100644
--- a/tools/firmware/vmxassist/vmxloader.c
+++ b/tools/firmware/vmxassist/vmxloader.c
@@ -132,11 +132,12 @@ main(void)
memcpy((void *)ACPI_PHYSICAL_ADDRESS, acpi, sizeof(acpi));
}
#endif
-
+
puts("Loading VMXAssist ...\n");
memcpy((void *)TEXTADDR, vmxassist, sizeof(vmxassist));
+
puts("Go ...\n");
- ((void (*)())TEXTADDR)();
+ asm volatile ( "jmp *%%eax" : : "a" (TEXTADDR), "d" (0) );
+
return 0;
}
-