aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lguest/page_tables.c
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2007-10-21 21:03:26 -0400
committerRusty Russell <rusty@rustcorp.com.au>2007-10-23 01:49:50 -0400
commit3c6b5bfa3cf3b4057788e08482a468cc3bc00780 (patch)
treef0d67890f6f8c9d0840c9b19a483ec06cbf822ef /drivers/lguest/page_tables.c
parent6649bb7af6a819b675bfcf22ab704737e905645a (diff)
Introduce guest mem offset, static link example launcher
In order to avoid problematic special linking of the Launcher, we give the Host an offset: this means we can use any memory region in the Launcher as Guest memory rather than insisting on mmap() at 0. The result is quite pleasing: a number of casts are replaced with simple additions. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'drivers/lguest/page_tables.c')
-rw-r--r--drivers/lguest/page_tables.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/lguest/page_tables.c b/drivers/lguest/page_tables.c
index b7a924ace684..9cd2faceb87c 100644
--- a/drivers/lguest/page_tables.c
+++ b/drivers/lguest/page_tables.c
@@ -152,7 +152,7 @@ static unsigned long get_pfn(unsigned long virtpfn, int write)
152static spte_t gpte_to_spte(struct lguest *lg, gpte_t gpte, int write) 152static spte_t gpte_to_spte(struct lguest *lg, gpte_t gpte, int write)
153{ 153{
154 spte_t spte; 154 spte_t spte;
155 unsigned long pfn; 155 unsigned long pfn, base;
156 156
157 /* The Guest sets the global flag, because it thinks that it is using 157 /* The Guest sets the global flag, because it thinks that it is using
158 * PGE. We only told it to use PGE so it would tell us whether it was 158 * PGE. We only told it to use PGE so it would tell us whether it was
@@ -160,11 +160,14 @@ static spte_t gpte_to_spte(struct lguest *lg, gpte_t gpte, int write)
160 * use the global bit, so throw it away. */ 160 * use the global bit, so throw it away. */
161 spte.flags = (gpte.flags & ~_PAGE_GLOBAL); 161 spte.flags = (gpte.flags & ~_PAGE_GLOBAL);
162 162
163 /* The Guest's pages are offset inside the Launcher. */
164 base = (unsigned long)lg->mem_base / PAGE_SIZE;
165
163 /* We need a temporary "unsigned long" variable to hold the answer from 166 /* We need a temporary "unsigned long" variable to hold the answer from
164 * get_pfn(), because it returns 0xFFFFFFFF on failure, which wouldn't 167 * get_pfn(), because it returns 0xFFFFFFFF on failure, which wouldn't
165 * fit in spte.pfn. get_pfn() finds the real physical number of the 168 * fit in spte.pfn. get_pfn() finds the real physical number of the
166 * page, given the virtual number. */ 169 * page, given the virtual number. */
167 pfn = get_pfn(gpte.pfn, write); 170 pfn = get_pfn(base + gpte.pfn, write);
168 if (pfn == -1UL) { 171 if (pfn == -1UL) {
169 kill_guest(lg, "failed to get page %u", gpte.pfn); 172 kill_guest(lg, "failed to get page %u", gpte.pfn);
170 /* When we destroy the Guest, we'll go through the shadow page 173 /* When we destroy the Guest, we'll go through the shadow page