1.1 --- a/stage2/cpu.c Mon Feb 22 20:31:50 2016 +0100
1.2 +++ b/stage2/cpu.c Mon Feb 22 23:23:52 2016 +0100
1.3 @@ -145,7 +145,7 @@
1.4
1.5 void map_page(u32 virtual, u32 physical, u32 pagesize)
1.6 {
1.7 - u32 start = virtual & 0xffffe000;
1.8 + u32 start = virtual & 0xffffe000; /* VPN2 */
1.9 u32 flags = 0x1f; /* C=3, dirty, global, valid */
1.10 u32 lower = ((physical & 0xffffc000) >> 6) | flags;
1.11 u32 upper = (((physical + pagesize) & 0xffffc000) >> 6) | flags;
1.12 @@ -153,8 +153,6 @@
1.13
1.14 asm volatile(
1.15 "mtc0 %3, $5\n" /* CP0_PAGEMASK */
1.16 - "li $t1, 2\n" /* index of first randomly-replaced entry */
1.17 - "mtc0 $t1, $6\n" /* CP0_WIRED */
1.18
1.19 /* Set physical address. */
1.20
1.21 @@ -172,3 +170,23 @@
1.22 : "r" (lower), "r" (upper), "r" (start), "r" (pagemask)
1.23 );
1.24 }
1.25 +
1.26 +void tlb_handle(void)
1.27 +{
1.28 + u32 context, virtual;
1.29 +
1.30 + /* Obtain the bad virtual address. */
1.31 +
1.32 + asm volatile(
1.33 + "mfc0 %0, $4\n" /* CP0_CONTEXT */
1.34 + : "=r" (context)
1.35 + );
1.36 +
1.37 + /* Obtain a virtual address region with 8KB resolution. */
1.38 +
1.39 + virtual = (context & 0x007ffff0) << 9;
1.40 +
1.41 + /* Request a physical region mapping two 4KB pages. */
1.42 +
1.43 + map_page(virtual, virtual, 4 * 1024);
1.44 +}