Statistics
| Branch: | Revision:

root / target-i386 / machine.c @ c34d440a

History | View | Annotate | Download (14.7 kB)

1 8dd3dca3 aurel32
#include "hw/hw.h"
2 8dd3dca3 aurel32
#include "hw/boards.h"
3 8dd3dca3 aurel32
#include "hw/pc.h"
4 8dd3dca3 aurel32
#include "hw/isa.h"
5 8dd3dca3 aurel32
6 8dd3dca3 aurel32
#include "exec-all.h"
7 b0a46a33 Jan Kiszka
#include "kvm.h"
8 8dd3dca3 aurel32
9 66e6d55b Juan Quintela
static const VMStateDescription vmstate_segment = {
10 66e6d55b Juan Quintela
    .name = "segment",
11 66e6d55b Juan Quintela
    .version_id = 1,
12 66e6d55b Juan Quintela
    .minimum_version_id = 1,
13 66e6d55b Juan Quintela
    .minimum_version_id_old = 1,
14 66e6d55b Juan Quintela
    .fields      = (VMStateField []) {
15 66e6d55b Juan Quintela
        VMSTATE_UINT32(selector, SegmentCache),
16 66e6d55b Juan Quintela
        VMSTATE_UINTTL(base, SegmentCache),
17 66e6d55b Juan Quintela
        VMSTATE_UINT32(limit, SegmentCache),
18 66e6d55b Juan Quintela
        VMSTATE_UINT32(flags, SegmentCache),
19 66e6d55b Juan Quintela
        VMSTATE_END_OF_LIST()
20 66e6d55b Juan Quintela
    }
21 66e6d55b Juan Quintela
};
22 66e6d55b Juan Quintela
23 0cb892aa Juan Quintela
#define VMSTATE_SEGMENT(_field, _state) {                            \
24 0cb892aa Juan Quintela
    .name       = (stringify(_field)),                               \
25 0cb892aa Juan Quintela
    .size       = sizeof(SegmentCache),                              \
26 0cb892aa Juan Quintela
    .vmsd       = &vmstate_segment,                                  \
27 0cb892aa Juan Quintela
    .flags      = VMS_STRUCT,                                        \
28 0cb892aa Juan Quintela
    .offset     = offsetof(_state, _field)                           \
29 0cb892aa Juan Quintela
            + type_check(SegmentCache,typeof_field(_state, _field))  \
30 8dd3dca3 aurel32
}
31 8dd3dca3 aurel32
32 0cb892aa Juan Quintela
#define VMSTATE_SEGMENT_ARRAY(_field, _state, _n)                    \
33 0cb892aa Juan Quintela
    VMSTATE_STRUCT_ARRAY(_field, _state, _n, 0, vmstate_segment, SegmentCache)
34 8dd3dca3 aurel32
35 fc3b0aa2 Juan Quintela
static const VMStateDescription vmstate_xmm_reg = {
36 fc3b0aa2 Juan Quintela
    .name = "xmm_reg",
37 fc3b0aa2 Juan Quintela
    .version_id = 1,
38 fc3b0aa2 Juan Quintela
    .minimum_version_id = 1,
39 fc3b0aa2 Juan Quintela
    .minimum_version_id_old = 1,
40 fc3b0aa2 Juan Quintela
    .fields      = (VMStateField []) {
41 fc3b0aa2 Juan Quintela
        VMSTATE_UINT64(XMM_Q(0), XMMReg),
42 fc3b0aa2 Juan Quintela
        VMSTATE_UINT64(XMM_Q(1), XMMReg),
43 fc3b0aa2 Juan Quintela
        VMSTATE_END_OF_LIST()
44 fc3b0aa2 Juan Quintela
    }
45 fc3b0aa2 Juan Quintela
};
46 fc3b0aa2 Juan Quintela
47 0cb892aa Juan Quintela
#define VMSTATE_XMM_REGS(_field, _state, _n)                         \
48 0cb892aa Juan Quintela
    VMSTATE_STRUCT_ARRAY(_field, _state, _n, 0, vmstate_xmm_reg, XMMReg)
49 fc3b0aa2 Juan Quintela
50 f1665b21 Sheng Yang
/* YMMH format is the same as XMM */
51 f1665b21 Sheng Yang
static const VMStateDescription vmstate_ymmh_reg = {
52 f1665b21 Sheng Yang
    .name = "ymmh_reg",
53 f1665b21 Sheng Yang
    .version_id = 1,
54 f1665b21 Sheng Yang
    .minimum_version_id = 1,
55 f1665b21 Sheng Yang
    .minimum_version_id_old = 1,
56 f1665b21 Sheng Yang
    .fields      = (VMStateField []) {
57 f1665b21 Sheng Yang
        VMSTATE_UINT64(XMM_Q(0), XMMReg),
58 f1665b21 Sheng Yang
        VMSTATE_UINT64(XMM_Q(1), XMMReg),
59 f1665b21 Sheng Yang
        VMSTATE_END_OF_LIST()
60 f1665b21 Sheng Yang
    }
61 f1665b21 Sheng Yang
};
62 f1665b21 Sheng Yang
63 f1665b21 Sheng Yang
#define VMSTATE_YMMH_REGS_VARS(_field, _state, _n, _v)                         \
64 f1665b21 Sheng Yang
    VMSTATE_STRUCT_ARRAY(_field, _state, _n, _v, vmstate_ymmh_reg, XMMReg)
