Revision aa941b94 hw/ide.c

b/hw/ide.c
2416 2416
    register_ioport_read(iobase, 4, 4, ide_data_readl, ide_state);
2417 2417
}
2418 2418

  
2419
/* save per IDE drive data */
2420
static void ide_save(QEMUFile* f, IDEState *s)
2421
{
2422
    qemu_put_be32s(f, &s->mult_sectors);
2423
    qemu_put_be32s(f, &s->identify_set);
2424
    if (s->identify_set) {
2425
        qemu_put_buffer(f, (const uint8_t *)s->identify_data, 512);
2426
    }
2427
    qemu_put_8s(f, &s->feature);
2428
    qemu_put_8s(f, &s->error);
2429
    qemu_put_be32s(f, &s->nsector);
2430
    qemu_put_8s(f, &s->sector);
2431
    qemu_put_8s(f, &s->lcyl);
2432
    qemu_put_8s(f, &s->hcyl);
2433
    qemu_put_8s(f, &s->hob_feature);
2434
    qemu_put_8s(f, &s->hob_nsector);
2435
    qemu_put_8s(f, &s->hob_sector);
2436
    qemu_put_8s(f, &s->hob_lcyl);
2437
    qemu_put_8s(f, &s->hob_hcyl);
2438
    qemu_put_8s(f, &s->select);
2439
    qemu_put_8s(f, &s->status);
2440
    qemu_put_8s(f, &s->lba48);
2441

  
2442
    qemu_put_8s(f, &s->sense_key);
2443
    qemu_put_8s(f, &s->asc);
2444
    /* XXX: if a transfer is pending, we do not save it yet */
2445
}
2446

  
2447
/* load per IDE drive data */
2448
static void ide_load(QEMUFile* f, IDEState *s)
2449
{
2450
    qemu_get_be32s(f, &s->mult_sectors);
2451
    qemu_get_be32s(f, &s->identify_set);
2452
    if (s->identify_set) {
2453
        qemu_get_buffer(f, (uint8_t *)s->identify_data, 512);
2454
    }
2455
    qemu_get_8s(f, &s->feature);
2456
    qemu_get_8s(f, &s->error);
2457
    qemu_get_be32s(f, &s->nsector);
2458
    qemu_get_8s(f, &s->sector);
2459
    qemu_get_8s(f, &s->lcyl);
2460
    qemu_get_8s(f, &s->hcyl);
2461
    qemu_get_8s(f, &s->hob_feature);
2462
    qemu_get_8s(f, &s->hob_nsector);
2463
    qemu_get_8s(f, &s->hob_sector);
2464
    qemu_get_8s(f, &s->hob_lcyl);
2465
    qemu_get_8s(f, &s->hob_hcyl);
2466
    qemu_get_8s(f, &s->select);
2467
    qemu_get_8s(f, &s->status);
2468
    qemu_get_8s(f, &s->lba48);
2469

  
2470
    qemu_get_8s(f, &s->sense_key);
2471
    qemu_get_8s(f, &s->asc);
2472
    /* XXX: if a transfer is pending, we do not save it yet */
2473
}
2474

  
2419 2475
/***********************************************************/
2420 2476
/* ISA IDE definitions */
2421 2477

  
......
2731 2787

  
2732 2788
    /* per IDE drive data */
2733 2789
    for(i = 0; i < 4; i++) {
2734
        IDEState *s = &d->ide_if[i];
2735
        qemu_put_be32s(f, &s->mult_sectors);
2736
        qemu_put_be32s(f, &s->identify_set);
2737
        if (s->identify_set) {
2738
            qemu_put_buffer(f, (const uint8_t *)s->identify_data, 512);
2739
        }
2740
        qemu_put_8s(f, &s->feature);
2741
        qemu_put_8s(f, &s->error);
2742
        qemu_put_be32s(f, &s->nsector);
2743
        qemu_put_8s(f, &s->sector);
2744
        qemu_put_8s(f, &s->lcyl);
2745
        qemu_put_8s(f, &s->hcyl);
2746
        qemu_put_8s(f, &s->hob_feature);
2747
        qemu_put_8s(f, &s->hob_nsector);
2748
        qemu_put_8s(f, &s->hob_sector);
2749
        qemu_put_8s(f, &s->hob_lcyl);
2750
        qemu_put_8s(f, &s->hob_hcyl);
2751
        qemu_put_8s(f, &s->select);
2752
        qemu_put_8s(f, &s->status);
2753
        qemu_put_8s(f, &s->lba48);
2754

  
2755
        qemu_put_8s(f, &s->sense_key);
2756
        qemu_put_8s(f, &s->asc);
2757
        /* XXX: if a transfer is pending, we do not save it yet */
2790
        ide_save(f, &d->ide_if[i]);
2758 2791
    }
