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