diff options
author | Jeremy Fitzhardinge <jeremy@goop.org> | 2007-05-02 13:27:15 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2007-05-02 13:27:15 -0400 |
commit | ce6234b5298902aaec831a67d5f8d9bd2ef5a488 (patch) | |
tree | 939c22684e11a4f5f17abb89c4898f016e878e21 /include/asm-i386/paravirt.h | |
parent | a27fe809b82c5e18932fcceded28d0d1481ce7bb (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.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/include/asm-i386/paravirt.h b/include/asm-i386/paravirt.h index 10f44af76b49..5048b41428fa 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 | ||
21 | struct page; | ||
20 | struct thread_struct; | 22 | struct thread_struct; |
21 | struct Xgt_desc_struct; | 23 | struct Xgt_desc_struct; |
22 | struct tss_struct; | 24 | struct 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 | ||
894 | static 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 | |||
887 | static inline void pte_update(struct mm_struct *mm, unsigned long addr, | 902 | static inline void pte_update(struct mm_struct *mm, unsigned long addr, |
888 | pte_t *ptep) | 903 | pte_t *ptep) |
889 | { | 904 | { |