TLB初始化 Missing Handler,MIPS R3K mips_init_tlb

 

#include <mips/r3kc0.h>
LEAF(mips_init_tlb)
mfc0 t0,        C0_ENTRYHI               # 保存ASID
mtc0 zero, C0_ENTRYLO                    # tlblo = valid, entryLo一直保持为0,不需要变动
li      a1, NTLBID<<TLBIDX_SHIFT         # 索引 : TLBIDX_SHIF=8对应index寄存器,NTLBID=64 个entry
li      a0, KSEG1_BASE                      # tlbhi = 不可能出现的VPN,KSEG1_BASE=0xa0000000, kseg1从来不需要MMU转换
.set noreorder
1:     subu              a1, 1<<TLBIDX_SHIFT #从63-0 的index
       mtc0       a0, C0_ENTRYHI            #VPN 无效地址
       mtc0       a1, C0_INDEX 
       addu       a0, 0x1000          # 增长VPN,使所有入口都不同
       bnes        a1, 1b
       tlbwi                                                 # 在跳转的delay slot中
.set reorder
       mtc0       t0, C0_ENTRYHI                 # 恢复ASID
       j             ra
END(mips_init_tlb)

 

       .set noreorder
       .set noat
TLBmissR3K:
       mfc0       k1, C0_CONTEXT        # context包含PTEBase,BadVPN, 每条entry大小是2^2=4byte
       mfc0       k0, C0_EPC            # tlb missing的地址
       lw           k1, 0(k1)           #从 PTEBase加载第BadVPN项
       nop                              # 
       mtc0       k1, C0_ENTRYLO        # move to entryLo
       nop                              # 
       tlbwr                            # 随机替换
       jr            k0                 #  返回tlb missing地方继续执行
       rfe                                           
       .set at
       .set reorder
原文地址:https://www.cnblogs.com/brightmind/p/6170323.html