arm64: Clean up the default pgprot setting
Catalin Marinas
maintainerPATCH 1/1 arm64: Clean up the default pgprot setting
The primary aim of this patchset is to remove the pgprot_default and prot_sect_default global variables and rely strictly on predefined values. The original goal was to be able to run SMP kernels on UP hardware by not setting the Shareability bit. However, it is unlikely to see UP ARMv8 hardware and even if we do, the Shareability bit is no longer assumed to disable cacheable accesses.
A side effect is that the device mappings now have the Shareability attribute set. The hardware, however, should ignore it since Device accesses are always Outer Shareable.
Following the removal of the two global variables, there is some PROT_* macro reshuffling and cleanup, including the __PAGE_* macros (replaced by PAGE_*).
--- arch/arm64/include/asm/io.h | 8 ---- arch/arm64/include/asm/pgtable.h | 98 +++++++++++++++++++--------------------- arch/arm64/kernel/setup.c | 1 - arch/arm64/mm/dma-mapping.c | 2 +- arch/arm64/mm/mmu.c | 36 +-------------- 5 files changed, 50 insertions(+), 95 deletions(-)
arch/arm64/include/asm/io.h +0 -8
@@ -230,19 +230,11 @@ extern void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t protextern void __iounmap (volatile void __iomem *addr);extern void __iomem *ioremap_cache (phys_addr_t phys_addr,size_t size); -#define PROT_DEFAULT (PTE_TYPE_PAGE | PTE_AF | PTE_DIRTY) -#define PROT_DEVICE_nGnRE (PROT_DEFAULT | PTE_PXN | PTE_UXN | PTE_ATTRINDX(MT_DEVICE_nGnRE)) -#define PROT_NORMAL_NC (PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL_NC)) -#define PROT_NORMAL (PROT_DEFAULT | PTE_ATTRINDX(MT_NORMAL)) -#define ioremap (addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))#define ioremap_nocache (addr, size) __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))#define ioremap_wc (addr, size) __ioremap((addr), (size), __pgprot(PROT_NORMAL_NC))#define iounmap __iounmap -#define PROT_SECT_DEFAULT (PMD_TYPE_SECT | PMD_SECT_AF) -#define PROT_SECT_DEVICE_nGnRE (PROT_SECT_DEFAULT | PTE_PXN | PTE_UXN | PMD_ATTRINDX(MT_DEVICE_nGnRE)) -#define ARCH_HAS_IOREMAP_WC #include <asm-generic/iomap.h>
arch/arm64/include/asm/pgtable.h +47 -51
120 lines not on this page · raw message
arch/arm64/kernel/setup.c +0 -1
@@ -376,7 +376,6 @@ void __init setup_arch(char **cmdline_p) *cmdline_p = boot_command_line; -init_mem_pgprot ();early_ioremap_init ();parse_early_param ();
arch/arm64/mm/dma-mapping.c +1 -1
@@ -115,7 +115,7 @@ static void *__dma_alloc_noncoherent(struct device *dev, size_t size,for (i =0 ; i < (size >>PAGE_SHIFT ); i++) map[i] = page + i; coherent_ptr =vmap (map, size >>PAGE_SHIFT ,VM_MAP , -__get_dma_pgprot (attrs, pgprot_default, false)); +__get_dma_pgprot (attrs,__pgprot (PROT_NORMAL_NC ), false));kfree (map);if (!coherent_ptr) goto no_map;
arch/arm64/mm/mmu.c +2 -34
@@ -43,11 +43,6 @@struct page *empty_zero_page;EXPORT_SYMBOL (empty_zero_page); -pgprot_t pgprot_default; -EXPORT_SYMBOL (pgprot_default); - -static pmdval_t prot_sect_kernel; -struct cachepolicy {const char policy[16 ];u64 mair;
@@ -122,33 +117,6 @@ static int __init early_cachepolicy(char *p) }early_param ("cachepolicy" , early_cachepolicy); -/* -* Adjust the PMD section entries according to the CPU in use. -*/ -void __init init_mem_pgprot (void ) -{ -pteval_t default_pgprot; -int i; - - default_pgprot =PTE_ATTRINDX (MT_NORMAL ); - prot_sect_kernel =PMD_TYPE_SECT |PMD_SECT_AF |PMD_ATTRINDX (MT_NORMAL ); - -#ifdef CONFIG_SMP -/* -* Mark memory with the "shared" attribute for SMP systems -*/ - default_pgprot |=PTE_SHARED ; - prot_sect_kernel |=PMD_SECT_S ; -#endif - -for (i =0 ; i <16 ; i++) { -unsigned long v =pgprot_val (protection_map[i]); - protection_map[i] =__pgprot (v | default_pgprot); - } - - pgprot_default =__pgprot (PTE_TYPE_PAGE |PTE_AF | default_pgprot); -} -pgprot_t phys_mem_access_prot (struct file *file,unsigned long pfn,unsigned long size,pgprot_t vma_prot) {
@@ -205,7 +173,7 @@ static void __init alloc_init_pmd(pud_t *pud, unsigned long addr,/* try section mapping first */ if (((addr | next | phys) & ~SECTION_MASK ) ==0 ) {pmd_t old_pmd =*pmd; -set_pmd (pmd,__pmd (phys | prot_sect_kernel)); +set_pmd (pmd,__pmd (phys |PROT_SECT_NORMAL_EXEC ));/* * Check for previous table entries created during * boot (__create_page_tables) and flush them.
@@ -417,7 +385,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node)if (!p)return -ENOMEM ; -set_pmd (pmd,__pmd (__pa (p) | prot_sect_kernel)); +set_pmd (pmd,__pmd (__pa (p) |PROT_SECT_NORMAL )); }else vmemmap_verify ((pte_t *)pmd, node, addr, next); }while (addr = next, addr != end);
PATCH 1/1 arm64: Clean up the default pgprot setting
Quoted 14 lines · Catalin Marinas
The primary aim of this patchset is to remove the
pgprot_defaultandprot_sect_defaultglobal variables and rely strictly on predefined values. The original goal was to be able to run SMP kernels on UP hardware by not setting the Shareability bit. However, it is unlikely to see UP ARMv8 hardware and even if we do, the Shareability bit is no longer assumed to disable cacheable accesses.A side effect is that the device mappings now have the Shareability attribute set. The hardware, however, should ignore it since Device accesses are always Outer Shareable.
Following the removal of the two global variables, there is some PROT_* macro reshuffling and cleanup, including the __PAGE_* macros (replaced by PAGE_*).
[...]
arch/arm64/include/asm/pgtable.h extern void __pgd_error(const char *file, int line, unsigned long val); · line 89
Quoted 8 lines
arch/arm64/include/asm/pgtable.h +8
-0+#define PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_TYPE_MASK) | PTE_PROT_NONE | PTE_PXN | PTE_UXN) +#define PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_WRITE) +#define PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_WRITE) +#define PAGE_COPY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN) +#define PAGE_COPY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN) +#define PAGE_READONLY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN) +#define PAGE_READONLY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN) +#define PAGE_EXECONLY __pgprot(_PAGE_DEFAULT | PTE_NG | PTE_PXN)
Could you build the non-exec versions in terms of the exec versions? The difference is just the addition of PTE_UXN, and it would make this easier to read.
Otherwise this looks fine,
Will
Catalin Marinas
maintainerPATCH 1/1 arm64: Clean up the default pgprot setting
Quoted 18 lines · Will Deacon
Quoted 14 lines · Catalin Marinas
The primary aim of this patchset is to remove the
pgprot_defaultandprot_sect_defaultglobal variables and rely strictly on predefined values. The original goal was to be able to run SMP kernels on UP hardware by not setting the Shareability bit. However, it is unlikely to see UP ARMv8 hardware and even if we do, the Shareability bit is no longer assumed to disable cacheable accesses.A side effect is that the device mappings now have the Shareability attribute set. The hardware, however, should ignore it since Device accesses are always Outer Shareable.
Following the removal of the two global variables, there is some PROT_* macro reshuffling and cleanup, including the __PAGE_* macros (replaced by PAGE_*).
[...]
Quoted 12 lines
arch/arm64/include/asm/pgtable.h extern void __pgd_error(const char *file, int line, unsigned long val); · line 89
Quoted 8 lines
arch/arm64/include/asm/pgtable.h +8
-0+#define PAGE_NONE __pgprot(((_PAGE_DEFAULT) & ~PTE_TYPE_MASK) | PTE_PROT_NONE | PTE_PXN | PTE_UXN) +#define PAGE_SHARED __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN | PTE_WRITE) +#define PAGE_SHARED_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_WRITE) +#define PAGE_COPY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN) +#define PAGE_COPY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN) +#define PAGE_READONLY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN) +#define PAGE_READONLY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN) +#define PAGE_EXECONLY __pgprot(_PAGE_DEFAULT | PTE_NG | PTE_PXN)Could you build the non-exec versions in terms of the exec versions? The difference is just the addition of
PTE_UXN, and it would make this easier to read.
I think it still looks nicer this way. If we are writing one in terms of the other we have to use pgprot_val() to decompose the __pgprot() returned type.
Signature · 1 line
Catalin