aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lguest/hypercalls.c
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2007-10-21 21:03:36 -0400
committerRusty Russell <rusty@rustcorp.com.au>2007-10-23 01:49:54 -0400
commit47436aa4ad054c1c7c8231618e86ebd9305308dc (patch)
treea9ba6e0521f9116442144a86e781a3164ec86094 /drivers/lguest/hypercalls.c
parentc18acd73ffc209def08003a1927473096f66c5ad (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.c8
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)