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/hypercalls.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 'drivers/lguest/hypercalls.c')
-rw-r--r-- | drivers/lguest/hypercalls.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/lguest/hypercalls.c b/drivers/lguest/hypercalls.c index 02d0ae268267..13b5f2f813de 100644 --- a/drivers/lguest/hypercalls.c +++ b/drivers/lguest/hypercalls.c | |||
@@ -181,15 +181,15 @@ static void initialize(struct lguest *lg) | |||
181 | /* The Guest tells us where we're not to deliver interrupts by putting | 181 | /* The Guest tells us where we're not to deliver interrupts by putting |
182 | * the range of addresses into "struct lguest_data". */ | 182 | * the range of addresses into "struct lguest_data". */ |
183 | if (get_user(lg->noirq_start, &lg->lguest_data->noirq_start) | 183 | if (get_user(lg->noirq_start, &lg->lguest_data->noirq_start) |
184 | || get_user(lg->noirq_end, &lg->lguest_data->noirq_end) | 184 | || get_user(lg->noirq_end, &lg->lguest_data->noirq_end)) |
185 | /* We tell the Guest that it can't use the top 4MB of virtual | ||
186 | * addresses used by the Switcher. */ | ||
187 | || put_user(4U*1024*1024, &lg->lguest_data->reserve_mem)) | ||
188 | kill_guest(lg, "bad guest page %p", lg->lguest_data); | 185 | kill_guest(lg, "bad guest page %p", lg->lguest_data); |
189 | 186 | ||
190 | /* We write the current time into the Guest's data page once now. */ | 187 | /* We write the current time into the Guest's data page once now. */ |
191 | write_timestamp(lg); | 188 | write_timestamp(lg); |
192 | 189 | ||
190 | /* page_tables.c will also do some setup. */ | ||
191 | page_table_guest_data_init(lg); | ||
192 | |||
193 | /* This is the one case where the above accesses might have been the | 193 | /* This is the one case where the above accesses might have been the |
194 | * first write to a Guest page. This may have caused a copy-on-write | 194 | * first write to a Guest page. This may have caused a copy-on-write |
195 | * fault, but the Guest might be referring to the old (read-only) | 195 | * fault, but the Guest might be referring to the old (read-only) |