65 f1665b21 Sheng Yang
66 216c07c3 Juan Quintela
static const VMStateDescription vmstate_mtrr_var = {
67 216c07c3 Juan Quintela
    .name = "mtrr_var",
68 216c07c3 Juan Quintela
    .version_id = 1,
69 216c07c3 Juan Quintela
    .minimum_version_id = 1,
70 216c07c3 Juan Quintela
    .minimum_version_id_old = 1,
71 216c07c3 Juan Quintela
    .fields      = (VMStateField []) {
72 216c07c3 Juan Quintela
        VMSTATE_UINT64(base, MTRRVar),
73 216c07c3 Juan Quintela
        VMSTATE_UINT64(mask, MTRRVar),
74 216c07c3 Juan Quintela
        VMSTATE_END_OF_LIST()
75 216c07c3 Juan Quintela
    }
76 216c07c3 Juan Quintela
};
77 216c07c3 Juan Quintela
78 0cb892aa Juan Quintela
#define VMSTATE_MTRR_VARS(_field, _state, _n, _v)                    \
79 0cb892aa Juan Quintela
    VMSTATE_STRUCT_ARRAY(_field, _state, _n, _v, vmstate_mtrr_var, MTRRVar)
80 216c07c3 Juan Quintela
81 0cb892aa Juan Quintela
static void put_fpreg_error(QEMUFile *f, void *opaque, size_t size)
82 216c07c3 Juan Quintela
{
83 0cb892aa Juan Quintela
    fprintf(stderr, "call put_fpreg() with invalid arguments\n");
84 0cb892aa Juan Quintela
    exit(0);
85 216c07c3 Juan Quintela
}
86 216c07c3 Juan Quintela
87 3c8ce630 Juan Quintela
#ifdef USE_X86LDOUBLE
88 3c8ce630 Juan Quintela
/* XXX: add that in a FPU generic layer */
89 3c8ce630 Juan Quintela
union x86_longdouble {
90 3c8ce630 Juan Quintela
    uint64_t mant;
91 3c8ce630 Juan Quintela
    uint16_t exp;
92 3c8ce630 Juan Quintela
};
93 3c8ce630 Juan Quintela
94 3c8ce630 Juan Quintela
#define MANTD1(fp)        (fp & ((1LL << 52) - 1))
95 3c8ce630 Juan Quintela
#define EXPBIAS1 1023
96 3c8ce630 Juan Quintela
#define EXPD1(fp)        ((fp >> 52) & 0x7FF)
97 3c8ce630 Juan Quintela
#define SIGND1(fp)        ((fp >> 32) & 0x80000000)
98 3c8ce630 Juan Quintela
99 3c8ce630 Juan Quintela
static void fp64_to_fp80(union x86_longdouble *p, uint64_t temp)
100 3c8ce630 Juan Quintela
{
101 3c8ce630 Juan Quintela
    int e;
102 3c8ce630 Juan Quintela
    /* mantissa */
103 3c8ce630 Juan Quintela
    p->mant = (MANTD1(temp) << 11) | (1LL << 63);
104 3c8ce630 Juan Quintela
    /* exponent + sign */
105 3c8ce630 Juan Quintela
    e = EXPD1(temp) - EXPBIAS1 + 16383;
106 3c8ce630 Juan Quintela
    e |= SIGND1(temp) >> 16;
107 3c8ce630 Juan Quintela
    p->exp = e;
108 3c8ce630 Juan Quintela
}
109 3c8ce630 Juan Quintela
110 3c8ce630 Juan Quintela
static int get_fpreg(QEMUFile *f, void *opaque, size_t size)
111 3c8ce630 Juan Quintela
{
112 3c8ce630 Juan Quintela
    FPReg *fp_reg = opaque;
113 3c8ce630 Juan Quintela
    uint64_t mant;
114 3c8ce630 Juan Quintela
    uint16_t exp;
115 3c8ce630 Juan Quintela
116 3c8ce630 Juan Quintela
    qemu_get_be64s(f, &mant);
117 3c8ce630 Juan Quintela
    qemu_get_be16s(f, &exp);
118 3c8ce630 Juan Quintela
    fp_reg->d = cpu_set_fp80(mant, exp);
119 3c8ce630 Juan Quintela
    return 0;
120 3c8ce630 Juan Quintela
}
121 3c8ce630 Juan Quintela
122 3c8ce630 Juan Quintela
static void put_fpreg(QEMUFile *f, void *opaque, size_t size)
123 3c8ce630 Juan Quintela
{
124 3c8ce630 Juan Quintela
    FPReg *fp_reg = opaque;
125 3c8ce630 Juan Quintela
    uint64_t mant;
126 3c8ce630 Juan Quintela
    uint16_t exp;
127 3c8ce630 Juan Quintela
    /* we save the real CPU data (in case of MMX usage only 'mant'
128 3c8ce630 Juan Quintela
       contains the MMX register */
129 3c8ce630 Juan Quintela
    cpu_get_fp80(&mant, &exp, fp_reg->d);
130 3c8ce630 Juan Quintela
    qemu_put_be64s(f, &mant);
131 3c8ce630 Juan Quintela
    qemu_put_be16s(f, &exp);
132 3c8ce630 Juan Quintela
}
133 3c8ce630 Juan Quintela
134 976b2037 Blue Swirl
static const VMStateInfo vmstate_fpreg = {
135 0cb892aa Juan Quintela
    .name = "fpreg",
136 0cb892aa Juan Quintela
    .get  = get_fpreg,
137 0cb892aa Juan Quintela
    .put  = put_fpreg,
138 0cb892aa Juan Quintela
};
139 0cb892aa Juan Quintela
140 3c8ce630 Juan Quintela
static int get_fpreg_1_mmx(QEMUFile *f, void *opaque, size_t size)
141 3c8ce630 Juan Quintela
{
142 3c8ce630 Juan Quintela
    union x86_longdouble *p = opaque;
143 3c8ce630 Juan Quintela
    uint64_t mant;
144 3c8ce630 Juan Quintela
145 3c8ce630 Juan Quintela
    qemu_get_be64s(f, &mant);
146 3c8ce630 Juan Quintela
    p->mant = mant;
147 3c8ce630 Juan Quintela
    p->exp = 0xffff;
148 3c8ce630 Juan Quintela
    return 0;
149 3c8ce630 Juan Quintela
}
150 3c8ce630 Juan Quintela
151 976b2037 Blue Swirl
static const VMStateInfo vmstate_fpreg_1_mmx = {
152 0cb892aa Juan Quintela
    .name = "fpreg_1_mmx",
153 0cb892aa Juan Quintela
    .get  = get_fpreg_1_mmx,
154 0cb892aa Juan Quintela
    .put  = put_fpreg_error,
155 0cb892aa Juan Quintela
};
156 0cb892aa Juan Quintela
157 3c8ce630 Juan Quintela
static int get_fpreg_1_no_mmx(QEMUFile *f, void *opaque, size_t size)
158 3c8ce630 Juan Quintela
{
159 3c8ce630 Juan Quintela
    union x86_longdouble *p = opaque;
160 3c8ce630 Juan Quintela
    uint64_t mant;
161 3c8ce630 Juan Quintela
162 3c8ce630 Juan Quintela
    qemu_get_be64s(f, &mant);
163 3c8ce630 Juan Quintela
    fp64_to_fp80(p, mant);
164 3c8ce630 Juan Quintela
    return 0;
165 3c8ce630 Juan Quintela
}
166 3c8ce630 Juan Quintela
167 976b2037 Blue Swirl
static const VMStateInfo vmstate_fpreg_1_no_mmx = {
168 0cb892aa Juan Quintela
    .name = "fpreg_1_no_mmx",
169 0cb892aa Juan Quintela
    .get  = get_fpreg_1_no_mmx,
170 0cb892aa Juan Quintela
    .put  = put_fpreg_error,
171 0cb892aa Juan Quintela
};
172 0cb892aa Juan Quintela
173 0cb892aa Juan Quintela
static bool fpregs_is_0(void *opaque, int version_id)
174 0cb892aa Juan Quintela
{
175 0cb892aa Juan Quintela
    CPUState *env = opaque;
176 0cb892aa Juan Quintela
177 0cb892aa Juan Quintela
    return (env->fpregs_format_vmstate == 0);
178 0cb892aa Juan Quintela
}
179 0cb892aa Juan Quintela
180 0cb892aa Juan Quintela
static bool fpregs_is_1_mmx(void *opaque, int version_id)
181 0cb892aa Juan Quintela
{
182 0cb892aa Juan Quintela
    CPUState *env = opaque;
183 0cb892aa Juan Quintela
    int guess_mmx;
184 0cb892aa Juan Quintela
185 0cb892aa Juan Quintela
    guess_mmx = ((env->fptag_vmstate == 0xff) &&
186 0cb892aa Juan Quintela
                 (env->fpus_vmstate & 0x3800) == 0);
187 0cb892aa Juan Quintela
    return (guess_mmx && (env->fpregs_format_vmstate == 1));
188 0cb892aa Juan Quintela
}
189 0cb892aa Juan Quintela
190 0cb892aa Juan Quintela
static bool fpregs_is_1_no_mmx(void *opaque, int version_id)
191 0cb892aa Juan Quintela
{
192 0cb892aa Juan Quintela
    CPUState *env = opaque;
193 0cb892aa Juan Quintela
    int guess_mmx;
194 0cb892aa Juan Quintela
195 0cb892aa Juan Quintela
    guess_mmx = ((env->fptag_vmstate == 0xff) &&
196 0cb892aa Juan Quintela
                 (env->fpus_vmstate & 0x3800) == 0);
197 0cb892aa Juan Quintela
    return (!guess_mmx && (env->fpregs_format_vmstate == 1));
198 0cb892aa Juan Quintela
}
199 0cb892aa Juan Quintela
200 0cb892aa Juan Quintela
#define VMSTATE_FP_REGS(_field, _state, _n)                               \
201 0cb892aa Juan Quintela
    VMSTATE_ARRAY_TEST(_field, _state, _n, fpregs_is_0, vmstate_fpreg, FPReg), \
