Skip to content

Commit 3aa79a7

Browse files
committed
Report right fault address for shadow MMU
Signed-off-by: Inochi Amaoto <inochiama@gmail.com>
1 parent ab0db2d commit 3aa79a7

File tree

5 files changed

+22
-7
lines changed

5 files changed

+22
-7
lines changed

src/main/scala/vexiiriscv/memory/MmuPlugin.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,15 +437,15 @@ class MmuPlugin(var spec : MmuSpec,
437437
IDLE whenIsActive {
438438
when(arbiter.io.output.valid) {
439439
val ppn = priv.implementHypervisor.mux(
440-
Mux(arbiter.io.output.guest, vsatp.ppn, satp.ppn),
440+
Mux(arbiter.io.output.indirect, vsatp.ppn, satp.ppn),
441441
satp.ppn
442442
)
443443
portOhReg := arbiter.io.chosenOH
444444
storageOhReg := UIntToOh(arbiter.io.output.storageId)
445445
storageEnable := arbiter.io.output.storageEnable
446446
virtual := arbiter.io.output.address
447447
load.address := (ppn @@ spec.levels.last.vpn(arbiter.io.output.address) @@ U(0, log2Up(spec.entryBytes) bits)).resized
448-
isTwoStage := arbiter.io.output.guest
448+
isTwoStage := arbiter.io.output.indirect
449449
arbiter.io.output.ready := True
450450
goto(CMD(spec.levels.size - 1))
451451
}

src/main/scala/vexiiriscv/memory/Service.scala

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,16 @@ case class AddressTranslationRefillCmdPerm() extends Bundle{
2525

2626
case class AddressTranslationRefillCmd(storageWidth : Int) extends Bundle{
2727
val address = MIXED_ADDRESS()
28-
val guest = Bool()
28+
/*
29+
* For first-stage MMU:
30+
* false : this request is a one-stage translation.
31+
* true : this request is a two-stage translation.
32+
*
33+
* For shadow (second-stage) MMU
34+
* false : this request is for explicit memory access.
35+
* true : this request is for implicit memory access.
36+
*/
37+
val indirect = Bool()
2938
val storageId = UInt(storageWidth bits)
3039
val storageEnable = Bool()
3140

src/main/scala/vexiiriscv/memory/ShadowMmuPlugin.scala

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ class ShadowMmuPlugin(var spec : MmuSpec,
195195
val storageOhReg = Reg(Bits(storages.size bits))
196196
val storageEnable = Reg(Bool())
197197
val permission = Reg(cloneOf(arbiter.io.output.permission))
198+
val isImplicitAccess = Reg(Bool())
198199

199200
arbiter.io.output.ready := False
200201
IDLE whenIsActive {
@@ -205,6 +206,7 @@ class ShadowMmuPlugin(var spec : MmuSpec,
205206
virtual := arbiter.io.output.address
206207
permission := arbiter.io.output.permission
207208
load.address := (hgatp.ppn @@ spec.levels.last.vpn(arbiter.io.output.address) @@ U(0, log2Up(spec.entryBytes) bits)).resized
209+
isImplicitAccess := arbiter.io.output.indirect
208210
arbiter.io.output.ready := True
209211

210212
when(hgatp.mode === spec.satpMode) {
@@ -405,8 +407,11 @@ class ShadowMmuPlugin(var spec : MmuSpec,
405407
o.ae_ptw := accessFault && !load.leaf
406408
o.ae_final := accessFault && load.leaf //Note so sure
407409
o.level := spec.levels.size - 1 - levelId
408-
o.address := Mux(translationFault, load.address,
409-
Mux(permissionFault, virtual, translatedAddress).resized)
410+
o.address := Mux(isImplicitAccess,
411+
Mux(translationFault, load.address,
412+
Mux(permissionFault, virtual, translatedAddress).resized),
413+
virtual
414+
).resized
410415
}
411416
}
412417
}

src/main/scala/vexiiriscv/memory/TranslatedDBusAccessPlugin.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class TranslatedDBusAccessPlugin() extends FiberPlugin with TranslatedDBusAccess
3030
if (withAtsRedo) {
3131
atsPort.cmd.valid := False
3232
atsPort.cmd.address := U(0)
33+
atsPort.cmd.indirect := True
3334
atsPort.cmd.storageEnable := False
3435
atsPort.cmd.storageId := U(0)
3536
atsPort.cmd.permission.read := True

src/main/scala/vexiiriscv/misc/TrapPlugin.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ class TrapPlugin(val trapAt : Int) extends FiberPlugin with TrapService {
422422
val refill = ats.newRefillPort()
423423
val isGuestRefill = pending.state.arg(2) || PrivilegeMode.isGuest(priv.getPrivilege(hartId))
424424
refill.cmd.valid := False
425-
refill.cmd.guest := isGuestRefill
425+
refill.cmd.indirect := isGuestRefill
426426
refill.cmd.permission.read := !pending.state.arg(1)
427427
refill.cmd.permission.write := pending.state.arg(0, 2 bits) === TrapArg.STORE
428428
refill.cmd.permission.execute := pending.state.arg(1)
@@ -443,7 +443,7 @@ class TrapPlugin(val trapAt : Int) extends FiberPlugin with TrapService {
443443
val satsPorts = sats.mayNeedRedo generate new Area{
444444
val refill = sats.newRefillPort()
445445
refill.cmd.valid := False
446-
refill.cmd.guest := True
446+
refill.cmd.indirect := False
447447
refill.cmd.permission.read := !pending.state.arg(1)
448448
refill.cmd.permission.write := pending.state.arg(0, 2 bits) === TrapArg.STORE
449449
refill.cmd.permission.execute := pending.state.arg(1)

0 commit comments

Comments
 (0)