diff options
author | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-09-28 14:05:58 +0100 |
---|---|---|
committer | kaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk> | 2005-09-28 14:05:58 +0100 |
commit | ae4846b8e4bd318add3553996dddd1b1ec0148f8 (patch) | |
tree | 41b0f64b9077ae9c6b54d79fae7b6ae98a69e6e5 | |
parent | 69f773c57276c97ea79bbfa7324366b211d36e79 (diff) | |
download | xen-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.c | 2 | ||||
-rw-r--r-- | tools/firmware/vmxassist/head.S | 5 | ||||
-rw-r--r-- | tools/firmware/vmxassist/setup.c | 43 | ||||
-rw-r--r-- | tools/firmware/vmxassist/vmxloader.c | 7 |
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; } - |