Mercurial > hg > Members > mitsuki > xv6_rpi2_port
view source/mmu.c @ 0:ed10291ff195
first commit
author | mir3636 |
---|---|
date | Sun, 06 Jan 2019 19:27:03 +0900 |
parents | |
children |
line wrap: on
line source
/***************************************************************** * mmu.c * by Zhiyi Huang, hzy@cs.otago.ac.nz * University of Otago * ********************************************************************/ #include "types.h" #include "defs.h" #include "memlayout.h" #include "mmu.h" unsigned int pm_size; void mmuinit0(void) { pde_t *l1; pte_t *l2; uint pa, va; // diable mmu // use inline assembly here as there is a limit on // branch distance after mmu is disabled // asm volatile("mrc p15, 0, r1, c1, c0, 0\n\t" // "bic r1,r1,#0x00000004\n\t" // 2: Disable data cache // "bic r1,r1,#0x00001000\n\t" // 12: Disable instruction cache // "bic r1,r1,#0x00000800\n\t" // 11: Disable branch prediction // "bic r1,r1,#0x00000001\n\t" // 0: Disable MMU // "mcr p15, 0, r1, c1, c0, 0\n\t" // "mov r0, #0\n\t" // "mcr p15, 0, r0, c7, c7, 0\n\t" // Invalidate Both Caches (only for ARM11) // "mcr p15, 0, r0, c8, c7, 0\n\t" // Invalidate Unified TLB // ::: "r0", "r1", "cc", "memory"); //for(p=(uint *)0x2000; p<(uint *)0x8000; p++) *p = 0; l1 = (pde_t *) K_PDX_BASE; l2 = (pte_t *) K_PTX_BASE; // map all of ram at KERNBASE va = KERNBASE + MBYTE; for(pa = PHYSTART + MBYTE; pa < PHYSTART+PHYSIZE; pa += MBYTE){ l1[PDX(va)] = pa|DOMAIN0|PDX_AP(K_RW)|SECTION|CACHED|BUFFERED; va += MBYTE; } // identity map first MB of ram so mmu can be enabled //l1[PDX(PHYSTART)] = PHYSTART|DOMAIN0|PDX_AP(K_RW)|SECTION|CACHED|BUFFERED; // map IO region va = MMIO_VA; for(pa = MMIO_PA; pa < MMIO_PA+MMIO_SIZE; pa += MBYTE){ l1[PDX(va)] = pa|DOMAIN0|PDX_AP(K_RW)|SECTION; va += MBYTE; } // map GPU memory va = GPUMEMBASE; for(pa = 0; pa < (uint)GPUMEMSIZE; pa += MBYTE){ l1[PDX(va)] = pa|DOMAIN0|PDX_AP(K_RW)|SECTION; va += MBYTE; } // double map exception vectors at top of virtual memory va = HVECTORS; l1[PDX(va)] = (uint)l2|DOMAIN0|COARSE; l2[PTX(va)] = PHYSTART|PTX_AP(K_RW)|SMALL; // asm volatile("mov r1, #1\n\t" // "mcr p15, 0, r1, c3, c0\n\t" // "mov r1, #0x4000\n\t" // "mcr p15, 0, r1, c2, c0\n\t" // "mrc p15, 0, r0, c1, c0, 0\n\t" // "mov r1, #0x00002000\n\t" // 13: Enable High exception vectors // "orr r1, #0x00000004\n\t" // 2: Enable data cache // "orr r1, #0x00001000\n\t" // 12: Enable instruction cache // "orr r1, #0x00000001\n\t" // 0: Enable MMU // "orr r0, r1\n\t" // "mcr p15, 0, r0, c1, c0, 0\n\t" // "mov r1, #1\n\t" // "mcr p15, 0, r1, c15, c12, 0\n\t" // Read Performance Monitor Control Register (ARM11)? // ::: "r0", "r1", "cc", "memory"); } void mmuinit1(void) { pde_t *l1; uint va1, va2; uint pa, va; l1 = (pde_t*)(K_PDX_BASE); // map the rest of RAM after PHYSTART+PHYSIZE va = KERNBASE + PHYSIZE; for(pa = PHYSTART + PHYSIZE; pa < PHYSTART+pm_size; pa += MBYTE){ l1[PDX(va)] = pa|DOMAIN0|PDX_AP(K_RW)|SECTION|CACHED|BUFFERED; va += MBYTE; } // undo identity map of first MB of ram l1[PDX(PHYSTART)] = 0; // drain write buffer; writeback data cache range [va, va+n] va1 = (uint)&l1[PDX(PHYSTART)]; va2 = va1 + sizeof(pde_t); va1 = va1 & ~((uint)CACHELINESIZE-1); va2 = va2 & ~((uint)CACHELINESIZE-1); flush_dcache(va1, va2); // invalidate TLB; DSB barrier used flush_tlb(); }