Statistics
| Branch: | Revision:

root / target-i386 / machine.c @ a88790a1

History | View | Annotate | Download (14.1 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 976b2037 Blue Swirl
static const VMStateDescription vmstate_cpu = {
377 0cb892aa Juan Quintela
    .name = "cpu",
378 0cb892aa Juan Quintela
    .version_id = CPU_SAVE_VERSION,
379 0cb892aa Juan Quintela
    .minimum_version_id = 3,
380 0cb892aa Juan Quintela
    .minimum_version_id_old = 3,
381 0cb892aa Juan Quintela
    .pre_save = cpu_pre_save,
382 0cb892aa Juan Quintela
    .post_load = cpu_post_load,
383 0cb892aa Juan Quintela
    .fields      = (VMStateField []) {
384 0cb892aa Juan Quintela
        VMSTATE_UINTTL_ARRAY(regs, CPUState, CPU_NB_REGS),
385 0cb892aa Juan Quintela
        VMSTATE_UINTTL(eip, CPUState),
386 0cb892aa Juan Quintela
        VMSTATE_UINTTL(eflags, CPUState),
387 0cb892aa Juan Quintela
        VMSTATE_UINT32(hflags, CPUState),
388 0cb892aa Juan Quintela
        /* FPU */
389 0cb892aa Juan Quintela
        VMSTATE_UINT16(fpuc, CPUState),
390 0cb892aa Juan Quintela
        VMSTATE_UINT16(fpus_vmstate, CPUState),
391 0cb892aa Juan Quintela
        VMSTATE_UINT16(fptag_vmstate, CPUState),
392 0cb892aa Juan Quintela
        VMSTATE_UINT16(fpregs_format_vmstate, CPUState),
393 0cb892aa Juan Quintela
        VMSTATE_FP_REGS(fpregs, CPUState, 8),
394 0cb892aa Juan Quintela
395 0cb892aa Juan Quintela
        VMSTATE_SEGMENT_ARRAY(segs, CPUState, 6),
396 0cb892aa Juan Quintela
        VMSTATE_SEGMENT(ldt, CPUState),
397 0cb892aa Juan Quintela
        VMSTATE_SEGMENT(tr, CPUState),
398 0cb892aa Juan Quintela
        VMSTATE_SEGMENT(gdt, CPUState),
399 0cb892aa Juan Quintela
        VMSTATE_SEGMENT(idt, CPUState),
400 0cb892aa Juan Quintela
401 0cb892aa Juan Quintela
        VMSTATE_UINT32(sysenter_cs, CPUState),
402 0cb892aa Juan Quintela
#ifdef TARGET_X86_64
403 0cb892aa Juan Quintela
        /* Hack: In v7 size changed from 32 to 64 bits on x86_64 */
404 0cb892aa Juan Quintela
        VMSTATE_HACK_UINT32(sysenter_esp, CPUState, less_than_7),
405 0cb892aa Juan Quintela
        VMSTATE_HACK_UINT32(sysenter_eip, CPUState, less_than_7),
406 0cb892aa Juan Quintela
        VMSTATE_UINTTL_V(sysenter_esp, CPUState, 7),
407 0cb892aa Juan Quintela
        VMSTATE_UINTTL_V(sysenter_eip, CPUState, 7),
408 8dd3dca3 aurel32
#else
409 0cb892aa Juan Quintela
        VMSTATE_UINTTL(sysenter_esp, CPUState),
410 0cb892aa Juan Quintela
        VMSTATE_UINTTL(sysenter_eip, CPUState),
411 3c8ce630 Juan Quintela
#endif
412 8dd3dca3 aurel32
413 0cb892aa Juan Quintela
        VMSTATE_UINTTL(cr[0], CPUState),
414 0cb892aa Juan Quintela
        VMSTATE_UINTTL(cr[2], CPUState),
415 0cb892aa Juan Quintela
        VMSTATE_UINTTL(cr[3], CPUState),
416 0cb892aa Juan Quintela
        VMSTATE_UINTTL(cr[4], CPUState),
417 0cb892aa Juan Quintela
        VMSTATE_UINTTL_ARRAY(dr, CPUState, 8),
418 0cb892aa Juan Quintela
        /* MMU */
419 0cb892aa Juan Quintela
        VMSTATE_INT32(a20_mask, CPUState),
420 0cb892aa Juan Quintela
        /* XMM */
421 0cb892aa Juan Quintela
        VMSTATE_UINT32(mxcsr, CPUState),
422 0cb892aa Juan Quintela
        VMSTATE_XMM_REGS(xmm_regs, CPUState, CPU_NB_REGS),
423 8dd3dca3 aurel32
424 8dd3dca3 aurel32
#ifdef TARGET_X86_64
425 0cb892aa Juan Quintela
        VMSTATE_UINT64(efer, CPUState),
426 0cb892aa Juan Quintela
        VMSTATE_UINT64(star, CPUState),
427 0cb892aa Juan Quintela
        VMSTATE_UINT64(lstar, CPUState),
428 0cb892aa Juan Quintela
        VMSTATE_UINT64(cstar, CPUState),
429 0cb892aa Juan Quintela
        VMSTATE_UINT64(fmask, CPUState),
430 0cb892aa Juan Quintela
        VMSTATE_UINT64(kernelgsbase, CPUState),
431 8dd3dca3 aurel32
#endif
432 0cb892aa Juan Quintela
        VMSTATE_UINT32_V(smbase, CPUState, 4),
433 0cb892aa Juan Quintela
434 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(pat, CPUState, 5),
435 0cb892aa Juan Quintela
        VMSTATE_UINT32_V(hflags2, CPUState, 5),
436 0cb892aa Juan Quintela
437 0cb892aa Juan Quintela
        VMSTATE_UINT32_TEST(halted, CPUState, version_is_5),
438 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(vm_hsave, CPUState, 5),
439 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(vm_vmcb, CPUState, 5),
440 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(tsc_offset, CPUState, 5),
441 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(intercept, CPUState, 5),
442 0cb892aa Juan Quintela
        VMSTATE_UINT16_V(intercept_cr_read, CPUState, 5),
443 0cb892aa Juan Quintela
        VMSTATE_UINT16_V(intercept_cr_write, CPUState, 5),
444 0cb892aa Juan Quintela
        VMSTATE_UINT16_V(intercept_dr_read, CPUState, 5),
445 0cb892aa Juan Quintela
        VMSTATE_UINT16_V(intercept_dr_write, CPUState, 5),
446 0cb892aa Juan Quintela
        VMSTATE_UINT32_V(intercept_exceptions, CPUState, 5),
447 0cb892aa Juan Quintela
        VMSTATE_UINT8_V(v_tpr, CPUState, 5),
448 dd5e3b17 aliguori
        /* MTRRs */
449 0cb892aa Juan Quintela
        VMSTATE_UINT64_ARRAY_V(mtrr_fixed, CPUState, 11, 8),
450 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(mtrr_deftype, CPUState, 8),
451 0cb892aa Juan Quintela
        VMSTATE_MTRR_VARS(mtrr_var, CPUState, 8, 8),
452 0cb892aa Juan Quintela
        /* KVM-related states */
453 0e607a80 Jan Kiszka
        VMSTATE_INT32_V(interrupt_injected, CPUState, 9),
454 0cb892aa Juan Quintela
        VMSTATE_UINT32_V(mp_state, CPUState, 9),
455 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(tsc, CPUState, 9),
456 31827373 Jan Kiszka
        VMSTATE_INT32_V(exception_injected, CPUState, 11),
457 a0fb002c Jan Kiszka
        VMSTATE_UINT8_V(soft_interrupt, CPUState, 11),
458 a0fb002c Jan Kiszka
        VMSTATE_UINT8_V(nmi_injected, CPUState, 11),
459 a0fb002c Jan Kiszka
        VMSTATE_UINT8_V(nmi_pending, CPUState, 11),
460 a0fb002c Jan Kiszka
        VMSTATE_UINT8_V(has_error_code, CPUState, 11),
461 a0fb002c Jan Kiszka
        VMSTATE_UINT32_V(sipi_vector, CPUState, 11),
462 0cb892aa Juan Quintela
        /* MCE */
463 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(mcg_cap, CPUState, 10),
464 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(mcg_status, CPUState, 10),
465 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(mcg_ctl, CPUState, 10),
466 0cb892aa Juan Quintela
        VMSTATE_UINT64_ARRAY_V(mce_banks, CPUState, MCE_BANKS_DEF *4, 10),
467 0cb892aa Juan Quintela
        /* rdtscp */
468 0cb892aa Juan Quintela
        VMSTATE_UINT64_V(tsc_aux, CPUState, 11),
469 1a03675d Glauber Costa
        /* KVM pvclock msr */
470 1a03675d Glauber Costa
        VMSTATE_UINT64_V(system_time_msr, CPUState, 11),
471 1a03675d Glauber Costa
        VMSTATE_UINT64_V(wall_clock_msr, CPUState, 11),
472 f1665b21 Sheng Yang
        /* XSAVE related fields */
473 f1665b21 Sheng Yang
        VMSTATE_UINT64_V(xcr0, CPUState, 12),
474 f1665b21 Sheng Yang
        VMSTATE_UINT64_V(xstate_bv, CPUState, 12),
475 f1665b21 Sheng Yang
        VMSTATE_YMMH_REGS_VARS(ymmh_regs, CPUState, CPU_NB_REGS, 12),
476 0cb892aa Juan Quintela
        VMSTATE_END_OF_LIST()
477 a0fb002c Jan Kiszka
        /* The above list is not sorted /wrt version numbers, watch out! */
478 79c4f6b0 Huang Ying
    }
479 0cb892aa Juan Quintela
};
480 79c4f6b0 Huang Ying
481 0cb892aa Juan Quintela
void cpu_save(QEMUFile *f, void *opaque)
482 0cb892aa Juan Quintela
{
483 0cb892aa Juan Quintela
    vmstate_save_state(f, &vmstate_cpu, opaque);
484 0cb892aa Juan Quintela
}
485 1f76b9b9 Juan Quintela
486 0cb892aa Juan Quintela
int cpu_load(QEMUFile *f, void *opaque, int version_id)
487 0cb892aa Juan Quintela
{
488 0cb892aa Juan Quintela
    return vmstate_load_state(f, &vmstate_cpu, opaque, version_id);
489 8dd3dca3 aurel32
}