Revision a90ffa49

b/hw/ac97.c
1167 1167
    transfer_audio (opaque, PO_INDEX, free);
1168 1168
}
1169 1169

  
1170
static void ac97_save (QEMUFile *f, void *opaque)
1171
{
1172
    size_t i;
1173
    AC97LinkState *s = opaque;
1174

  
1175
    pci_device_save (&s->dev, f);
1176

  
1177
    qemu_put_be32s (f, &s->glob_cnt);
1178
    qemu_put_be32s (f, &s->glob_sta);
1179
    qemu_put_be32s (f, &s->cas);
1180

  
1181
    for (i = 0; i < ARRAY_SIZE (s->bm_regs); ++i) {
1182
        AC97BusMasterRegs *r = &s->bm_regs[i];
1183
        qemu_put_be32s (f, &r->bdbar);
1184
        qemu_put_8s (f, &r->civ);
1185
        qemu_put_8s (f, &r->lvi);
1186
        qemu_put_be16s (f, &r->sr);
1187
        qemu_put_be16s (f, &r->picb);
1188
        qemu_put_8s (f, &r->piv);
1189
        qemu_put_8s (f, &r->cr);
1190
        qemu_put_be32s (f, &r->bd_valid);
1191
        qemu_put_be32s (f, &r->bd.addr);
1192
        qemu_put_be32s (f, &r->bd.ctl_len);
1170
static const VMStateDescription vmstate_ac97_bm_regs = {
1171
    .name = "ac97_bm_regs",
1172
    .version_id = 1,
1173
    .minimum_version_id = 1,
1174
    .minimum_version_id_old = 1,
1175
    .fields      = (VMStateField []) {
1176
        VMSTATE_UINT32(bdbar, AC97BusMasterRegs),
1177
        VMSTATE_UINT8(civ, AC97BusMasterRegs),
1178
        VMSTATE_UINT8(lvi, AC97BusMasterRegs),
1179
        VMSTATE_UINT16(sr, AC97BusMasterRegs),
1180
        VMSTATE_UINT16(picb, AC97BusMasterRegs),
1181
        VMSTATE_UINT8(piv, AC97BusMasterRegs),
1182
        VMSTATE_UINT8(cr, AC97BusMasterRegs),
1183
        VMSTATE_UINT32(bd_valid, AC97BusMasterRegs),
1184
        VMSTATE_UINT32(bd.addr, AC97BusMasterRegs),
1185
        VMSTATE_UINT32(bd.ctl_len, AC97BusMasterRegs),
1186
        VMSTATE_END_OF_LIST()
1193 1187
    }
1194
    qemu_put_buffer (f, s->mixer_data, sizeof (s->mixer_data));
1195
}
1188
};
1196 1189

  
1197
static int ac97_load (QEMUFile *f, void *opaque, int version_id)
1190
static int ac97_post_load (void *opaque, int version_id)
1198 1191
{
1199
    int ret;
1200
    size_t i;
1201 1192
    uint8_t active[LAST_INDEX];
1202 1193
    AC97LinkState *s = opaque;
1203 1194

  
1204
    if (version_id < 2 || version_id > 3)
1205
        return -EINVAL;
1206

  
1207
    ret = pci_device_load (&s->dev, f);
1208
    if (ret)
1209
        return ret;
1210

  
1211
    qemu_get_be32s (f, &s->glob_cnt);
1212
    qemu_get_be32s (f, &s->glob_sta);
1213
    qemu_get_be32s (f, &s->cas);
1214

  
1215
    for (i = 0; i < ARRAY_SIZE (s->bm_regs); ++i) {
1216
        AC97BusMasterRegs *r = &s->bm_regs[i];
1217
        qemu_get_be32s (f, &r->bdbar);
1218
        qemu_get_8s (f, &r->civ);
1219
        qemu_get_8s (f, &r->lvi);
1220
        qemu_get_be16s (f, &r->sr);
1221
        qemu_get_be16s (f, &r->picb);
1222
        qemu_get_8s (f, &r->piv);
1223
        qemu_get_8s (f, &r->cr);
1224
        qemu_get_be32s (f, &r->bd_valid);
1225
        qemu_get_be32s (f, &r->bd.addr);
1226
        qemu_get_be32s (f, &r->bd.ctl_len);
1227
    }
1228
    qemu_get_buffer (f, s->mixer_data, sizeof (s->mixer_data));
1229
    if (version_id < 3)
1230
        qemu_get_buffer (f, active, sizeof (active));
1231

  
1232 1195
#ifdef USE_MIXER
1233 1196
    record_select (s, mixer_load (s, AC97_Record_Select));
1234 1197
#define V_(a, b) set_volume (s, a, b, mixer_load (s, a))
......
1247 1210
    return 0;
1248 1211
}
1249 1212

  
1213
static bool is_version_2 (void *opaque, int version_id)
1214
{
1215
    return version_id == 2;
1216
}
1217

  
1218
static const VMStateDescription vmstate_ac97 = {
1219
    .name = "ac97",
1220
    .version_id = 3,
1221
    .minimum_version_id = 2,
1222
    .minimum_version_id_old = 2,
1223
    .post_load = ac97_post_load,
1224
    .fields      = (VMStateField []) {
1225
        VMSTATE_PCI_DEVICE(dev, AC97LinkState),
1226
        VMSTATE_UINT32(glob_cnt, AC97LinkState),
1227
        VMSTATE_UINT32(glob_sta, AC97LinkState),
1228
        VMSTATE_UINT32(cas, AC97LinkState),
1229
        VMSTATE_STRUCT_ARRAY(bm_regs, AC97LinkState, 3, 1,
1230
                             vmstate_ac97_bm_regs, AC97BusMasterRegs),
1231
        VMSTATE_BUFFER(mixer_data, AC97LinkState),
1232
        VMSTATE_UNUSED_TEST(is_version_2, 3),
1233
        VMSTATE_END_OF_LIST()
1234
    }
1235
};
1236

  
1250 1237
static void ac97_map (PCIDevice *pci_dev, int region_num,
1251 1238
                      pcibus_t addr, pcibus_t size, int type)
1252 1239
{
......
1332 1319
    pci_register_bar (&s->dev, 0, 256 * 4, PCI_BASE_ADDRESS_SPACE_IO,
1333 1320
                      ac97_map);
1334 1321
    pci_register_bar (&s->dev, 1, 64 * 4, PCI_BASE_ADDRESS_SPACE_IO, ac97_map);
1335
    register_savevm ("ac97", 0, 3, ac97_save, ac97_load, s);
1322
    vmstate_register (0, &vmstate_ac97, s);
1336 1323
    qemu_register_reset (ac97_on_reset, s);
1337 1324
    AUD_register_card ("ac97", &s->card);
1338 1325
    ac97_on_reset (s);

Also available in: Unified diff