202 0cb892aa Juan Quintela
    VMSTATE_ARRAY_TEST(_field, _state, _n, fpregs_is_1_mmx, vmstate_fpreg_1_mmx, FPReg), \
203 0cb892aa Juan Quintela
    VMSTATE_ARRAY_TEST(_field, _state, _n, fpregs_is_1_no_mmx, vmstate_fpreg_1_no_mmx, FPReg)
204 0cb892aa Juan Quintela
205 3c8ce630 Juan Quintela
#else
206 3c8ce630 Juan Quintela
static int get_fpreg(QEMUFile *f, void *opaque, size_t size)
207 3c8ce630 Juan Quintela
{
208 3c8ce630 Juan Quintela
    FPReg *fp_reg = opaque;
209 3c8ce630 Juan Quintela
210 3c8ce630 Juan Quintela
    qemu_get_be64s(f, &fp_reg->mmx.MMX_Q(0));
211 3c8ce630 Juan Quintela
    return 0;
212 3c8ce630 Juan Quintela
}
213 3c8ce630 Juan Quintela
214 3c8ce630 Juan Quintela
static void put_fpreg(QEMUFile *f, void *opaque, size_t size)
215 3c8ce630 Juan Quintela
{
216 3c8ce630 Juan Quintela
    FPReg *fp_reg = opaque;
217 3c8ce630 Juan Quintela
    /* if we use doubles for float emulation, we save the doubles to
218 3c8ce630 Juan Quintela
       avoid losing information in case of MMX usage. It can give
219 3c8ce630 Juan Quintela
       problems if the image is restored on a CPU where long
220 3c8ce630 Juan Quintela
       doubles are used instead. */
221 3c8ce630 Juan Quintela
    qemu_put_be64s(f, &fp_reg->mmx.MMX_Q(0));
222 3c8ce630 Juan Quintela
}
223 3c8ce630 Juan Quintela
224 0cb892aa Juan Quintela
const VMStateInfo vmstate_fpreg = {
225 0cb892aa Juan Quintela
    .name = "fpreg",
226 0cb892aa Juan Quintela
    .get  = get_fpreg,
227 0cb892aa Juan Quintela
    .put  = put_fpreg,
228 0cb892aa Juan Quintela
};
229 0cb892aa Juan Quintela
230 3c8ce630 Juan Quintela
static int get_fpreg_0_mmx(QEMUFile *f, void *opaque, size_t size)
231 3c8ce630 Juan Quintela
{
232 3c8ce630 Juan Quintela
    FPReg *fp_reg = opaque;
233 3c8ce630 Juan Quintela
    uint64_t mant;
234 3c8ce630 Juan Quintela
    uint16_t exp;
235 3c8ce630 Juan Quintela
236 3c8ce630 Juan Quintela
    qemu_get_be64s(f, &mant);
237 3c8ce630 Juan Quintela
    qemu_get_be16s(f, &exp);
238 3c8ce630 Juan Quintela
    fp_reg->mmx.MMX_Q(0) = mant;
239 3c8ce630 Juan Quintela
    return 0;
240 3c8ce630 Juan Quintela
}
241 3c8ce630 Juan Quintela
242 0cb892aa Juan Quintela
const VMStateInfo vmstate_fpreg_0_mmx = {
243 0cb892aa Juan Quintela
    .name = "fpreg_0_mmx",
244 0cb892aa Juan Quintela
    .get  = get_fpreg_0_mmx,
245 0cb892aa Juan Quintela
    .put  = put_fpreg_error,
246 0cb892aa Juan Quintela
};
247 0cb892aa Juan Quintela
248 3c8ce630 Juan Quintela
static int get_fpreg_0_no_mmx(QEMUFile *f, void *opaque, size_t size)
249 3c8ce630 Juan Quintela
{
250 3c8ce630 Juan Quintela
    FPReg *fp_reg = opaque;
251 3c8ce630 Juan Quintela
    uint64_t mant;
252 3c8ce630 Juan Quintela
    uint16_t exp;
253 3c8ce630 Juan Quintela
254 3c8ce630 Juan Quintela
    qemu_get_be64s(f, &mant);
255 3c8ce630 Juan Quintela
    qemu_get_be16s(f, &exp);
256 3c8ce630 Juan Quintela
257 3c8ce630 Juan Quintela
    fp_reg->d = cpu_set_fp80(mant, exp);
258 3c8ce630 Juan Quintela
    return 0;
259 3c8ce630 Juan Quintela
}
260 3c8ce630 Juan Quintela
261 0cb892aa Juan Quintela
const VMStateInfo vmstate_fpreg_0_no_mmx = {
262 0cb892aa Juan Quintela
    .name = "fpreg_0_no_mmx",
263 0cb892aa Juan Quintela
    .get  = get_fpreg_0_no_mmx,
264 0cb892aa Juan Quintela
    .put  = put_fpreg_error,
265 0cb892aa Juan Quintela
};
266 0cb892aa Juan Quintela
267 0cb892aa Juan Quintela
static bool fpregs_is_1(void *opaque, int version_id)
268 0cb892aa Juan Quintela
{
269 0cb892aa Juan Quintela
    CPUState *env = opaque;
270 0cb892aa Juan Quintela
271 0cb892aa Juan Quintela
    return env->fpregs_format_vmstate == 1;
272 0cb892aa Juan Quintela
}
273 0cb892aa Juan Quintela
274 0cb892aa Juan Quintela
static bool fpregs_is_0_mmx(void *opaque, int version_id)
275 0cb892aa Juan Quintela
{
276 0cb892aa Juan Quintela
    CPUState *env = opaque;
277 0cb892aa Juan Quintela
    int guess_mmx;
278 0cb892aa Juan Quintela
279 0cb892aa Juan Quintela
    guess_mmx = ((env->fptag_vmstate == 0xff) &&
280 0cb892aa Juan Quintela
                 (env->fpus_vmstate & 0x3800) == 0);
281 0cb892aa Juan Quintela
    return guess_mmx && env->fpregs_format_vmstate == 0;
282 0cb892aa Juan Quintela
}
283 0cb892aa Juan Quintela
284 0cb892aa Juan Quintela
static bool fpregs_is_0_no_mmx(void *opaque, int version_id)
285 0cb892aa Juan Quintela
{
286 0cb892aa Juan Quintela
    CPUState *env = opaque;
287 0cb892aa Juan Quintela
    int guess_mmx;
288 0cb892aa Juan Quintela
289 0cb892aa Juan Quintela
    guess_mmx = ((env->fptag_vmstate == 0xff) &&
290 0cb892aa Juan Quintela
                 (env->fpus_vmstate & 0x3800) == 0);
291 0cb892aa Juan Quintela
    return !guess_mmx && env->fpregs_format_vmstate == 0;
292 0cb892aa Juan Quintela
}
293 0cb892aa Juan Quintela
294 0cb892aa Juan Quintela
#define VMSTATE_FP_REGS(_field, _state, _n)                               \
295 0cb892aa Juan Quintela
    VMSTATE_ARRAY_TEST(_field, _state, _n, fpregs_is_1, vmstate_fpreg, FPReg), \
