Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xen: make include/xen/page.h portable moving those definitions under asm dir

The definitions in include/asm/xen/page.h are arch specific.
ia64/xen wants to define its own version. So move them to arch specific
directory and keep include/xen/page.h in order not to break compilation.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>

authored by

Isaku Yamahata and committed by
Ingo Molnar
20e71f2e 642e0c88

+169 -168
+168
include/asm-x86/xen/page.h
··· 1 + #ifndef __XEN_PAGE_H 2 + #define __XEN_PAGE_H 3 + 4 + #include <linux/pfn.h> 5 + 6 + #include <asm/uaccess.h> 7 + #include <asm/pgtable.h> 8 + 9 + #include <xen/features.h> 10 + 11 + /* Xen machine address */ 12 + typedef struct xmaddr { 13 + phys_addr_t maddr; 14 + } xmaddr_t; 15 + 16 + /* Xen pseudo-physical address */ 17 + typedef struct xpaddr { 18 + phys_addr_t paddr; 19 + } xpaddr_t; 20 + 21 + #define XMADDR(x) ((xmaddr_t) { .maddr = (x) }) 22 + #define XPADDR(x) ((xpaddr_t) { .paddr = (x) }) 23 + 24 + /**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/ 25 + #define INVALID_P2M_ENTRY (~0UL) 26 + #define FOREIGN_FRAME_BIT (1UL<<31) 27 + #define FOREIGN_FRAME(m) ((m) | FOREIGN_FRAME_BIT) 28 + 29 + extern unsigned long *phys_to_machine_mapping; 30 + 31 + static inline unsigned long pfn_to_mfn(unsigned long pfn) 32 + { 33 + if (xen_feature(XENFEAT_auto_translated_physmap)) 34 + return pfn; 35 + 36 + return phys_to_machine_mapping[(unsigned int)(pfn)] & 37 + ~FOREIGN_FRAME_BIT; 38 + } 39 + 40 + static inline int phys_to_machine_mapping_valid(unsigned long pfn) 41 + { 42 + if (xen_feature(XENFEAT_auto_translated_physmap)) 43 + return 1; 44 + 45 + return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY); 46 + } 47 + 48 + static inline unsigned long mfn_to_pfn(unsigned long mfn) 49 + { 50 + unsigned long pfn; 51 + 52 + if (xen_feature(XENFEAT_auto_translated_physmap)) 53 + return mfn; 54 + 55 + #if 0 56 + if (unlikely((mfn >> machine_to_phys_order) != 0)) 57 + return max_mapnr; 58 + #endif 59 + 60 + pfn = 0; 61 + /* 62 + * The array access can fail (e.g., device space beyond end of RAM). 63 + * In such cases it doesn't matter what we return (we return garbage), 64 + * but we must handle the fault without crashing! 65 + */ 66 + __get_user(pfn, &machine_to_phys_mapping[mfn]); 67 + 68 + return pfn; 69 + } 70 + 71 + static inline xmaddr_t phys_to_machine(xpaddr_t phys) 72 + { 73 + unsigned offset = phys.paddr & ~PAGE_MASK; 74 + return XMADDR(PFN_PHYS((u64)pfn_to_mfn(PFN_DOWN(phys.paddr))) | offset); 75 + } 76 + 77 + static inline xpaddr_t machine_to_phys(xmaddr_t machine) 78 + { 79 + unsigned offset = machine.maddr & ~PAGE_MASK; 80 + return XPADDR(PFN_PHYS((u64)mfn_to_pfn(PFN_DOWN(machine.maddr))) | offset); 81 + } 82 + 83 + /* 84 + * We detect special mappings in one of two ways: 85 + * 1. If the MFN is an I/O page then Xen will set the m2p entry 86 + * to be outside our maximum possible pseudophys range. 87 + * 2. If the MFN belongs to a different domain then we will certainly 88 + * not have MFN in our p2m table. Conversely, if the page is ours, 89 + * then we'll have p2m(m2p(MFN))==MFN. 90 + * If we detect a special mapping then it doesn't have a 'struct page'. 91 + * We force !pfn_valid() by returning an out-of-range pointer. 92 + * 93 + * NB. These checks require that, for any MFN that is not in our reservation, 94 + * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if 95 + * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN. 96 + * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety. 97 + * 98 + * NB2. When deliberately mapping foreign pages into the p2m table, you *must* 99 + * use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we 100 + * require. In all the cases we care about, the FOREIGN_FRAME bit is 101 + * masked (e.g., pfn_to_mfn()) so behaviour there is correct. 102 + */ 103 + static inline unsigned long mfn_to_local_pfn(unsigned long mfn) 104 + { 105 + extern unsigned long max_mapnr; 106 + unsigned long pfn = mfn_to_pfn(mfn); 107 + if ((pfn < max_mapnr) 108 + && !xen_feature(XENFEAT_auto_translated_physmap) 109 + && (phys_to_machine_mapping[pfn] != mfn)) 110 + return max_mapnr; /* force !pfn_valid() */ 111 + return pfn; 112 + } 113 + 114 + static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn) 115 + { 116 + if (xen_feature(XENFEAT_auto_translated_physmap)) { 117 + BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY); 118 + return; 119 + } 120 + phys_to_machine_mapping[pfn] = mfn; 121 + } 122 + 123 + /* VIRT <-> MACHINE conversion */ 124 + #define virt_to_machine(v) (phys_to_machine(XPADDR(__pa(v)))) 125 + #define virt_to_mfn(v) (pfn_to_mfn(PFN_DOWN(__pa(v)))) 126 + #define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) 127 + 128 + static inline unsigned long pte_mfn(pte_t pte) 129 + { 130 + return (pte.pte & ~_PAGE_NX) >> PAGE_SHIFT; 131 + } 132 + 133 + static inline pte_t mfn_pte(unsigned long page_nr, pgprot_t pgprot) 134 + { 135 + pte_t pte; 136 + 137 + pte.pte = ((phys_addr_t)page_nr << PAGE_SHIFT) | 138 + (pgprot_val(pgprot) & __supported_pte_mask); 139 + 140 + return pte; 141 + } 142 + 143 + static inline pteval_t pte_val_ma(pte_t pte) 144 + { 145 + return pte.pte; 146 + } 147 + 148 + static inline pte_t __pte_ma(pteval_t x) 149 + { 150 + return (pte_t) { .pte = x }; 151 + } 152 + 153 + #ifdef CONFIG_X86_PAE 154 + #define pmd_val_ma(v) ((v).pmd) 155 + #define pud_val_ma(v) ((v).pgd.pgd) 156 + #define __pmd_ma(x) ((pmd_t) { (x) } ) 157 + #else /* !X86_PAE */ 158 + #define pmd_val_ma(v) ((v).pud.pgd.pgd) 159 + #endif /* CONFIG_X86_PAE */ 160 + 161 + #define pgd_val_ma(x) ((x).pgd) 162 + 163 + 164 + xmaddr_t arbitrary_virt_to_machine(unsigned long address); 165 + void make_lowmem_page_readonly(void *vaddr); 166 + void make_lowmem_page_readwrite(void *vaddr); 167 + 168 + #endif /* __XEN_PAGE_H */
+1 -168
include/xen/page.h
··· 1 - #ifndef __XEN_PAGE_H 2 - #define __XEN_PAGE_H 3 - 4 - #include <linux/pfn.h> 5 - 6 - #include <asm/uaccess.h> 7 - #include <asm/pgtable.h> 8 - 9 - #include <xen/features.h> 10 - 11 - /* Xen machine address */ 12 - typedef struct xmaddr { 13 - phys_addr_t maddr; 14 - } xmaddr_t; 15 - 16 - /* Xen pseudo-physical address */ 17 - typedef struct xpaddr { 18 - phys_addr_t paddr; 19 - } xpaddr_t; 20 - 21 - #define XMADDR(x) ((xmaddr_t) { .maddr = (x) }) 22 - #define XPADDR(x) ((xpaddr_t) { .paddr = (x) }) 23 - 24 - /**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/ 25 - #define INVALID_P2M_ENTRY (~0UL) 26 - #define FOREIGN_FRAME_BIT (1UL<<31) 27 - #define FOREIGN_FRAME(m) ((m) | FOREIGN_FRAME_BIT) 28 - 29 - extern unsigned long *phys_to_machine_mapping; 30 - 31 - static inline unsigned long pfn_to_mfn(unsigned long pfn) 32 - { 33 - if (xen_feature(XENFEAT_auto_translated_physmap)) 34 - return pfn; 35 - 36 - return phys_to_machine_mapping[(unsigned int)(pfn)] & 37 - ~FOREIGN_FRAME_BIT; 38 - } 39 - 40 - static inline int phys_to_machine_mapping_valid(unsigned long pfn) 41 - { 42 - if (xen_feature(XENFEAT_auto_translated_physmap)) 43 - return 1; 44 - 45 - return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY); 46 - } 47 - 48 - static inline unsigned long mfn_to_pfn(unsigned long mfn) 49 - { 50 - unsigned long pfn; 51 - 52 - if (xen_feature(XENFEAT_auto_translated_physmap)) 53 - return mfn; 54 - 55 - #if 0 56 - if (unlikely((mfn >> machine_to_phys_order) != 0)) 57 - return max_mapnr; 58 - #endif 59 - 60 - pfn = 0; 61 - /* 62 - * The array access can fail (e.g., device space beyond end of RAM). 63 - * In such cases it doesn't matter what we return (we return garbage), 64 - * but we must handle the fault without crashing! 65 - */ 66 - __get_user(pfn, &machine_to_phys_mapping[mfn]); 67 - 68 - return pfn; 69 - } 70 - 71 - static inline xmaddr_t phys_to_machine(xpaddr_t phys) 72 - { 73 - unsigned offset = phys.paddr & ~PAGE_MASK; 74 - return XMADDR(PFN_PHYS((u64)pfn_to_mfn(PFN_DOWN(phys.paddr))) | offset); 75 - } 76 - 77 - static inline xpaddr_t machine_to_phys(xmaddr_t machine) 78 - { 79 - unsigned offset = machine.maddr & ~PAGE_MASK; 80 - return XPADDR(PFN_PHYS((u64)mfn_to_pfn(PFN_DOWN(machine.maddr))) | offset); 81 - } 82 - 83 - /* 84 - * We detect special mappings in one of two ways: 85 - * 1. If the MFN is an I/O page then Xen will set the m2p entry 86 - * to be outside our maximum possible pseudophys range. 87 - * 2. If the MFN belongs to a different domain then we will certainly 88 - * not have MFN in our p2m table. Conversely, if the page is ours, 89 - * then we'll have p2m(m2p(MFN))==MFN. 90 - * If we detect a special mapping then it doesn't have a 'struct page'. 91 - * We force !pfn_valid() by returning an out-of-range pointer. 92 - * 93 - * NB. These checks require that, for any MFN that is not in our reservation, 94 - * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if 95 - * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN. 96 - * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety. 97 - * 98 - * NB2. When deliberately mapping foreign pages into the p2m table, you *must* 99 - * use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we 100 - * require. In all the cases we care about, the FOREIGN_FRAME bit is 101 - * masked (e.g., pfn_to_mfn()) so behaviour there is correct. 102 - */ 103 - static inline unsigned long mfn_to_local_pfn(unsigned long mfn) 104 - { 105 - extern unsigned long max_mapnr; 106 - unsigned long pfn = mfn_to_pfn(mfn); 107 - if ((pfn < max_mapnr) 108 - && !xen_feature(XENFEAT_auto_translated_physmap) 109 - && (phys_to_machine_mapping[pfn] != mfn)) 110 - return max_mapnr; /* force !pfn_valid() */ 111 - return pfn; 112 - } 113 - 114 - static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn) 115 - { 116 - if (xen_feature(XENFEAT_auto_translated_physmap)) { 117 - BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY); 118 - return; 119 - } 120 - phys_to_machine_mapping[pfn] = mfn; 121 - } 122 - 123 - /* VIRT <-> MACHINE conversion */ 124 - #define virt_to_machine(v) (phys_to_machine(XPADDR(__pa(v)))) 125 - #define virt_to_mfn(v) (pfn_to_mfn(PFN_DOWN(__pa(v)))) 126 - #define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) 127 - 128 - static inline unsigned long pte_mfn(pte_t pte) 129 - { 130 - return (pte.pte & ~_PAGE_NX) >> PAGE_SHIFT; 131 - } 132 - 133 - static inline pte_t mfn_pte(unsigned long page_nr, pgprot_t pgprot) 134 - { 135 - pte_t pte; 136 - 137 - pte.pte = ((phys_addr_t)page_nr << PAGE_SHIFT) | 138 - (pgprot_val(pgprot) & __supported_pte_mask); 139 - 140 - return pte; 141 - } 142 - 143 - static inline pteval_t pte_val_ma(pte_t pte) 144 - { 145 - return pte.pte; 146 - } 147 - 148 - static inline pte_t __pte_ma(pteval_t x) 149 - { 150 - return (pte_t) { .pte = x }; 151 - } 152 - 153 - #ifdef CONFIG_X86_PAE 154 - #define pmd_val_ma(v) ((v).pmd) 155 - #define pud_val_ma(v) ((v).pgd.pgd) 156 - #define __pmd_ma(x) ((pmd_t) { (x) } ) 157 - #else /* !X86_PAE */ 158 - #define pmd_val_ma(v) ((v).pud.pgd.pgd) 159 - #endif /* CONFIG_X86_PAE */ 160 - 161 - #define pgd_val_ma(x) ((x).pgd) 162 - 163 - 164 - xmaddr_t arbitrary_virt_to_machine(unsigned long address); 165 - void make_lowmem_page_readonly(void *vaddr); 166 - void make_lowmem_page_readwrite(void *vaddr); 167 - 168 - #endif /* __XEN_PAGE_H */ 1 + #include <asm/xen/page.h>