aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-i386/paravirt.h
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2007-05-02 13:27:15 -0400
committerAndi Kleen <andi@basil.nowhere.org>2007-05-02 13:27:15 -0400
commitce6234b5298902aaec831a67d5f8d9bd2ef5a488 (patch)
tree939c22684e11a4f5f17abb89c4898f016e878e21 /include/asm-i386/paravirt.h
parenta27fe809b82c5e18932fcceded28d0d1481ce7bb (diff)
[PATCH] i386: PARAVIRT: add kmap_atomic_pte for mapping highpte pages
Xen and VMI both have special requirements when mapping a highmem pte page into the kernel address space. These can be dealt with by adding a new kmap_atomic_pte() function for mapping highptes, and hooking it into the paravirt_ops infrastructure. Xen specifically wants to map the pte page RO, so this patch exposes a helper function, kmap_atomic_prot, which maps the page with the specified page protections. This also adds a kmap_flush_unused() function to clear out the cached kmap mappings. Xen needs this to clear out any potential stray RW mappings of pages which will become part of a pagetable. [ Zach - vmi.c will need some attention after this patch. It wasn't immediately obvious to me what needs to be done. ] Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com> Signed-off-by: Andi Kleen <ak@suse.de> Cc: Zachary Amsden <zach@vmware.com>
Diffstat (limited to 'include/asm-i386/paravirt.h')
-rw-r--r--include/asm-i386/paravirt.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/include/asm-i386/paravirt.h b/include/asm-i386/paravirt.h
index 10f44af76b4..5048b41428f 100644
--- a/include/asm-i386/paravirt.h
+++ b/include/asm-i386/paravirt.h
@@ -16,7 +16,9 @@
16#ifndef __ASSEMBLY__ 16#ifndef __ASSEMBLY__
17#include <linux/types.h> 17#include <linux/types.h>
18#include <linux/cpumask.h> 18#include <linux/cpumask.h>
19#include <asm/kmap_types.h>
19 20
21struct page;
20struct thread_struct; 22struct thread_struct;
21struct Xgt_desc_struct; 23struct Xgt_desc_struct;
22struct tss_struct; 24struct tss_struct;
@@ -187,6 +189,10 @@ struct paravirt_ops
187 189
188 pte_t (*ptep_get_and_clear)(pte_t *ptep); 190 pte_t (*ptep_get_and_clear)(pte_t *ptep);
189 191
192#ifdef CONFIG_HIGHPTE
193 void *(*kmap_atomic_pte)(struct page *page, enum km_type type);
194#endif
195
190#ifdef CONFIG_X86_PAE 196#ifdef CONFIG_X86_PAE
191 void (*set_pte_atomic)(pte_t *ptep, pte_t pteval); 197 void (*set_pte_atomic)(pte_t *ptep, pte_t pteval);
192 void (*set_pte_present)(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte); 198 void (*set_pte_present)(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte);
@@ -884,6 +890,15 @@ static inline void paravirt_release_pd(unsigned pfn)
884 PVOP_VCALL1(release_pd, pfn); 890 PVOP_VCALL1(release_pd, pfn);
885} 891}
886 892
893#ifdef CONFIG_HIGHPTE
894static inline void *kmap_atomic_pte(struct page *page, enum km_type type)
895{
896 unsigned long ret;
897 ret = PVOP_CALL2(unsigned long, kmap_atomic_pte, page, type);
898 return (void *)ret;
899}
900#endif
901
887static inline void pte_update(struct mm_struct *mm, unsigned long addr, 902static inline void pte_update(struct mm_struct *mm, unsigned long addr,
888 pte_t *ptep) 903 pte_t *ptep)
889{ 904{