2759 2792
}
2760 2793

  
......
2788 2821

  
2789 2822
    /* per IDE drive data */
2790 2823
    for(i = 0; i < 4; i++) {
2791
        IDEState *s = &d->ide_if[i];
2792
        qemu_get_be32s(f, &s->mult_sectors);
2793
        qemu_get_be32s(f, &s->identify_set);
2794
        if (s->identify_set) {
2795
            qemu_get_buffer(f, (uint8_t *)s->identify_data, 512);
2796
        }
2797
        qemu_get_8s(f, &s->feature);
2798
        qemu_get_8s(f, &s->error);
2799
        qemu_get_be32s(f, &s->nsector);
2800
        qemu_get_8s(f, &s->sector);
2801
        qemu_get_8s(f, &s->lcyl);
2802
        qemu_get_8s(f, &s->hcyl);
2803
        qemu_get_8s(f, &s->hob_feature);
2804
        qemu_get_8s(f, &s->hob_nsector);
2805
        qemu_get_8s(f, &s->hob_sector);
2806
        qemu_get_8s(f, &s->hob_lcyl);
2807
        qemu_get_8s(f, &s->hob_hcyl);
2808
        qemu_get_8s(f, &s->select);
2809
        qemu_get_8s(f, &s->status);
2810
        qemu_get_8s(f, &s->lba48);
2811

  
2812
        qemu_get_8s(f, &s->sense_key);
2813
        qemu_get_8s(f, &s->asc);
2814
        /* XXX: if a transfer is pending, we do not save it yet */
2824
        ide_load(f, &d->ide_if[i]);
2815 2825
    }
2816 2826
    return 0;
2817 2827
}
......
3255 3265
    }
3256 3266
}
3257 3267

  
3268
static void md_save(QEMUFile *f, void *opaque)
3269
{
3270
    struct md_s *s = (struct md_s *) opaque;
3271
    int i;
3272
    uint8_t drive1_selected;
3273

  
3274
    qemu_put_8s(f, &s->opt);
3275
    qemu_put_8s(f, &s->stat);
3276
    qemu_put_8s(f, &s->pins);
3277

  
3278
    qemu_put_8s(f, &s->ctrl);
3279
    qemu_put_be16s(f, &s->io);
3280
    qemu_put_byte(f, s->cycle);
3281

  
3282
    drive1_selected = (s->ide->cur_drive != s->ide);
3283
    qemu_put_8s(f, &s->ide->cmd);
3284
    qemu_put_8s(f, &drive1_selected);
3285

  
3286
    for (i = 0; i < 2; i ++)
3287
        ide_save(f, &s->ide[i]);
3288
}
3289

  
3290
static int md_load(QEMUFile *f, void *opaque, int version_id)
3291
{
3292
    struct md_s *s = (struct md_s *) opaque;
3293
    int i;
3294
    uint8_t drive1_selected;
3295

  
3296
    qemu_get_8s(f, &s->opt);
3297
    qemu_get_8s(f, &s->stat);
3298
    qemu_get_8s(f, &s->pins);
3299

  
3300
    qemu_get_8s(f, &s->ctrl);
3301
    qemu_get_be16s(f, &s->io);
3302
    s->cycle = qemu_get_byte(f);
3303

  
3304
    qemu_get_8s(f, &s->ide->cmd);
3305
    qemu_get_8s(f, &drive1_selected);
3306
    s->ide->cur_drive = &s->ide[(drive1_selected != 0)];
3307

  
3308
    for (i = 0; i < 2; i ++)
3309
        ide_load(f, &s->ide[i]);
3310

  
3311
    return 0;
3312
}
3313

  
3314
static int md_iid = 0;
3315

  
3258 3316
static const uint8_t dscm1xxxx_cis[0x14a] = {
3259 3317
    [0x000] = CISTPL_DEVICE,	/* 5V Device Information */
3260 3318
    [0x002] = 0x03,		/* Tuple length = 4 bytes */
......
3480 3538
    md->ide->is_cf = 1;
3481 3539
    md->ide->mdata_size = METADATA_SIZE;
3482 3540
    md->ide->mdata_storage = (uint8_t *) qemu_mallocz(METADATA_SIZE);
3541

  
3542
    register_savevm("microdrive", md_iid ++, 0, md_save, md_load, md);
3543

  
3483 3544
    return &md->card;
3484 3545
}

Also available in: Unified diff