mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-25 23:06:15 +00:00
treewide: Add a function to change page permissions
For armv8 we are adding proper page permissions for the relocated U-Boot binary. Add a weak function that can be used across architectures to change the page permissions Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on AML-S905X-CC Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
parent
ff0a979fc3
commit
ec1c6cfb1c
13 changed files with 108 additions and 0 deletions
|
@ -8,6 +8,7 @@
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/log2.h>
|
#include <linux/log2.h>
|
||||||
#include <asm/arcregs.h>
|
#include <asm/arcregs.h>
|
||||||
|
@ -819,3 +820,8 @@ void sync_n_cleanup_cache_all(void)
|
||||||
|
|
||||||
__ic_entire_invalidate();
|
__ic_entire_invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __weak pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
*/
|
*/
|
||||||
#include <cpu_func.h>
|
#include <cpu_func.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
#if !CONFIG_IS_ENABLED(SYS_DCACHE_OFF)
|
#if !CONFIG_IS_ENABLED(SYS_DCACHE_OFF)
|
||||||
|
@ -88,3 +89,8 @@ void enable_caches(void)
|
||||||
dcache_enable();
|
dcache_enable();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __weak pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
*/
|
*/
|
||||||
#include <cpu_func.h>
|
#include <cpu_func.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <asm/armv7.h>
|
#include <asm/armv7.h>
|
||||||
#include <asm/utils.h>
|
#include <asm/utils.h>
|
||||||
|
@ -209,3 +210,8 @@ __weak void v7_outer_cache_flush_all(void) {}
|
||||||
__weak void v7_outer_cache_inval_all(void) {}
|
__weak void v7_outer_cache_inval_all(void) {}
|
||||||
__weak void v7_outer_cache_flush_range(u32 start, u32 end) {}
|
__weak void v7_outer_cache_flush_range(u32 start, u32 end) {}
|
||||||
__weak void v7_outer_cache_inval_range(u32 start, u32 end) {}
|
__weak void v7_outer_cache_inval_range(u32 start, u32 end) {}
|
||||||
|
|
||||||
|
int __weak pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
/* Cache maintenance operation registers */
|
/* Cache maintenance operation registers */
|
||||||
|
|
||||||
|
@ -370,3 +371,8 @@ void enable_caches(void)
|
||||||
dcache_enable();
|
dcache_enable();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __weak pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/armv8/mmu.h>
|
#include <asm/armv8/mmu.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
@ -1032,6 +1033,30 @@ void mmu_change_region_attr(phys_addr_t addr, size_t siz, u64 attrs)
|
||||||
mmu_change_region_attr_nobreak(addr, siz, attrs);
|
mmu_change_region_attr_nobreak(addr, siz, attrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
|
||||||
|
{
|
||||||
|
u64 attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | PTE_BLOCK_INNER_SHARE | PTE_TYPE_VALID;
|
||||||
|
|
||||||
|
switch (perm) {
|
||||||
|
case MMU_ATTR_RO:
|
||||||
|
attrs |= PTE_BLOCK_PXN | PTE_BLOCK_UXN | PTE_BLOCK_RO;
|
||||||
|
break;
|
||||||
|
case MMU_ATTR_RX:
|
||||||
|
attrs |= PTE_BLOCK_RO;
|
||||||
|
break;
|
||||||
|
case MMU_ATTR_RW:
|
||||||
|
attrs |= PTE_BLOCK_PXN | PTE_BLOCK_UXN;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
log_err("Unknown attribute %d\n", perm);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
mmu_change_region_attr_nobreak(addr, size, attrs);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#else /* !CONFIG_IS_ENABLED(SYS_DCACHE_OFF) */
|
#else /* !CONFIG_IS_ENABLED(SYS_DCACHE_OFF) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
@ -170,3 +171,8 @@ __weak int arm_reserve_mmu(void)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __weak pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <cpu_func.h>
|
#include <cpu_func.h>
|
||||||
#include <asm/immap.h>
|
#include <asm/immap.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
volatile int *cf_icache_status = (int *)ICACHE_STATUS;
|
volatile int *cf_icache_status = (int *)ICACHE_STATUS;
|
||||||
volatile int *cf_dcache_status = (int *)DCACHE_STATUS;
|
volatile int *cf_dcache_status = (int *)DCACHE_STATUS;
|
||||||
|
@ -151,3 +152,8 @@ __weak void flush_dcache_range(unsigned long start, unsigned long stop)
|
||||||
{
|
{
|
||||||
/* An empty stub, real implementation should be in platform code */
|
/* An empty stub, real implementation should be in platform code */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __weak pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <cpu_func.h>
|
#include <cpu_func.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
@ -127,3 +128,8 @@ void dcache_disable(void)
|
||||||
{
|
{
|
||||||
flush_dcache_all();
|
flush_dcache_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __weak pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <watchdog.h>
|
#include <watchdog.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
static ulong maybe_watchdog_reset(ulong flushed)
|
static ulong maybe_watchdog_reset(ulong flushed)
|
||||||
{
|
{
|
||||||
|
@ -58,3 +59,8 @@ void invalidate_icache_all(void)
|
||||||
{
|
{
|
||||||
puts("No arch specific invalidate_icache_all available!\n");
|
puts("No arch specific invalidate_icache_all available!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __weak pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
#include <asm/insn-def.h>
|
#include <asm/insn-def.h>
|
||||||
#include <linux/const.h>
|
#include <linux/const.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
#define CBO_INVAL(base) \
|
#define CBO_INVAL(base) \
|
||||||
INSN_I(OPCODE_MISC_MEM, FUNC3(2), __RD(0), \
|
INSN_I(OPCODE_MISC_MEM, FUNC3(2), __RD(0), \
|
||||||
|
@ -151,3 +152,8 @@ __weak void enable_caches(void)
|
||||||
if (!zicbom_block_size)
|
if (!zicbom_block_size)
|
||||||
log_debug("Zicbom not initialized.\n");
|
log_debug("Zicbom not initialized.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __weak pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
#define CACHE_VALID 1
|
#define CACHE_VALID 1
|
||||||
#define CACHE_UPDATED 2
|
#define CACHE_UPDATED 2
|
||||||
|
@ -126,3 +127,8 @@ int dcache_status(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __weak pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include <cpu_func.h>
|
#include <cpu_func.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
|
#include <linux/errno.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We currently run always with caches enabled when running from memory.
|
* We currently run always with caches enabled when running from memory.
|
||||||
|
@ -57,3 +58,8 @@ void invalidate_icache_all(void)
|
||||||
{
|
{
|
||||||
__invalidate_icache_all();
|
__invalidate_icache_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __weak pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm)
|
||||||
|
{
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
|
@ -69,6 +69,23 @@ void flush_dcache_range(unsigned long start, unsigned long stop);
|
||||||
void invalidate_dcache_range(unsigned long start, unsigned long stop);
|
void invalidate_dcache_range(unsigned long start, unsigned long stop);
|
||||||
void invalidate_dcache_all(void);
|
void invalidate_dcache_all(void);
|
||||||
void invalidate_icache_all(void);
|
void invalidate_icache_all(void);
|
||||||
|
|
||||||
|
enum pgprot_attrs {
|
||||||
|
MMU_ATTR_RO,
|
||||||
|
MMU_ATTR_RX,
|
||||||
|
MMU_ATTR_RW,
|
||||||
|
};
|
||||||
|
|
||||||
|
/** pgprot_set_attrs() - Set page table permissions
|
||||||
|
*
|
||||||
|
* @addr: Physical address start
|
||||||
|
* @size: size of memory to change
|
||||||
|
* @perm: New permissions
|
||||||
|
*
|
||||||
|
* Return: 0 on success, error otherwise.
|
||||||
|
**/
|
||||||
|
int pgprot_set_attrs(phys_addr_t addr, size_t size, enum pgprot_attrs perm);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* noncached_init() - Initialize non-cached memory region
|
* noncached_init() - Initialize non-cached memory region
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue