self.fields = DecodeFields(SignalBitRange, [self.i.ctx.op.insn])
self.fields.create_specs()
self.kaivb = Signal(64) # KAIVB SPR
+ self.state_reset = Signal() # raise high to reset KAIVB cache
def trap(self, m, trap_addr, return_addr):
"""trap. sets new PC, stores MSR and old PC in SRR1 and SRR0
srr0_o, srr1_o, svsrr0_o = self.o.srr0, self.o.srr1, self.o.svsrr0
traptype, trapaddr = op.traptype, op.trapaddr
+ # hard reset of KAIVB
+ with m.If(self.state_reset):
+ sync += self.kaivb.eq(0)
+
# take copy of D-Form TO field
i_fields = self.fields.FormD
to = Signal(i_fields.TO[0:-1].shape())
# L => bit 16 in LSB0, bit 15 in MSB0 order
L = self.fields.FormX.L1[0:1] # X-Form field L1
# start with copy of msr
- comb += msr_o.eq(msr_i)
+ comb += msr_o.data.eq(msr_i)
with m.If(L):
# just update RI..EE
comb += msr_o.data[MSR.RI].eq(a_i[MSR.RI])
if False: # XXX no - not doing hypervisor yet
with m.If(~self.i.ctx.op.insn[9]): # XXX BAD HACK! (hrfid)
with m.If(field(msr_i, 3)): # HV
- comb += field(msr_o, 51).eq(field(srr1_i, 51)) # ME
+ comb += field(msr_o.data, 51).eq(field(srr1_i, 51)) # ME
with m.Else():
- comb += field(msr_o, 51).eq(field(msr_i, 51)) # ME
+ comb += field(msr_o.data, 51).eq(field(msr_i, 51)) # ME
else:
# same as microwatt: treat MSR.ME rfid same as hrfid
- comb += field(msr_o, 51).eq(field(srr1_i, 51)) # ME
+ comb += field(msr_o.data, 51).eq(field(srr1_i, 51)) # ME
# check problem state: if set, not permitted to set EE,IR,DR
msr_check_pr(m, srr1_i, msr_o.data)