Revision 7b5045c5 hw/dma.c
b/hw/dma.c | ||
---|---|---|
500 | 500 |
} |
501 | 501 |
} |
502 | 502 |
|
503 |
static void dma_save (QEMUFile *f, void *opaque) |
|
504 |
{ |
|
505 |
struct dma_cont *d = opaque; |
|
506 |
int i; |
|
507 |
|
|
508 |
/* qemu_put_8s (f, &d->status); */ |
|
509 |
qemu_put_8s (f, &d->command); |
|
510 |
qemu_put_8s (f, &d->mask); |
|
511 |
qemu_put_8s (f, &d->flip_flop); |
|
512 |
qemu_put_be32 (f, d->dshift); |
|
513 |
|
|
514 |
for (i = 0; i < 4; ++i) { |
|
515 |
struct dma_regs *r = &d->regs[i]; |
|
516 |
qemu_put_be32 (f, r->now[0]); |
|
517 |
qemu_put_be32 (f, r->now[1]); |
|
518 |
qemu_put_be16s (f, &r->base[0]); |
|
519 |
qemu_put_be16s (f, &r->base[1]); |
|
520 |
qemu_put_8s (f, &r->mode); |
|
521 |
qemu_put_8s (f, &r->page); |
|
522 |
qemu_put_8s (f, &r->pageh); |
|
523 |
qemu_put_8s (f, &r->dack); |
|
524 |
qemu_put_8s (f, &r->eop); |
|
503 |
static const VMStateDescription vmstate_dma_regs = { |
|
504 |
.name = "dma_regs", |
|
505 |
.version_id = 1, |
|
506 |
.minimum_version_id = 1, |
|
507 |
.minimum_version_id_old = 1, |
|
508 |
.fields = (VMStateField []) { |
|
509 |
VMSTATE_INT32_ARRAY(now, struct dma_regs, 2), |
|
510 |
VMSTATE_UINT16_ARRAY(base, struct dma_regs, 2), |
|
511 |
VMSTATE_UINT8(mode, struct dma_regs), |
|
512 |
VMSTATE_UINT8(page, struct dma_regs), |
|
513 |
VMSTATE_UINT8(pageh, struct dma_regs), |
|
514 |
VMSTATE_UINT8(dack, struct dma_regs), |
|
515 |
VMSTATE_UINT8(eop, struct dma_regs), |
|
516 |
VMSTATE_END_OF_LIST() |
|
525 | 517 |
} |
526 |
} |
|
518 |
};
|
|
527 | 519 |
|
528 |
static int dma_load (QEMUFile *f, void *opaque, int version_id)
|
|
520 |
static int dma_post_load(void *opaque)
|
|
529 | 521 |
{ |
530 |
struct dma_cont *d = opaque; |
|
531 |
int i; |
|
532 |
|
|
533 |
if (version_id != 1) |
|
534 |
return -EINVAL; |
|
535 |
|
|
536 |
/* qemu_get_8s (f, &d->status); */ |
|
537 |
qemu_get_8s (f, &d->command); |
|
538 |
qemu_get_8s (f, &d->mask); |
|
539 |
qemu_get_8s (f, &d->flip_flop); |
|
540 |
d->dshift=qemu_get_be32 (f); |
|
541 |
|
|
542 |
for (i = 0; i < 4; ++i) { |
|
543 |
struct dma_regs *r = &d->regs[i]; |
|
544 |
r->now[0]=qemu_get_be32 (f); |
|
545 |
r->now[1]=qemu_get_be32 (f); |
|
546 |
qemu_get_be16s (f, &r->base[0]); |
|
547 |
qemu_get_be16s (f, &r->base[1]); |
|
548 |
qemu_get_8s (f, &r->mode); |
|
549 |
qemu_get_8s (f, &r->page); |
|
550 |
qemu_get_8s (f, &r->pageh); |
|
551 |
qemu_get_8s (f, &r->dack); |
|
552 |
qemu_get_8s (f, &r->eop); |
|
553 |
} |
|
554 |
|
|
555 | 522 |
DMA_run(); |
556 | 523 |
|
557 | 524 |
return 0; |
558 | 525 |
} |
559 | 526 |
|
527 |
static const VMStateDescription vmstate_dma = { |
|
528 |
.name = "dma", |
|
529 |
.version_id = 1, |
|
530 |
.minimum_version_id = 1, |
|
531 |
.minimum_version_id_old = 1, |
|
532 |
.post_load = dma_post_load, |
|
533 |
.fields = (VMStateField []) { |
|
534 |
VMSTATE_UINT8(command, struct dma_cont), |
|
535 |
VMSTATE_UINT8(mask, struct dma_cont), |
|
536 |
VMSTATE_UINT8(flip_flop, struct dma_cont), |
|
537 |
VMSTATE_INT32(dshift, struct dma_cont), |
|
538 |
VMSTATE_STRUCT_ARRAY(regs, struct dma_cont, 4, 1, vmstate_dma_regs, struct dma_regs), |
|
539 |
VMSTATE_END_OF_LIST() |
|
540 |
} |
|
541 |
}; |
|
542 |
|
|
560 | 543 |
void DMA_init (int high_page_enable) |
561 | 544 |
{ |
562 | 545 |
dma_init2(&dma_controllers[0], 0x00, 0, 0x80, |
563 | 546 |
high_page_enable ? 0x480 : -1); |
564 | 547 |
dma_init2(&dma_controllers[1], 0xc0, 1, 0x88, |
565 | 548 |
high_page_enable ? 0x488 : -1); |
566 |
register_savevm ("dma", 0, 1, dma_save, dma_load, &dma_controllers[0]);
|
|
567 |
register_savevm ("dma", 1, 1, dma_save, dma_load, &dma_controllers[1]);
|
|
549 |
vmstate_register (0, &vmstate_dma, &dma_controllers[0]);
|
|
550 |
vmstate_register (1, &vmstate_dma, &dma_controllers[1]);
|
|
568 | 551 |
|
569 | 552 |
dma_bh = qemu_bh_new(DMA_run_bh, NULL); |
570 | 553 |
} |
Also available in: Unified diff