296 0cb892aa Juan Quintela
    VMSTATE_ARRAY_TEST(_field, _state, _n, fpregs_is_0_mmx, vmstate_fpreg_0_mmx, FPReg), \
297 0cb892aa Juan Quintela
    VMSTATE_ARRAY_TEST(_field, _state, _n, fpregs_is_0_no_mmx, vmstate_fpreg_0_no_mmx, FPReg)
298 0cb892aa Juan Quintela
299 3c8ce630 Juan Quintela
#endif /* USE_X86LDOUBLE */
300 3c8ce630 Juan Quintela
301 0cb892aa Juan Quintela
static bool version_is_5(void *opaque, int version_id)
302 0cb892aa Juan Quintela
{
303 0cb892aa Juan Quintela
    return version_id == 5;
304 0cb892aa Juan Quintela
}
305 0cb892aa Juan Quintela
306 0cb892aa Juan Quintela
#ifdef TARGET_X86_64
307 0cb892aa Juan Quintela
static bool less_than_7(void *opaque, int version_id)
308 0cb892aa Juan Quintela
{
309 0cb892aa Juan Quintela
    return version_id < 7;
310 0cb892aa Juan Quintela
}
311 0cb892aa Juan Quintela
312 0cb892aa Juan Quintela
static int get_uint64_as_uint32(QEMUFile *f, void *pv, size_t size)
313 0cb892aa Juan Quintela
{
314 0cb892aa Juan Quintela
    uint64_t *v = pv;
315 0cb892aa Juan Quintela
    *v = qemu_get_be32(f);
316 0cb892aa Juan Quintela
    return 0;
317 0cb892aa Juan Quintela
}
318 0cb892aa Juan Quintela
319 0cb892aa Juan Quintela
static void put_uint64_as_uint32(QEMUFile *f, void *pv, size_t size)
320 0cb892aa Juan Quintela
{
321 0cb892aa Juan Quintela
    uint64_t *v = pv;
322 0cb892aa Juan Quintela
    qemu_put_be32(f, *v);
323 0cb892aa Juan Quintela
}
324 0cb892aa Juan Quintela
325 976b2037 Blue Swirl
static const VMStateInfo vmstate_hack_uint64_as_uint32 = {
326 0cb892aa Juan Quintela
    .name = "uint64_as_uint32",
327 0cb892aa Juan Quintela
    .get  = get_uint64_as_uint32,
328 0cb892aa Juan Quintela
    .put  = put_uint64_as_uint32,
329 0cb892aa Juan Quintela
};
330 0cb892aa Juan Quintela
331 0cb892aa Juan Quintela
#define VMSTATE_HACK_UINT32(_f, _s, _t)                                  \
332 d4829d49 Juan Quintela
    VMSTATE_SINGLE_TEST(_f, _s, _t, 0, vmstate_hack_uint64_as_uint32, uint64_t)
