xen: unify pte operations
[safe/jmp/linux-2.6] / arch / x86 / xen / mmu.c
1 /*
2  * Xen mmu operations
3  *
4  * This file contains the various mmu fetch and update operations.
5  * The most important job they must perform is the mapping between the
6  * domain's pfn and the overall machine mfns.
7  *
8  * Xen allows guests to directly update the pagetable, in a controlled
9  * fashion.  In other words, the guest modifies the same pagetable
10  * that the CPU actually uses, which eliminates the overhead of having
11  * a separate shadow pagetable.
12  *
13  * In order to allow this, it falls on the guest domain to map its
14  * notion of a "physical" pfn - which is just a domain-local linear
15  * address - into a real "machine address" which the CPU's MMU can
16  * use.
17  *
18  * A pgd_t/pmd_t/pte_t will typically contain an mfn, and so can be
19  * inserted directly into the pagetable.  When creating a new
20  * pte/pmd/pgd, it converts the passed pfn into an mfn.  Conversely,
21  * when reading the content back with __(pgd|pmd|pte)_val, it converts
22  * the mfn back into a pfn.
23  *
24  * The other constraint is that all pages which make up a pagetable
25  * must be mapped read-only in the guest.  This prevents uncontrolled
26  * guest updates to the pagetable.  Xen strictly enforces this, and
27  * will disallow any pagetable update which will end up mapping a
28  * pagetable page RW, and will disallow using any writable page as a
29  * pagetable.
30  *
31  * Naively, when loading %cr3 with the base of a new pagetable, Xen
32  * would need to validate the whole pagetable before going on.
33  * Naturally, this is quite slow.  The solution is to "pin" a
34  * pagetable, which enforces all the constraints on the pagetable even
35  * when it is not actively in use.  This menas that Xen can be assured
36  * that it is still valid when you do load it into %cr3, and doesn't
37  * need to revalidate it.
38  *
39  * Jeremy Fitzhardinge <jeremy@xensource.com>, XenSource Inc, 2007
40  */
41 #include <linux/sched.h>
42 #include <linux/highmem.h>
43 #include <linux/bug.h>
44
45 #include <asm/pgtable.h>
46 #include <asm/tlbflush.h>
47 #include <asm/mmu_context.h>
48 #include <asm/paravirt.h>
49
50 #include <asm/xen/hypercall.h>
51 #include <asm/xen/hypervisor.h>
52
53 #include <xen/page.h>
54 #include <xen/interface/xen.h>
55
56 #include "multicalls.h"
57 #include "mmu.h"
58
59 xmaddr_t arbitrary_virt_to_machine(unsigned long address)
60 {
61         unsigned int level;
62         pte_t *pte = lookup_address(address, &level);
63         unsigned offset = address & PAGE_MASK;
64
65         BUG_ON(pte == NULL);
66
67         return XMADDR((pte_mfn(*pte) << PAGE_SHIFT) + offset);
68 }
69
70 void make_lowmem_page_readonly(void *vaddr)
71 {
72         pte_t *pte, ptev;
73         unsigned long address = (unsigned long)vaddr;
74         unsigned int level;
75
76         pte = lookup_address(address, &level);
77         BUG_ON(pte == NULL);
78
79         ptev = pte_wrprotect(*pte);
80
81         if (HYPERVISOR_update_va_mapping(address, ptev, 0))
82                 BUG();
83 }
84
85 void make_lowmem_page_readwrite(void *vaddr)
86 {
87         pte_t *pte, ptev;
88         unsigned long address = (unsigned long)vaddr;
89         unsigned int level;
90
91         pte = lookup_address(address, &level);
92         BUG_ON(pte == NULL);
93
94         ptev = pte_mkwrite(*pte);
95
96         if (HYPERVISOR_update_va_mapping(address, ptev, 0))
97                 BUG();
98 }
99
100
101 void xen_set_pmd(pmd_t *ptr, pmd_t val)
102 {
103         struct multicall_space mcs;
104         struct mmu_update *u;
105
106         preempt_disable();
107
108         mcs = xen_mc_entry(sizeof(*u));
109         u = mcs.args;
110         u->ptr = virt_to_machine(ptr).maddr;
111         u->val = pmd_val_ma(val);
112         MULTI_mmu_update(mcs.mc, u, 1, NULL, DOMID_SELF);
113
114         xen_mc_issue(PARAVIRT_LAZY_MMU);
115
116         preempt_enable();
117 }
118
119 /*
120  * Associate a virtual page frame with a given physical page frame
121  * and protection flags for that frame.
122  */
123 void set_pte_mfn(unsigned long vaddr, unsigned long mfn, pgprot_t flags)
124 {
125         pgd_t *pgd;
126         pud_t *pud;
127         pmd_t *pmd;
128         pte_t *pte;
129
130         pgd = swapper_pg_dir + pgd_index(vaddr);
131         if (pgd_none(*pgd)) {
132                 BUG();
133                 return;
134         }
135         pud = pud_offset(pgd, vaddr);
136         if (pud_none(*pud)) {
137                 BUG();
138                 return;
139         }
140         pmd = pmd_offset(pud, vaddr);
141         if (pmd_none(*pmd)) {
142                 BUG();
143                 return;
144         }
145         pte = pte_offset_kernel(pmd, vaddr);
146         /* <mfn,flags> stored as-is, to permit clearing entries */
147         xen_set_pte(pte, mfn_pte(mfn, flags));
148
149         /*
150          * It's enough to flush this one mapping.
151          * (PGE mappings get flushed as well)
152          */
153         __flush_tlb_one(vaddr);
154 }
155
156 void xen_set_pte_at(struct mm_struct *mm, unsigned long addr,
157                     pte_t *ptep, pte_t pteval)
158 {
159         if (mm == current->mm || mm == &init_mm) {
160                 if (paravirt_get_lazy_mode() == PARAVIRT_LAZY_MMU) {
161                         struct multicall_space mcs;
162                         mcs = xen_mc_entry(0);
163
164                         MULTI_update_va_mapping(mcs.mc, addr, pteval, 0);
165                         xen_mc_issue(PARAVIRT_LAZY_MMU);
166                         return;
167                 } else
168                         if (HYPERVISOR_update_va_mapping(addr, pteval, 0) == 0)
169                                 return;
170         }
171         xen_set_pte(ptep, pteval);
172 }
173
174 pteval_t xen_pte_val(pte_t pte)
175 {
176         pteval_t ret = pte.pte;
177
178         if (ret & _PAGE_PRESENT)
179                 ret = machine_to_phys(XMADDR(ret)).paddr | _PAGE_PRESENT;
180
181         return ret;
182 }
183
184 pgdval_t xen_pgd_val(pgd_t pgd)
185 {
186         pgdval_t ret = pgd.pgd;
187         if (ret & _PAGE_PRESENT)
188                 ret = machine_to_phys(XMADDR(ret)).paddr | _PAGE_PRESENT;
189         return ret;
190 }
191
192 pte_t xen_make_pte(pteval_t pte)
193 {
194         if (pte & _PAGE_PRESENT) {
195                 pte = phys_to_machine(XPADDR(pte)).maddr;
196                 pte &= ~(_PAGE_PCD | _PAGE_PWT);
197         }
198
199         return (pte_t){ .pte = pte };
200 }
201
202 pgd_t xen_make_pgd(pgdval_t pgd)
203 {
204         if (pgd & _PAGE_PRESENT)
205                 pgd = phys_to_machine(XPADDR(pgd)).maddr;
206
207         return (pgd_t){ pgd };
208 }
209
210 pmdval_t xen_pmd_val(pmd_t pmd)
211 {
212         pmdval_t ret = native_pmd_val(pmd);
213         if (ret & _PAGE_PRESENT)
214                 ret = machine_to_phys(XMADDR(ret)).paddr | _PAGE_PRESENT;
215         return ret;
216 }
217 #ifdef CONFIG_X86_PAE
218 void xen_set_pud(pud_t *ptr, pud_t val)
219 {
220         struct multicall_space mcs;
221         struct mmu_update *u;
222
223         preempt_disable();
224
225         mcs = xen_mc_entry(sizeof(*u));
226         u = mcs.args;
227         u->ptr = virt_to_machine(ptr).maddr;
228         u->val = pud_val_ma(val);
229         MULTI_mmu_update(mcs.mc, u, 1, NULL, DOMID_SELF);
230
231         xen_mc_issue(PARAVIRT_LAZY_MMU);
232
233         preempt_enable();
234 }
235
236 void xen_set_pte(pte_t *ptep, pte_t pte)
237 {
238         ptep->pte_high = pte.pte_high;
239         smp_wmb();
240         ptep->pte_low = pte.pte_low;
241 }
242
243 void xen_set_pte_atomic(pte_t *ptep, pte_t pte)
244 {
245         set_64bit((u64 *)ptep, pte_val_ma(pte));
246 }
247
248 void xen_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
249 {
250         ptep->pte_low = 0;
251         smp_wmb();              /* make sure low gets written first */
252         ptep->pte_high = 0;
253 }
254
255 void xen_pmd_clear(pmd_t *pmdp)
256 {
257         xen_set_pmd(pmdp, __pmd(0));
258 }
259
260 pmd_t xen_make_pmd(pmdval_t pmd)
261 {
262         if (pmd & _PAGE_PRESENT)
263                 pmd = phys_to_machine(XPADDR(pmd)).maddr;
264
265         return native_make_pmd(pmd);
266 }
267 #else  /* !PAE */
268 void xen_set_pte(pte_t *ptep, pte_t pte)
269 {
270         *ptep = pte;
271 }
272 #endif  /* CONFIG_X86_PAE */
273
274 /*
275   (Yet another) pagetable walker.  This one is intended for pinning a
276   pagetable.  This means that it walks a pagetable and calls the
277   callback function on each page it finds making up the page table,
278   at every level.  It walks the entire pagetable, but it only bothers
279   pinning pte pages which are below pte_limit.  In the normal case
280   this will be TASK_SIZE, but at boot we need to pin up to
281   FIXADDR_TOP.  But the important bit is that we don't pin beyond
282   there, because then we start getting into Xen's ptes.
283 */
284 static int pgd_walk(pgd_t *pgd_base, int (*func)(struct page *, enum pt_level),
285                     unsigned long limit)
286 {
287         pgd_t *pgd = pgd_base;
288         int flush = 0;
289         unsigned long addr = 0;
290         unsigned long pgd_next;
291
292         BUG_ON(limit > FIXADDR_TOP);
293
294         if (xen_feature(XENFEAT_auto_translated_physmap))
295                 return 0;
296
297         for (; addr != FIXADDR_TOP; pgd++, addr = pgd_next) {
298                 pud_t *pud;
299                 unsigned long pud_limit, pud_next;
300
301                 pgd_next = pud_limit = pgd_addr_end(addr, FIXADDR_TOP);
302
303                 if (!pgd_val(*pgd))
304                         continue;
305
306                 pud = pud_offset(pgd, 0);
307
308                 if (PTRS_PER_PUD > 1) /* not folded */
309                         flush |= (*func)(virt_to_page(pud), PT_PUD);
310
311                 for (; addr != pud_limit; pud++, addr = pud_next) {
312                         pmd_t *pmd;
313                         unsigned long pmd_limit;
314
315                         pud_next = pud_addr_end(addr, pud_limit);
316
317                         if (pud_next < limit)
318                                 pmd_limit = pud_next;
319                         else
320                                 pmd_limit = limit;
321
322                         if (pud_none(*pud))
323                                 continue;
324
325                         pmd = pmd_offset(pud, 0);
326
327                         if (PTRS_PER_PMD > 1) /* not folded */
328                                 flush |= (*func)(virt_to_page(pmd), PT_PMD);
329
330                         for (; addr != pmd_limit; pmd++) {
331                                 addr += (PAGE_SIZE * PTRS_PER_PTE);
332                                 if ((pmd_limit-1) < (addr-1)) {
333                                         addr = pmd_limit;
334                                         break;
335                                 }
336
337                                 if (pmd_none(*pmd))
338                                         continue;
339
340                                 flush |= (*func)(pmd_page(*pmd), PT_PTE);
341                         }
342                 }
343         }
344
345         flush |= (*func)(virt_to_page(pgd_base), PT_PGD);
346
347         return flush;
348 }
349
350 static spinlock_t *lock_pte(struct page *page)
351 {
352         spinlock_t *ptl = NULL;
353
354 #if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS
355         ptl = __pte_lockptr(page);
356         spin_lock(ptl);
357 #endif
358
359         return ptl;
360 }
361
362 static void do_unlock(void *v)
363 {
364         spinlock_t *ptl = v;
365         spin_unlock(ptl);
366 }
367
368 static void xen_do_pin(unsigned level, unsigned long pfn)
369 {
370         struct mmuext_op *op;
371         struct multicall_space mcs;
372
373         mcs = __xen_mc_entry(sizeof(*op));
374         op = mcs.args;
375         op->cmd = level;
376         op->arg1.mfn = pfn_to_mfn(pfn);
377         MULTI_mmuext_op(mcs.mc, op, 1, NULL, DOMID_SELF);
378 }
379
380 static int pin_page(struct page *page, enum pt_level level)
381 {
382         unsigned pgfl = test_and_set_bit(PG_pinned, &page->flags);
383         int flush;
384
385         if (pgfl)
386                 flush = 0;              /* already pinned */
387         else if (PageHighMem(page))
388                 /* kmaps need flushing if we found an unpinned
389                    highpage */
390                 flush = 1;
391         else {
392                 void *pt = lowmem_page_address(page);
393                 unsigned long pfn = page_to_pfn(page);
394                 struct multicall_space mcs = __xen_mc_entry(0);
395                 spinlock_t *ptl;
396
397                 flush = 0;
398
399                 ptl = NULL;
400                 if (level == PT_PTE)
401                         ptl = lock_pte(page);
402
403                 MULTI_update_va_mapping(mcs.mc, (unsigned long)pt,
404                                         pfn_pte(pfn, PAGE_KERNEL_RO),
405                                         level == PT_PGD ? UVMF_TLB_FLUSH : 0);
406
407                 if (level == PT_PTE)
408                         xen_do_pin(MMUEXT_PIN_L1_TABLE, pfn);
409
410                 if (ptl) {
411                         /* Queue a deferred unlock for when this batch
412                            is completed. */
413                         xen_mc_callback(do_unlock, ptl);
414                 }
415         }
416
417         return flush;
418 }
419
420 /* This is called just after a mm has been created, but it has not
421    been used yet.  We need to make sure that its pagetable is all
422    read-only, and can be pinned. */
423 void xen_pgd_pin(pgd_t *pgd)
424 {
425         unsigned level;
426
427         xen_mc_batch();
428
429         if (pgd_walk(pgd, pin_page, TASK_SIZE)) {
430                 /* re-enable interrupts for kmap_flush_unused */
431                 xen_mc_issue(0);
432                 kmap_flush_unused();
433                 xen_mc_batch();
434         }
435
436 #ifdef CONFIG_X86_PAE
437         level = MMUEXT_PIN_L3_TABLE;
438 #else
439         level = MMUEXT_PIN_L2_TABLE;
440 #endif
441
442         xen_do_pin(level, PFN_DOWN(__pa(pgd)));
443
444         xen_mc_issue(0);
445 }
446
447 /* The init_mm pagetable is really pinned as soon as its created, but
448    that's before we have page structures to store the bits.  So do all
449    the book-keeping now. */
450 static __init int mark_pinned(struct page *page, enum pt_level level)
451 {
452         SetPagePinned(page);
453         return 0;
454 }
455
456 void __init xen_mark_init_mm_pinned(void)
457 {
458         pgd_walk(init_mm.pgd, mark_pinned, FIXADDR_TOP);
459 }
460
461 static int unpin_page(struct page *page, enum pt_level level)
462 {
463         unsigned pgfl = test_and_clear_bit(PG_pinned, &page->flags);
464
465         if (pgfl && !PageHighMem(page)) {
466                 void *pt = lowmem_page_address(page);
467                 unsigned long pfn = page_to_pfn(page);
468                 spinlock_t *ptl = NULL;
469                 struct multicall_space mcs;
470
471                 if (level == PT_PTE) {
472                         ptl = lock_pte(page);
473
474                         xen_do_pin(MMUEXT_UNPIN_TABLE, pfn);
475                 }
476
477                 mcs = __xen_mc_entry(0);
478
479                 MULTI_update_va_mapping(mcs.mc, (unsigned long)pt,
480                                         pfn_pte(pfn, PAGE_KERNEL),
481                                         level == PT_PGD ? UVMF_TLB_FLUSH : 0);
482
483                 if (ptl) {
484                         /* unlock when batch completed */
485                         xen_mc_callback(do_unlock, ptl);
486                 }
487         }
488
489         return 0;               /* never need to flush on unpin */
490 }
491
492 /* Release a pagetables pages back as normal RW */
493 static void xen_pgd_unpin(pgd_t *pgd)
494 {
495         xen_mc_batch();
496
497         xen_do_pin(MMUEXT_UNPIN_TABLE, PFN_DOWN(__pa(pgd)));
498
499         pgd_walk(pgd, unpin_page, TASK_SIZE);
500
501         xen_mc_issue(0);
502 }
503
504 void xen_activate_mm(struct mm_struct *prev, struct mm_struct *next)
505 {
506         spin_lock(&next->page_table_lock);
507         xen_pgd_pin(next->pgd);
508         spin_unlock(&next->page_table_lock);
509 }
510
511 void xen_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm)
512 {
513         spin_lock(&mm->page_table_lock);
514         xen_pgd_pin(mm->pgd);
515         spin_unlock(&mm->page_table_lock);
516 }
517
518
519 #ifdef CONFIG_SMP
520 /* Another cpu may still have their %cr3 pointing at the pagetable, so
521    we need to repoint it somewhere else before we can unpin it. */
522 static void drop_other_mm_ref(void *info)
523 {
524         struct mm_struct *mm = info;
525
526         if (__get_cpu_var(cpu_tlbstate).active_mm == mm)
527                 leave_mm(smp_processor_id());
528
529         /* If this cpu still has a stale cr3 reference, then make sure
530            it has been flushed. */
531         if (x86_read_percpu(xen_current_cr3) == __pa(mm->pgd)) {
532                 load_cr3(swapper_pg_dir);
533                 arch_flush_lazy_cpu_mode();
534         }
535 }
536
537 static void drop_mm_ref(struct mm_struct *mm)
538 {
539         cpumask_t mask;
540         unsigned cpu;
541
542         if (current->active_mm == mm) {
543                 if (current->mm == mm)
544                         load_cr3(swapper_pg_dir);
545                 else
546                         leave_mm(smp_processor_id());
547                 arch_flush_lazy_cpu_mode();
548         }
549
550         /* Get the "official" set of cpus referring to our pagetable. */
551         mask = mm->cpu_vm_mask;
552
553         /* It's possible that a vcpu may have a stale reference to our
554            cr3, because its in lazy mode, and it hasn't yet flushed
555            its set of pending hypercalls yet.  In this case, we can
556            look at its actual current cr3 value, and force it to flush
557            if needed. */
558         for_each_online_cpu(cpu) {
559                 if (per_cpu(xen_current_cr3, cpu) == __pa(mm->pgd))
560                         cpu_set(cpu, mask);
561         }
562
563         if (!cpus_empty(mask))
564                 xen_smp_call_function_mask(mask, drop_other_mm_ref, mm, 1);
565 }
566 #else
567 static void drop_mm_ref(struct mm_struct *mm)
568 {
569         if (current->active_mm == mm)
570                 load_cr3(swapper_pg_dir);
571 }
572 #endif
573
574 /*
575  * While a process runs, Xen pins its pagetables, which means that the
576  * hypervisor forces it to be read-only, and it controls all updates
577  * to it.  This means that all pagetable updates have to go via the
578  * hypervisor, which is moderately expensive.
579  *
580  * Since we're pulling the pagetable down, we switch to use init_mm,
581  * unpin old process pagetable and mark it all read-write, which
582  * allows further operations on it to be simple memory accesses.
583  *
584  * The only subtle point is that another CPU may be still using the
585  * pagetable because of lazy tlb flushing.  This means we need need to
586  * switch all CPUs off this pagetable before we can unpin it.
587  */
588 void xen_exit_mmap(struct mm_struct *mm)
589 {
590         get_cpu();              /* make sure we don't move around */
591         drop_mm_ref(mm);
592         put_cpu();
593
594         spin_lock(&mm->page_table_lock);
595
596         /* pgd may not be pinned in the error exit path of execve */
597         if (PagePinned(virt_to_page(mm->pgd)))
598                 xen_pgd_unpin(mm->pgd);
599
600         spin_unlock(&mm->page_table_lock);
601 }