#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