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 /drivers/lguest/x86 | |
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 'drivers/lguest/x86')
-rw-r--r-- | drivers/lguest/x86/core.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/lguest/x86/core.c b/drivers/lguest/x86/core.c index a125109446dc..39f64c95de18 100644 --- a/drivers/lguest/x86/core.c +++ b/drivers/lguest/x86/core.c | |||
@@ -216,9 +216,10 @@ static int emulate_insn(struct lguest *lg) | |||
216 | * guest_pa just subtracts the Guest's page_offset. */ | 216 | * guest_pa just subtracts the Guest's page_offset. */ |
217 | unsigned long physaddr = guest_pa(lg, lg->regs->eip); | 217 | unsigned long physaddr = guest_pa(lg, lg->regs->eip); |
218 | 218 | ||
219 | /* The guest_pa() function only works for Guest kernel addresses, but | 219 | /* This must be the Guest kernel trying to do something, not userspace! |
220 | * that's all we're trying to do anyway. */ | 220 | * The bottom two bits of the CS segment register are the privilege |
221 | if (lg->regs->eip < lg->page_offset) | 221 | * level. */ |
222 | if ((lg->regs->cs & 3) != GUEST_PL) | ||
222 | return 0; | 223 | return 0; |
223 | 224 | ||
224 | /* Decoding x86 instructions is icky. */ | 225 | /* Decoding x86 instructions is icky. */ |