feat: implement privileged mode support
This commit is contained in:
@@ -47,6 +47,24 @@ class Decoder(p: CoreParams = CoreParams()) extends Module {
|
||||
))
|
||||
d.memSigned := !funct3(2)
|
||||
d.illegal := false.B
|
||||
val isSystemOpcode = opcode === "b1110011".U
|
||||
val isFenceOpcode = opcode === "b0001111".U
|
||||
val isEcall = io.inst === "h00000073".U
|
||||
val isEbreak = io.inst === "h00100073".U
|
||||
val isMret = io.inst === "h30200073".U
|
||||
val isSret = io.inst === "h10200073".U
|
||||
val isUret = io.inst === "h00200073".U
|
||||
val isWfi = io.inst === "h10500073".U
|
||||
val isSfenceVma = isSystemOpcode && funct3 === 0.U && funct7 === "b0001001".U
|
||||
val isKnownPrivInst = isEcall || isEbreak || isMret || isSret || isSfenceVma || isWfi
|
||||
d.isEcall := isEcall
|
||||
d.isEbreak := isEbreak
|
||||
d.isMret := isMret
|
||||
d.isSret := isSret
|
||||
d.isUret := isUret
|
||||
d.isSfenceVma := isSfenceVma
|
||||
d.isXret := isMret || isSret
|
||||
d.isWfi := isWfi
|
||||
|
||||
switch(opcode) {
|
||||
is("b0110111".U) {
|
||||
@@ -128,11 +146,15 @@ class Decoder(p: CoreParams = CoreParams()) extends Module {
|
||||
is("b0001111".U) {
|
||||
d.opClass := Consts.OP_SYSTEM
|
||||
d.isFenceI := funct3 === "b001".U
|
||||
d.illegal := funct3 =/= 0.U && funct3 =/= "b001".U
|
||||
}
|
||||
is("b1110011".U) {
|
||||
d.isSystem := true.B
|
||||
d.writesRd := rd =/= 0.U && funct3 =/= 0.U
|
||||
d.opClass := Consts.OP_SYSTEM
|
||||
when(funct3 === 0.U) {
|
||||
d.illegal := !(isKnownPrivInst && !isUret)
|
||||
}
|
||||
}
|
||||
is("b0101111".U) {
|
||||
d.isLoad := true.B
|
||||
@@ -151,5 +173,9 @@ class Decoder(p: CoreParams = CoreParams()) extends Module {
|
||||
d.illegal := true.B
|
||||
}
|
||||
|
||||
when(isSystemOpcode && isUret) {
|
||||
d.illegal := true.B
|
||||
}
|
||||
|
||||
io.out := d
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user