diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2007-10-21 21:03:36 -0400 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2007-10-23 01:49:54 -0400 |
commit | 47436aa4ad054c1c7c8231618e86ebd9305308dc (patch) | |
tree | a9ba6e0521f9116442144a86e781a3164ec86094 /arch/x86/lguest/boot.c | |
parent | c18acd73ffc209def08003a1927473096f66c5ad (diff) |
Boot with virtual == physical to get closer to native Linux.
1) This allows us to get alot closer to booting bzImages.
2) It means we don't have to know page_offset.
3) The Guest needs to modify the boot pagetables to create the
PAGE_OFFSET mapping before jumping to C code.
4) guest_pa() walks the page tables rather than using page_offset.
5) We don't use page_offset to figure out whether to emulate: it was
always kinda quesationable, and won't work for instructions done
before remapping (bzImage unpacking in particular).
6) We still want the kernel address for tlb flushing: have the initial
hypercall give us that, too.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'arch/x86/lguest/boot.c')
-rw-r--r-- | arch/x86/lguest/boot.c | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c index 3a06b51c98ad..090f30cbf24c 100644 --- a/arch/x86/lguest/boot.c +++ b/arch/x86/lguest/boot.c | |||
@@ -86,6 +86,7 @@ struct lguest_data lguest_data = { | |||
86 | .hcall_status = { [0 ... LHCALL_RING_SIZE-1] = 0xFF }, | 86 | .hcall_status = { [0 ... LHCALL_RING_SIZE-1] = 0xFF }, |
87 | .noirq_start = (u32)lguest_noirq_start, | 87 | .noirq_start = (u32)lguest_noirq_start, |
88 | .noirq_end = (u32)lguest_noirq_end, | 88 | .noirq_end = (u32)lguest_noirq_end, |
89 | .kernel_address = PAGE_OFFSET, | ||
89 | .blocked_interrupts = { 1 }, /* Block timer interrupts */ | 90 | .blocked_interrupts = { 1 }, /* Block timer interrupts */ |
90 | .syscall_vec = SYSCALL_VECTOR, | 91 | .syscall_vec = SYSCALL_VECTOR, |
91 | }; | 92 | }; |
@@ -1033,11 +1034,7 @@ __init void lguest_init(void *boot) | |||
1033 | 1034 | ||
1034 | /*G:070 Now we've seen all the paravirt_ops, we return to | 1035 | /*G:070 Now we've seen all the paravirt_ops, we return to |
1035 | * lguest_init() where the rest of the fairly chaotic boot setup | 1036 | * lguest_init() where the rest of the fairly chaotic boot setup |
1036 | * occurs. | 1037 | * occurs. */ |
1037 | * | ||
1038 | * The Host expects our first hypercall to tell it where our "struct | ||
1039 | * lguest_data" is, so we do that first. */ | ||
1040 | hcall(LHCALL_LGUEST_INIT, __pa(&lguest_data), 0, 0); | ||
1041 | 1038 | ||
1042 | /* The native boot code sets up initial page tables immediately after | 1039 | /* The native boot code sets up initial page tables immediately after |
1043 | * the kernel itself, and sets init_pg_tables_end so they're not | 1040 | * the kernel itself, and sets init_pg_tables_end so they're not |