VMState port more devices
cover VMState port more devices
Hi,
This is the second half of devices that needed some change for vmstate conversion. Change was minimal. Fixed issues from previous sent. Again thanks to Blaw Swirl for the comments and review.
This series apply on top of:
[PATCH 0/9] VMState infrastructure
[PATCH 00/32] VMState port of misc devices
Later, Juan.
Juan Quintela (13):
pxa2xx_lcd: name anonymous struct
pxa2xx_lcd: up field is used as a bool and migrated as an uint8_t
vmstate: port pxa2xx_lcd
max111x: input field is only used as uint8_t
vmstate: port max111x
nand: pin values are uint8_t
vmstate: port nand
mac_nvram: size is a size, no need to be a target dependent type
vmstate: port mac_nvram
piix4: create PIIX4State
vmstate: port piix4
mac_dbdma: create DBDMAState instead of passing one array around
vmstate: port mac_dbdma
hw/flash.h | 4 +- hw/mac_dbdma.c | 83 ++++++++++++++++++--------------- hw/mac_nvram.c | 32 +++++-------- hw/max111x.c | 51 +++++++------------- hw/nand.c | 79 +++++++++++++++++--------------- hw/piix4.c | 44 +++++++++-------- hw/pxa2xx_lcd.c | 138 +++++++++++++++++++++++-------------------------------- 7 files changed, 200 insertions(+), 231 deletions(-)
Signature · 1 line
1.7.4
PATCH 1/13 pxa2xx_lcd: name anonymous struct
--- hw/pxa2xx_lcd.c | 28 +++++++++++++++------------- 1 files changed, 15 insertions(+), 13 deletions(-)
hw/pxa2xx_lcd.c +15 -13
@@ -15,6 +15,20 @@#include "sysemu.h" #include "framebuffer.h" +struct DMAChannel { +target_phys_addr_t branch; +int up; +uint8_t palette[1024 ]; +uint8_t pbuffer[1024 ]; +void (*redraw)(PXA2xxLCDState *s,target_phys_addr_t addr, +int *miny,int *maxy); + +target_phys_addr_t descriptor; +target_phys_addr_t source; +uint32_t id; +uint32_t command; +}; +struct PXA2xxLCDState {qemu_irq irq;int irqlevel;
@@ -50,19 +64,7 @@ struct PXA2xxLCDState {uint32_t liidr;uint8_t bscntr; -struct { -target_phys_addr_t branch; -int up; -uint8_t palette[1024 ]; -uint8_t pbuffer[1024 ]; -void (*redraw)(PXA2xxLCDState *s,target_phys_addr_t addr, -int *miny,int *maxy); - -target_phys_addr_t descriptor; -target_phys_addr_t source; -uint32_t id; -uint32_t command; - } dma_ch[7 ]; +struct DMAChannel dma_ch[7 ];qemu_irq vsync_cb;int orientation;
Signature · 1 line
1.7.4
PATCH 2/13 pxa2xx_lcd: up field is used as a bool and migrated as an uint8_t
In reply to Juan Quintela--- hw/pxa2xx_lcd.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
hw/pxa2xx_lcd.c +1 -1
@@ -17,7 +17,7 @@struct DMAChannel {target_phys_addr_t branch; -int up; +uint8_t up;uint8_t palette[1024 ];uint8_t pbuffer[1024 ]; void (*redraw)(PXA2xxLCDState *s, target_phys_addr_t addr,
Signature · 1 line
1.7.4
PATCH 3/13 vmstate: port pxa2xx_lcd
In reply to Juan Quintela--- hw/pxa2xx_lcd.c | 110 +++++++++++++++++++++--------------------------------- 1 files changed, 43 insertions(+), 67 deletions(-)
hw/pxa2xx_lcd.c +43 -67
@@ -833,74 +833,26 @@ static void pxa2xx_lcdc_orientation(void *opaque, int angle)pxa2xx_lcdc_resize (s); } -static void pxa2xx_lcdc_save (QEMUFile *f,void *opaque) -{ -PXA2xxLCDState *s = (PXA2xxLCDState *) opaque; -int i; - -qemu_put_be32 (f, s->irqlevel); -qemu_put_be32 (f, s->transp); - -for (i =0 ; i <6 ; i ++) -qemu_put_be32s (f, &s->control[i]); -for (i =0 ; i <2 ; i ++) -qemu_put_be32s (f, &s->status[i]); -for (i =0 ; i <2 ; i ++) -qemu_put_be32s (f, &s->ovl1c[i]); -for (i =0 ; i <2 ; i ++) -qemu_put_be32s (f, &s->ovl2c[i]); -qemu_put_be32s (f, &s->ccr); -qemu_put_be32s (f, &s->cmdcr); -qemu_put_be32s (f, &s->trgbr); -qemu_put_be32s (f, &s->tcr); -qemu_put_be32s (f, &s->liidr); -qemu_put_8s (f, &s->bscntr); - -for (i =0 ; i <7 ; i ++) { -qemu_put_betl (f, s->dma_ch[i].branch); -qemu_put_byte (f, s->dma_ch[i].up); -qemu_put_buffer (f, s->dma_ch[i].pbuffer,sizeof (s->dma_ch[i].pbuffer)); - -qemu_put_betl (f, s->dma_ch[i].descriptor); -qemu_put_betl (f, s->dma_ch[i].source); -qemu_put_be32s (f, &s->dma_ch[i].id); -qemu_put_be32s (f, &s->dma_ch[i].command); +static const VMStateDescription vmstate_dma_channel = { + .name ="dma_channel" , + .version_id =0 , + .minimum_version_id =0 , + .minimum_version_id_old =0 , + .fields = (VMStateField []) { + VMSTATE_UINTTL(branch, struct DMAChannel), + VMSTATE_UINT8(up, struct DMAChannel), + VMSTATE_BUFFER(pbuffer, struct DMAChannel), + VMSTATE_UINTTL(descriptor, struct DMAChannel), + VMSTATE_UINTTL(source, struct DMAChannel), + VMSTATE_UINT32(id, struct DMAChannel), + VMSTATE_UINT32(command, struct DMAChannel), +VMSTATE_END_OF_LIST () } -} +}; -static int pxa2xx_lcdc_load (QEMUFile *f,void *opaque,int version_id) +static int pxa2xx_lcdc_post_load (void *opaque,int version_id) { -PXA2xxLCDState *s = (PXA2xxLCDState *) opaque; -int i; - - s->irqlevel =qemu_get_be32 (f); - s->transp =qemu_get_be32 (f); - -for (i =0 ; i <6 ; i ++) -qemu_get_be32s (f, &s->control[i]); -for (i =0 ; i <2 ; i ++) -qemu_get_be32s (f, &s->status[i]); -for (i =0 ; i <2 ; i ++) -qemu_get_be32s (f, &s->ovl1c[i]); -for (i =0 ; i <2 ; i ++) -qemu_get_be32s (f, &s->ovl2c[i]); -qemu_get_be32s (f, &s->ccr); -qemu_get_be32s (f, &s->cmdcr); -qemu_get_be32s (f, &s->trgbr); -qemu_get_be32s (f, &s->tcr); -qemu_get_be32s (f, &s->liidr); -qemu_get_8s (f, &s->bscntr); - -for (i =0 ; i <7 ; i ++) { - s->dma_ch[i].branch =qemu_get_betl (f); - s->dma_ch[i].up =qemu_get_byte (f); -qemu_get_buffer (f, s->dma_ch[i].pbuffer,sizeof (s->dma_ch[i].pbuffer)); - - s->dma_ch[i].descriptor =qemu_get_betl (f); - s->dma_ch[i].source =qemu_get_betl (f); -qemu_get_be32s (f, &s->dma_ch[i].id); -qemu_get_be32s (f, &s->dma_ch[i].command); - } +PXA2xxLCDState *s = opaque; s->bpp =LCCR3_BPP (s->control[3 ]); s->xres = s->yres = s->pal_for =-1 ;
@@ -908,6 +860,31 @@ static int pxa2xx_lcdc_load(QEMUFile *f, void *opaque, int version_id)return 0 ; } +static const VMStateDescription vmstate_pxa2xx_lcdc = { + .name ="pxa2xx_lcdc" , + .version_id =0 , + .minimum_version_id =0 , + .minimum_version_id_old =0 , + .post_load = pxa2xx_lcdc_post_load, + .fields = (VMStateField []) { +VMSTATE_INT32 (irqlevel, PXA2xxLCDState), +VMSTATE_INT32 (transp, PXA2xxLCDState), +VMSTATE_UINT32_ARRAY (control, PXA2xxLCDState,6 ), +VMSTATE_UINT32_ARRAY (status, PXA2xxLCDState,2 ), +VMSTATE_UINT32_ARRAY (ovl1c, PXA2xxLCDState,2 ), +VMSTATE_UINT32_ARRAY (ovl2c, PXA2xxLCDState,2 ), +VMSTATE_UINT32 (ccr, PXA2xxLCDState), +VMSTATE_UINT32 (cmdcr, PXA2xxLCDState), +VMSTATE_UINT32 (trgbr, PXA2xxLCDState), +VMSTATE_UINT32 (tcr, PXA2xxLCDState), +VMSTATE_UINT32 (liidr, PXA2xxLCDState), +VMSTATE_UINT8 (bscntr, PXA2xxLCDState), +VMSTATE_STRUCT_ARRAY (dma_ch, PXA2xxLCDState,7 ,0 , + vmstate_dma_channel, struct DMAChannel), +VMSTATE_END_OF_LIST () + } +}; +#define BITS 8#include "pxa2xx_template.h" #define BITS 15
@@ -972,8 +949,7 @@ PXA2xxLCDState *pxa2xx_lcdc_init(target_phys_addr_t base, qemu_irq irq)exit (1 ); } -register_savevm (NULL ,"pxa2xx_lcdc" ,0 ,0 , - pxa2xx_lcdc_save, pxa2xx_lcdc_load, s); +vmstate_register (NULL ,0 , &vmstate_pxa2xx_lcdc, s);return s; }
Signature · 1 line
1.7.4
PATCH 4/13 max111x: input field is only used as uint8_t
In reply to Juan Quintela--- hw/max111x.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
hw/max111x.c +1 -1
@@ -15,7 +15,7 @@ typedef struct {uint8_t tb1, rb2, rb3;int cycle; -int input[8 ]; +uint8_t input[8 ];int inputs, com; } MAX111xState;
Signature · 1 line
1.7.4
PATCH 5/13 vmstate: port max111x
In reply to Juan Quintela--- hw/max111x.c | 49 +++++++++++++++++-------------------------------- 1 files changed, 17 insertions(+), 32 deletions(-)
hw/max111x.c +17 -32
@@ -94,36 +94,22 @@ static uint32_t max111x_transfer(SSISlave *dev, uint32_t value)return max111x_read (s); } -static void max111x_save (QEMUFile *f,void *opaque) -{ -MAX111xState *s = (MAX111xState *) opaque; -int i; - -qemu_put_8s (f, &s->tb1); -qemu_put_8s (f, &s->rb2); -qemu_put_8s (f, &s->rb3); -qemu_put_be32 (f, s->inputs); -qemu_put_be32 (f, s->com); -for (i =0 ; i < s->inputs; i ++) -qemu_put_byte (f, s->input[i]); -} - -static int max111x_load (QEMUFile *f,void *opaque,int version_id) -{ -MAX111xState *s = (MAX111xState *) opaque; -int i; - -qemu_get_8s (f, &s->tb1); -qemu_get_8s (f, &s->rb2); -qemu_get_8s (f, &s->rb3); -if (s->inputs !=qemu_get_be32 (f)) -return -EINVAL ; - s->com =qemu_get_be32 (f); -for (i =0 ; i < s->inputs; i ++) - s->input[i] =qemu_get_byte (f); - -return 0 ; -} +static const VMStateDescription vmstate_max111x = { + .name ="max111x" , + .version_id =0 , + .minimum_version_id =0 , + .minimum_version_id_old =0 , + .fields = (VMStateField []) { +VMSTATE_UINT8 (tb1, MAX111xState), +VMSTATE_UINT8 (rb2, MAX111xState), +VMSTATE_UINT8 (rb3, MAX111xState), +VMSTATE_INT32_EQUAL (inputs, MAX111xState), +VMSTATE_INT32 (com, MAX111xState), +VMSTATE_ARRAY_INT32_UNSAFE (input, MAX111xState, inputs, + vmstate_info_uint8, uint8_t), +VMSTATE_END_OF_LIST () + } +};static int max111x_init (SSISlave *dev,int inputs) {
@@ -143,8 +129,7 @@ static int max111x_init(SSISlave *dev, int inputs) s->input[7 ] =0x80 ; s->com =0 ; -register_savevm (&dev->qdev,"max111x" ,-1 ,0 , - max111x_save, max111x_load, s); +vmstate_register (&dev->qdev,-1 , &vmstate_max111x, s);return 0 ; }
Signature · 1 line
1.7.4
PATCH 6/13 nand: pin values are uint8_t
In reply to Juan Quintela--- hw/flash.h | 4 ++-- hw/nand.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-)
hw/flash.h +2 -2
@@ -21,8 +21,8 @@ pflash_t *pflash_cfi02_register(target_phys_addr_t base, ram_addr_t off,typedef struct NANDFlashState NANDFlashState ;NANDFlashState *nand_init (int manf_id,int chip_id);void nand_done (NANDFlashState *s); -void nand_setpins (NANDFlashState *s, -int cle,int ale,int ce,int wp,int gnd); +void nand_setpins (NANDFlashState *s,uint8_t cle,uint8_t ale, +uint8_t ce,uint8_t wp,uint8_t gnd);void nand_getpins (NANDFlashState *s,int *rb);void nand_setio (NANDFlashState *s,uint8_t value);uint8_t nand_getio (NANDFlashState *s);
hw/nand.c +3 -3
@@ -52,7 +52,7 @@ struct NANDFlashState {BlockDriverState *bdrv;int mem_oob; -int cle, ale, ce, wp, gnd; +uint8_t cle, ale, ce, wp, gnd;uint8_t io[MAX_PAGE +MAX_OOB +0x400 ];uint8_t *ioaddr;
@@ -329,8 +329,8 @@ static int nand_load(QEMUFile *f, void *opaque, int version_id)* * CE, WP and R/B are active low. */ -void nand_setpins (NANDFlashState *s, -int cle,int ale,int ce,int wp,int gnd) +void nand_setpins (NANDFlashState *s,uint8_t cle,uint8_t ale, +uint8_t ce,uint8_t wp,uint8_t gnd) { s->cle = cle; s->ale = ale;
Signature · 1 line
1.7.4
PATCH 7/13 vmstate: port nand
In reply to Juan Quintela--- hw/nand.c | 73 ++++++++++++++++++++++++++++++++---------------------------- 1 files changed, 39 insertions(+), 34 deletions(-)
hw/nand.c +39 -34
@@ -66,6 +66,8 @@ struct NANDFlashState {void (*blk_write)(NANDFlashState *s);void (*blk_erase)(NANDFlashState *s);void (*blk_load)(NANDFlashState *s,uint32_t addr,int offset); + +uint32_t ioaddr_vmstate; };# define NAND_NO_AUTOINCR 0x00000001
@@ -281,48 +283,51 @@ static void nand_command(NANDFlashState *s) } } -static void nand_save (QEMUFile *f,void *opaque) +static void nand_pre_save (void *opaque) { -NANDFlashState *s = (NANDFlashState *) opaque; -qemu_put_byte (f, s->cle); -qemu_put_byte (f, s->ale); -qemu_put_byte (f, s->ce); -qemu_put_byte (f, s->wp); -qemu_put_byte (f, s->gnd); -qemu_put_buffer (f, s->io,sizeof (s->io)); -qemu_put_be32 (f, s->ioaddr - s->io); -qemu_put_be32 (f, s->iolen); - -qemu_put_be32s (f, &s->cmd); -qemu_put_be32s (f, &s->addr); -qemu_put_be32 (f, s->addrlen); -qemu_put_be32 (f, s->status); -qemu_put_be32 (f, s->offset); -/* XXX: do we want to save s->storage too? */ +NANDFlashState *s = opaque; + + s->ioaddr_vmstate = s->ioaddr - s->io; } -static int nand_load (QEMUFile *f,void *opaque,int version_id) +static int nand_post_load (void *opaque,int version_id) { -NANDFlashState *s = (NANDFlashState *) opaque; - s->cle =qemu_get_byte (f); - s->ale =qemu_get_byte (f); - s->ce =qemu_get_byte (f); - s->wp =qemu_get_byte (f); - s->gnd =qemu_get_byte (f); -qemu_get_buffer (f, s->io,sizeof (s->io)); - s->ioaddr = s->io +qemu_get_be32 (f); - s->iolen =qemu_get_be32 (f); -if (s->ioaddr >= s->io +sizeof (s->io) || s->ioaddr < s->io) +NANDFlashState *s = opaque; + +if (s->ioaddr_vmstate >sizeof (s->io)) {return -EINVAL ; + } + s->ioaddr = s->io + s->ioaddr_vmstate; -qemu_get_be32s (f, &s->cmd); -qemu_get_be32s (f, &s->addr); - s->addrlen =qemu_get_be32 (f); - s->status =qemu_get_be32 (f); - s->offset =qemu_get_be32 (f);return 0 ; } +static const VMStateDescription vmstate_nand = { + .name ="nand" , + .version_id =0 , + .minimum_version_id =0 , + .minimum_version_id_old =0 , + .pre_save = nand_pre_save, + .post_load = nand_post_load, + .fields = (VMStateField []) { +VMSTATE_UINT8 (cle, NANDFlashState), +VMSTATE_UINT8 (ale, NANDFlashState), +VMSTATE_UINT8 (ce, NANDFlashState), +VMSTATE_UINT8 (wp, NANDFlashState), +VMSTATE_UINT8 (gnd, NANDFlashState), +VMSTATE_BUFFER (io, NANDFlashState), +VMSTATE_UINT32 (ioaddr_vmstate, NANDFlashState), +VMSTATE_INT32 (iolen, NANDFlashState), +VMSTATE_UINT32 (cmd, NANDFlashState), +VMSTATE_UINT32 (addr, NANDFlashState), +VMSTATE_INT32 (addrlen, NANDFlashState), +VMSTATE_INT32 (status, NANDFlashState), +VMSTATE_INT32 (offset, NANDFlashState), +/* XXX: do we want to save s->storage too? */ +VMSTATE_END_OF_LIST () + } +}; +/* * Chip inputs are CLE, ALE, CE, WP, GND and eight I/O pins. Chip * outputs are R/B and eight I/O pins.
@@ -502,7 +507,7 @@ NANDFlashState *nand_init(int manf_id, int chip_id)is used. */ s->ioaddr = s->io; -register_savevm (NULL ,"nand" ,-1 ,0 , nand_save, nand_load, s); +vmstate_register (NULL ,-1 , &vmstate_nand, s);return s; }
Signature · 1 line
1.7.4
PATCH 8/13 mac_nvram: size is a size, no need to be a target dependent type
In reply to Juan Quintela--- hw/mac_nvram.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
hw/mac_nvram.c +1 -1
@@ -38,7 +38,7 @@#endif struct MacIONVRAMState { -target_phys_addr_t size; +uint32_t size;int mem_index;unsigned int it_shift;uint8_t *data;
Signature · 1 line
1.7.4
PATCH 9/13 vmstate: port mac_nvram
In reply to Juan Quintela--- hw/mac_nvram.c | 30 +++++++++++------------------- 1 files changed, 11 insertions(+), 19 deletions(-)
hw/mac_nvram.c +11 -19
@@ -105,24 +105,17 @@ static CPUReadMemoryFunc * const nvram_read[] = { &macio_nvram_readb, }; -static void macio_nvram_save (QEMUFile *f,void *opaque) -{ -MacIONVRAMState *s = (MacIONVRAMState *)opaque; - -qemu_put_buffer (f, s->data, s->size); -} - -static int macio_nvram_load (QEMUFile *f,void *opaque,int version_id) -{ -MacIONVRAMState *s = (MacIONVRAMState *)opaque; - -if (version_id !=1 ) -return -EINVAL ; - -qemu_get_buffer (f, s->data, s->size); +static const VMStateDescription vmstate_macio_nvram = { + .name ="macio_nvram" , + .version_id =1 , + .minimum_version_id =1 , + .minimum_version_id_old =1 , + .fields = (VMStateField []) { +VMSTATE_VBUFFER_UINT32 (data, MacIONVRAMState,0 ,NULL ,0 , size), +VMSTATE_END_OF_LIST () + } +}; -return 0 ; -}static void macio_nvram_reset (void *opaque) {
@@ -141,8 +134,7 @@ MacIONVRAMState *macio_nvram_init (int *mem_index, target_phys_addr_t size, s->mem_index =cpu_register_io_memory (nvram_read, nvram_write, s,DEVICE_NATIVE_ENDIAN ); *mem_index = s->mem_index; -register_savevm (NULL ,"macio_nvram" ,-1 ,1 , macio_nvram_save, - macio_nvram_load, s); +vmstate_register (NULL ,-1 , &vmstate_macio_nvram, s);qemu_register_reset (macio_nvram_reset, s);return s;
Signature · 1 line
1.7.4
PATCH 10/13 piix4: create PIIX4State
In reply to Juan QuintelaIt only contains a PCIDevice by know, but it makes easy to use migration code
--- hw/piix4.c | 29 +++++++++++++++++------------ 1 files changed, 17 insertions(+), 12 deletions(-)
hw/piix4.c +17 -12
@@ -30,10 +30,14 @@PCIDevice *piix4_dev; +typedef struct PIIX4State { +PCIDevice dev; +}PIIX4State ; +static void piix4_reset (void *opaque) { -PCIDevice *d = opaque; -uint8_t *pci_conf = d->config; +PIIX4State *d = opaque; +uint8_t *pci_conf = d->dev.config; pci_conf[0x04 ] =0x07 ;// master, memory and I/O pci_conf[0x05 ] =0x00 ;
@@ -70,31 +74,32 @@ static void piix4_reset(void *opaque)static void piix_save (QEMUFile * f,void *opaque) { -PCIDevice *d = opaque; -pci_device_save (d, f); +PIIX4State *d = opaque; +pci_device_save (&d->dev, f); }static int piix_load (QEMUFile * f,void *opaque,int version_id) { -PCIDevice *d = opaque; +PIIX4State *d = opaque;if (version_id !=2 )return -EINVAL ; -return pci_device_load (d, f); +return pci_device_load (&d->dev, f); } -static int piix4_initfn (PCIDevice *d) +static int piix4_initfn (PCIDevice *dev) { +PIIX4State *d =DO_UPCAST (PIIX4State, dev, dev);uint8_t *pci_conf; -isa_bus_new (&d->qdev); -register_savevm (&d->qdev,"PIIX4" ,0 ,2 , piix_save, piix_load, d); +isa_bus_new (&d->dev.qdev); +register_savevm (&d->dev.qdev,"PIIX4" ,0 ,2 , piix_save, piix_load, d); - pci_conf = d->config; + pci_conf = d->dev.config;pci_config_set_vendor_id (pci_conf,PCI_VENDOR_ID_INTEL );pci_config_set_device_id (pci_conf,PCI_DEVICE_ID_INTEL_82371AB_0 );// 82371AB/EB/MB PIIX4 PCI-to-ISA bridge pci_config_set_class (pci_conf,PCI_CLASS_BRIDGE_ISA ); - piix4_dev = d; + piix4_dev = &d->dev;qemu_register_reset (piix4_reset, d);return 0 ; }
@@ -111,7 +116,7 @@ static PCIDeviceInfo piix4_info[] = { { .qdev.name = "PIIX4", .qdev.desc = "ISA bridge", - .qdev.size = sizeof(PCIDevice), + .qdev.size = sizeof(PIIX4State), .qdev.no_user = 1, .no_hotplug = 1, .init = piix4_initfn,
Signature · 1 line
1.7.4
PATCH 11/13 vmstate: port piix4
In reply to Juan Quintela--- hw/piix4.c | 25 +++++++++++-------------- 1 files changed, 11 insertions(+), 14 deletions(-)
hw/piix4.c +11 -14
@@ -72,19 +72,16 @@ static void piix4_reset(void *opaque) pci_conf[0xae ] =0x00 ; } -static void piix_save (QEMUFile * f,void *opaque) -{ -PIIX4State *d = opaque; -pci_device_save (&d->dev, f); -} - -static int piix_load (QEMUFile * f,void *opaque,int version_id) -{ -PIIX4State *d = opaque; -if (version_id !=2 ) -return -EINVAL ; -return pci_device_load (&d->dev, f); -} +static const VMStateDescription vmstate_piix4 = { + .name ="PIIX4" , + .version_id =2 , + .minimum_version_id =2 , + .minimum_version_id_old =2 , + .fields = (VMStateField []) { +VMSTATE_PCI_DEVICE (dev, PIIX4State), +VMSTATE_END_OF_LIST () + } +};static int piix4_initfn (PCIDevice *dev) {
@@ -92,7 +89,6 @@ static int piix4_initfn(PCIDevice *dev)uint8_t *pci_conf;isa_bus_new (&d->dev.qdev); -register_savevm (&d->dev.qdev,"PIIX4" ,0 ,2 , piix_save, piix_load, d); pci_conf = d->dev.config;pci_config_set_vendor_id (pci_conf,PCI_VENDOR_ID_INTEL );
@@ -117,6 +113,7 @@ static PCIDeviceInfo piix4_info[] = { .qdev.name = "PIIX4", .qdev.desc = "ISA bridge", .qdev.size = sizeof(PIIX4State), + .qdev.vmsd = &vmstate_piix4, .qdev.no_user = 1, .no_hotplug = 1, .init = piix4_initfn,
Signature · 1 line
1.7.4
PATCH 12/13 mac_dbdma: create DBDMAState instead of passing one array around
In reply to Juan Quintela--- hw/mac_dbdma.c | 45 +++++++++++++++++++++++++++------------------ 1 files changed, 27 insertions(+), 18 deletions(-)
hw/mac_dbdma.c +27 -18
@@ -165,6 +165,10 @@ typedef struct DBDMA_channel {int processing; } DBDMA_channel; +typedef struct { +DBDMA_channel channels[DBDMA_CHANNELS ]; +}DBDMAState ; +#ifdef DEBUG_DBDMA static void dump_dbdma_cmd (dbdma_cmd *cmd) {
@@ -617,31 +621,34 @@ static void channel_run(DBDMA_channel *ch) } } -static void DBDMA_run (DBDMA_channel *ch) +static void DBDMA_run (DBDMAState *s) {int channel; -for (channel =0 ; channel <DBDMA_CHANNELS ; channel++, ch++) { -uint32_t status = ch->regs[DBDMA_STATUS ]; -if (!ch->processing && (status &RUN ) && (status &ACTIVE )) -channel_run (ch); +for (channel =0 ; channel <DBDMA_CHANNELS ; channel++) { +DBDMA_channel *ch = &s->channels[channel]; +uint32_t status = ch->regs[DBDMA_STATUS ]; +if (!ch->processing && (status &RUN ) && (status &ACTIVE )) { +channel_run (ch); + } } }static void DBDMA_run_bh (void *opaque) { -DBDMA_channel *ch = opaque; +DBDMAState *s = opaque;DBDMA_DPRINTF ("DBDMA_run_bh\n" ); -DBDMA_run (ch); +DBDMA_run (s); }void DBDMA_register_channel (void *dbdma,int nchan,qemu_irq irq,DBDMA_rw rw,DBDMA_flush flush,void *opaque) { -DBDMA_channel *ch = (DBDMA_channel *)dbdma + nchan; +DBDMAState *s = dbdma; +DBDMA_channel *ch = &s->channels[nchan];DBDMA_DPRINTF ("DBDMA_register_channel 0x%x\n" , nchan);
@@ -700,7 +707,8 @@ static void dbdma_writel (void *opaque, target_phys_addr_t addr, uint32_t value) { int channel = addr >> DBDMA_CHANNEL_SHIFT; -DBDMA_channel *ch = (DBDMA_channel *)opaque + channel; +DBDMAState *s = opaque; +DBDMA_channel *ch = &s->channels[channel];int reg = (addr - (channel <<DBDMA_CHANNEL_SHIFT )) >>2 ;DBDMA_DPRINTF ("writel 0x" TARGET_FMT_plx" <= 0x%08x\n" , addr, value);
@@ -749,7 +757,8 @@ static uint32_t dbdma_readl (void *opaque, target_phys_addr_t addr) {uint32_t value;int channel = addr >>DBDMA_CHANNEL_SHIFT ; -DBDMA_channel *ch = (DBDMA_channel *)opaque + channel; +DBDMAState *s = opaque; +DBDMA_channel *ch = &s->channels[channel];int reg = (addr - (channel <<DBDMA_CHANNEL_SHIFT )) >>2 ; value = ch->regs[reg];
@@ -803,17 +812,17 @@ static CPUReadMemoryFunc * const dbdma_read[] = {static void dbdma_save (QEMUFile *f,void *opaque) { -DBDMA_channel *s = opaque; +DBDMAState *s = opaque;unsigned int i, j;for (i =0 ; i <DBDMA_CHANNELS ; i++)for (j =0 ; j <DBDMA_REGS ; j++) -qemu_put_be32s (f, &s[i].regs[j]); +qemu_put_be32s (f, &s->channels[i].regs[j]); }static int dbdma_load (QEMUFile *f,void *opaque,int version_id) { -DBDMA_channel *s = opaque; +DBDMAState *s = opaque;unsigned int i, j;if (version_id !=2 )
@@ -821,25 +830,25 @@ static int dbdma_load(QEMUFile *f, void *opaque, int version_id)for (i =0 ; i <DBDMA_CHANNELS ; i++)for (j =0 ; j <DBDMA_REGS ; j++) -qemu_get_be32s (f, &s[i].regs[j]); +qemu_get_be32s (f, &s->channels[i].regs[j]);return 0 ; }static void dbdma_reset (void *opaque) { -DBDMA_channel *s = opaque; +DBDMAState *s = opaque;int i;for (i =0 ; i <DBDMA_CHANNELS ; i++) -memset (s[i].regs,0 ,DBDMA_SIZE ); +memset (s->channels[i].regs,0 ,DBDMA_SIZE ); }void *DBDMA_init (int *dbdma_mem_index) { -DBDMA_channel *s; +DBDMAState *s; - s =qemu_mallocz (sizeof (DBDMA_channel) *DBDMA_CHANNELS ); + s =qemu_mallocz (sizeof (DBDMAState)); *dbdma_mem_index =cpu_register_io_memory (dbdma_read, dbdma_write, s,DEVICE_LITTLE_ENDIAN );
Signature · 1 line
1.7.4
PATCH 13/13 vmstate: port mac_dbdma
In reply to Juan Quintela--- hw/mac_dbdma.c | 46 ++++++++++++++++++++++------------------------ 1 files changed, 22 insertions(+), 24 deletions(-)
hw/mac_dbdma.c +22 -24
@@ -810,30 +810,28 @@ static CPUReadMemoryFunc * const dbdma_read[] = { dbdma_readl, }; -static void dbdma_save (QEMUFile *f,void *opaque) -{ -DBDMAState *s = opaque; -unsigned int i, j; - -for (i =0 ; i <DBDMA_CHANNELS ; i++) -for (j =0 ; j <DBDMA_REGS ; j++) -qemu_put_be32s (f, &s->channels[i].regs[j]); -} - -static int dbdma_load (QEMUFile *f,void *opaque,int version_id) -{ -DBDMAState *s = opaque; -unsigned int i, j; - -if (version_id !=2 ) -return -EINVAL ; - -for (i =0 ; i <DBDMA_CHANNELS ; i++) -for (j =0 ; j <DBDMA_REGS ; j++) -qemu_get_be32s (f, &s->channels[i].regs[j]); +static const VMStateDescription vmstate_dbdma_channel = { + .name ="dbdma_channel" , + .version_id =0 , + .minimum_version_id =0 , + .minimum_version_id_old =0 , + .fields = (VMStateField []) { + VMSTATE_UINT32_ARRAY(regs, struct DBDMA_channel, DBDMA_REGS), +VMSTATE_END_OF_LIST () + } +}; -return 0 ; -} +static const VMStateDescription vmstate_dbdma = { + .name ="dbdma" , + .version_id =2 , + .minimum_version_id =2 , + .minimum_version_id_old =2 , + .fields = (VMStateField []) { +VMSTATE_STRUCT_ARRAY (channels, DBDMAState,DBDMA_CHANNELS ,1 , + vmstate_dbdma_channel, DBDMA_channel), +VMSTATE_END_OF_LIST () + } +};static void dbdma_reset (void *opaque) {
@@ -852,7 +850,7 @@ void* DBDMA_init (int *dbdma_mem_index) *dbdma_mem_index =cpu_register_io_memory (dbdma_read, dbdma_write, s,DEVICE_LITTLE_ENDIAN ); -register_savevm (NULL ,"dbdma" ,-1 ,1 , dbdma_save, dbdma_load, s); +vmstate_register (NULL ,-1 , &vmstate_dbdma, s);qemu_register_reset (dbdma_reset, s); dbdma_bh =qemu_bh_new (DBDMA_run_bh, s);
Signature · 1 line
1.7.4