diff options
| -rw-r--r-- | mips/mips_insts.sail | 121 | ||||
| -rw-r--r-- | mips/mips_prelude.sail | 193 | ||||
| -rw-r--r-- | src/lem_interp/run_with_elf.ml | 29 | ||||
| -rw-r--r-- | src/lem_interp/run_with_elf_cheri.ml | 29 |
4 files changed, 349 insertions, 23 deletions
diff --git a/mips/mips_insts.sail b/mips/mips_insts.sail index a265bd13..063472ca 100644 --- a/mips/mips_insts.sail +++ b/mips/mips_insts.sail @@ -1323,18 +1323,18 @@ function clause execute (MFC0(rt, rd, sel, double)) = { checkCP0Access(); let (bit[64]) result = switch (rd, sel) { - case (0b00000,0b000) -> 0 (* 0, TLB Index *) - case (0b00001,0b000) -> 0 (* 1, TLB Random *) - case (0b00010,0b000) -> 0 (* 2, TLB EntryLo0 *) - case (0b00011,0b000) -> 0 (* 3, TLB EntryLo1 *) - case (0b00100,0b000) -> 0 (* 4, TLB Context *) - case (0b00101,0b000) -> 0 (* 5, TLB PageMask *) - case (0b00110,0b000) -> 0 (* 6, TLB Wired *) - case (0b00111,0b000) -> EXTZ(CP0HWREna) (* 6, HWREna *) + case (0b00000,0b000) -> (0x00000000 : [TLBProbe] : 0x0000000 : TLBIndex) (* 0, TLB Index *) + case (0b00001,0b000) -> EXTZ(TLBRandom) (* 1, TLB Random *) + case (0b00010,0b000) -> EXTZ(TLBEntryLo0)(* 2, TLB EntryLo0 *) + case (0b00011,0b000) -> EXTZ(TLBEntryLo1)(* 3, TLB EntryLo1 *) + case (0b00100,0b000) -> TLBContext (* 4, TLB Context *) + case (0b00101,0b000) -> EXTZ(TLBPageMask : 0x000) (* 5, TLB PageMask *) + case (0b00110,0b000) -> EXTZ(TLBWired) (* 6, TLB Wired *) + case (0b00111,0b000) -> EXTZ(CP0HWREna) (* 7, HWREna *) case (0b01000,0b000) -> CP0BadVAddr (* 8, BadVAddr reg *) case (0b01000,0b001) -> 0 (* 8, BadInstr reg XXX TODO *) case (0b01001,0b000) -> EXTZ(CP0Count) (* 9, Count reg *) - case (0b01010,0b000) -> 0 (* 10, TLB EntryHi *) + case (0b01010,0b000) -> TLBEntryHi (* 10, TLB EntryHi *) case (0b01011,0b000) -> EXTZ(CP0Compare) (* 11, Compare reg *) case (0b01100,0b000) -> EXTZ(CP0Status) (* 12, Status reg *) case (0b01101,0b000) -> EXTZ(CP0Cause) (* 13, Cause reg *) @@ -1377,10 +1377,11 @@ function clause execute (MFC0(rt, rd, sel, double)) = { : 0b0000 (* SL L2 lines *) : 0b0000) (* SA L2 assoc. *) case (0b10000,0b011) -> 0x0000000000002000 (* 16, sel 3: Config3 zero except for bit 13 == ulri *) + case (0b10000,0b101) -> 0x0000000000000000 (* 16, sel 5: Config5 beri specific -- no extended TLB *) case (0b10001,0b000) -> CP0LLAddr (* 17, sel 0: LLAddr *) case (0b10010,0b000) -> 0 (* 18, WatchLo *) case (0b10011,0b000) -> 0 (* 19, WatchHi *) - case (0b10100,0b000) -> 0 (* 20, XContext *) + case (0b10100,0b000) -> TLBXContext (* 20, XContext *) case (0b11110,0b000) -> CP0ErrorEPC (* 30, ErrorEPC *) case _ -> {exit (SignalException(ResI)); 0} } in @@ -1397,9 +1398,25 @@ function clause execute (MTC0(rt, rd, sel, double)) = { let reg_val = (rGPR(rt)) in switch (rd, sel) { + case (0b00000,0b000) -> TLBIndex := mask(reg_val) (* NB no write to TLBProbe *) + case (0b00001,0b000) -> () (* TLBRandom is read only *) + case (0b00010,0b000) -> TLBEntryLo0 := mask(reg_val) + case (0b00011,0b000) -> TLBEntryLo1 := mask(reg_val) + case (0b00100,0b000) -> (TLBContext.PTEBase) := (reg_val[63..23]) case (0b00100,0b010) -> CP0UserLocal := reg_val + case (0b00101,0b000) -> TLBPageMask := (reg_val[28..13]) + case (0b00110,0b000) -> { + TLBWired := mask(reg_val); + TLBRandom := TLBIndexMax; + } case (0b00111,0b000) -> CP0HWREna := (reg_val[31..29] : 0b0000000000000000000000000 : reg_val[3..0]) + case (0b01000,0b000) -> () (* BadVAddr read only *) case (0b01001,0b000) -> CP0Count := reg_val[31..0] + case (0b01010,0b000) -> { + (TLBEntryHi.R) := (reg_val[63..62]); + (TLBEntryHi.VPN2) := (reg_val[39..13]); + (TLBEntryHi.ASID) := (reg_val[7..0]); + } case (0b01011,0b000) -> { (* 11, sel 0: Compare reg *) CP0Compare := reg_val[31..0]; (CP0Cause[15]) := bitzero; @@ -1421,11 +1438,95 @@ function clause execute (MTC0(rt, rd, sel, double)) = { (CP0Cause.IP)[9..8] := reg_val[9..8]; } case (0b01110,0b000) -> CP0EPC := reg_val (* 14, EPC *) + case (0b10100,0b000) -> (TLBXContext.PTEBase) := (reg_val[63..33]) case (0b11110,0b000) -> CP0ErrorEPC := reg_val (* 30, ErrorEPC *) case _ -> exit (SignalException(ResI)) } } +function unit TLBWriteEntry((TLBIndexT) idx) = { + pagemask := ((bit[16]) TLBPageMask); + switch(pagemask) { + case 0x0000 -> () + case 0x0003 -> () + case 0x000f -> () + case 0x003f -> () + case 0x00ff -> () + case 0x03ff -> () + case 0x0fff -> () + case 0x3fff -> () + case 0xffff -> () + case _ -> exit (SignalException(MCheck)) + }; + ((TLBEntries[idx]).pagemask) := pagemask; + ((TLBEntries[idx]).r ) := TLBEntryHi.R; + ((TLBEntries[idx]).vpn2 ) := TLBEntryHi.VPN2; + ((TLBEntries[idx]).asid ) := TLBEntryHi.ASID; + ((TLBEntries[idx]).g ) := ((TLBEntryLo0.G) & (TLBEntryLo1.G)); + ((TLBEntries[idx]).valid ) := bitone; + ((TLBEntries[idx]).pfn0 ) := TLBEntryLo0.PFN; + ((TLBEntries[idx]).c0 ) := TLBEntryLo0.C; + ((TLBEntries[idx]).d0 ) := TLBEntryLo0.D; + ((TLBEntries[idx]).v0 ) := TLBEntryLo0.V; + ((TLBEntries[idx]).pfn1 ) := TLBEntryLo1.PFN; + ((TLBEntries[idx]).c1 ) := TLBEntryLo1.C; + ((TLBEntries[idx]).d1 ) := TLBEntryLo1.D; + ((TLBEntries[idx]).v1 ) := TLBEntryLo1.V; +} + +union ast member TLBWI +function clause decode (0b010000 : 0b10000000000000000000 : 0b000010) = Some(TLBWI) +function clause execute (TLBWI) = { + checkCP0Access(); + TLBWriteEntry(TLBIndex); +} + +union ast member TLBWR +function clause decode (0b010000 : 0b10000000000000000000 : 0b000110) = Some(TLBWR) +function clause execute (TLBWR) = { + checkCP0Access(); + TLBWriteEntry(TLBRandom); +} + +union ast member TLBR +function clause decode (0b010000 : 0b10000000000000000000 : 0b000001) = Some(TLBR) +function clause execute (TLBR) = { + checkCP0Access(); + let entry = TLBEntries[TLBIndex] in { + TLBPageMask := entry.pagemask; + TLBEntryHi.R := entry.r; + TLBEntryHi.VPN2 := entry.vpn2; + TLBEntryHi.ASID := entry.asid; + TLBEntryLo0.PFN := entry.pfn0; + TLBEntryLo0.C := entry.c0; + TLBEntryLo0.D := entry.d0; + TLBEntryLo0.V := entry.v0; + TLBEntryLo0.G := entry.g; + TLBEntryLo1.PFN := entry.pfn1; + TLBEntryLo1.C := entry.c1; + TLBEntryLo1.D := entry.d1; + TLBEntryLo1.V := entry.v1; + TLBEntryLo1.G := entry.g; + } +} + +union ast member TLBP +function clause decode (0b010000 : 0b10000000000000000000 : 0b001000) = Some(TLBP) +function clause execute ((TLBP)) = { + checkCP0Access(); + let result = tlbSearch(TLBEntryHi) in + switch(result) { + case (Some(idx)) -> { + TLBProbe := [bitzero]; + TLBIndex := idx; + } + case None -> { + TLBProbe := [bitone]; + TLBIndex := 0; + } + } +} + union ast member (regno, regno) RDHWR function clause decode (0b011111 : 0b00000 : (regno) rt : (regno) rd : 0b00000 : 0b111011) = Some(RDHWR(rt, rd)) function clause execute (RDHWR(rt, rd)) = { diff --git a/mips/mips_prelude.sail b/mips/mips_prelude.sail index f01d6f4e..6105deb8 100644 --- a/mips/mips_prelude.sail +++ b/mips/mips_prelude.sail @@ -23,6 +23,85 @@ typedef CauseReg = register bits [ 31 : 0 ] { 6 .. 2 : ExcCode; (* code of last exception *) (*1 .. 0 : Z4;*) } + +typedef TLBEntryLoReg = register bits [29 : 0] { + 29 .. 6 : PFN; + 5 .. 3 : C; + 2 : D; + 1 : V; + 0 : G; +} + +typedef TLBEntryHiReg = register bits [63 : 0] { + 63 .. 62 : R; + 39 .. 13 : VPN2; + 7 .. 0 : ASID; +} + +typedef ContextReg = register bits [63 : 0] { + 63 .. 23 : PTEBase; + 22 .. 4 : BadVPN2; + (*3 .. 0 : ZR;*) +} + +typedef XContextReg = register bits [63 : 0] { + 63 .. 33: PTEBase; + 32 .. 31: R; + 30 .. 4: BadVPN2; +} + +let ([:8:]) TLBNumEntries = 8 +typedef TLBIndexT = (bit[3]) +let (TLBIndexT) TLBIndexMax = 0b111 + +typedef TLBEntry = register bits [112 : 0] { + 112 .. 97: pagemask; (* 16 bits *) + 96 .. 95: r; (* 2 bits *) + 94 .. 68: vpn2; (* 27 bits *) + 67 .. 60: asid; (* 8 bits *) + 59 : g; + 58 : valid; + 57 .. 34: pfn0; (* 24 bits *) + 33 .. 31: c0; (* 3 bits *) + 30 : d0; + 29 : v0; + 28 .. 5 : pfn1; + 4 .. 2 : c1; + 1 : d1; + 0 : v1; +} + +register (bit[1]) TLBProbe +register (bit[3]) TLBIndex +register (bit[3]) TLBRandom +register (TLBEntryLoReg) TLBEntryLo0 +register (TLBEntryLoReg) TLBEntryLo1 +register (ContextReg) TLBContext +register (bit[16]) TLBPageMask +register (bit[3]) TLBWired +register (TLBEntryHiReg) TLBEntryHi +register (XContextReg) TLBXContext + +register (TLBEntry) TLBEntry00 +register (TLBEntry) TLBEntry01 +register (TLBEntry) TLBEntry02 +register (TLBEntry) TLBEntry03 +register (TLBEntry) TLBEntry04 +register (TLBEntry) TLBEntry05 +register (TLBEntry) TLBEntry06 +register (TLBEntry) TLBEntry07 + +let (vector <0, 8, inc, (TLBEntry)>) TLBEntries = [ +TLBEntry00, +TLBEntry01, +TLBEntry02, +TLBEntry03, +TLBEntry04, +TLBEntry05, +TLBEntry06, +TLBEntry07 +] + register (bit[32]) CP0Compare register (CauseReg) CP0Cause register (bit[64]) CP0EPC @@ -126,8 +205,8 @@ val extern unit -> unit effect { barr } MEM_sync typedef Exception = enumerate { - Int; Mod; TLBL; TLBS; AdEL; AdES; Sys; Bp; ResI; CpU; Ov; Tr; C2E; C2Trap; - XTLBRefillL; XTLBRefillS + Int; TLBMod; TLBL; TLBS; AdEL; AdES; Sys; Bp; ResI; CpU; Ov; Tr; C2E; C2Trap; + XTLBRefillL; XTLBRefillS; XTLBInvL; XTLBInvS; MCheck } (* Return the ISA defined code for an exception condition *) @@ -135,7 +214,7 @@ function (bit[5]) ExceptionCode ((Exception) ex) = switch (ex) { case Int -> mask(0x00) (* Interrupt *) - case Mod -> mask(0x01) (* TLB modification exception *) + case TLBMod -> mask(0x01) (* TLB modification exception *) case TLBL -> mask(0x02) (* TLB exception (load or fetch) *) case TLBS -> mask(0x03) (* TLB exception (store) *) case AdEL -> mask(0x04) (* Address error (load or fetch) *) @@ -150,6 +229,9 @@ function (bit[5]) ExceptionCode ((Exception) ex) = case C2Trap -> mask(0x12) (* C2Trap maps to same exception code, different vector *) case XTLBRefillL -> mask(0x02) case XTLBRefillS -> mask(0x03) + case XTLBInvL -> mask(0x02) + case XTLBInvS -> mask(0x03) + case MCheck -> mask(0x18) } @@ -198,6 +280,16 @@ function unit SignalExceptionBadAddr((Exception) ex, (bit[64]) badAddr) = SignalException(ex); } +function unit SignalExceptionTLB((Exception) ex, (bit[64]) badAddr) = { + CP0BadVAddr := badAddr; + (TLBContext.BadVPN2) := (badAddr[31..13]); + (TLBXContext.BadVPN2):= (badAddr[39..13]); + (TLBXContext.R) := (badAddr[63..62]); + (TLBEntryHi.R) := (badAddr[63..62]); + (TLBEntryHi.VPN2) := (badAddr[39..13]); + SignalException(ex); +} + typedef MemAccessType = enumerate {Instruction; LoadData; StoreData} typedef AccessLevel = enumerate {User; Supervisor; Kernel} @@ -223,6 +315,9 @@ function unit checkCP0Access () = } function unit incrementCP0Count() = { + TLBRandom := (if (unsigned(TLBRandom) == unsigned(TLBWired)) + then (TLBIndexMax) else (TLBRandom - 1)); + CP0Count := (CP0Count + 1); if (unsigned(CP0Count) == unsigned(CP0Compare)) then { (CP0Cause[15]) := bitone; @@ -239,26 +334,98 @@ function unit incrementCP0Count() = { exit (SignalException(Int)); } +function bool tlbEntryMatch(r, vpn2, asid, (TLBEntry) entry) = + let entryVal = (bit[113]) entry in + let entryValid = (entryVal[58]) in + let entryR = (entryVal[96..95]) in + let entryMask = (entryVal[112..97]) in + let entryVPN = (entryVal[94..68]) in + let entryASID = (entryVal[67..60]) in + let entryG = (entryVal[59]) in + ((entryValid) & + (r == (entryR)) & + ((vpn2 & ~(EXTZ(entryMask))) == ((entryVPN) & ~(EXTZ(entryMask)))) & + ((asid == (entryASID)) | (entryG))) + +function option<TLBIndexT> tlbSearch((bit[64]) VAddr) = + let r = (VAddr[63..62]) in + let vpn2 = (VAddr[39..13]) in + let asid = (TLBEntryHi.ASID) in + if (tlbEntryMatch(r, vpn2, asid, TLBEntry00)) then + Some(0b000) + else if (tlbEntryMatch(r, vpn2, asid, TLBEntry01)) then + Some(0b001) + else if (tlbEntryMatch(r, vpn2, asid, TLBEntry02)) then + Some(0b010) + else if (tlbEntryMatch(r, vpn2, asid, TLBEntry03)) then + Some(0b011) + else if (tlbEntryMatch(r, vpn2, asid, TLBEntry04)) then + Some(0b100) + else if (tlbEntryMatch(r, vpn2, asid, TLBEntry05)) then + Some(0b101) + else if (tlbEntryMatch(r, vpn2, asid, TLBEntry06)) then + Some(0b110) + else if (tlbEntryMatch(r, vpn2, asid, TLBEntry07)) then + Some(0b111) + else + None + +function (bit[64]) TLBTranslate2 ((bit[64]) vAddr, (MemAccessType) accessType) = { + let idx = tlbSearch(vAddr) in + switch(idx) { + case (Some(idx)) -> + let entry = ((bit[113])(TLBEntries[idx])) in + let entryMask = (entry[112..97]) in + + let evenOddBit = switch(entryMask) { + case 0x0000 -> 12 + case 0x0003 -> 14 + case 0x000f -> 16 + case 0x003f -> 18 + case 0x00ff -> 20 + case 0x03ff -> 22 + case 0x0fff -> 24 + case 0x3fff -> 26 + case 0xffff -> 28 + case _ -> undefined + } in + let isOdd = (vAddr[evenOddBit]) in + let (pfn, v, c, d) = if (isOdd) then + (entry[28..5], entry[0], entry[4..2], entry[1]) + else + (entry[57..34], entry[29], entry[33..31], entry[30]) in + if (~(v)) then + exit (SignalExceptionTLB(if (accessType == StoreData) then XTLBInvS else XTLBInvL, vAddr)) + else if ((accessType == StoreData) & ~(d)) then + exit (SignalExceptionTLB(TLBMod, vAddr)) + else + EXTZ(pfn[23..((evenOddBit)-(12))] : vAddr[((evenOddBit)-(1)) .. 0]) + case None -> exit (SignalExceptionTLB(if (accessType == StoreData) then XTLBRefillS else XTLBRefillL, vAddr)) + } +} + function (bit[64]) TLBTranslate ((bit[64]) vAddr, (MemAccessType) accessType) = { err := (if (accessType == StoreData) then AdES else AdEL); let currentAccessLevel = getAccessLevel() in let (requiredLevel, addr) = switch(vAddr[63..62]) { case 0b11 -> switch(vAddr[61..31], vAddr[30..29]) { (* xkseg *) - case (0b1111111111111111111111111111111, 0b11) -> exit (SignalException(err)) (* kseg3 mapped 32-bit compat TODO *) - case (0b1111111111111111111111111111111, 0b10) -> exit (SignalException(err)) (* sseg mapped 32-bit compat TODO *) - case (0b1111111111111111111111111111111, 0b01) -> (Kernel, EXTZ(vAddr[28..0])) (* kseg1 unmapped uncached 32-bit compat *) - case (0b1111111111111111111111111111111, 0b00) -> (Kernel, EXTZ(vAddr[28..0])) (* kseg0 unmapped cached 32-bit compat *) - case (_, _) -> exit (SignalException(err)) (* xkseg mapped TODO *) + case (0b1111111111111111111111111111111, 0b11) -> (Kernel, None) (* kseg3 mapped 32-bit compat *) + case (0b1111111111111111111111111111111, 0b10) -> (Supervisor, None) (* sseg mapped 32-bit compat *) + case (0b1111111111111111111111111111111, 0b01) -> (Kernel, Some(EXTZ(vAddr[28..0]))) (* kseg1 unmapped uncached 32-bit compat *) + case (0b1111111111111111111111111111111, 0b00) -> (Kernel, Some(EXTZ(vAddr[28..0]))) (* kseg0 unmapped cached 32-bit compat *) + case (_, _) -> (Kernel, None) (* xkseg mapped *) } - case 0b10 -> (Kernel, EXTZ(vAddr[58..0])) (* xkphys bits 61-59 are cache mode which we ignore *) - case 0b01 -> exit (SignalException(err)) (* xsseg - supervisor mapped TODO *) - case 0b00 -> exit (SignalException(err)) (* xuseg - user mapped TODO *) + case 0b10 -> (Kernel, Some(EXTZ(vAddr[58..0]))) (* xkphys bits 61-59 are cache mode which we ignore *) + case 0b01 -> (Supervisor, None) (* xsseg - supervisor mapped *) + case 0b00 -> (User, None) (* xuseg - user mapped *) } in if (((nat)currentAccessLevel) < ((nat)requiredLevel)) then exit (SignalException(err)) - else - addr + else switch(addr) { + case (Some(a)) -> a + case None -> TLBTranslate2(vAddr, accessType) + } } typedef regno = bit[5] (* a register number *) diff --git a/src/lem_interp/run_with_elf.ml b/src/lem_interp/run_with_elf.ml index 7872a5b5..313babe4 100644 --- a/src/lem_interp/run_with_elf.ml +++ b/src/lem_interp/run_with_elf.ml @@ -500,6 +500,24 @@ let mips_register_data_all = [ ("CP0Compare", (D_decreasing, 32, 31)); ("CP0HWREna", (D_decreasing, 32, 31)); ("CP0UserLocal", (D_decreasing, 64, 63)); + ("TLBProbe" ,(D_decreasing, 1, 0)); + ("TLBIndex" ,(D_decreasing, 3, 2)); + ("TLBRandom" ,(D_decreasing, 3, 2)); + ("TLBEntryLo0",(D_decreasing, 30, 29)); + ("TLBEntryLo1",(D_decreasing, 30, 29)); + ("TLBContext" ,(D_decreasing, 64, 63)); + ("TLBPageMask",(D_decreasing, 16, 15)); + ("TLBWired" ,(D_decreasing, 3, 2)); + ("TLBEntryHi" ,(D_decreasing, 64, 63)); + ("TLBXContext",(D_decreasing, 64, 63)); + ("TLBEntry00" ,(D_decreasing, 113, 112)); + ("TLBEntry01" ,(D_decreasing, 113, 112)); + ("TLBEntry02" ,(D_decreasing, 113, 112)); + ("TLBEntry03" ,(D_decreasing, 113, 112)); + ("TLBEntry04" ,(D_decreasing, 113, 112)); + ("TLBEntry05" ,(D_decreasing, 113, 112)); + ("TLBEntry06" ,(D_decreasing, 113, 112)); + ("TLBEntry07" ,(D_decreasing, 113, 112)); ] let initial_stack_and_reg_data_of_MIPS_elf_file e_entry all_data_memory = @@ -880,6 +898,17 @@ let get_addr_trans_regs _ = (Interp_interface.Reg0("CP0Count", 31, 32, Interp_interface.D_decreasing), Reg.find "CP0Count" !reg); (Interp_interface.Reg0("CP0Compare", 31, 32, Interp_interface.D_decreasing), Reg.find "CP0Compare" !reg); (Interp_interface.Reg0("inBranchDelay", 0, 1, Interp_interface.D_decreasing), Reg.find "inBranchDelay" !reg); + (Interp_interface.Reg0("TLBRandom", 2, 3, Interp_interface.D_decreasing), Reg.find "TLBRandom" !reg); + (Interp_interface.Reg0("TLBWired", 2, 3, Interp_interface.D_decreasing), Reg.find "TLBWired" !reg); + (Interp_interface.Reg0("TLBEntryHi", 63, 64, Interp_interface.D_decreasing), Reg.find "TLBEntryHi" !reg); + (Interp_interface.Reg0("TLBEntry00", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry00" !reg); + (Interp_interface.Reg0("TLBEntry01", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry01" !reg); + (Interp_interface.Reg0("TLBEntry02", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry02" !reg); + (Interp_interface.Reg0("TLBEntry03", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry03" !reg); + (Interp_interface.Reg0("TLBEntry04", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry04" !reg); + (Interp_interface.Reg0("TLBEntry05", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry05" !reg); + (Interp_interface.Reg0("TLBEntry06", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry06" !reg); + (Interp_interface.Reg0("TLBEntry07", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry07" !reg); ]) let get_opcode pc_a = diff --git a/src/lem_interp/run_with_elf_cheri.ml b/src/lem_interp/run_with_elf_cheri.ml index 633dda72..dd7a5093 100644 --- a/src/lem_interp/run_with_elf_cheri.ml +++ b/src/lem_interp/run_with_elf_cheri.ml @@ -500,6 +500,24 @@ let mips_register_data_all = [ ("CP0Compare", (D_decreasing, 32, 31)); ("CP0HWREna", (D_decreasing, 32, 31)); ("CP0UserLocal", (D_decreasing, 64, 63)); + ("TLBProbe" ,(D_decreasing, 1, 0)); + ("TLBIndex" ,(D_decreasing, 3, 2)); + ("TLBRandom" ,(D_decreasing, 3, 2)); + ("TLBEntryLo0",(D_decreasing, 30, 29)); + ("TLBEntryLo1",(D_decreasing, 30, 29)); + ("TLBContext" ,(D_decreasing, 64, 63)); + ("TLBPageMask",(D_decreasing, 16, 15)); + ("TLBWired" ,(D_decreasing, 3, 2)); + ("TLBEntryHi" ,(D_decreasing, 64, 63)); + ("TLBXContext",(D_decreasing, 64, 63)); + ("TLBEntry00" ,(D_decreasing, 113, 112)); + ("TLBEntry01" ,(D_decreasing, 113, 112)); + ("TLBEntry02" ,(D_decreasing, 113, 112)); + ("TLBEntry03" ,(D_decreasing, 113, 112)); + ("TLBEntry04" ,(D_decreasing, 113, 112)); + ("TLBEntry05" ,(D_decreasing, 113, 112)); + ("TLBEntry06" ,(D_decreasing, 113, 112)); + ("TLBEntry07" ,(D_decreasing, 113, 112)); ] let cheri_register_data_all = mips_register_data_all @ [ @@ -968,6 +986,17 @@ let get_addr_trans_regs _ = (Interp_interface.Reg0("CP0Count", 31, 32, Interp_interface.D_decreasing), Reg.find "CP0Count" !reg); (Interp_interface.Reg0("CP0Compare", 31, 32, Interp_interface.D_decreasing), Reg.find "CP0Compare" !reg); (Interp_interface.Reg0("inBranchDelay", 0, 1, Interp_interface.D_decreasing), Reg.find "inBranchDelay" !reg); + (Interp_interface.Reg0("TLBRandom", 2, 3, Interp_interface.D_decreasing), Reg.find "TLBRandom" !reg); + (Interp_interface.Reg0("TLBWired", 2, 3, Interp_interface.D_decreasing), Reg.find "TLBWired" !reg); + (Interp_interface.Reg0("TLBEntryHi", 63, 64, Interp_interface.D_decreasing), Reg.find "TLBEntryHi" !reg); + (Interp_interface.Reg0("TLBEntry00", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry00" !reg); + (Interp_interface.Reg0("TLBEntry01", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry01" !reg); + (Interp_interface.Reg0("TLBEntry02", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry02" !reg); + (Interp_interface.Reg0("TLBEntry03", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry03" !reg); + (Interp_interface.Reg0("TLBEntry04", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry04" !reg); + (Interp_interface.Reg0("TLBEntry05", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry05" !reg); + (Interp_interface.Reg0("TLBEntry06", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry06" !reg); + (Interp_interface.Reg0("TLBEntry07", 112, 113, Interp_interface.D_decreasing), Reg.find "TLBEntry07" !reg); ]) let get_opcode pc_a = |
