diff options
Diffstat (limited to 'hw')
-rw-r--r-- | hw/eeprom93xx.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/hw/eeprom93xx.c b/hw/eeprom93xx.c index 1d546e2..ae15a7f 100644 --- a/hw/eeprom93xx.c +++ b/hw/eeprom93xx.c @@ -49,8 +49,9 @@ #define logout(fmt, args...) ((void)0) #endif -static int eeprom_instance = 0; -static const int eeprom_version = 20061112; +#define EEPROM_INSTANCE 0 +#define OLD_EEPROM_VERSION 20061112 +#define EEPROM_VERSION (OLD_EEPROM_VERSION + 1) #if 0 typedef enum { @@ -83,7 +84,7 @@ struct _eeprom_t { uint8_t eedo; uint8_t addrbits; - uint8_t size; + uint16_t size; uint16_t data; uint16_t contents[0]; }; @@ -106,8 +107,7 @@ static void eeprom_save(QEMUFile *f, void *opaque) qemu_put_byte(f, eeprom->eedo); qemu_put_byte(f, eeprom->addrbits); - qemu_put_byte(f, eeprom->size); - qemu_put_byte(f, 0); /* padding for compatiblity */ + qemu_put_be16(f, eeprom->size); qemu_put_be16(f, eeprom->data); for (address = 0; address < eeprom->size; address++) { qemu_put_be16(f, eeprom->contents[address]); @@ -120,9 +120,9 @@ static int eeprom_load(QEMUFile *f, void *opaque, int version_id) of data and current EEPROM are identical. */ eeprom_t *eeprom = (eeprom_t *)opaque; int result = -EINVAL; - if (version_id == eeprom_version) { + if (version_id >= OLD_EEPROM_VERSION) { unsigned address; - uint8_t size = eeprom->size; + int size = eeprom->size; eeprom->tick = qemu_get_byte(f); eeprom->address = qemu_get_byte(f); @@ -134,8 +134,12 @@ static int eeprom_load(QEMUFile *f, void *opaque, int version_id) eeprom->eedo = qemu_get_byte(f); eeprom->addrbits = qemu_get_byte(f); - eeprom->size = qemu_get_byte(f); - qemu_get_byte(f); /* skip padding byte */ + if (version_id == OLD_EEPROM_VERSION) { + eeprom->size = qemu_get_byte(f); + qemu_get_byte(f); + } else { + eeprom->size = qemu_get_be16(f); + } if (eeprom->size == size) { eeprom->data = qemu_get_be16(f); @@ -317,7 +321,7 @@ eeprom_t *eeprom93xx_new(uint16_t nwords) /* Output DO is tristate, read results in 1. */ eeprom->eedo = 1; logout("eeprom = 0x%p, nwords = %u\n", eeprom, nwords); - register_savevm("eeprom", eeprom_instance, eeprom_version, + register_savevm("eeprom", EEPROM_INSTANCE, EEPROM_VERSION, eeprom_save, eeprom_load, eeprom); return eeprom; } |