Messages in this thread Patch in this message | | | From | Jim Kukunas <> | Subject | [PATCH 11/11] x86/xip: update _va() and _pa() macros | Date | Mon, 23 Mar 2015 00:46:40 -0700 |
| |
For obtaining the physical address, we always take the slow path of slow_virt_to_phys(). In the future, we should probably special case data addresses to avoid walking the page table. For obtaining a virtual address, this patch introduces a slow path of slow_xip_phys_to_virt().
Signed-off-by: Jim Kukunas <james.t.kukunas@linux.intel.com> --- arch/x86/include/asm/page.h | 15 +++++++++++++++ arch/x86/mm/pageattr.c | 11 +++++++++++ 2 files changed, 26 insertions(+)
diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h index 802dde3..b54c7be 100644 --- a/arch/x86/include/asm/page.h +++ b/arch/x86/include/asm/page.h @@ -6,6 +6,7 @@ #ifdef __KERNEL__ #include <asm/page_types.h> +#include <asm/pgtable_types.h> #ifdef CONFIG_X86_64 #include <asm/page_64.h> @@ -37,8 +38,15 @@ static inline void copy_user_page(void *to, void *from, unsigned long vaddr, alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr) #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE + +#ifdef CONFIG_XIP_KERNEL /* TODO special case text translations */ +#define __pa(x) slow_virt_to_phys((void *)(x)) +#define __pa_nodebug slow_virt_to_phys((void *)(x)) +#else #define __pa(x) __phys_addr((unsigned long)(x)) #define __pa_nodebug(x) __phys_addr_nodebug((unsigned long)(x)) +#endif + /* __pa_symbol should be used for C visible symbols. This seems to be the official gcc blessed way to do such arithmetic. */ /* @@ -51,7 +59,14 @@ static inline void copy_user_page(void *to, void *from, unsigned long vaddr, #define __pa_symbol(x) \ __phys_addr_symbol(__phys_reloc_hide((unsigned long)(x))) + +#ifdef CONFIG_XIP_KERNEL +extern unsigned long slow_xip_phys_to_virt(phys_addr_t); + +#define __va(x) ((void *)slow_xip_phys_to_virt((phys_addr_t)x)) +#else #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) +#endif #define __boot_va(x) __va(x) #define __boot_pa(x) __pa(x) diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 536ea2f..ca9e2ca 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c @@ -383,6 +383,17 @@ static pte_t *_lookup_address_cpa(struct cpa_data *cpa, unsigned long address, return lookup_address(address, level); } +#ifdef CONFIG_XIP_KERNEL +unsigned long slow_xip_phys_to_virt(phys_addr_t x) +{ + if (x >= CONFIG_XIP_BASE && x <= (phys_addr_t)phys_sdata) { + unsigned long off = x - CONFIG_XIP_BASE; + return PAGE_OFFSET + off; + } + return x + PAGE_OFFSET; +} +#endif + /* * Lookup the PMD entry for a virtual address. Return a pointer to the entry * or NULL if not present. -- 2.1.0
| |