2 * S390x machine definitions and functions
4 * Copyright IBM Corp. 2014
7 * Thomas Huth <thuth@linux.vnet.ibm.com>
8 * Christian Borntraeger <borntraeger@de.ibm.com>
9 * Jason J. Herne <jjherne@us.ibm.com>
11 * This work is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published
13 * by the Free Software Foundation; either version 2 of the License,
14 * or (at your option) any later version.
17 #include "qemu/osdep.h"
20 #include "sysemu/kvm.h"
22 static int cpu_post_load(void *opaque
, int version_id
)
24 S390CPU
*cpu
= opaque
;
27 * As the cpu state is pushed to kvm via kvm_set_mp_state rather
28 * than via cpu_synchronize_state, we need update kvm here.
31 kvm_s390_set_cpu_state(cpu
, cpu
->env
.cpu_state
);
32 return kvm_s390_vcpu_interrupt_post_load(cpu
);
37 static void cpu_pre_save(void *opaque
)
39 S390CPU
*cpu
= opaque
;
42 kvm_s390_vcpu_interrupt_pre_save(cpu
);
46 static inline bool fpu_needed(void *opaque
)
48 /* This looks odd, but we might want to NOT transfer fprs in the future */
52 static const VMStateDescription vmstate_fpu
= {
55 .minimum_version_id
= 1,
57 .fields
= (VMStateField
[]) {
58 VMSTATE_UINT64(env
.vregs
[0][0].ll
, S390CPU
),
59 VMSTATE_UINT64(env
.vregs
[1][0].ll
, S390CPU
),
60 VMSTATE_UINT64(env
.vregs
[2][0].ll
, S390CPU
),
61 VMSTATE_UINT64(env
.vregs
[3][0].ll
, S390CPU
),
62 VMSTATE_UINT64(env
.vregs
[4][0].ll
, S390CPU
),
63 VMSTATE_UINT64(env
.vregs
[5][0].ll
, S390CPU
),
64 VMSTATE_UINT64(env
.vregs
[6][0].ll
, S390CPU
),
65 VMSTATE_UINT64(env
.vregs
[7][0].ll
, S390CPU
),
66 VMSTATE_UINT64(env
.vregs
[8][0].ll
, S390CPU
),
67 VMSTATE_UINT64(env
.vregs
[9][0].ll
, S390CPU
),
68 VMSTATE_UINT64(env
.vregs
[10][0].ll
, S390CPU
),
69 VMSTATE_UINT64(env
.vregs
[11][0].ll
, S390CPU
),
70 VMSTATE_UINT64(env
.vregs
[12][0].ll
, S390CPU
),
71 VMSTATE_UINT64(env
.vregs
[13][0].ll
, S390CPU
),
72 VMSTATE_UINT64(env
.vregs
[14][0].ll
, S390CPU
),
73 VMSTATE_UINT64(env
.vregs
[15][0].ll
, S390CPU
),
74 VMSTATE_UINT32(env
.fpc
, S390CPU
),
79 static bool vregs_needed(void *opaque
)
81 return s390_has_feat(S390_FEAT_VECTOR
);
84 static const VMStateDescription vmstate_vregs
= {
87 .minimum_version_id
= 1,
88 .needed
= vregs_needed
,
89 .fields
= (VMStateField
[]) {
90 /* vregs[0][0] -> vregs[15][0] and fregs are overlays */
91 VMSTATE_UINT64(env
.vregs
[16][0].ll
, S390CPU
),
92 VMSTATE_UINT64(env
.vregs
[17][0].ll
, S390CPU
),
93 VMSTATE_UINT64(env
.vregs
[18][0].ll
, S390CPU
),
94 VMSTATE_UINT64(env
.vregs
[19][0].ll
, S390CPU
),
95 VMSTATE_UINT64(env
.vregs
[20][0].ll
, S390CPU
),
96 VMSTATE_UINT64(env
.vregs
[21][0].ll
, S390CPU
),
97 VMSTATE_UINT64(env
.vregs
[22][0].ll
, S390CPU
),
98 VMSTATE_UINT64(env
.vregs
[23][0].ll
, S390CPU
),
99 VMSTATE_UINT64(env
.vregs
[24][0].ll
, S390CPU
),
100 VMSTATE_UINT64(env
.vregs
[25][0].ll
, S390CPU
),
101 VMSTATE_UINT64(env
.vregs
[26][0].ll
, S390CPU
),
102 VMSTATE_UINT64(env
.vregs
[27][0].ll
, S390CPU
),
103 VMSTATE_UINT64(env
.vregs
[28][0].ll
, S390CPU
),
104 VMSTATE_UINT64(env
.vregs
[29][0].ll
, S390CPU
),
105 VMSTATE_UINT64(env
.vregs
[30][0].ll
, S390CPU
),
106 VMSTATE_UINT64(env
.vregs
[31][0].ll
, S390CPU
),
107 VMSTATE_UINT64(env
.vregs
[0][1].ll
, S390CPU
),
108 VMSTATE_UINT64(env
.vregs
[1][1].ll
, S390CPU
),
109 VMSTATE_UINT64(env
.vregs
[2][1].ll
, S390CPU
),
110 VMSTATE_UINT64(env
.vregs
[3][1].ll
, S390CPU
),
111 VMSTATE_UINT64(env
.vregs
[4][1].ll
, S390CPU
),
112 VMSTATE_UINT64(env
.vregs
[5][1].ll
, S390CPU
),
113 VMSTATE_UINT64(env
.vregs
[6][1].ll
, S390CPU
),
114 VMSTATE_UINT64(env
.vregs
[7][1].ll
, S390CPU
),
115 VMSTATE_UINT64(env
.vregs
[8][1].ll
, S390CPU
),
116 VMSTATE_UINT64(env
.vregs
[9][1].ll
, S390CPU
),
117 VMSTATE_UINT64(env
.vregs
[10][1].ll
, S390CPU
),
118 VMSTATE_UINT64(env
.vregs
[11][1].ll
, S390CPU
),
119 VMSTATE_UINT64(env
.vregs
[12][1].ll
, S390CPU
),
120 VMSTATE_UINT64(env
.vregs
[13][1].ll
, S390CPU
),
121 VMSTATE_UINT64(env
.vregs
[14][1].ll
, S390CPU
),
122 VMSTATE_UINT64(env
.vregs
[15][1].ll
, S390CPU
),
123 VMSTATE_UINT64(env
.vregs
[16][1].ll
, S390CPU
),
124 VMSTATE_UINT64(env
.vregs
[17][1].ll
, S390CPU
),
125 VMSTATE_UINT64(env
.vregs
[18][1].ll
, S390CPU
),
126 VMSTATE_UINT64(env
.vregs
[19][1].ll
, S390CPU
),
127 VMSTATE_UINT64(env
.vregs
[20][1].ll
, S390CPU
),
128 VMSTATE_UINT64(env
.vregs
[21][1].ll
, S390CPU
),
129 VMSTATE_UINT64(env
.vregs
[22][1].ll
, S390CPU
),
130 VMSTATE_UINT64(env
.vregs
[23][1].ll
, S390CPU
),
131 VMSTATE_UINT64(env
.vregs
[24][1].ll
, S390CPU
),
132 VMSTATE_UINT64(env
.vregs
[25][1].ll
, S390CPU
),
133 VMSTATE_UINT64(env
.vregs
[26][1].ll
, S390CPU
),
134 VMSTATE_UINT64(env
.vregs
[27][1].ll
, S390CPU
),
135 VMSTATE_UINT64(env
.vregs
[28][1].ll
, S390CPU
),
136 VMSTATE_UINT64(env
.vregs
[29][1].ll
, S390CPU
),
137 VMSTATE_UINT64(env
.vregs
[30][1].ll
, S390CPU
),
138 VMSTATE_UINT64(env
.vregs
[31][1].ll
, S390CPU
),
139 VMSTATE_END_OF_LIST()
143 static bool riccb_needed(void *opaque
)
145 return s390_has_feat(S390_FEAT_RUNTIME_INSTRUMENTATION
);
148 const VMStateDescription vmstate_riccb
= {
151 .minimum_version_id
= 1,
152 .needed
= riccb_needed
,
153 .fields
= (VMStateField
[]) {
154 VMSTATE_UINT8_ARRAY(env
.riccb
, S390CPU
, 64),
155 VMSTATE_END_OF_LIST()
159 const VMStateDescription vmstate_s390_cpu
= {
161 .post_load
= cpu_post_load
,
162 .pre_save
= cpu_pre_save
,
164 .minimum_version_id
= 3,
165 .fields
= (VMStateField
[]) {
166 VMSTATE_UINT64_ARRAY(env
.regs
, S390CPU
, 16),
167 VMSTATE_UINT64(env
.psw
.mask
, S390CPU
),
168 VMSTATE_UINT64(env
.psw
.addr
, S390CPU
),
169 VMSTATE_UINT64(env
.psa
, S390CPU
),
170 VMSTATE_UINT32(env
.todpr
, S390CPU
),
171 VMSTATE_UINT64(env
.pfault_token
, S390CPU
),
172 VMSTATE_UINT64(env
.pfault_compare
, S390CPU
),
173 VMSTATE_UINT64(env
.pfault_select
, S390CPU
),
174 VMSTATE_UINT64(env
.cputm
, S390CPU
),
175 VMSTATE_UINT64(env
.ckc
, S390CPU
),
176 VMSTATE_UINT64(env
.gbea
, S390CPU
),
177 VMSTATE_UINT64(env
.pp
, S390CPU
),
178 VMSTATE_UINT32_ARRAY(env
.aregs
, S390CPU
, 16),
179 VMSTATE_UINT64_ARRAY(env
.cregs
, S390CPU
, 16),
180 VMSTATE_UINT8(env
.cpu_state
, S390CPU
),
181 VMSTATE_UINT8(env
.sigp_order
, S390CPU
),
182 VMSTATE_UINT32_V(irqstate_saved_size
, S390CPU
, 4),
183 VMSTATE_VBUFFER_UINT32(irqstate
, S390CPU
, 4, NULL
, 0,
184 irqstate_saved_size
),
185 VMSTATE_END_OF_LIST()
187 .subsections
= (const VMStateDescription
*[]) {