Revision c3d78997 hw/ide.c

b/hw/ide.c
2409 2409
              cmd646_set_irq, d, 1);
2410 2410
}
2411 2411

  
2412
static void pci_ide_save(QEMUFile* f, void *opaque)
2413
{
2414
    PCIIDEState *d = opaque;
2415
    int i;
2416

  
2417
    pci_device_save(&d->dev, f);
2418

  
2419
    for(i = 0; i < 2; i++) {
2420
        BMDMAState *bm = &d->bmdma[i];
2421
        qemu_put_8s(f, &bm->cmd);
2422
        qemu_put_8s(f, &bm->status);
2423
        qemu_put_be32s(f, &bm->addr);
2424
        /* XXX: if a transfer is pending, we do not save it yet */
2425
    }
2426

  
2427
    /* per IDE interface data */
2428
    for(i = 0; i < 2; i++) {
2429
        IDEState *s = &d->ide_if[i * 2];
2430
        uint8_t drive1_selected;
2431
        qemu_put_8s(f, &s->cmd);
2432
        drive1_selected = (s->cur_drive != s);
2433
        qemu_put_8s(f, &drive1_selected);
2434
    }
2435

  
2436
    /* per IDE drive data */
2437
    for(i = 0; i < 4; i++) {
2438
        IDEState *s = &d->ide_if[i];
2439
        qemu_put_be32s(f, &s->mult_sectors);
2440
        qemu_put_be32s(f, &s->identify_set);
2441
        if (s->identify_set) {
2442
            qemu_put_buffer(f, (const uint8_t *)s->identify_data, 512);
2443
        }
2444
        qemu_put_8s(f, &s->feature);
2445
        qemu_put_8s(f, &s->error);
2446
        qemu_put_be32s(f, &s->nsector);
2447
        qemu_put_8s(f, &s->sector);
2448
        qemu_put_8s(f, &s->lcyl);
2449
        qemu_put_8s(f, &s->hcyl);
2450
        qemu_put_8s(f, &s->hob_feature);
2451
        qemu_put_8s(f, &s->hob_nsector);
2452
        qemu_put_8s(f, &s->hob_sector);
2453
        qemu_put_8s(f, &s->hob_lcyl);
2454
        qemu_put_8s(f, &s->hob_hcyl);
2455
        qemu_put_8s(f, &s->select);
2456
        qemu_put_8s(f, &s->status);
2457
        qemu_put_8s(f, &s->lba48);
2458

  
2459
        qemu_put_8s(f, &s->sense_key);
2460
        qemu_put_8s(f, &s->asc);
2461
        /* XXX: if a transfer is pending, we do not save it yet */
2462
    }
2463
}
2464

  
2465
static int pci_ide_load(QEMUFile* f, void *opaque, int version_id)
2466
{
2467
    PCIIDEState *d = opaque;
2468
    int ret, i;
2469

  
2470
    if (version_id != 1)
2471
        return -EINVAL;
2472
    ret = pci_device_load(&d->dev, f);
2473
    if (ret < 0)
2474
        return ret;
2475

  
2476
    for(i = 0; i < 2; i++) {
2477
        BMDMAState *bm = &d->bmdma[i];
2478
        qemu_get_8s(f, &bm->cmd);
2479
        qemu_get_8s(f, &bm->status);
2480
        qemu_get_be32s(f, &bm->addr);
2481
        /* XXX: if a transfer is pending, we do not save it yet */
2482
    }
2483

  
2484
    /* per IDE interface data */
2485
    for(i = 0; i < 2; i++) {
2486
        IDEState *s = &d->ide_if[i * 2];
2487
        uint8_t drive1_selected;
2488
        qemu_get_8s(f, &s->cmd);
2489
        qemu_get_8s(f, &drive1_selected);
2490
        s->cur_drive = &d->ide_if[i * 2 + (drive1_selected != 0)];
2491
    }
2492

  
2493
    /* per IDE drive data */
2494
    for(i = 0; i < 4; i++) {
2495
        IDEState *s = &d->ide_if[i];
2496
        qemu_get_be32s(f, &s->mult_sectors);
2497
        qemu_get_be32s(f, &s->identify_set);
2498
        if (s->identify_set) {
2499
            qemu_get_buffer(f, (uint8_t *)s->identify_data, 512);
2500
        }
2501
        qemu_get_8s(f, &s->feature);
2502
        qemu_get_8s(f, &s->error);
2503
        qemu_get_be32s(f, &s->nsector);
2504
        qemu_get_8s(f, &s->sector);
2505
        qemu_get_8s(f, &s->lcyl);
2506
        qemu_get_8s(f, &s->hcyl);
2507
        qemu_get_8s(f, &s->hob_feature);
2508
        qemu_get_8s(f, &s->hob_nsector);
2509
        qemu_get_8s(f, &s->hob_sector);
2510
        qemu_get_8s(f, &s->hob_lcyl);
2511
        qemu_get_8s(f, &s->hob_hcyl);
2512
        qemu_get_8s(f, &s->select);
2513
        qemu_get_8s(f, &s->status);
2514
        qemu_get_8s(f, &s->lba48);
2515

  
2516
        qemu_get_8s(f, &s->sense_key);
2517
        qemu_get_8s(f, &s->asc);
2518
        /* XXX: if a transfer is pending, we do not save it yet */
2519
    }
2520
    return 0;
2521
}
2522

  
2412 2523
/* hd_table must contain 4 block drivers */
2413 2524
/* NOTE: for the PIIX3, the IRQs and IOports are hardcoded */
2414 2525
void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn)
......
2442 2553
              pic_set_irq_new, isa_pic, 15);
2443 2554
    ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6);
2444 2555
    ide_init_ioport(&d->ide_if[2], 0x170, 0x376);
2556

  
2557
    register_savevm("ide", 0, 1, pci_ide_save, pci_ide_load, d);
2445 2558
}
2446 2559

  
2447 2560
/***********************************************************/

Also available in: Unified diff