blob: 758466299b0d46895d6f61f22cd8df9489f17941 [file] [log] [blame]
Rusty Russell2e04ef72009-07-30 16:03:45 -06001/*P:700
2 * The pagetable code, on the other hand, still shows the scars of
Rusty Russellf938d2c2007-07-26 10:41:02 -07003 * previous encounters. It's functional, and as neat as it can be in the
4 * circumstances, but be wary, for these things are subtle and break easily.
5 * The Guest provides a virtual to physical mapping, but we can neither trust
Rusty Russella6bd8e12008-03-28 11:05:53 -05006 * it nor use it: we verify and convert it here then point the CPU to the
Rusty Russell2e04ef72009-07-30 16:03:45 -06007 * converted Guest pages when running the Guest.
8:*/
Rusty Russellf938d2c2007-07-26 10:41:02 -07009
10/* Copyright (C) Rusty Russell IBM Corporation 2006.
Rusty Russelld7e28ff2007-07-19 01:49:23 -070011 * GPL v2 and any later version */
12#include <linux/mm.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090013#include <linux/gfp.h>
Rusty Russelld7e28ff2007-07-19 01:49:23 -070014#include <linux/types.h>
15#include <linux/spinlock.h>
16#include <linux/random.h>
17#include <linux/percpu.h>
18#include <asm/tlbflush.h>
Rusty Russell47436aa2007-10-22 11:03:36 +100019#include <asm/uaccess.h>
Rusty Russelld7e28ff2007-07-19 01:49:23 -070020#include "lg.h"
21
Rusty Russell2e04ef72009-07-30 16:03:45 -060022/*M:008
23 * We hold reference to pages, which prevents them from being swapped.
Rusty Russellf56a3842007-07-26 10:41:05 -070024 * It'd be nice to have a callback in the "struct mm_struct" when Linux wants
25 * to swap out. If we had this, and a shrinker callback to trim PTE pages, we
Rusty Russell2e04ef72009-07-30 16:03:45 -060026 * could probably consider launching Guests as non-root.
27:*/
Rusty Russellf56a3842007-07-26 10:41:05 -070028
Rusty Russellbff672e2007-07-26 10:41:04 -070029/*H:300
30 * The Page Table Code
31 *
Rusty Russella91d74a2009-07-30 16:03:45 -060032 * We use two-level page tables for the Guest, or three-level with PAE. If
33 * you're not entirely comfortable with virtual addresses, physical addresses
34 * and page tables then I recommend you review arch/x86/lguest/boot.c's "Page
35 * Table Handling" (with diagrams!).
Rusty Russellbff672e2007-07-26 10:41:04 -070036 *
37 * The Guest keeps page tables, but we maintain the actual ones here: these are
38 * called "shadow" page tables. Which is a very Guest-centric name: these are
39 * the real page tables the CPU uses, although we keep them up to date to
40 * reflect the Guest's. (See what I mean about weird naming? Since when do
41 * shadows reflect anything?)
42 *
43 * Anyway, this is the most complicated part of the Host code. There are seven
44 * parts to this:
Rusty Russelle1e72962007-10-25 15:02:50 +100045 * (i) Looking up a page table entry when the Guest faults,
46 * (ii) Making sure the Guest stack is mapped,
47 * (iii) Setting up a page table entry when the Guest tells us one has changed,
Rusty Russellbff672e2007-07-26 10:41:04 -070048 * (iv) Switching page tables,
Rusty Russelle1e72962007-10-25 15:02:50 +100049 * (v) Flushing (throwing away) page tables,
Rusty Russellbff672e2007-07-26 10:41:04 -070050 * (vi) Mapping the Switcher when the Guest is about to run,
51 * (vii) Setting up the page tables initially.
Rusty Russell2e04ef72009-07-30 16:03:45 -060052:*/
Rusty Russellbff672e2007-07-26 10:41:04 -070053
Rusty Russell2e04ef72009-07-30 16:03:45 -060054/*
Rusty Russella91d74a2009-07-30 16:03:45 -060055 * The Switcher uses the complete top PTE page. That's 1024 PTE entries (4MB)
56 * or 512 PTE entries with PAE (2MB).
Rusty Russell2e04ef72009-07-30 16:03:45 -060057 */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +100058#define SWITCHER_PGD_INDEX (PTRS_PER_PGD - 1)
Rusty Russelld7e28ff2007-07-19 01:49:23 -070059
Rusty Russell2e04ef72009-07-30 16:03:45 -060060/*
61 * For PAE we need the PMD index as well. We use the last 2MB, so we
62 * will need the last pmd entry of the last pmd page.
63 */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -060064#ifdef CONFIG_X86_PAE
65#define SWITCHER_PMD_INDEX (PTRS_PER_PMD - 1)
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -060066#define CHECK_GPGD_MASK _PAGE_PRESENT
67#else
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -060068#define CHECK_GPGD_MASK _PAGE_TABLE
69#endif
70
Rusty Russell2e04ef72009-07-30 16:03:45 -060071/*
72 * We actually need a separate PTE page for each CPU. Remember that after the
Rusty Russellbff672e2007-07-26 10:41:04 -070073 * Switcher code itself comes two pages for each CPU, and we don't want this
Rusty Russell2e04ef72009-07-30 16:03:45 -060074 * CPU's guest to see the pages of any other CPU.
75 */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +100076static DEFINE_PER_CPU(pte_t *, switcher_pte_pages);
Rusty Russelld7e28ff2007-07-19 01:49:23 -070077#define switcher_pte_page(cpu) per_cpu(switcher_pte_pages, cpu)
78
Rusty Russell2e04ef72009-07-30 16:03:45 -060079/*H:320
80 * The page table code is curly enough to need helper functions to keep it
Rusty Russella91d74a2009-07-30 16:03:45 -060081 * clear and clean. The kernel itself provides many of them; one advantage
82 * of insisting that the Guest and Host use the same CONFIG_PAE setting.
Rusty Russellbff672e2007-07-26 10:41:04 -070083 *
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +100084 * There are two functions which return pointers to the shadow (aka "real")
Rusty Russellbff672e2007-07-26 10:41:04 -070085 * page tables.
86 *
87 * spgd_addr() takes the virtual address and returns a pointer to the top-level
Rusty Russelle1e72962007-10-25 15:02:50 +100088 * page directory entry (PGD) for that address. Since we keep track of several
89 * page tables, the "i" argument tells us which one we're interested in (it's
Rusty Russell2e04ef72009-07-30 16:03:45 -060090 * usually the current one).
91 */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -020092static pgd_t *spgd_addr(struct lg_cpu *cpu, u32 i, unsigned long vaddr)
Rusty Russelld7e28ff2007-07-19 01:49:23 -070093{
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +100094 unsigned int index = pgd_index(vaddr);
Rusty Russelld7e28ff2007-07-19 01:49:23 -070095
Rusty Russellbff672e2007-07-26 10:41:04 -070096 /* Return a pointer index'th pgd entry for the i'th page table. */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -020097 return &cpu->lg->pgdirs[i].pgdir[index];
Rusty Russelld7e28ff2007-07-19 01:49:23 -070098}
99
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600100#ifdef CONFIG_X86_PAE
Rusty Russell2e04ef72009-07-30 16:03:45 -0600101/*
102 * This routine then takes the PGD entry given above, which contains the
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600103 * address of the PMD page. It then returns a pointer to the PMD entry for the
Rusty Russell2e04ef72009-07-30 16:03:45 -0600104 * given address.
105 */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600106static pmd_t *spmd_addr(struct lg_cpu *cpu, pgd_t spgd, unsigned long vaddr)
107{
108 unsigned int index = pmd_index(vaddr);
109 pmd_t *page;
110
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600111 /* You should never call this if the PGD entry wasn't valid */
112 BUG_ON(!(pgd_flags(spgd) & _PAGE_PRESENT));
113 page = __va(pgd_pfn(spgd) << PAGE_SHIFT);
114
115 return &page[index];
116}
117#endif
118
Rusty Russell2e04ef72009-07-30 16:03:45 -0600119/*
120 * This routine then takes the page directory entry returned above, which
Rusty Russelle1e72962007-10-25 15:02:50 +1000121 * contains the address of the page table entry (PTE) page. It then returns a
Rusty Russell2e04ef72009-07-30 16:03:45 -0600122 * pointer to the PTE entry for the given address.
123 */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600124static pte_t *spte_addr(struct lg_cpu *cpu, pgd_t spgd, unsigned long vaddr)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700125{
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600126#ifdef CONFIG_X86_PAE
127 pmd_t *pmd = spmd_addr(cpu, spgd, vaddr);
128 pte_t *page = __va(pmd_pfn(*pmd) << PAGE_SHIFT);
129
130 /* You should never call this if the PMD entry wasn't valid */
131 BUG_ON(!(pmd_flags(*pmd) & _PAGE_PRESENT));
132#else
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000133 pte_t *page = __va(pgd_pfn(spgd) << PAGE_SHIFT);
Rusty Russellbff672e2007-07-26 10:41:04 -0700134 /* You should never call this if the PGD entry wasn't valid */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000135 BUG_ON(!(pgd_flags(spgd) & _PAGE_PRESENT));
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600136#endif
137
Matias Zabaljauregui90603d12009-06-12 22:27:06 -0600138 return &page[pte_index(vaddr)];
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700139}
140
Rusty Russell2e04ef72009-07-30 16:03:45 -0600141/*
Rusty Russell9f542882011-07-22 14:39:50 +0930142 * These functions are just like the above, except they access the Guest
Rusty Russell2e04ef72009-07-30 16:03:45 -0600143 * page tables. Hence they return a Guest address.
144 */
Glauber de Oliveira Costa17136082008-01-07 11:05:37 -0200145static unsigned long gpgd_addr(struct lg_cpu *cpu, unsigned long vaddr)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700146{
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000147 unsigned int index = vaddr >> (PGDIR_SHIFT);
Glauber de Oliveira Costa17136082008-01-07 11:05:37 -0200148 return cpu->lg->pgdirs[cpu->cpu_pgd].gpgdir + index * sizeof(pgd_t);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700149}
150
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600151#ifdef CONFIG_X86_PAE
Rusty Russella91d74a2009-07-30 16:03:45 -0600152/* Follow the PGD to the PMD. */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600153static unsigned long gpmd_addr(pgd_t gpgd, unsigned long vaddr)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700154{
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000155 unsigned long gpage = pgd_pfn(gpgd) << PAGE_SHIFT;
156 BUG_ON(!(pgd_flags(gpgd) & _PAGE_PRESENT));
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600157 return gpage + pmd_index(vaddr) * sizeof(pmd_t);
158}
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600159
Rusty Russella91d74a2009-07-30 16:03:45 -0600160/* Follow the PMD to the PTE. */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600161static unsigned long gpte_addr(struct lg_cpu *cpu,
Rusty Russell92b4d8d2009-06-12 22:27:08 -0600162 pmd_t gpmd, unsigned long vaddr)
163{
164 unsigned long gpage = pmd_pfn(gpmd) << PAGE_SHIFT;
165
166 BUG_ON(!(pmd_flags(gpmd) & _PAGE_PRESENT));
167 return gpage + pte_index(vaddr) * sizeof(pte_t);
168}
169#else
Rusty Russella91d74a2009-07-30 16:03:45 -0600170/* Follow the PGD to the PTE (no mid-level for !PAE). */
Rusty Russell92b4d8d2009-06-12 22:27:08 -0600171static unsigned long gpte_addr(struct lg_cpu *cpu,
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600172 pgd_t gpgd, unsigned long vaddr)
173{
Rusty Russell92b4d8d2009-06-12 22:27:08 -0600174 unsigned long gpage = pgd_pfn(gpgd) << PAGE_SHIFT;
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600175
176 BUG_ON(!(pgd_flags(gpgd) & _PAGE_PRESENT));
Matias Zabaljauregui90603d12009-06-12 22:27:06 -0600177 return gpage + pte_index(vaddr) * sizeof(pte_t);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700178}
Rusty Russell92b4d8d2009-06-12 22:27:08 -0600179#endif
Rusty Russella6bd8e12008-03-28 11:05:53 -0500180/*:*/
181
Rusty Russell9f542882011-07-22 14:39:50 +0930182/*M:007
Rusty Russell2e04ef72009-07-30 16:03:45 -0600183 * get_pfn is slow: we could probably try to grab batches of pages here as
184 * an optimization (ie. pre-faulting).
185:*/
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700186
Rusty Russell2e04ef72009-07-30 16:03:45 -0600187/*H:350
188 * This routine takes a page number given by the Guest and converts it to
Rusty Russellbff672e2007-07-26 10:41:04 -0700189 * an actual, physical page number. It can fail for several reasons: the
190 * virtual address might not be mapped by the Launcher, the write flag is set
191 * and the page is read-only, or the write flag was set and the page was
192 * shared so had to be copied, but we ran out of memory.
193 *
Rusty Russella6bd8e12008-03-28 11:05:53 -0500194 * This holds a reference to the page, so release_pte() is careful to put that
Rusty Russell2e04ef72009-07-30 16:03:45 -0600195 * back.
196 */
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700197static unsigned long get_pfn(unsigned long virtpfn, int write)
198{
199 struct page *page;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700200
Rusty Russell71a3f4e2008-08-12 17:52:53 -0500201 /* gup me one page at this address please! */
202 if (get_user_pages_fast(virtpfn << PAGE_SHIFT, 1, write, &page) == 1)
203 return page_to_pfn(page);
204
205 /* This value indicates failure. */
206 return -1UL;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700207}
208
Rusty Russell2e04ef72009-07-30 16:03:45 -0600209/*H:340
210 * Converting a Guest page table entry to a shadow (ie. real) page table
Rusty Russellbff672e2007-07-26 10:41:04 -0700211 * entry can be a little tricky. The flags are (almost) the same, but the
212 * Guest PTE contains a virtual page number: the CPU needs the real page
Rusty Russell2e04ef72009-07-30 16:03:45 -0600213 * number.
214 */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200215static pte_t gpte_to_spte(struct lg_cpu *cpu, pte_t gpte, int write)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700216{
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000217 unsigned long pfn, base, flags;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700218
Rusty Russell2e04ef72009-07-30 16:03:45 -0600219 /*
220 * The Guest sets the global flag, because it thinks that it is using
Rusty Russellbff672e2007-07-26 10:41:04 -0700221 * PGE. We only told it to use PGE so it would tell us whether it was
222 * flushing a kernel mapping or a userspace mapping. We don't actually
Rusty Russell2e04ef72009-07-30 16:03:45 -0600223 * use the global bit, so throw it away.
224 */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000225 flags = (pte_flags(gpte) & ~_PAGE_GLOBAL);
Rusty Russellbff672e2007-07-26 10:41:04 -0700226
Rusty Russell3c6b5bf2007-10-22 11:03:26 +1000227 /* The Guest's pages are offset inside the Launcher. */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200228 base = (unsigned long)cpu->lg->mem_base / PAGE_SIZE;
Rusty Russell3c6b5bf2007-10-22 11:03:26 +1000229
Rusty Russell2e04ef72009-07-30 16:03:45 -0600230 /*
231 * We need a temporary "unsigned long" variable to hold the answer from
Rusty Russellbff672e2007-07-26 10:41:04 -0700232 * get_pfn(), because it returns 0xFFFFFFFF on failure, which wouldn't
233 * fit in spte.pfn. get_pfn() finds the real physical number of the
Rusty Russell2e04ef72009-07-30 16:03:45 -0600234 * page, given the virtual number.
235 */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000236 pfn = get_pfn(base + pte_pfn(gpte), write);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700237 if (pfn == -1UL) {
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200238 kill_guest(cpu, "failed to get page %lu", pte_pfn(gpte));
Rusty Russell2e04ef72009-07-30 16:03:45 -0600239 /*
240 * When we destroy the Guest, we'll go through the shadow page
Rusty Russellbff672e2007-07-26 10:41:04 -0700241 * tables and release_pte() them. Make sure we don't think
Rusty Russell2e04ef72009-07-30 16:03:45 -0600242 * this one is valid!
243 */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000244 flags = 0;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700245 }
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000246 /* Now we assemble our shadow PTE from the page number and flags. */
247 return pfn_pte(pfn, __pgprot(flags));
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700248}
249
Rusty Russellbff672e2007-07-26 10:41:04 -0700250/*H:460 And to complete the chain, release_pte() looks like this: */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000251static void release_pte(pte_t pte)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700252{
Rusty Russell2e04ef72009-07-30 16:03:45 -0600253 /*
254 * Remember that get_user_pages_fast() took a reference to the page, in
255 * get_pfn()? We have to put it back now.
256 */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000257 if (pte_flags(pte) & _PAGE_PRESENT)
Matias Zabaljauregui90603d12009-06-12 22:27:06 -0600258 put_page(pte_page(pte));
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700259}
Rusty Russellbff672e2007-07-26 10:41:04 -0700260/*:*/
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700261
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200262static void check_gpte(struct lg_cpu *cpu, pte_t gpte)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700263{
Ahmed S. Darwish31f4b462008-02-09 23:24:09 +0100264 if ((pte_flags(gpte) & _PAGE_PSE) ||
265 pte_pfn(gpte) >= cpu->lg->pfn_limit)
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200266 kill_guest(cpu, "bad page table entry");
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700267}
268
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200269static void check_gpgd(struct lg_cpu *cpu, pgd_t gpgd)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700270{
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600271 if ((pgd_flags(gpgd) & ~CHECK_GPGD_MASK) ||
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200272 (pgd_pfn(gpgd) >= cpu->lg->pfn_limit))
273 kill_guest(cpu, "bad page directory entry");
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700274}
275
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600276#ifdef CONFIG_X86_PAE
277static void check_gpmd(struct lg_cpu *cpu, pmd_t gpmd)
278{
279 if ((pmd_flags(gpmd) & ~_PAGE_TABLE) ||
280 (pmd_pfn(gpmd) >= cpu->lg->pfn_limit))
281 kill_guest(cpu, "bad page middle directory entry");
282}
283#endif
284
Rusty Russellbff672e2007-07-26 10:41:04 -0700285/*H:330
Rusty Russelle1e72962007-10-25 15:02:50 +1000286 * (i) Looking up a page table entry when the Guest faults.
Rusty Russellbff672e2007-07-26 10:41:04 -0700287 *
288 * We saw this call in run_guest(): when we see a page fault in the Guest, we
289 * come here. That's because we only set up the shadow page tables lazily as
290 * they're needed, so we get page faults all the time and quietly fix them up
291 * and return to the Guest without it knowing.
292 *
293 * If we fixed up the fault (ie. we mapped the address), this routine returns
Rusty Russell2e04ef72009-07-30 16:03:45 -0600294 * true. Otherwise, it was a real fault and we need to tell the Guest.
295 */
Matias Zabaljaureguidf1693a2009-03-18 13:38:35 -0300296bool demand_page(struct lg_cpu *cpu, unsigned long vaddr, int errcode)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700297{
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000298 pgd_t gpgd;
299 pgd_t *spgd;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700300 unsigned long gpte_ptr;
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000301 pte_t gpte;
302 pte_t *spte;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700303
Rusty Russella91d74a2009-07-30 16:03:45 -0600304 /* Mid level for PAE. */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600305#ifdef CONFIG_X86_PAE
306 pmd_t *spmd;
307 pmd_t gpmd;
308#endif
309
Rusty Russell68a644d2013-04-22 14:10:37 +0930310 /* We never demand page the Switcher, so trying is a mistake. */
311 if (vaddr >= switcher_addr)
312 return false;
313
Rusty Russellbff672e2007-07-26 10:41:04 -0700314 /* First step: get the top-level Guest page table entry. */
Rusty Russell5dea1c82011-07-22 14:39:48 +0930315 if (unlikely(cpu->linear_pages)) {
316 /* Faking up a linear mapping. */
317 gpgd = __pgd(CHECK_GPGD_MASK);
318 } else {
319 gpgd = lgread(cpu, gpgd_addr(cpu, vaddr), pgd_t);
320 /* Toplevel not present? We can't map it in. */
321 if (!(pgd_flags(gpgd) & _PAGE_PRESENT))
322 return false;
323 }
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700324
Rusty Russellbff672e2007-07-26 10:41:04 -0700325 /* Now look at the matching shadow entry. */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200326 spgd = spgd_addr(cpu, cpu->cpu_pgd, vaddr);
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000327 if (!(pgd_flags(*spgd) & _PAGE_PRESENT)) {
Rusty Russellbff672e2007-07-26 10:41:04 -0700328 /* No shadow entry: allocate a new shadow PTE page. */
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700329 unsigned long ptepage = get_zeroed_page(GFP_KERNEL);
Rusty Russell2e04ef72009-07-30 16:03:45 -0600330 /*
331 * This is not really the Guest's fault, but killing it is
332 * simple for this corner case.
333 */
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700334 if (!ptepage) {
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200335 kill_guest(cpu, "out of memory allocating pte page");
Matias Zabaljaureguidf1693a2009-03-18 13:38:35 -0300336 return false;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700337 }
Rusty Russellbff672e2007-07-26 10:41:04 -0700338 /* We check that the Guest pgd is OK. */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200339 check_gpgd(cpu, gpgd);
Rusty Russell2e04ef72009-07-30 16:03:45 -0600340 /*
341 * And we copy the flags to the shadow PGD entry. The page
342 * number in the shadow PGD is the page we just allocated.
343 */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600344 set_pgd(spgd, __pgd(__pa(ptepage) | pgd_flags(gpgd)));
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700345 }
346
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600347#ifdef CONFIG_X86_PAE
Rusty Russell5dea1c82011-07-22 14:39:48 +0930348 if (unlikely(cpu->linear_pages)) {
349 /* Faking up a linear mapping. */
350 gpmd = __pmd(_PAGE_TABLE);
351 } else {
352 gpmd = lgread(cpu, gpmd_addr(gpgd, vaddr), pmd_t);
353 /* Middle level not present? We can't map it in. */
354 if (!(pmd_flags(gpmd) & _PAGE_PRESENT))
355 return false;
356 }
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600357
358 /* Now look at the matching shadow entry. */
359 spmd = spmd_addr(cpu, *spgd, vaddr);
360
361 if (!(pmd_flags(*spmd) & _PAGE_PRESENT)) {
362 /* No shadow entry: allocate a new shadow PTE page. */
363 unsigned long ptepage = get_zeroed_page(GFP_KERNEL);
364
Rusty Russell2e04ef72009-07-30 16:03:45 -0600365 /*
366 * This is not really the Guest's fault, but killing it is
367 * simple for this corner case.
368 */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600369 if (!ptepage) {
370 kill_guest(cpu, "out of memory allocating pte page");
371 return false;
372 }
373
374 /* We check that the Guest pmd is OK. */
375 check_gpmd(cpu, gpmd);
376
Rusty Russell2e04ef72009-07-30 16:03:45 -0600377 /*
378 * And we copy the flags to the shadow PMD entry. The page
379 * number in the shadow PMD is the page we just allocated.
380 */
Rusty Russell4c1ea3d2009-09-23 22:26:45 -0600381 set_pmd(spmd, __pmd(__pa(ptepage) | pmd_flags(gpmd)));
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600382 }
Rusty Russell92b4d8d2009-06-12 22:27:08 -0600383
Rusty Russell2e04ef72009-07-30 16:03:45 -0600384 /*
385 * OK, now we look at the lower level in the Guest page table: keep its
386 * address, because we might update it later.
387 */
Rusty Russell92b4d8d2009-06-12 22:27:08 -0600388 gpte_ptr = gpte_addr(cpu, gpmd, vaddr);
389#else
Rusty Russell2e04ef72009-07-30 16:03:45 -0600390 /*
391 * OK, now we look at the lower level in the Guest page table: keep its
392 * address, because we might update it later.
393 */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600394 gpte_ptr = gpte_addr(cpu, gpgd, vaddr);
Rusty Russell92b4d8d2009-06-12 22:27:08 -0600395#endif
Rusty Russella91d74a2009-07-30 16:03:45 -0600396
Rusty Russell5dea1c82011-07-22 14:39:48 +0930397 if (unlikely(cpu->linear_pages)) {
398 /* Linear? Make up a PTE which points to same page. */
399 gpte = __pte((vaddr & PAGE_MASK) | _PAGE_RW | _PAGE_PRESENT);
400 } else {
401 /* Read the actual PTE value. */
402 gpte = lgread(cpu, gpte_ptr, pte_t);
403 }
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700404
Rusty Russellbff672e2007-07-26 10:41:04 -0700405 /* If this page isn't in the Guest page tables, we can't page it in. */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000406 if (!(pte_flags(gpte) & _PAGE_PRESENT))
Matias Zabaljaureguidf1693a2009-03-18 13:38:35 -0300407 return false;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700408
Rusty Russell2e04ef72009-07-30 16:03:45 -0600409 /*
410 * Check they're not trying to write to a page the Guest wants
411 * read-only (bit 2 of errcode == write).
412 */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000413 if ((errcode & 2) && !(pte_flags(gpte) & _PAGE_RW))
Matias Zabaljaureguidf1693a2009-03-18 13:38:35 -0300414 return false;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700415
Rusty Russelle1e72962007-10-25 15:02:50 +1000416 /* User access to a kernel-only page? (bit 3 == user access) */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000417 if ((errcode & 4) && !(pte_flags(gpte) & _PAGE_USER))
Matias Zabaljaureguidf1693a2009-03-18 13:38:35 -0300418 return false;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700419
Rusty Russell2e04ef72009-07-30 16:03:45 -0600420 /*
421 * Check that the Guest PTE flags are OK, and the page number is below
422 * the pfn_limit (ie. not mapping the Launcher binary).
423 */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200424 check_gpte(cpu, gpte);
Rusty Russelle1e72962007-10-25 15:02:50 +1000425
Rusty Russellbff672e2007-07-26 10:41:04 -0700426 /* Add the _PAGE_ACCESSED and (for a write) _PAGE_DIRTY flag */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000427 gpte = pte_mkyoung(gpte);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700428 if (errcode & 2)
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000429 gpte = pte_mkdirty(gpte);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700430
Rusty Russellbff672e2007-07-26 10:41:04 -0700431 /* Get the pointer to the shadow PTE entry we're going to set. */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600432 spte = spte_addr(cpu, *spgd, vaddr);
Rusty Russell2e04ef72009-07-30 16:03:45 -0600433
434 /*
435 * If there was a valid shadow PTE entry here before, we release it.
436 * This can happen with a write to a previously read-only entry.
437 */
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700438 release_pte(*spte);
439
Rusty Russell2e04ef72009-07-30 16:03:45 -0600440 /*
441 * If this is a write, we insist that the Guest page is writable (the
442 * final arg to gpte_to_spte()).
443 */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000444 if (pte_dirty(gpte))
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200445 *spte = gpte_to_spte(cpu, gpte, 1);
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000446 else
Rusty Russell2e04ef72009-07-30 16:03:45 -0600447 /*
448 * If this is a read, don't set the "writable" bit in the page
Rusty Russellbff672e2007-07-26 10:41:04 -0700449 * table entry, even if the Guest says it's writable. That way
Rusty Russelle1e72962007-10-25 15:02:50 +1000450 * we will come back here when a write does actually occur, so
Rusty Russell2e04ef72009-07-30 16:03:45 -0600451 * we can update the Guest's _PAGE_DIRTY flag.
452 */
Rusty Russell4c1ea3d2009-09-23 22:26:45 -0600453 set_pte(spte, gpte_to_spte(cpu, pte_wrprotect(gpte), 0));
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700454
Rusty Russell2e04ef72009-07-30 16:03:45 -0600455 /*
456 * Finally, we write the Guest PTE entry back: we've set the
457 * _PAGE_ACCESSED and maybe the _PAGE_DIRTY flags.
458 */
Rusty Russell5dea1c82011-07-22 14:39:48 +0930459 if (likely(!cpu->linear_pages))
460 lgwrite(cpu, gpte_ptr, pte_t, gpte);
Rusty Russellbff672e2007-07-26 10:41:04 -0700461
Rusty Russell2e04ef72009-07-30 16:03:45 -0600462 /*
463 * The fault is fixed, the page table is populated, the mapping
Rusty Russelle1e72962007-10-25 15:02:50 +1000464 * manipulated, the result returned and the code complete. A small
465 * delay and a trace of alliteration are the only indications the Guest
Rusty Russell2e04ef72009-07-30 16:03:45 -0600466 * has that a page fault occurred at all.
467 */
Matias Zabaljaureguidf1693a2009-03-18 13:38:35 -0300468 return true;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700469}
470
Rusty Russelle1e72962007-10-25 15:02:50 +1000471/*H:360
472 * (ii) Making sure the Guest stack is mapped.
Rusty Russellbff672e2007-07-26 10:41:04 -0700473 *
Rusty Russelle1e72962007-10-25 15:02:50 +1000474 * Remember that direct traps into the Guest need a mapped Guest kernel stack.
475 * pin_stack_pages() calls us here: we could simply call demand_page(), but as
476 * we've seen that logic is quite long, and usually the stack pages are already
477 * mapped, so it's overkill.
Rusty Russellbff672e2007-07-26 10:41:04 -0700478 *
479 * This is a quick version which answers the question: is this virtual address
Rusty Russell2e04ef72009-07-30 16:03:45 -0600480 * mapped by the shadow page tables, and is it writable?
481 */
Matias Zabaljaureguidf1693a2009-03-18 13:38:35 -0300482static bool page_writable(struct lg_cpu *cpu, unsigned long vaddr)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700483{
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000484 pgd_t *spgd;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700485 unsigned long flags;
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600486#ifdef CONFIG_X86_PAE
487 pmd_t *spmd;
488#endif
Rusty Russell68a644d2013-04-22 14:10:37 +0930489
490 /* You can't put your stack in the Switcher! */
491 if (vaddr >= switcher_addr)
492 return false;
493
Rusty Russelle1e72962007-10-25 15:02:50 +1000494 /* Look at the current top level entry: is it present? */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200495 spgd = spgd_addr(cpu, cpu->cpu_pgd, vaddr);
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000496 if (!(pgd_flags(*spgd) & _PAGE_PRESENT))
Matias Zabaljaureguidf1693a2009-03-18 13:38:35 -0300497 return false;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700498
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600499#ifdef CONFIG_X86_PAE
500 spmd = spmd_addr(cpu, *spgd, vaddr);
501 if (!(pmd_flags(*spmd) & _PAGE_PRESENT))
502 return false;
503#endif
504
Rusty Russell2e04ef72009-07-30 16:03:45 -0600505 /*
506 * Check the flags on the pte entry itself: it must be present and
507 * writable.
508 */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600509 flags = pte_flags(*(spte_addr(cpu, *spgd, vaddr)));
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000510
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700511 return (flags & (_PAGE_PRESENT|_PAGE_RW)) == (_PAGE_PRESENT|_PAGE_RW);
512}
513
Rusty Russell2e04ef72009-07-30 16:03:45 -0600514/*
515 * So, when pin_stack_pages() asks us to pin a page, we check if it's already
Rusty Russellbff672e2007-07-26 10:41:04 -0700516 * in the page tables, and if not, we call demand_page() with error code 2
Rusty Russell2e04ef72009-07-30 16:03:45 -0600517 * (meaning "write").
518 */
Glauber de Oliveira Costa17136082008-01-07 11:05:37 -0200519void pin_page(struct lg_cpu *cpu, unsigned long vaddr)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700520{
Glauber de Oliveira Costa17136082008-01-07 11:05:37 -0200521 if (!page_writable(cpu, vaddr) && !demand_page(cpu, vaddr, 2))
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200522 kill_guest(cpu, "bad stack page %#lx", vaddr);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700523}
Rusty Russella91d74a2009-07-30 16:03:45 -0600524/*:*/
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700525
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600526#ifdef CONFIG_X86_PAE
527static void release_pmd(pmd_t *spmd)
528{
529 /* If the entry's not present, there's nothing to release. */
530 if (pmd_flags(*spmd) & _PAGE_PRESENT) {
531 unsigned int i;
532 pte_t *ptepage = __va(pmd_pfn(*spmd) << PAGE_SHIFT);
533 /* For each entry in the page, we might need to release it. */
534 for (i = 0; i < PTRS_PER_PTE; i++)
535 release_pte(ptepage[i]);
536 /* Now we can free the page of PTEs */
537 free_page((long)ptepage);
538 /* And zero out the PMD entry so we never release it twice. */
Rusty Russell4c1ea3d2009-09-23 22:26:45 -0600539 set_pmd(spmd, __pmd(0));
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600540 }
541}
542
543static void release_pgd(pgd_t *spgd)
544{
545 /* If the entry's not present, there's nothing to release. */
546 if (pgd_flags(*spgd) & _PAGE_PRESENT) {
547 unsigned int i;
548 pmd_t *pmdpage = __va(pgd_pfn(*spgd) << PAGE_SHIFT);
549
550 for (i = 0; i < PTRS_PER_PMD; i++)
551 release_pmd(&pmdpage[i]);
552
553 /* Now we can free the page of PMDs */
554 free_page((long)pmdpage);
555 /* And zero out the PGD entry so we never release it twice. */
556 set_pgd(spgd, __pgd(0));
557 }
558}
559
560#else /* !CONFIG_X86_PAE */
Rusty Russella91d74a2009-07-30 16:03:45 -0600561/*H:450
562 * If we chase down the release_pgd() code, the non-PAE version looks like
563 * this. The PAE version is almost identical, but instead of calling
564 * release_pte it calls release_pmd(), which looks much like this.
565 */
Matias Zabaljauregui90603d12009-06-12 22:27:06 -0600566static void release_pgd(pgd_t *spgd)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700567{
Rusty Russellbff672e2007-07-26 10:41:04 -0700568 /* If the entry's not present, there's nothing to release. */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000569 if (pgd_flags(*spgd) & _PAGE_PRESENT) {
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700570 unsigned int i;
Rusty Russell2e04ef72009-07-30 16:03:45 -0600571 /*
572 * Converting the pfn to find the actual PTE page is easy: turn
Rusty Russellbff672e2007-07-26 10:41:04 -0700573 * the page number into a physical address, then convert to a
Rusty Russell2e04ef72009-07-30 16:03:45 -0600574 * virtual address (easy for kernel pages like this one).
575 */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000576 pte_t *ptepage = __va(pgd_pfn(*spgd) << PAGE_SHIFT);
Rusty Russellbff672e2007-07-26 10:41:04 -0700577 /* For each entry in the page, we might need to release it. */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000578 for (i = 0; i < PTRS_PER_PTE; i++)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700579 release_pte(ptepage[i]);
Rusty Russellbff672e2007-07-26 10:41:04 -0700580 /* Now we can free the page of PTEs */
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700581 free_page((long)ptepage);
Rusty Russelle1e72962007-10-25 15:02:50 +1000582 /* And zero out the PGD entry so we never release it twice. */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000583 *spgd = __pgd(0);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700584 }
585}
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600586#endif
Rusty Russell2e04ef72009-07-30 16:03:45 -0600587
588/*H:445
589 * We saw flush_user_mappings() twice: once from the flush_user_mappings()
Rusty Russelle1e72962007-10-25 15:02:50 +1000590 * hypercall and once in new_pgdir() when we re-used a top-level pgdir page.
Rusty Russell2e04ef72009-07-30 16:03:45 -0600591 * It simply releases every PTE page from 0 up to the Guest's kernel address.
592 */
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700593static void flush_user_mappings(struct lguest *lg, int idx)
594{
595 unsigned int i;
Rusty Russellbff672e2007-07-26 10:41:04 -0700596 /* Release every pgd entry up to the kernel's address. */
Rusty Russell47436aa2007-10-22 11:03:36 +1000597 for (i = 0; i < pgd_index(lg->kernel_address); i++)
Matias Zabaljauregui90603d12009-06-12 22:27:06 -0600598 release_pgd(lg->pgdirs[idx].pgdir + i);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700599}
600
Rusty Russell2e04ef72009-07-30 16:03:45 -0600601/*H:440
602 * (v) Flushing (throwing away) page tables,
Rusty Russelle1e72962007-10-25 15:02:50 +1000603 *
604 * The Guest has a hypercall to throw away the page tables: it's used when a
Rusty Russell2e04ef72009-07-30 16:03:45 -0600605 * large number of mappings have been changed.
606 */
Glauber de Oliveira Costa17136082008-01-07 11:05:37 -0200607void guest_pagetable_flush_user(struct lg_cpu *cpu)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700608{
Rusty Russellbff672e2007-07-26 10:41:04 -0700609 /* Drop the userspace part of the current page table. */
Glauber de Oliveira Costa17136082008-01-07 11:05:37 -0200610 flush_user_mappings(cpu->lg, cpu->cpu_pgd);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700611}
Rusty Russellbff672e2007-07-26 10:41:04 -0700612/*:*/
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700613
Rusty Russell47436aa2007-10-22 11:03:36 +1000614/* We walk down the guest page tables to get a guest-physical address */
Glauber de Oliveira Costa17136082008-01-07 11:05:37 -0200615unsigned long guest_pa(struct lg_cpu *cpu, unsigned long vaddr)
Rusty Russell47436aa2007-10-22 11:03:36 +1000616{
617 pgd_t gpgd;
618 pte_t gpte;
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600619#ifdef CONFIG_X86_PAE
620 pmd_t gpmd;
621#endif
Rusty Russell5dea1c82011-07-22 14:39:48 +0930622
623 /* Still not set up? Just map 1:1. */
624 if (unlikely(cpu->linear_pages))
625 return vaddr;
626
Rusty Russell47436aa2007-10-22 11:03:36 +1000627 /* First step: get the top-level Guest page table entry. */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200628 gpgd = lgread(cpu, gpgd_addr(cpu, vaddr), pgd_t);
Rusty Russell47436aa2007-10-22 11:03:36 +1000629 /* Toplevel not present? We can't map it in. */
Rusty Russell6afbdd02009-03-30 21:55:23 -0600630 if (!(pgd_flags(gpgd) & _PAGE_PRESENT)) {
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200631 kill_guest(cpu, "Bad address %#lx", vaddr);
Rusty Russell6afbdd02009-03-30 21:55:23 -0600632 return -1UL;
633 }
Rusty Russell47436aa2007-10-22 11:03:36 +1000634
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600635#ifdef CONFIG_X86_PAE
636 gpmd = lgread(cpu, gpmd_addr(gpgd, vaddr), pmd_t);
637 if (!(pmd_flags(gpmd) & _PAGE_PRESENT))
638 kill_guest(cpu, "Bad address %#lx", vaddr);
Rusty Russell92b4d8d2009-06-12 22:27:08 -0600639 gpte = lgread(cpu, gpte_addr(cpu, gpmd, vaddr), pte_t);
640#else
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600641 gpte = lgread(cpu, gpte_addr(cpu, gpgd, vaddr), pte_t);
Rusty Russell92b4d8d2009-06-12 22:27:08 -0600642#endif
Rusty Russell47436aa2007-10-22 11:03:36 +1000643 if (!(pte_flags(gpte) & _PAGE_PRESENT))
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200644 kill_guest(cpu, "Bad address %#lx", vaddr);
Rusty Russell47436aa2007-10-22 11:03:36 +1000645
646 return pte_pfn(gpte) * PAGE_SIZE | (vaddr & ~PAGE_MASK);
647}
648
Rusty Russell2e04ef72009-07-30 16:03:45 -0600649/*
650 * We keep several page tables. This is a simple routine to find the page
Rusty Russellbff672e2007-07-26 10:41:04 -0700651 * table (if any) corresponding to this top-level address the Guest has given
Rusty Russell2e04ef72009-07-30 16:03:45 -0600652 * us.
653 */
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700654static unsigned int find_pgdir(struct lguest *lg, unsigned long pgtable)
655{
656 unsigned int i;
657 for (i = 0; i < ARRAY_SIZE(lg->pgdirs); i++)
Rusty Russell4357bd92008-03-11 09:35:57 -0500658 if (lg->pgdirs[i].pgdir && lg->pgdirs[i].gpgdir == pgtable)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700659 break;
660 return i;
661}
662
Rusty Russell2e04ef72009-07-30 16:03:45 -0600663/*H:435
664 * And this is us, creating the new page directory. If we really do
Rusty Russellbff672e2007-07-26 10:41:04 -0700665 * allocate a new one (and so the kernel parts are not there), we set
Rusty Russell2e04ef72009-07-30 16:03:45 -0600666 * blank_pgdir.
667 */
Glauber de Oliveira Costa17136082008-01-07 11:05:37 -0200668static unsigned int new_pgdir(struct lg_cpu *cpu,
Rusty Russellee3db0f2007-10-22 11:03:34 +1000669 unsigned long gpgdir,
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700670 int *blank_pgdir)
671{
672 unsigned int next;
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600673#ifdef CONFIG_X86_PAE
674 pmd_t *pmd_table;
675#endif
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700676
Rusty Russell2e04ef72009-07-30 16:03:45 -0600677 /*
678 * We pick one entry at random to throw out. Choosing the Least
679 * Recently Used might be better, but this is easy.
680 */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200681 next = random32() % ARRAY_SIZE(cpu->lg->pgdirs);
Rusty Russellbff672e2007-07-26 10:41:04 -0700682 /* If it's never been allocated at all before, try now. */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200683 if (!cpu->lg->pgdirs[next].pgdir) {
684 cpu->lg->pgdirs[next].pgdir =
685 (pgd_t *)get_zeroed_page(GFP_KERNEL);
Rusty Russellbff672e2007-07-26 10:41:04 -0700686 /* If the allocation fails, just keep using the one we have */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200687 if (!cpu->lg->pgdirs[next].pgdir)
Glauber de Oliveira Costa17136082008-01-07 11:05:37 -0200688 next = cpu->cpu_pgd;
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600689 else {
690#ifdef CONFIG_X86_PAE
Rusty Russell2e04ef72009-07-30 16:03:45 -0600691 /*
692 * In PAE mode, allocate a pmd page and populate the
693 * last pgd entry.
694 */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600695 pmd_table = (pmd_t *)get_zeroed_page(GFP_KERNEL);
696 if (!pmd_table) {
697 free_page((long)cpu->lg->pgdirs[next].pgdir);
698 set_pgd(cpu->lg->pgdirs[next].pgdir, __pgd(0));
699 next = cpu->cpu_pgd;
700 } else {
701 set_pgd(cpu->lg->pgdirs[next].pgdir +
702 SWITCHER_PGD_INDEX,
703 __pgd(__pa(pmd_table) | _PAGE_PRESENT));
Rusty Russell2e04ef72009-07-30 16:03:45 -0600704 /*
705 * This is a blank page, so there are no kernel
706 * mappings: caller must map the stack!
707 */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600708 *blank_pgdir = 1;
709 }
710#else
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700711 *blank_pgdir = 1;
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600712#endif
713 }
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700714 }
Rusty Russellbff672e2007-07-26 10:41:04 -0700715 /* Record which Guest toplevel this shadows. */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200716 cpu->lg->pgdirs[next].gpgdir = gpgdir;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700717 /* Release all the non-kernel mappings. */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200718 flush_user_mappings(cpu->lg, next);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700719
720 return next;
721}
722
Rusty Russell2e04ef72009-07-30 16:03:45 -0600723/*H:470
724 * Finally, a routine which throws away everything: all PGD entries in all
Rusty Russelle1e72962007-10-25 15:02:50 +1000725 * the shadow page tables, including the Guest's kernel mappings. This is used
Rusty Russell2e04ef72009-07-30 16:03:45 -0600726 * when we destroy the Guest.
727 */
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700728static void release_all_pagetables(struct lguest *lg)
729{
730 unsigned int i, j;
731
Rusty Russellbff672e2007-07-26 10:41:04 -0700732 /* Every shadow pagetable this Guest has */
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700733 for (i = 0; i < ARRAY_SIZE(lg->pgdirs); i++)
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600734 if (lg->pgdirs[i].pgdir) {
735#ifdef CONFIG_X86_PAE
736 pgd_t *spgd;
737 pmd_t *pmdpage;
738 unsigned int k;
739
740 /* Get the last pmd page. */
741 spgd = lg->pgdirs[i].pgdir + SWITCHER_PGD_INDEX;
742 pmdpage = __va(pgd_pfn(*spgd) << PAGE_SHIFT);
743
Rusty Russell2e04ef72009-07-30 16:03:45 -0600744 /*
745 * And release the pmd entries of that pmd page,
746 * except for the switcher pmd.
747 */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600748 for (k = 0; k < SWITCHER_PMD_INDEX; k++)
749 release_pmd(&pmdpage[k]);
750#endif
Rusty Russellbff672e2007-07-26 10:41:04 -0700751 /* Every PGD entry except the Switcher at the top */
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700752 for (j = 0; j < SWITCHER_PGD_INDEX; j++)
Matias Zabaljauregui90603d12009-06-12 22:27:06 -0600753 release_pgd(lg->pgdirs[i].pgdir + j);
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600754 }
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700755}
756
Rusty Russell2e04ef72009-07-30 16:03:45 -0600757/*
758 * We also throw away everything when a Guest tells us it's changed a kernel
Rusty Russellbff672e2007-07-26 10:41:04 -0700759 * mapping. Since kernel mappings are in every page table, it's easiest to
Rusty Russelle1e72962007-10-25 15:02:50 +1000760 * throw them all away. This traps the Guest in amber for a while as
Rusty Russell2e04ef72009-07-30 16:03:45 -0600761 * everything faults back in, but it's rare.
762 */
Glauber de Oliveira Costa4665ac8e2008-01-07 11:05:35 -0200763void guest_pagetable_clear_all(struct lg_cpu *cpu)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700764{
Glauber de Oliveira Costa4665ac8e2008-01-07 11:05:35 -0200765 release_all_pagetables(cpu->lg);
Rusty Russellbff672e2007-07-26 10:41:04 -0700766 /* We need the Guest kernel stack mapped again. */
Glauber de Oliveira Costa4665ac8e2008-01-07 11:05:35 -0200767 pin_stack_pages(cpu);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700768}
Rusty Russell5dea1c82011-07-22 14:39:48 +0930769
770/*H:430
771 * (iv) Switching page tables
772 *
773 * Now we've seen all the page table setting and manipulation, let's see
774 * what happens when the Guest changes page tables (ie. changes the top-level
775 * pgdir). This occurs on almost every context switch.
776 */
777void guest_new_pagetable(struct lg_cpu *cpu, unsigned long pgtable)
778{
779 int newpgdir, repin = 0;
780
781 /*
782 * The very first time they call this, we're actually running without
783 * any page tables; we've been making it up. Throw them away now.
784 */
785 if (unlikely(cpu->linear_pages)) {
786 release_all_pagetables(cpu->lg);
787 cpu->linear_pages = false;
788 /* Force allocation of a new pgdir. */
789 newpgdir = ARRAY_SIZE(cpu->lg->pgdirs);
790 } else {
791 /* Look to see if we have this one already. */
792 newpgdir = find_pgdir(cpu->lg, pgtable);
793 }
794
795 /*
796 * If not, we allocate or mug an existing one: if it's a fresh one,
797 * repin gets set to 1.
798 */
799 if (newpgdir == ARRAY_SIZE(cpu->lg->pgdirs))
800 newpgdir = new_pgdir(cpu, pgtable, &repin);
801 /* Change the current pgd index to the new one. */
802 cpu->cpu_pgd = newpgdir;
803 /* If it was completely blank, we map in the Guest kernel stack */
804 if (repin)
805 pin_stack_pages(cpu);
806}
Rusty Russelle1e72962007-10-25 15:02:50 +1000807/*:*/
Rusty Russell2e04ef72009-07-30 16:03:45 -0600808
809/*M:009
810 * Since we throw away all mappings when a kernel mapping changes, our
Rusty Russelle1e72962007-10-25 15:02:50 +1000811 * performance sucks for guests using highmem. In fact, a guest with
812 * PAGE_OFFSET 0xc0000000 (the default) and more than about 700MB of RAM is
813 * usually slower than a Guest with less memory.
814 *
815 * This, of course, cannot be fixed. It would take some kind of... well, I
Rusty Russell2e04ef72009-07-30 16:03:45 -0600816 * don't know, but the term "puissant code-fu" comes to mind.
817:*/
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700818
Rusty Russell2e04ef72009-07-30 16:03:45 -0600819/*H:420
820 * This is the routine which actually sets the page table entry for then
Rusty Russellbff672e2007-07-26 10:41:04 -0700821 * "idx"'th shadow page table.
822 *
823 * Normally, we can just throw out the old entry and replace it with 0: if they
824 * use it demand_page() will put the new entry in. We need to do this anyway:
825 * The Guest expects _PAGE_ACCESSED to be set on its PTE the first time a page
826 * is read from, and _PAGE_DIRTY when it's written to.
827 *
828 * But Avi Kivity pointed out that most Operating Systems (Linux included) set
829 * these bits on PTEs immediately anyway. This is done to save the CPU from
830 * having to update them, but it helps us the same way: if they set
831 * _PAGE_ACCESSED then we can put a read-only PTE entry in immediately, and if
832 * they set _PAGE_DIRTY then we can put a writable PTE entry in immediately.
833 */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200834static void do_set_pte(struct lg_cpu *cpu, int idx,
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000835 unsigned long vaddr, pte_t gpte)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700836{
Rusty Russelle1e72962007-10-25 15:02:50 +1000837 /* Look up the matching shadow page directory entry. */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200838 pgd_t *spgd = spgd_addr(cpu, idx, vaddr);
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600839#ifdef CONFIG_X86_PAE
840 pmd_t *spmd;
841#endif
Rusty Russellbff672e2007-07-26 10:41:04 -0700842
843 /* If the top level isn't present, there's no entry to update. */
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +1000844 if (pgd_flags(*spgd) & _PAGE_PRESENT) {
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600845#ifdef CONFIG_X86_PAE
846 spmd = spmd_addr(cpu, *spgd, vaddr);
847 if (pmd_flags(*spmd) & _PAGE_PRESENT) {
848#endif
Rusty Russell2e04ef72009-07-30 16:03:45 -0600849 /* Otherwise, start by releasing the existing entry. */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600850 pte_t *spte = spte_addr(cpu, *spgd, vaddr);
851 release_pte(*spte);
Rusty Russellbff672e2007-07-26 10:41:04 -0700852
Rusty Russell2e04ef72009-07-30 16:03:45 -0600853 /*
854 * If they're setting this entry as dirty or accessed,
855 * we might as well put that entry they've given us in
856 * now. This shaves 10% off a copy-on-write
857 * micro-benchmark.
858 */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600859 if (pte_flags(gpte) & (_PAGE_DIRTY | _PAGE_ACCESSED)) {
860 check_gpte(cpu, gpte);
Rusty Russell4c1ea3d2009-09-23 22:26:45 -0600861 set_pte(spte,
862 gpte_to_spte(cpu, gpte,
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600863 pte_flags(gpte) & _PAGE_DIRTY));
Rusty Russell2e04ef72009-07-30 16:03:45 -0600864 } else {
865 /*
866 * Otherwise kill it and we can demand_page()
867 * it in later.
868 */
Rusty Russell4c1ea3d2009-09-23 22:26:45 -0600869 set_pte(spte, __pte(0));
Rusty Russell2e04ef72009-07-30 16:03:45 -0600870 }
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600871#ifdef CONFIG_X86_PAE
872 }
873#endif
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700874 }
875}
876
Rusty Russell2e04ef72009-07-30 16:03:45 -0600877/*H:410
878 * Updating a PTE entry is a little trickier.
Rusty Russellbff672e2007-07-26 10:41:04 -0700879 *
880 * We keep track of several different page tables (the Guest uses one for each
881 * process, so it makes sense to cache at least a few). Each of these have
882 * identical kernel parts: ie. every mapping above PAGE_OFFSET is the same for
883 * all processes. So when the page table above that address changes, we update
884 * all the page tables, not just the current one. This is rare.
885 *
Rusty Russella6bd8e12008-03-28 11:05:53 -0500886 * The benefit is that when we have to track a new page table, we can keep all
Rusty Russell2e04ef72009-07-30 16:03:45 -0600887 * the kernel mappings. This speeds up context switch immensely.
888 */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200889void guest_set_pte(struct lg_cpu *cpu,
Rusty Russellee3db0f2007-10-22 11:03:34 +1000890 unsigned long gpgdir, unsigned long vaddr, pte_t gpte)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700891{
Rusty Russell68a644d2013-04-22 14:10:37 +0930892 /* We don't let you remap the Switcher; we need it to get back! */
893 if (vaddr >= switcher_addr) {
894 kill_guest(cpu, "attempt to set pte into Switcher pages");
895 return;
896 }
897
Rusty Russell2e04ef72009-07-30 16:03:45 -0600898 /*
899 * Kernel mappings must be changed on all top levels. Slow, but doesn't
900 * happen often.
901 */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200902 if (vaddr >= cpu->lg->kernel_address) {
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700903 unsigned int i;
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200904 for (i = 0; i < ARRAY_SIZE(cpu->lg->pgdirs); i++)
905 if (cpu->lg->pgdirs[i].pgdir)
906 do_set_pte(cpu, i, vaddr, gpte);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700907 } else {
Rusty Russellbff672e2007-07-26 10:41:04 -0700908 /* Is this page table one we have a shadow for? */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200909 int pgdir = find_pgdir(cpu->lg, gpgdir);
910 if (pgdir != ARRAY_SIZE(cpu->lg->pgdirs))
Rusty Russellbff672e2007-07-26 10:41:04 -0700911 /* If so, do the update. */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200912 do_set_pte(cpu, pgdir, vaddr, gpte);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700913 }
914}
915
Rusty Russellbff672e2007-07-26 10:41:04 -0700916/*H:400
Rusty Russelle1e72962007-10-25 15:02:50 +1000917 * (iii) Setting up a page table entry when the Guest tells us one has changed.
Rusty Russellbff672e2007-07-26 10:41:04 -0700918 *
919 * Just like we did in interrupts_and_traps.c, it makes sense for us to deal
920 * with the other side of page tables while we're here: what happens when the
921 * Guest asks for a page table to be updated?
922 *
923 * We already saw that demand_page() will fill in the shadow page tables when
924 * needed, so we can simply remove shadow page table entries whenever the Guest
925 * tells us they've changed. When the Guest tries to use the new entry it will
926 * fault and demand_page() will fix it up.
927 *
Anand Gadiyarfd589a82009-07-16 17:13:03 +0200928 * So with that in mind here's our code to update a (top-level) PGD entry:
Rusty Russellbff672e2007-07-26 10:41:04 -0700929 */
Matias Zabaljaureguiebe0ba82009-05-30 15:48:08 -0300930void guest_set_pgd(struct lguest *lg, unsigned long gpgdir, u32 idx)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700931{
932 int pgdir;
933
934 if (idx >= SWITCHER_PGD_INDEX)
935 return;
936
Rusty Russellbff672e2007-07-26 10:41:04 -0700937 /* If they're talking about a page table we have a shadow for... */
Rusty Russellee3db0f2007-10-22 11:03:34 +1000938 pgdir = find_pgdir(lg, gpgdir);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700939 if (pgdir < ARRAY_SIZE(lg->pgdirs))
Rusty Russellbff672e2007-07-26 10:41:04 -0700940 /* ... throw it away. */
Matias Zabaljauregui90603d12009-06-12 22:27:06 -0600941 release_pgd(lg->pgdirs[pgdir].pgdir + idx);
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700942}
Rusty Russella91d74a2009-07-30 16:03:45 -0600943
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600944#ifdef CONFIG_X86_PAE
Rusty Russella91d74a2009-07-30 16:03:45 -0600945/* For setting a mid-level, we just throw everything away. It's easy. */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -0600946void guest_set_pmd(struct lguest *lg, unsigned long pmdp, u32 idx)
947{
948 guest_pagetable_clear_all(&lg->cpus[0]);
949}
950#endif
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700951
Rusty Russell2e04ef72009-07-30 16:03:45 -0600952/*H:500
953 * (vii) Setting up the page tables initially.
Rusty Russellbff672e2007-07-26 10:41:04 -0700954 *
Rusty Russell5dea1c82011-07-22 14:39:48 +0930955 * When a Guest is first created, set initialize a shadow page table which
956 * we will populate on future faults. The Guest doesn't have any actual
957 * pagetables yet, so we set linear_pages to tell demand_page() to fake it
958 * for the moment.
Rusty Russell2e04ef72009-07-30 16:03:45 -0600959 */
Matias Zabaljauregui58a24562008-09-29 01:40:07 -0300960int init_guest_pagetable(struct lguest *lg)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700961{
Rusty Russell5dea1c82011-07-22 14:39:48 +0930962 struct lg_cpu *cpu = &lg->cpus[0];
963 int allocated = 0;
Matias Zabaljauregui58a24562008-09-29 01:40:07 -0300964
Rusty Russell5dea1c82011-07-22 14:39:48 +0930965 /* lg (and lg->cpus[]) starts zeroed: this allocates a new pgdir */
966 cpu->cpu_pgd = new_pgdir(cpu, 0, &allocated);
967 if (!allocated)
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700968 return -ENOMEM;
Rusty Russella91d74a2009-07-30 16:03:45 -0600969
Rusty Russell5dea1c82011-07-22 14:39:48 +0930970 /* We start with a linear mapping until the initialize. */
971 cpu->linear_pages = true;
Rusty Russelld7e28ff2007-07-19 01:49:23 -0700972 return 0;
973}
974
Rusty Russella91d74a2009-07-30 16:03:45 -0600975/*H:508 When the Guest calls LHCALL_LGUEST_INIT we do more setup. */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200976void page_table_guest_data_init(struct lg_cpu *cpu)
Rusty Russell47436aa2007-10-22 11:03:36 +1000977{
Rusty Russellc215a8b2013-04-22 14:10:37 +0930978 /*
979 * We tell the Guest that it can't use the virtual addresses
980 * used by the Switcher. This trick is equivalent to 4GB -
981 * switcher_addr.
982 */
983 u32 top = ~switcher_addr + 1;
984
Rusty Russell47436aa2007-10-22 11:03:36 +1000985 /* We get the kernel address: above this is all kernel memory. */
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200986 if (get_user(cpu->lg->kernel_address,
Rusty Russellc215a8b2013-04-22 14:10:37 +0930987 &cpu->lg->lguest_data->kernel_address)
Rusty Russell2e04ef72009-07-30 16:03:45 -0600988 /*
Rusty Russellc215a8b2013-04-22 14:10:37 +0930989 * We tell the Guest that it can't use the top virtual
990 * addresses (used by the Switcher).
Rusty Russell2e04ef72009-07-30 16:03:45 -0600991 */
Rusty Russellc215a8b2013-04-22 14:10:37 +0930992 || put_user(top, &cpu->lg->lguest_data->reserve_mem)) {
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -0200993 kill_guest(cpu, "bad guest page %p", cpu->lg->lguest_data);
Rusty Russell5dea1c82011-07-22 14:39:48 +0930994 return;
995 }
Rusty Russell47436aa2007-10-22 11:03:36 +1000996
Rusty Russell2e04ef72009-07-30 16:03:45 -0600997 /*
998 * In flush_user_mappings() we loop from 0 to
Rusty Russell47436aa2007-10-22 11:03:36 +1000999 * "pgd_index(lg->kernel_address)". This assumes it won't hit the
Rusty Russell2e04ef72009-07-30 16:03:45 -06001000 * Switcher mappings, so check that now.
1001 */
Rusty Russell68a644d2013-04-22 14:10:37 +09301002 if (cpu->lg->kernel_address >= switcher_addr)
Glauber de Oliveira Costa382ac6b2008-01-17 19:19:42 -02001003 kill_guest(cpu, "bad kernel address %#lx",
1004 cpu->lg->kernel_address);
Rusty Russell47436aa2007-10-22 11:03:36 +10001005}
1006
Rusty Russellbff672e2007-07-26 10:41:04 -07001007/* When a Guest dies, our cleanup is fairly simple. */
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001008void free_guest_pagetable(struct lguest *lg)
1009{
1010 unsigned int i;
1011
Rusty Russellbff672e2007-07-26 10:41:04 -07001012 /* Throw away all page table pages. */
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001013 release_all_pagetables(lg);
Rusty Russellbff672e2007-07-26 10:41:04 -07001014 /* Now free the top levels: free_page() can handle 0 just fine. */
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001015 for (i = 0; i < ARRAY_SIZE(lg->pgdirs); i++)
1016 free_page((long)lg->pgdirs[i].pgdir);
1017}
1018
Rusty Russell2e04ef72009-07-30 16:03:45 -06001019/*H:480
1020 * (vi) Mapping the Switcher when the Guest is about to run.
Rusty Russellbff672e2007-07-26 10:41:04 -07001021 *
Rusty Russelle1e72962007-10-25 15:02:50 +10001022 * The Switcher and the two pages for this CPU need to be visible in the
Rusty Russellbff672e2007-07-26 10:41:04 -07001023 * Guest (and not the pages for other CPUs). We have the appropriate PTE pages
Rusty Russelle1e72962007-10-25 15:02:50 +10001024 * for each CPU already set up, we just need to hook them in now we know which
Rusty Russell2e04ef72009-07-30 16:03:45 -06001025 * Guest is about to run on this CPU.
1026 */
Glauber de Oliveira Costa0c784412008-01-07 11:05:30 -02001027void map_switcher_in_guest(struct lg_cpu *cpu, struct lguest_pages *pages)
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001028{
Christoph Lameterc9f29542010-11-30 13:07:21 -06001029 pte_t *switcher_pte_page = __this_cpu_read(switcher_pte_pages);
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +10001030 pte_t regs_pte;
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001031
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -06001032#ifdef CONFIG_X86_PAE
1033 pmd_t switcher_pmd;
1034 pmd_t *pmd_table;
1035
Rusty Russell4c1ea3d2009-09-23 22:26:45 -06001036 switcher_pmd = pfn_pmd(__pa(switcher_pte_page) >> PAGE_SHIFT,
1037 PAGE_KERNEL_EXEC);
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -06001038
Rusty Russella91d74a2009-07-30 16:03:45 -06001039 /* Figure out where the pmd page is, by reading the PGD, and converting
1040 * it to a virtual address. */
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -06001041 pmd_table = __va(pgd_pfn(cpu->lg->
1042 pgdirs[cpu->cpu_pgd].pgdir[SWITCHER_PGD_INDEX])
1043 << PAGE_SHIFT);
Rusty Russella91d74a2009-07-30 16:03:45 -06001044 /* Now write it into the shadow page table. */
Rusty Russell4c1ea3d2009-09-23 22:26:45 -06001045 set_pmd(&pmd_table[SWITCHER_PMD_INDEX], switcher_pmd);
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -06001046#else
1047 pgd_t switcher_pgd;
1048
Rusty Russell2e04ef72009-07-30 16:03:45 -06001049 /*
1050 * Make the last PGD entry for this Guest point to the Switcher's PTE
1051 * page for this CPU (with appropriate flags).
1052 */
Matias Zabaljaureguied1dc772009-05-30 15:35:49 -03001053 switcher_pgd = __pgd(__pa(switcher_pte_page) | __PAGE_KERNEL_EXEC);
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +10001054
Glauber de Oliveira Costa17136082008-01-07 11:05:37 -02001055 cpu->lg->pgdirs[cpu->cpu_pgd].pgdir[SWITCHER_PGD_INDEX] = switcher_pgd;
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001056
Matias Zabaljaureguiacdd0b62009-06-12 22:27:07 -06001057#endif
Rusty Russell2e04ef72009-07-30 16:03:45 -06001058 /*
1059 * We also change the Switcher PTE page. When we're running the Guest,
Rusty Russellbff672e2007-07-26 10:41:04 -07001060 * we want the Guest's "regs" page to appear where the first Switcher
1061 * page for this CPU is. This is an optimization: when the Switcher
1062 * saves the Guest registers, it saves them into the first page of this
1063 * CPU's "struct lguest_pages": if we make sure the Guest's register
1064 * page is already mapped there, we don't have to copy them out
Rusty Russell2e04ef72009-07-30 16:03:45 -06001065 * again.
1066 */
Rusty Russell4c1ea3d2009-09-23 22:26:45 -06001067 regs_pte = pfn_pte(__pa(cpu->regs_page) >> PAGE_SHIFT, PAGE_KERNEL);
1068 set_pte(&switcher_pte_page[pte_index((unsigned long)pages)], regs_pte);
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001069}
Rusty Russellbff672e2007-07-26 10:41:04 -07001070/*:*/
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001071
1072static void free_switcher_pte_pages(void)
1073{
1074 unsigned int i;
1075
1076 for_each_possible_cpu(i)
1077 free_page((long)switcher_pte_page(i));
1078}
1079
Rusty Russell2e04ef72009-07-30 16:03:45 -06001080/*H:520
1081 * Setting up the Switcher PTE page for given CPU is fairly easy, given
Rusty Russell93a2cdf2013-04-22 14:10:38 +09301082 * the CPU number and the "struct page"s for the Switcher and per-cpu pages.
Rusty Russell2e04ef72009-07-30 16:03:45 -06001083 */
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001084static __init void populate_switcher_pte_page(unsigned int cpu,
Rusty Russell93a2cdf2013-04-22 14:10:38 +09301085 struct page *switcher_pages[])
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001086{
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +10001087 pte_t *pte = switcher_pte_page(cpu);
Rusty Russell93a2cdf2013-04-22 14:10:38 +09301088 int i;
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001089
Rusty Russell93a2cdf2013-04-22 14:10:38 +09301090 /* The first entries maps the Switcher code. */
1091 set_pte(&pte[0], mk_pte(switcher_pages[0],
Matias Zabaljauregui90603d12009-06-12 22:27:06 -06001092 __pgprot(_PAGE_PRESENT|_PAGE_ACCESSED)));
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001093
Rusty Russellbff672e2007-07-26 10:41:04 -07001094 /* The only other thing we map is this CPU's pair of pages. */
Rusty Russell93a2cdf2013-04-22 14:10:38 +09301095 i = 1 + cpu*2;
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001096
Rusty Russellbff672e2007-07-26 10:41:04 -07001097 /* First page (Guest registers) is writable from the Guest */
Rusty Russell856c6082013-04-22 14:10:38 +09301098 set_pte(&pte[i], pfn_pte(page_to_pfn(switcher_pages[i]),
Matias Zabaljauregui90603d12009-06-12 22:27:06 -06001099 __pgprot(_PAGE_PRESENT|_PAGE_ACCESSED|_PAGE_RW)));
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +10001100
Rusty Russell2e04ef72009-07-30 16:03:45 -06001101 /*
1102 * The second page contains the "struct lguest_ro_state", and is
1103 * read-only.
1104 */
Rusty Russell856c6082013-04-22 14:10:38 +09301105 set_pte(&pte[i+1], pfn_pte(page_to_pfn(switcher_pages[i+1]),
Matias Zabaljauregui90603d12009-06-12 22:27:06 -06001106 __pgprot(_PAGE_PRESENT|_PAGE_ACCESSED)));
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001107}
1108
Rusty Russell2e04ef72009-07-30 16:03:45 -06001109/*
1110 * We've made it through the page table code. Perhaps our tired brains are
Rusty Russelle1e72962007-10-25 15:02:50 +10001111 * still processing the details, or perhaps we're simply glad it's over.
1112 *
Rusty Russella6bd8e12008-03-28 11:05:53 -05001113 * If nothing else, note that all this complexity in juggling shadow page tables
1114 * in sync with the Guest's page tables is for one reason: for most Guests this
1115 * page table dance determines how bad performance will be. This is why Xen
1116 * uses exotic direct Guest pagetable manipulation, and why both Intel and AMD
1117 * have implemented shadow page table support directly into hardware.
Rusty Russelle1e72962007-10-25 15:02:50 +10001118 *
Rusty Russell2e04ef72009-07-30 16:03:45 -06001119 * There is just one file remaining in the Host.
1120 */
Rusty Russelle1e72962007-10-25 15:02:50 +10001121
Rusty Russell2e04ef72009-07-30 16:03:45 -06001122/*H:510
1123 * At boot or module load time, init_pagetables() allocates and populates
1124 * the Switcher PTE page for each CPU.
1125 */
Rusty Russell93a2cdf2013-04-22 14:10:38 +09301126__init int init_pagetables(struct page **switcher_pages)
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001127{
1128 unsigned int i;
1129
1130 for_each_possible_cpu(i) {
Matias Zabaljaureguidf29f432007-10-22 11:03:33 +10001131 switcher_pte_page(i) = (pte_t *)get_zeroed_page(GFP_KERNEL);
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001132 if (!switcher_pte_page(i)) {
1133 free_switcher_pte_pages();
1134 return -ENOMEM;
1135 }
Rusty Russell93a2cdf2013-04-22 14:10:38 +09301136 populate_switcher_pte_page(i, switcher_pages);
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001137 }
1138 return 0;
1139}
Rusty Russellbff672e2007-07-26 10:41:04 -07001140/*:*/
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001141
Rusty Russellbff672e2007-07-26 10:41:04 -07001142/* Cleaning up simply involves freeing the PTE page for each CPU. */
Rusty Russelld7e28ff2007-07-19 01:49:23 -07001143void free_pagetables(void)
1144{
1145 free_switcher_pte_pages();
1146}