333 0cb892aa Juan Quintela
#endif
334 0cb892aa Juan Quintela
335 c4c38c8c Juan Quintela
static void cpu_pre_save(void *opaque)
336 8dd3dca3 aurel32
{
337 8dd3dca3 aurel32
    CPUState *env = opaque;
338 0e607a80 Jan Kiszka
    int i;
339 8dd3dca3 aurel32
340 8dd3dca3 aurel32
    /* FPU */
341 67b8f419 Juan Quintela
    env->fpus_vmstate = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11;
342 cdc0c58f Juan Quintela
    env->fptag_vmstate = 0;
343 8dd3dca3 aurel32
    for(i = 0; i < 8; i++) {
344 cdc0c58f Juan Quintela
        env->fptag_vmstate |= ((!env->fptags[i]) << i);
345 8dd3dca3 aurel32
    }
346 8dd3dca3 aurel32
347 8dd3dca3 aurel32
#ifdef USE_X86LDOUBLE
348 60a902f1 Juan Quintela
    env->fpregs_format_vmstate = 0;
349 8dd3dca3 aurel32
#else
350 60a902f1 Juan Quintela
    env->fpregs_format_vmstate = 1;
351 8dd3dca3 aurel32
#endif
352 c4c38c8c Juan Quintela
}
353 c4c38c8c Juan Quintela
354 468f6581 Juan Quintela
static int cpu_post_load(void *opaque, int version_id)
355 468f6581 Juan Quintela
{
356 468f6581 Juan Quintela
    CPUState *env = opaque;
357 468f6581 Juan Quintela
    int i;
358 468f6581 Juan Quintela
359 468f6581 Juan Quintela
    /* XXX: restore FPU round state */
360 468f6581 Juan Quintela
    env->fpstt = (env->fpus_vmstate >> 11) & 7;
361 468f6581 Juan Quintela
    env->fpus = env->fpus_vmstate & ~0x3800;
362 468f6581 Juan Quintela
    env->fptag_vmstate ^= 0xff;
363 468f6581 Juan Quintela
    for(i = 0; i < 8; i++) {
364 468f6581 Juan Quintela
        env->fptags[i] = (env->fptag_vmstate >> i) & 1;
365 468f6581 Juan Quintela
    }
366 468f6581 Juan Quintela
367 468f6581 Juan Quintela
    cpu_breakpoint_remove_all(env, BP_CPU);
368 468f6581 Juan Quintela
    cpu_watchpoint_remove_all(env, BP_CPU);
369 468f6581 Juan Quintela
    for (i = 0; i < 4; i++)
370 468f6581 Juan Quintela
        hw_breakpoint_insert(env, i);
371 468f6581 Juan Quintela
372 1e7fbc6d Juan Quintela
    tlb_flush(env, 1);
373 1e7fbc6d Juan Quintela
    return 0;
374 468f6581 Juan Quintela
}
375 468f6581 Juan Quintela
376 f6584ee2 Gleb Natapov
static bool async_pf_msr_needed(void *opaque)
377 f6584ee2 Gleb Natapov
{
378 f6584ee2 Gleb Natapov
    CPUState *cpu = opaque;
379 f6584ee2 Gleb Natapov
380 f6584ee2 Gleb Natapov
    return cpu->async_pf_en_msr != 0;
381 f6584ee2 Gleb Natapov
}
382 f6584ee2 Gleb Natapov
383 f6584ee2 Gleb Natapov
static const VMStateDescription vmstate_async_pf_msr = {
384 f6584ee2 Gleb Natapov
    .name = "cpu/async_pf_msr",
385 f6584ee2 Gleb Natapov
    .version_id = 1,
386 f6584ee2 Gleb Natapov
    .minimum_version_id = 1,
387 f6584ee2 Gleb Natapov
    .minimum_version_id_old = 1,
388 f6584ee2 Gleb Natapov
    .fields      = (VMStateField []) {
389 f6584ee2 Gleb Natapov
        VMSTATE_UINT64(async_pf_en_msr, CPUState),
390 f6584ee2 Gleb Natapov
        VMSTATE_END_OF_LIST()
391 f6584ee2 Gleb Natapov
    }
392 f6584ee2 Gleb Natapov
};
393 f6584ee2 Gleb Natapov
394 976b2037 Blue Swirl
static const VMStateDescription vmstate_cpu = {
395 0cb892aa Juan Quintela
    .name = "cpu",
396 0cb892aa Juan Quintela
    .version_id = CPU_SAVE_VERSION,
397 0cb892aa Juan Quintela
    .minimum_version_id = 3,
398 0cb892aa Juan Quintela
    .minimum_version_id_old = 3,
399 0cb892aa Juan Quintela
    .pre_save = cpu_pre_save,
400 0cb892aa Juan Quintela
    .post_load = cpu_post_load,
401 0cb892aa Juan Quintela
    .fields      = (VMStateField []) {
402 0cb892aa Juan Quintela
        VMSTATE_UINTTL_ARRAY(regs, CPUState, CPU_NB_REGS),
403 0cb892aa Juan Quintela
        VMSTATE_UINTTL(eip, CPUState),
404 0cb892aa Juan Quintela
        VMSTATE_UINTTL(eflags, CPUState),
405 0cb892aa Juan Quintela
        VMSTATE_UINT32(hflags, CPUState),
406 0cb892aa Juan Quintela
        /* FPU */
407 0cb892aa Juan Quintela
        VMSTATE_UINT16(fpuc, CPUState),
408 0cb892aa Juan Quintela
        VMSTATE_UINT16(fpus_vmstate, CPUState),
409 0cb892aa Juan Quintela
        VMSTATE_UINT16(fptag_vmstate, CPUState),
410 0cb892aa Juan Quintela
        VMSTATE_UINT16(fpregs_format_vmstate, CPUState),
411 0cb892aa Juan Quintela
        VMSTATE_FP_REGS(fpregs, CPUState, 8),
412 0cb892aa Juan Quintela
413 0cb892aa Juan Quintela
        VMSTATE_SEGMENT_ARRAY(segs, CPUState, 6),
414 0cb892aa Juan Quintela
        VMSTATE_SEGMENT(ldt, CPUState),
415 0cb892aa Juan Quintela
        VMSTATE_SEGMENT(tr, CPUState),
416 0cb892aa Juan Quintela
        VMSTATE_SEGMENT(gdt, CPUState),
417 0cb892aa Juan Quintela
        VMSTATE_SEGMENT(idt, CPUState),
418 0cb892aa Juan Quintela
419 0cb892aa Juan Quintela
        VMSTATE_UINT32(sysenter_cs, CPUState),
420 0cb892aa Juan Quintela
#ifdef TARGET_X86_64
421 0cb892aa Juan Quintela
        /* Hack: In v7 size changed from 32 to 64 bits on x86_64 */
422 0cb892aa Juan Quintela
        VMSTATE_HACK_UINT32(sysenter_esp, CPUState, less_than_7),
423 0cb892aa Juan Quintela
        VMSTATE_HACK_UINT32(sysenter_eip, CPUState, less_than_7),
424 0cb892aa Juan Quintela
        VMSTATE_UINTTL_V(sysenter_esp, CPUState, 7),
425 0cb892aa Juan Quintela
        VMSTATE_UINTTL_V(sysenter_eip, CPUState, 7),
426 8dd3dca3 aurel32
#else
427 0cb892aa Juan Quintela
        VMSTATE_UINTTL(sysenter_esp, CPUState),
428 0cb892aa Juan Quintela
        VMSTATE_UINTTL(sysenter_eip, CPUState),
429 3c8ce630 Juan Quintela
#endif
430 8dd3dca3 aurel32
431 0cb892aa Juan Quintela
        VMSTATE_UINTTL(cr[0], CPUState),
432 0cb892aa Juan Quintela
        VMSTATE_UINTTL(cr[2], CPUState),
433 0cb892aa Juan Quintela
        VMSTATE_UINTTL(cr[3], CPUState),
434 0cb892aa Juan Quintela
        VMSTATE_UINTTL(cr[4], CPUState),
435 0cb892aa Juan Quintela
        VMSTATE_UINTTL_ARRAY(dr, CPUState, 8),
436 0cb892aa Juan Quintela
        /* MMU */
437 0cb892aa Juan Quintela
        VMSTATE_INT32(a20_mask, CPUState),
438 0cb892aa Juan Quintela
        /* XMM */
439 0cb892aa Juan Quintela
        VMSTATE_UINT32(mxcsr, CPUState),
440 0cb892aa Juan Quintela
        VMSTATE_XMM_REGS(xmm_regs, CPUState, CPU_NB_REGS),
441 8dd3dca3 aurel32
442 8dd3dca3 aurel32
#ifdef TARGET_X86_64
443 0cb892aa Juan Quintela
        VMSTATE_UINT64(efer, CPUState),
444 0cb892aa Juan Quintela
        VMSTATE_UINT64(star, CPUState),
445 0cb892aa Juan Quintela
        VMSTATE_UINT64(lstar, CPUState),
446 0cb892aa Juan Quintela
        VMSTATE_UINT64(cstar, CPUState),
447 0cb892aa Juan Quintela
        VMSTATE_UINT64(fmask, CPUState),
448 0cb892aa Juan Quintela
        VMSTATE_UINT64(kernelgsbase, CPUState),
449 8dd3dca3 aurel32
#endif
450 0cb892aa Juan Quintela
        VMSTATE_UINT32_V(smbase, CPUState, 4),
451 0cb892aa Juan Quintela
452 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(pat, CPUState, 5),
453 0cb892aa Juan Quintela
        VMSTATE_UINT32_V(hflags2, CPUState, 5),
454 0cb892aa Juan Quintela
455 0cb892aa Juan Quintela
        VMSTATE_UINT32_TEST(halted, CPUState, version_is_5),
456 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(vm_hsave, CPUState, 5),
457 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(vm_vmcb, CPUState, 5),
458 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(tsc_offset, CPUState, 5),
459 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(intercept, CPUState, 5),
460 0cb892aa Juan Quintela
        VMSTATE_UINT16_V(intercept_cr_read, CPUState, 5),
461 0cb892aa Juan Quintela
        VMSTATE_UINT16_V(intercept_cr_write, CPUState, 5),
462 0cb892aa Juan Quintela
        VMSTATE_UINT16_V(intercept_dr_read, CPUState, 5),
463 0cb892aa Juan Quintela
        VMSTATE_UINT16_V(intercept_dr_write, CPUState, 5),
464 0cb892aa Juan Quintela
        VMSTATE_UINT32_V(intercept_exceptions, CPUState, 5),
465 0cb892aa Juan Quintela
        VMSTATE_UINT8_V(v_tpr, CPUState, 5),
466 dd5e3b17 aliguori
        /* MTRRs */
467 0cb892aa Juan Quintela
        VMSTATE_UINT64_ARRAY_V(mtrr_fixed, CPUState, 11, 8),
468 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(mtrr_deftype, CPUState, 8),
469 0cb892aa Juan Quintela
        VMSTATE_MTRR_VARS(mtrr_var, CPUState, 8, 8),
470 0cb892aa Juan Quintela
        /* KVM-related states */
471 0e607a80 Jan Kiszka
        VMSTATE_INT32_V(interrupt_injected, CPUState, 9),
472 0cb892aa Juan Quintela
        VMSTATE_UINT32_V(mp_state, CPUState, 9),
473 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(tsc, CPUState, 9),
474 31827373 Jan Kiszka
        VMSTATE_INT32_V(exception_injected, CPUState, 11),
475 a0fb002c Jan Kiszka
        VMSTATE_UINT8_V(soft_interrupt, CPUState, 11),
476 a0fb002c Jan Kiszka
        VMSTATE_UINT8_V(nmi_injected, CPUState, 11),
477 a0fb002c Jan Kiszka
        VMSTATE_UINT8_V(nmi_pending, CPUState, 11),
478 a0fb002c Jan Kiszka
        VMSTATE_UINT8_V(has_error_code, CPUState, 11),
479 a0fb002c Jan Kiszka
        VMSTATE_UINT32_V(sipi_vector, CPUState, 11),
480 0cb892aa Juan Quintela
        /* MCE */
481 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(mcg_cap, CPUState, 10),
482 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(mcg_status, CPUState, 10),
483 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(mcg_ctl, CPUState, 10),
484 0cb892aa Juan Quintela
        VMSTATE_UINT64_ARRAY_V(mce_banks, CPUState, MCE_BANKS_DEF *4, 10),
485 0cb892aa Juan Quintela
        /* rdtscp */
486 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(tsc_aux, CPUState, 11),
487 1a03675d Glauber Costa
        /* KVM pvclock msr */
488 1a03675d Glauber Costa
        VMSTATE_UINT64_V(system_time_msr, CPUState, 11),
489 1a03675d Glauber Costa
        VMSTATE_UINT64_V(wall_clock_msr, CPUState, 11),
490 f1665b21 Sheng Yang
        /* XSAVE related fields */
491 f1665b21 Sheng Yang
        VMSTATE_UINT64_V(xcr0, CPUState, 12),
492 f1665b21 Sheng Yang
        VMSTATE_UINT64_V(xstate_bv, CPUState, 12),
493 f1665b21 Sheng Yang
        VMSTATE_YMMH_REGS_VARS(ymmh_regs, CPUState, CPU_NB_REGS, 12),
494 0cb892aa Juan Quintela
        VMSTATE_END_OF_LIST()
495 a0fb002c Jan Kiszka
        /* The above list is not sorted /wrt version numbers, watch out! */
496 f6584ee2 Gleb Natapov
    },
497 f6584ee2 Gleb Natapov
    .subsections = (VMStateSubsection []) {
498 f6584ee2 Gleb Natapov
        {
499 f6584ee2 Gleb Natapov
            .vmsd = &vmstate_async_pf_msr,
500 f6584ee2 Gleb Natapov
            .needed = async_pf_msr_needed,
501 f6584ee2 Gleb Natapov
        } , {
502 f6584ee2 Gleb Natapov
            /* empty */
503 f6584ee2 Gleb Natapov
        }
504 79c4f6b0 Huang Ying
    }
505 0cb892aa Juan Quintela
};
506 79c4f6b0 Huang Ying
507 0cb892aa Juan Quintela
void cpu_save(QEMUFile *f, void *opaque)
508 0cb892aa Juan Quintela
{
509 0cb892aa Juan Quintela
    vmstate_save_state(f, &vmstate_cpu, opaque);
510 0cb892aa Juan Quintela
}
511 1f76b9b9 Juan Quintela
512 0cb892aa Juan Quintela
int cpu_load(QEMUFile *f, void *opaque, int version_id)
513 0cb892aa Juan Quintela
{
514 0cb892aa Juan Quintela
    return vmstate_load_state(f, &vmstate_cpu, opaque, version_id);
515 8dd3dca3 aurel32
}