emulation: engine: always update registers on write

These registers get reset when the hardware is reset, however the engine
may still be running. Ensure it's not running when the device is reset.

Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
Sean Cross 2021-07-15 18:22:15 +08:00
parent 3f1593e56e
commit d248ab3cc7

View file

@ -480,15 +480,15 @@ namespace Antmicro.Renode.Peripherals.Miscellaneous
private void DefineRegisters()
{
Registers.WINDOW.Define(this)
.WithValueField(0, 4, name: "WINDOW", valueProviderCallback: (_) => this.window, changeCallback: (_, value) => this.window = (byte)(value & 0xf))
.WithValueField(0, 4, name: "WINDOW", valueProviderCallback: (_) => this.window, writeCallback: (_, value) => this.window = (byte)(value & 0xf))
;
Registers.MPSTART.Define(this)
.WithValueField(0, 11, name: "MPSTART", valueProviderCallback: (_) => this.mpstart, changeCallback: (_, value) => this.mpstart = (UInt16)(value & 0x7ff))
.WithValueField(0, 11, name: "MPSTART", valueProviderCallback: (_) => this.mpstart, writeCallback: (_, value) => this.mpstart = (UInt16)(value & 0x7ff))
;
Registers.MPLEN.Define(this)
.WithValueField(0, 11, name: "MPLEN", valueProviderCallback: _ => this.mplen, changeCallback: (_, value) => this.mplen = (UInt16)(value & 0x7ff))
.WithValueField(0, 11, name: "MPLEN", valueProviderCallback: _ => this.mplen, writeCallback: (_, value) => this.mplen = (UInt16)(value & 0x7ff))
;
Registers.CONTROL.Define(this)
@ -510,7 +510,7 @@ namespace Antmicro.Renode.Peripherals.Miscellaneous
;
Registers.MPRESUME.Define(this)
.WithValueField(0, 11, name: "MPRESUME", valueProviderCallback: _ => this.mpresume, changeCallback: (_, value) => { this.mpresume = (UInt16)(value & 0x7ff); })
.WithValueField(0, 11, name: "MPRESUME", valueProviderCallback: _ => this.mpresume, writeCallback: (_, value) => { this.mpresume = (UInt16)(value & 0x7ff); })
;
Registers.POWER.Define(this)
@ -578,6 +578,12 @@ namespace Antmicro.Renode.Peripherals.Miscellaneous
this.mplen = 0;
this.mpresume = 0;
this.mpc = 0;
if (this.engineExecution != null) {
if (this.engineExecution.IsAlive) {
this.engineExecution.Abort();
}
this.engineExecution = null;
}
if (this.powerIsOn != null)
{
this.powerIsOn.Value = false;