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/lg.h | |
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/lg.h')
-rw-r--r-- | drivers/lguest/lg.h | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/lguest/lg.h b/drivers/lguest/lg.h index 7408cebe995e..e4845d7f0688 100644 --- a/drivers/lguest/lg.h +++ b/drivers/lguest/lg.h | |||
@@ -63,7 +63,7 @@ struct lguest | |||
63 | /* This provides the offset to the base of guest-physical | 63 | /* This provides the offset to the base of guest-physical |
64 | * memory in the Launcher. */ | 64 | * memory in the Launcher. */ |
65 | void __user *mem_base; | 65 | void __user *mem_base; |
66 | u32 page_offset; | 66 | unsigned long kernel_address; |
67 | u32 cr2; | 67 | u32 cr2; |
68 | int halted; | 68 | int halted; |
69 | int ts; | 69 | int ts; |
@@ -165,6 +165,8 @@ void guest_set_pte(struct lguest *lg, unsigned long gpgdir, | |||
165 | void map_switcher_in_guest(struct lguest *lg, struct lguest_pages *pages); | 165 | void map_switcher_in_guest(struct lguest *lg, struct lguest_pages *pages); |
166 | int demand_page(struct lguest *info, unsigned long cr2, int errcode); | 166 | int demand_page(struct lguest *info, unsigned long cr2, int errcode); |
167 | void pin_page(struct lguest *lg, unsigned long vaddr); | 167 | void pin_page(struct lguest *lg, unsigned long vaddr); |
168 | unsigned long guest_pa(struct lguest *lg, unsigned long vaddr); | ||
169 | void page_table_guest_data_init(struct lguest *lg); | ||
168 | 170 | ||
169 | /* <arch>/core.c: */ | 171 | /* <arch>/core.c: */ |
170 | void lguest_arch_host_init(void); | 172 | void lguest_arch_host_init(void); |
@@ -229,9 +231,5 @@ do { \ | |||
229 | } while(0) | 231 | } while(0) |
230 | /* (End of aside) :*/ | 232 | /* (End of aside) :*/ |
231 | 233 | ||
232 | static inline unsigned long guest_pa(struct lguest *lg, unsigned long vaddr) | ||
233 | { | ||
234 | return vaddr - lg->page_offset; | ||
235 | } | ||
236 | #endif /* __ASSEMBLY__ */ | 234 | #endif /* __ASSEMBLY__ */ |
237 | #endif /* _LGUEST_H */ | 235 | #endif /* _LGUEST_H */ |