Xtensa——MPU
小狼@http://blog.csdn.net/xiaolangyangyang
Xtensa的MPU仅提供内存访问控制和缓存属性控制,不提供任何形式的地址转换,MPU的内存映射被指定为配置时固定的背景映射和动态变化的前景映射。
1、Entry结构
XTHAL_MPU_ENTRY(vStartAddress, valid, accessRights, memoryType)
vStartAddress:entry起始地址,一般第一个entry从0x0开始
valid:entry有效标志
accessRights:内存访问控制
memoryType:缓存属性控制
背景映射:
const struct xthal_MPU_entry mpumap[] =
{
XTHAL_MPU_ENTRY( 0x00000000, 1, XTHAL_AR_RWXrwx, XTHAL_MEM_WRITEBACK),
XTHAL_MPU_ENTRY( 0xE0000000, 1, XTHAL_AR_RWXrwx, XTHAL_MEM_NON_CACHEABLE,
XTHAL_MPU_ENTRY( 0xF0000000, 1, XTHAL_AR_RWX, XTHAL_MEM_NON_CACHEABLE)
};
xthal_write_map(mpumap, sizeof(mpumap) / sizeof(struct xthal_MPU_entry));
MPU Entry没有明确说明区域的长度或区域的结束地址。区域结束于下一个条目的vStartAddress - 1,最后一项定义的区域延伸到地址空间的末尾0xFFFFFFFF。
2、修改Entry的宏定义
XTHAL_MPU_ENTRY_GET_VSTARTADDR(entry)
XTHAL_MPU_ENTRY_SET_VSTARTADDR(entry, vStartAddress)
XTHAL_MPU_ENTRY_GET_VALID(entry)
XTHAL_MPU_ENTRY_SET_VALID(entry, valid)
XTHAL_MPU_ENTRY_GET_ACCESS(entry)
XTHAL_MPU_ENTRY_SET_ACCESS(entry, accessRights)
XTHAL_MPU_ENTRY_GET_MEMORY_TYPE(entry)
XTHAL_MPU_ENTRY_SET_MEMORY_TYPE(entry, memoryType)
XTHAL_MPU_ENTRY_GET_LOCK(entry)
XTHAL_MPU_ENTRY_SET_LOCK(entry)
3、内存访问控制
4、缓存属性控制
5、函数定义
内存访问控制查询:
extern int32_t xthal_is_kernel_readable(int32_t accessRights);
extern int32_t xthal_is_kernel_writeable(int32_t accessRights);
extern int32_t xthal_is_kernel_executable(int32_t accessRights);
extern int32_t xthal_is_user_readable(int32_t accessRights);
extern int32_t xthal_is_user_writeable(int32_t accessRights);
extern int32_t xthal_is_user_executable(int32_t accessRights);
extern int32_t xthal_encode_memory_type(uint32_t x);
缓存属性控制查询:
extern int32_t xthal_is_cacheable(uint32_t memoryType);
extern int32_t xthal_is_writeback(uint32_t memoryType);
extern int32_t xthal_is_device(uint32_t memoryType);
其他:
extern int32_t xthal_read_map(xthal_MPU_entry* entries);
extern void xthal_read_map_raw(xthal_MPU_entry* entries);
extern void xthal_write_map(const xthal_MPU_entry* entries, uint32_t num_entries);
extern void xthal_write_map_raw(const xthal_MPU_entry* entries, uint32_t num_entries);
extern int32_t xthal_check_map(const xthal_MPU_entry* entries, uint32_t num_entries);
extern xthal_MPU_entry xthal_get_entry_for_address(void* vaddr, int32_t infgmap);
extern int32_t xthal_mpu_set_region_attribute(void* vaddr, uint32_t size, uint32_t accessRights, uint32_t memoryType, uint32_t flags);
extern uint32_txthal_calc_cacheadrdis(const struct xthal_MPU_entry*e, uint32_t n);
inline void xthal_mpu_set_entry(xthal_MPU_entry entry);
int32_t xthal_mpu_get_entry(xthal_MPU_entry * entry, uint32_t index);
extern uint32_t xthal_convert_to_writethru_memtype(uint32_t mt);
常用函数:
extern void xthal_write_map(const xthal_MPU_entry* entries, uint32_t num_entries);
extern int32_t xthal_mpu_set_region_attribute(void* vaddr, uint32_t size, uint32_t accessRights, uint32_t memoryType, uint32_t flags);
6、MPU相关指令、寄存器和异常