|
@@ -29,6 +29,7 @@
|
|
|
#include "qemu/timer.h"
|
|
|
|
|
|
REG32(LED0, 0)
|
|
|
+REG32(DBGCTRL, 4)
|
|
|
REG32(BUTTON, 8)
|
|
|
REG32(CLK1HZ, 0x10)
|
|
|
REG32(CLK100HZ, 0x14)
|
|
@@ -129,6 +130,12 @@ static uint64_t mps2_fpgaio_read(void *opaque, hwaddr offset, unsigned size)
|
|
|
case A_LED0:
|
|
|
r = s->led0;
|
|
|
break;
|
|
|
+ case A_DBGCTRL:
|
|
|
+ if (!s->has_dbgctrl) {
|
|
|
+ goto bad_offset;
|
|
|
+ }
|
|
|
+ r = s->dbgctrl;
|
|
|
+ break;
|
|
|
case A_BUTTON:
|
|
|
/* User-pressable board buttons. We don't model that, so just return
|
|
|
* zeroes.
|
|
@@ -195,6 +202,14 @@ static void mps2_fpgaio_write(void *opaque, hwaddr offset, uint64_t value,
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
+ case A_DBGCTRL:
|
|
|
+ if (!s->has_dbgctrl) {
|
|
|
+ goto bad_offset;
|
|
|
+ }
|
|
|
+ qemu_log_mask(LOG_UNIMP,
|
|
|
+ "MPS2 FPGAIO: DBGCTRL unimplemented\n");
|
|
|
+ s->dbgctrl = value;
|
|
|
+ break;
|
|
|
case A_PRESCALE:
|
|
|
resync_counter(s);
|
|
|
s->prescale = value;
|
|
@@ -225,6 +240,7 @@ static void mps2_fpgaio_write(void *opaque, hwaddr offset, uint64_t value,
|
|
|
s->pscntr = value;
|
|
|
break;
|
|
|
default:
|
|
|
+ bad_offset:
|
|
|
qemu_log_mask(LOG_GUEST_ERROR,
|
|
|
"MPS2 FPGAIO write: bad offset 0x%x\n", (int) offset);
|
|
|
break;
|
|
@@ -287,12 +303,13 @@ static void mps2_fpgaio_realize(DeviceState *dev, Error **errp)
|
|
|
|
|
|
static const VMStateDescription mps2_fpgaio_vmstate = {
|
|
|
.name = "mps2-fpgaio",
|
|
|
- .version_id = 2,
|
|
|
- .minimum_version_id = 2,
|
|
|
+ .version_id = 3,
|
|
|
+ .minimum_version_id = 3,
|
|
|
.fields = (VMStateField[]) {
|
|
|
VMSTATE_UINT32(led0, MPS2FPGAIO),
|
|
|
VMSTATE_UINT32(prescale, MPS2FPGAIO),
|
|
|
VMSTATE_UINT32(misc, MPS2FPGAIO),
|
|
|
+ VMSTATE_UINT32(dbgctrl, MPS2FPGAIO),
|
|
|
VMSTATE_INT64(clk1hz_tick_offset, MPS2FPGAIO),
|
|
|
VMSTATE_INT64(clk100hz_tick_offset, MPS2FPGAIO),
|
|
|
VMSTATE_UINT32(counter, MPS2FPGAIO),
|
|
@@ -308,6 +325,7 @@ static Property mps2_fpgaio_properties[] = {
|
|
|
/* Number of LEDs controlled by LED0 register */
|
|
|
DEFINE_PROP_UINT32("num-leds", MPS2FPGAIO, num_leds, 2),
|
|
|
DEFINE_PROP_BOOL("has-switches", MPS2FPGAIO, has_switches, false),
|
|
|
+ DEFINE_PROP_BOOL("has-dbgctrl", MPS2FPGAIO, has_dbgctrl, false),
|
|
|
DEFINE_PROP_END_OF_LIST(),
|
|
|
};
|
|
|
|