📄 mmu.c
字号:
#include "addr.h"
#include "mmu.h"
void init_mmu() {
unsigned long ttb = (unsigned long)MMU_TBL_BASE;
__asm__(
"mov r0, #0\n"
/* disable ICache, DCache on v4*/
"mcr p15, 0, r0, c7, c7, 0\n"
/* drian wirte buffer on v4*/
"mcr p15, 0, r0, c7, c10, 4\n"
/* disable ICache, DCache, TLBs on v4*/
"mcr p15, 0, r0, c8, c7, 0\n"
/* load page table pointer*/
"mov r4, %0\n"
"mcr p15, 0, r4, c2, c0, 0\n"
/*
* write domain id (cp15_r13)
* domain=0b11, manager mode, no check for permission
*/
"mvn r0, #0\n"
"mcr p15, 0, r0, c3, c0, 0\n"
/* set control register v4*/
"mrc p15, 0, r0, c1, c0, 0\n"
/* clear out 'unwanted' bits*/
"ldr r1, =0x1384\n"
"bic r0, r0, r1\n"
/*
* turn on what we want
* base location of exception = 0xffff0000
*/
"orr r0, r0, #0x2000\n"
/* fault checking enabled*/
"orr r0, r0, #0x0002\n"
#ifdef CONFIG_CPU_DCACHE_ON
"orr r0, r0, #0x0004\n"
#endif
#ifndef CONFIG_CPU_ICACHE_ON
"orr r0, r0, #0x1000\n"
#endif
/* MMU enabled*/
"orr r0, r0, #0x0001\n"
/* write control register*/
"mcr p15, 0, r0, c1, c0, 0\n"
: /* no output*/
: "r"(ttb));
}
/* init MMU page table*/
void init_mmu_tlb() {
unsigned long vm_addr, idx;
unsigned long *tb_base = (unsigned long *)MMU_TBL_BASE;
for (vm_addr = MEM_START; vm_addr < MEM_END; vm_addr += PAGE_SIZE) {
idx = vm_addr >> 20;
/* entry: section base, AP=0b11, domain=0b00,cached,write-through*/
*(tb_base + idx) = vm_addr|(0x3<<10)|(0<<5)|(1<<4)|(1<<3)|0x02;
}
/* set IO mapped-memory addr for function register*/
for (vm_addr = MEM_IO_MAPPED_START; vm_addr < MEM_IO_MAPPED_END; vm_addr += PAGE_SIZE) {
idx = vm_addr >> 20;
/* entry: section base, AP=0b11, domain=0b00, NCNB*/
*(tb_base + idx) = vm_addr|(0x03<<10)|(0<<5)|(1<<4)|0x02;
}
/*
* exception vectors
* entry: AP=0b11, domain=0b00, cached, write-through
*/
*(tb_base + 0x00000000) = (0x00000000)|(0x03<<10)|(0<<5)|(1<<4)|(1<<3)|0x02;
*(tb_base + (0xffff0000>>20)) = VECTORS_PHY_BASE|(0x03<<10)|(0<<5)|(1<<4)|(0<<3)|0x02;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -