]> git.proxmox.com Git - pve-qemu-kvm.git/blame - debian/patches/ahci-add_migration-support.patch
Two more fixes
[pve-qemu-kvm.git] / debian / patches / ahci-add_migration-support.patch
CommitLineData
e0d0d994
DM
1From: Jason Baron
2Subject: [Qemu-devel] [PATCH] ahci: add migration support
3Date: Thu, 30 Aug 2012 14:00:04 -0400
4
5Add support for ahci migration. This patch builds upon the patches posted
6previously by Andreas Faerber:
7
8http://lists.gnu.org/archive/html/qemu-devel/2012-08/msg01538.html
9
10(I hope I am giving Andreas proper credit for his work.)
11
12I've tested these patches by migrating Windows 7 and Fedora 16 guests on
13both piix with ahci attached and on q35 (which has a built-in ahci controller).
14
15Signed-off-by: Jason Baron <address@hidden>
16---
17 hw/ide/ahci.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
18 hw/ide/ahci.h | 10 +++++++++
19 hw/ide/ich.c | 11 +++++++--
20 3 files changed, 81 insertions(+), 4 deletions(-)
21
2802c577
DM
22Index: new/hw/ide/ahci.c
23===================================================================
24--- new.orig/hw/ide/ahci.c 2012-09-24 07:15:00.000000000 +0200
25+++ new/hw/ide/ahci.c 2012-09-24 07:15:28.000000000 +0200
26@@ -1203,6 +1203,65 @@
e0d0d994
DM
27 }
28 }
29
30+static const VMStateDescription vmstate_ahci_device = {
31+ .name = "ahci port",
32+ .version_id = 1,
33+ .fields = (VMStateField []) {
34+ VMSTATE_IDE_BUS(port, AHCIDevice),
35+ VMSTATE_UINT32(port_state, AHCIDevice),
36+ VMSTATE_UINT32(finished, AHCIDevice),
37+ VMSTATE_UINT32(port_regs.lst_addr, AHCIDevice),
38+ VMSTATE_UINT32(port_regs.lst_addr_hi, AHCIDevice),
39+ VMSTATE_UINT32(port_regs.fis_addr, AHCIDevice),
40+ VMSTATE_UINT32(port_regs.fis_addr_hi, AHCIDevice),
41+ VMSTATE_UINT32(port_regs.irq_stat, AHCIDevice),
42+ VMSTATE_UINT32(port_regs.irq_mask, AHCIDevice),
43+ VMSTATE_UINT32(port_regs.cmd, AHCIDevice),
44+ VMSTATE_UINT32(port_regs.tfdata, AHCIDevice),
45+ VMSTATE_UINT32(port_regs.sig, AHCIDevice),
46+ VMSTATE_UINT32(port_regs.scr_stat, AHCIDevice),
47+ VMSTATE_UINT32(port_regs.scr_ctl, AHCIDevice),
48+ VMSTATE_UINT32(port_regs.scr_err, AHCIDevice),
49+ VMSTATE_UINT32(port_regs.scr_act, AHCIDevice),
50+ VMSTATE_UINT32(port_regs.cmd_issue, AHCIDevice),
51+ VMSTATE_END_OF_LIST()
52+ },
53+};
54+
55+static int ahci_state_post_load(void *opaque, int version_id)
56+{
57+ int i;
58+ AHCIState *s = opaque;
59+
60+ for (i = 0; i < s->ports; i++) {
61+ AHCIPortRegs *pr = &s->dev[i].port_regs;
62+
63+ map_page(&s->dev[i].lst,
64+ ((uint64_t)pr->lst_addr_hi << 32) | pr->lst_addr, 1024);
65+ map_page(&s->dev[i].res_fis,
66+ ((uint64_t)pr->fis_addr_hi << 32) | pr->fis_addr, 256);
67+ }
68+
69+ return 0;
70+}
71+
72+const VMStateDescription vmstate_ahci = {
73+ .name = "ahci",
74+ .version_id = 1,
75+ .post_load = ahci_state_post_load,
76+ .fields = (VMStateField []) {
77+ VMSTATE_STRUCT_VARRAY_POINTER_INT32(dev, AHCIState, ports,
78+ vmstate_ahci_device, AHCIDevice),
79+ VMSTATE_UINT32(control_regs.cap, AHCIState),
80+ VMSTATE_UINT32(control_regs.ghc, AHCIState),
81+ VMSTATE_UINT32(control_regs.irqstatus, AHCIState),
82+ VMSTATE_UINT32(control_regs.impl, AHCIState),
83+ VMSTATE_UINT32(control_regs.version, AHCIState),
84+ VMSTATE_UINT32(idp_index, AHCIState),
85+ VMSTATE_END_OF_LIST()
86+ },
87+};
88+
89 typedef struct SysbusAHCIState {
90 SysBusDevice busdev;
91 AHCIState ahci;
2802c577 92@@ -1211,7 +1270,10 @@
e0d0d994
DM
93
94 static const VMStateDescription vmstate_sysbus_ahci = {
95 .name = "sysbus-ahci",
96- .unmigratable = 1,
97+ .fields = (VMStateField []) {
98+ VMSTATE_AHCI(ahci, AHCIPCIState),
99+ VMSTATE_END_OF_LIST()
100+ },
101 };
102
103 static void sysbus_ahci_reset(DeviceState *dev)
2802c577
DM
104Index: new/hw/ide/ahci.h
105===================================================================
106--- new.orig/hw/ide/ahci.h 2012-09-24 07:15:00.000000000 +0200
107+++ new/hw/ide/ahci.h 2012-09-24 07:15:28.000000000 +0200
108@@ -307,6 +307,16 @@
e0d0d994
DM
109 AHCIState ahci;
110 } AHCIPCIState;
111
112+extern const VMStateDescription vmstate_ahci;
113+
114+#define VMSTATE_AHCI(_field, _state) { \
115+ .name = (stringify(_field)), \
116+ .size = sizeof(AHCIState), \
117+ .vmsd = &vmstate_ahci, \
118+ .flags = VMS_STRUCT, \
119+ .offset = vmstate_offset_value(_state, _field, AHCIState), \
120+}
121+
122 typedef struct NCQFrame {
123 uint8_t fis_type;
124 uint8_t c;
2802c577
DM
125Index: new/hw/ide/ich.c
126===================================================================
127--- new.orig/hw/ide/ich.c 2012-09-24 07:15:00.000000000 +0200
128+++ new/hw/ide/ich.c 2012-09-24 07:15:28.000000000 +0200
e0d0d994
DM
129@@ -79,9 +79,14 @@
130 #define ICH9_IDP_INDEX 0x10
131 #define ICH9_IDP_INDEX_LOG2 0x04
132
133-static const VMStateDescription vmstate_ahci = {
134+static const VMStateDescription vmstate_ich9_ahci = {
135 .name = "ahci",
136- .unmigratable = 1,
137+ .version_id = 1,
138+ .fields = (VMStateField []) {
139+ VMSTATE_PCI_DEVICE(card, AHCIPCIState),
140+ VMSTATE_AHCI(ahci, AHCIPCIState),
141+ VMSTATE_END_OF_LIST()
142+ },
143 };
144
145 static void pci_ich9_reset(DeviceState *dev)
2802c577 146@@ -152,7 +157,7 @@
e0d0d994
DM
147 k->device_id = PCI_DEVICE_ID_INTEL_82801IR;
148 k->revision = 0x02;
149 k->class_id = PCI_CLASS_STORAGE_SATA;
150- dc->vmsd = &vmstate_ahci;
151+ dc->vmsd = &vmstate_ich9_ahci;
152 dc->reset = pci_ich9_reset;
153 }
154