Statistics
| Branch: | Revision:

root / target-i386 / helper.c @ b36d24b6

History | View | Annotate | Download (54.6 kB)

1
/*
2
 *  i386 helpers (without register variable usage)
3
 *
4
 *  Copyright (c) 2003 Fabrice Bellard
5
 *
6
 * This library is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2 of the License, or (at your option) any later version.
10
 *
11
 * This library is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with this library; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 USA
19
 */
20
#include <stdarg.h>
21
#include <stdlib.h>
22
#include <stdio.h>
23
#include <string.h>
24
#include <inttypes.h>
25
#include <signal.h>
26
#include <assert.h>
27

    
28
#include "cpu.h"
29
#include "exec-all.h"
30
#include "qemu-common.h"
31
#include "kvm.h"
32

    
33
//#define DEBUG_MMU
34

    
35
static void add_flagname_to_bitmaps(char *flagname, uint32_t *features, 
36
                                    uint32_t *ext_features, 
37
                                    uint32_t *ext2_features, 
38
                                    uint32_t *ext3_features)
39
{
40
    int i;
41
    /* feature flags taken from "Intel Processor Identification and the CPUID
42
     * Instruction" and AMD's "CPUID Specification". In cases of disagreement 
43
     * about feature names, the Linux name is used. */
44
    static const char *feature_name[] = {
45
        "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",
46
        "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov",
47
        "pat", "pse36", "pn" /* Intel psn */, "clflush" /* Intel clfsh */, NULL, "ds" /* Intel dts */, "acpi", "mmx",
48
        "fxsr", "sse", "sse2", "ss", "ht" /* Intel htt */, "tm", "ia64", "pbe",
49
    };
50
    static const char *ext_feature_name[] = {
51
       "pni" /* Intel,AMD sse3 */, NULL, NULL, "monitor", "ds_cpl", "vmx", NULL /* Linux smx */, "est",
52
       "tm2", "ssse3", "cid", NULL, NULL, "cx16", "xtpr", NULL,
53
       NULL, NULL, "dca", NULL, NULL, NULL, NULL, "popcnt",
54
       NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
55
    };
56
    static const char *ext2_feature_name[] = {
57
       "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",
58
       "cx8" /* AMD CMPXCHG8B */, "apic", NULL, "syscall", "mtrr", "pge", "mca", "cmov",
59
       "pat", "pse36", NULL, NULL /* Linux mp */, "nx" /* Intel xd */, NULL, "mmxext", "mmx",
60
       "fxsr", "fxsr_opt" /* AMD ffxsr */, "pdpe1gb" /* AMD Page1GB */, "rdtscp", NULL, "lm" /* Intel 64 */, "3dnowext", "3dnow",
61
    };
62
    static const char *ext3_feature_name[] = {
63
       "lahf_lm" /* AMD LahfSahf */, "cmp_legacy", "svm", "extapic" /* AMD ExtApicSpace */, "cr8legacy" /* AMD AltMovCr8 */, "abm", "sse4a", "misalignsse",
64
       "3dnowprefetch", "osvw", NULL /* Linux ibs */, NULL, "skinit", "wdt", NULL, NULL,
65
       NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
66
       NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
67
    };
68

    
69
    for ( i = 0 ; i < 32 ; i++ ) 
70
        if (feature_name[i] && !strcmp (flagname, feature_name[i])) {
71
            *features |= 1 << i;
72
            return;
73
        }
74
    for ( i = 0 ; i < 32 ; i++ ) 
75
        if (ext_feature_name[i] && !strcmp (flagname, ext_feature_name[i])) {
76
            *ext_features |= 1 << i;
77
            return;
78
        }
79
    for ( i = 0 ; i < 32 ; i++ ) 
80
        if (ext2_feature_name[i] && !strcmp (flagname, ext2_feature_name[i])) {
81
            *ext2_features |= 1 << i;
82
            return;
83
        }
84
    for ( i = 0 ; i < 32 ; i++ ) 
85
        if (ext3_feature_name[i] && !strcmp (flagname, ext3_feature_name[i])) {
86
            *ext3_features |= 1 << i;
87
            return;
88
        }
89
    fprintf(stderr, "CPU feature %s not found\n", flagname);
90
}
91

    
92
typedef struct x86_def_t {
93
    const char *name;
94
    uint32_t level;
95
    uint32_t vendor1, vendor2, vendor3;
96
    int family;
97
    int model;
98
    int stepping;
99
    uint32_t features, ext_features, ext2_features, ext3_features;
100
    uint32_t xlevel;
101
    char model_id[48];
102
} x86_def_t;
103

    
104
#define I486_FEATURES (CPUID_FP87 | CPUID_VME | CPUID_PSE)
105
#define PENTIUM_FEATURES (I486_FEATURES | CPUID_DE | CPUID_TSC | \
106
          CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_MMX)
107
#define PENTIUM2_FEATURES (PENTIUM_FEATURES | CPUID_PAE | CPUID_SEP | \
108
          CPUID_MTRR | CPUID_PGE | CPUID_MCA | CPUID_CMOV | CPUID_PAT | \
109
          CPUID_PSE36 | CPUID_FXSR)
110
#define PENTIUM3_FEATURES (PENTIUM2_FEATURES | CPUID_SSE)
111
#define PPRO_FEATURES (CPUID_FP87 | CPUID_DE | CPUID_PSE | CPUID_TSC | \
112
          CPUID_MSR | CPUID_MCE | CPUID_CX8 | CPUID_PGE | CPUID_CMOV | \
113
          CPUID_PAT | CPUID_FXSR | CPUID_MMX | CPUID_SSE | CPUID_SSE2 | \
114
          CPUID_PAE | CPUID_SEP | CPUID_APIC)
115
static x86_def_t x86_defs[] = {
116
#ifdef TARGET_X86_64
117
    {
118
        .name = "qemu64",
119
        .level = 2,
120
        .vendor1 = CPUID_VENDOR_AMD_1,
121
        .vendor2 = CPUID_VENDOR_AMD_2,
122
        .vendor3 = CPUID_VENDOR_AMD_3,
123
        .family = 6,
124
        .model = 2,
125
        .stepping = 3,
126
        .features = PPRO_FEATURES | 
127
        /* these features are needed for Win64 and aren't fully implemented */
128
            CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
129
        /* this feature is needed for Solaris and isn't fully implemented */
130
            CPUID_PSE36,
131
        .ext_features = CPUID_EXT_SSE3,
132
        .ext2_features = (PPRO_FEATURES & 0x0183F3FF) | 
133
            CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
134
            CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
135
        .ext3_features = CPUID_EXT3_SVM,
136
        .xlevel = 0x8000000A,
137
        .model_id = "QEMU Virtual CPU version " QEMU_VERSION,
138
    },
139
    {
140
        .name = "phenom",
141
        .level = 5,
142
        .vendor1 = CPUID_VENDOR_AMD_1,
143
        .vendor2 = CPUID_VENDOR_AMD_2,
144
        .vendor3 = CPUID_VENDOR_AMD_3,
145
        .family = 16,
146
        .model = 2,
147
        .stepping = 3,
148
        /* Missing: CPUID_VME, CPUID_HT */
149
        .features = PPRO_FEATURES | 
150
            CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
151
            CPUID_PSE36,
152
        /* Missing: CPUID_EXT_CX16, CPUID_EXT_POPCNT */
153
        .ext_features = CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
154
        /* Missing: CPUID_EXT2_PDPE1GB, CPUID_EXT2_RDTSCP */
155
        .ext2_features = (PPRO_FEATURES & 0x0183F3FF) | 
156
            CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX |
157
            CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT | CPUID_EXT2_MMXEXT |
158
            CPUID_EXT2_FFXSR,
159
        /* Missing: CPUID_EXT3_LAHF_LM, CPUID_EXT3_CMP_LEG, CPUID_EXT3_EXTAPIC,
160
                    CPUID_EXT3_CR8LEG, CPUID_EXT3_ABM, CPUID_EXT3_SSE4A,
161
                    CPUID_EXT3_MISALIGNSSE, CPUID_EXT3_3DNOWPREFETCH,
162
                    CPUID_EXT3_OSVW, CPUID_EXT3_IBS */
163
        .ext3_features = CPUID_EXT3_SVM,
164
        .xlevel = 0x8000001A,
165
        .model_id = "AMD Phenom(tm) 9550 Quad-Core Processor"
166
    },
167
    {
168
        .name = "core2duo",
169
        .level = 10,
170
        .family = 6,
171
        .model = 15,
172
        .stepping = 11,
173
        /* The original CPU also implements these features:
174
               CPUID_VME, CPUID_DTS, CPUID_ACPI, CPUID_SS, CPUID_HT,
175
               CPUID_TM, CPUID_PBE */
176
        .features = PPRO_FEATURES |
177
            CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA |
178
            CPUID_PSE36,
179
        /* The original CPU also implements these ext features:
180
               CPUID_EXT_DTES64, CPUID_EXT_DSCPL, CPUID_EXT_VMX, CPUID_EXT_EST,
181
               CPUID_EXT_TM2, CPUID_EXT_CX16, CPUID_EXT_XTPR, CPUID_EXT_PDCM */
182
        .ext_features = CPUID_EXT_SSE3 | CPUID_EXT_MONITOR | CPUID_EXT_SSSE3,
183
        .ext2_features = CPUID_EXT2_LM | CPUID_EXT2_SYSCALL | CPUID_EXT2_NX,
184
        /* Missing: .ext3_features = CPUID_EXT3_LAHF_LM */
185
        .xlevel = 0x80000008,
186
        .model_id = "Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHz",
187
    },
188
#endif
189
    {
190
        .name = "qemu32",
191
        .level = 2,
192
        .family = 6,
193
        .model = 3,
194
        .stepping = 3,
195
        .features = PPRO_FEATURES,
196
        .ext_features = CPUID_EXT_SSE3,
197
        .xlevel = 0,
198
        .model_id = "QEMU Virtual CPU version " QEMU_VERSION,
199
    },
200
    {
201
        .name = "coreduo",
202
        .level = 10,
203
        .family = 6,
204
        .model = 14,
205
        .stepping = 8,
206
        /* The original CPU also implements these features:
207
               CPUID_DTS, CPUID_ACPI, CPUID_SS, CPUID_HT,
208
               CPUID_TM, CPUID_PBE */
209
        .features = PPRO_FEATURES | CPUID_VME |
210
            CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA,
211
        /* The original CPU also implements these ext features:
212
               CPUID_EXT_VMX, CPUID_EXT_EST, CPUID_EXT_TM2, CPUID_EXT_XTPR,
213
               CPUID_EXT_PDCM */
214
        .ext_features = CPUID_EXT_SSE3 | CPUID_EXT_MONITOR,
215
        .ext2_features = CPUID_EXT2_NX,
216
        .xlevel = 0x80000008,
217
        .model_id = "Genuine Intel(R) CPU           T2600  @ 2.16GHz",
218
    },
219
    {
220
        .name = "486",
221
        .level = 0,
222
        .family = 4,
223
        .model = 0,
224
        .stepping = 0,
225
        .features = I486_FEATURES,
226
        .xlevel = 0,
227
    },
228
    {
229
        .name = "pentium",
230
        .level = 1,
231
        .family = 5,
232
        .model = 4,
233
        .stepping = 3,
234
        .features = PENTIUM_FEATURES,
235
        .xlevel = 0,
236
    },
237
    {
238
        .name = "pentium2",
239
        .level = 2,
240
        .family = 6,
241
        .model = 5,
242
        .stepping = 2,
243
        .features = PENTIUM2_FEATURES,
244
        .xlevel = 0,
245
    },
246
    {
247
        .name = "pentium3",
248
        .level = 2,
249
        .family = 6,
250
        .model = 7,
251
        .stepping = 3,
252
        .features = PENTIUM3_FEATURES,
253
        .xlevel = 0,
254
    },
255
    {
256
        .name = "athlon",
257
        .level = 2,
258
        .vendor1 = 0x68747541, /* "Auth" */
259
        .vendor2 = 0x69746e65, /* "enti" */
260
        .vendor3 = 0x444d4163, /* "cAMD" */
261
        .family = 6,
262
        .model = 2,
263
        .stepping = 3,
264
        .features = PPRO_FEATURES | CPUID_PSE36 | CPUID_VME | CPUID_MTRR | CPUID_MCA,
265
        .ext2_features = (PPRO_FEATURES & 0x0183F3FF) | CPUID_EXT2_MMXEXT | CPUID_EXT2_3DNOW | CPUID_EXT2_3DNOWEXT,
266
        .xlevel = 0x80000008,
267
        /* XXX: put another string ? */
268
        .model_id = "QEMU Virtual CPU version " QEMU_VERSION,
269
    },
270
    {
271
        .name = "n270",
272
        /* original is on level 10 */
273
        .level = 5,
274
        .family = 6,
275
        .model = 28,
276
        .stepping = 2,
277
        .features = PPRO_FEATURES |
278
            CPUID_MTRR | CPUID_CLFLUSH | CPUID_MCA | CPUID_VME,
279
            /* Missing: CPUID_DTS | CPUID_ACPI | CPUID_SS |
280
             * CPUID_HT | CPUID_TM | CPUID_PBE */
281
            /* Some CPUs got no CPUID_SEP */
282
        .ext_features = CPUID_EXT_MONITOR |
283
            CPUID_EXT_SSE3 /* PNI */ | CPUID_EXT_SSSE3,
284
            /* Missing: CPUID_EXT_DSCPL | CPUID_EXT_EST |
285
             * CPUID_EXT_TM2 | CPUID_EXT_XTPR */
286
        .ext2_features = (PPRO_FEATURES & 0x0183F3FF) | CPUID_EXT2_NX,
287
        /* Missing: .ext3_features = CPUID_EXT3_LAHF_LM */
288
        .xlevel = 0x8000000A,
289
        .model_id = "Intel(R) Atom(TM) CPU N270   @ 1.60GHz",
290
    },
291
};
292

    
293
static int cpu_x86_find_by_name(x86_def_t *x86_cpu_def, const char *cpu_model)
294
{
295
    unsigned int i;
296
    x86_def_t *def;
297

    
298
    char *s = strdup(cpu_model);
299
    char *featurestr, *name = strtok(s, ",");
300
    uint32_t plus_features = 0, plus_ext_features = 0, plus_ext2_features = 0, plus_ext3_features = 0;
301
    uint32_t minus_features = 0, minus_ext_features = 0, minus_ext2_features = 0, minus_ext3_features = 0;
302
    int family = -1, model = -1, stepping = -1;
303

    
304
    def = NULL;
305
    for (i = 0; i < ARRAY_SIZE(x86_defs); i++) {
306
        if (strcmp(name, x86_defs[i].name) == 0) {
307
            def = &x86_defs[i];
308
            break;
309
        }
310
    }
311
    if (!def)
312
        goto error;
313
    memcpy(x86_cpu_def, def, sizeof(*def));
314

    
315
    featurestr = strtok(NULL, ",");
316

    
317
    while (featurestr) {
318
        char *val;
319
        if (featurestr[0] == '+') {
320
            add_flagname_to_bitmaps(featurestr + 1, &plus_features, &plus_ext_features, &plus_ext2_features, &plus_ext3_features);
321
        } else if (featurestr[0] == '-') {
322
            add_flagname_to_bitmaps(featurestr + 1, &minus_features, &minus_ext_features, &minus_ext2_features, &minus_ext3_features);
323
        } else if ((val = strchr(featurestr, '='))) {
324
            *val = 0; val++;
325
            if (!strcmp(featurestr, "family")) {
326
                char *err;
327
                family = strtol(val, &err, 10);
328
                if (!*val || *err || family < 0) {
329
                    fprintf(stderr, "bad numerical value %s\n", val);
330
                    goto error;
331
                }
332
                x86_cpu_def->family = family;
333
            } else if (!strcmp(featurestr, "model")) {
334
                char *err;
335
                model = strtol(val, &err, 10);
336
                if (!*val || *err || model < 0 || model > 0xff) {
337
                    fprintf(stderr, "bad numerical value %s\n", val);
338
                    goto error;
339
                }
340
                x86_cpu_def->model = model;
341
            } else if (!strcmp(featurestr, "stepping")) {
342
                char *err;
343
                stepping = strtol(val, &err, 10);
344
                if (!*val || *err || stepping < 0 || stepping > 0xf) {
345
                    fprintf(stderr, "bad numerical value %s\n", val);
346
                    goto error;
347
                }
348
                x86_cpu_def->stepping = stepping;
349
            } else if (!strcmp(featurestr, "vendor")) {
350
                if (strlen(val) != 12) {
351
                    fprintf(stderr, "vendor string must be 12 chars long\n");
352
                    goto error;
353
                }
354
                x86_cpu_def->vendor1 = 0;
355
                x86_cpu_def->vendor2 = 0;
356
                x86_cpu_def->vendor3 = 0;
357
                for(i = 0; i < 4; i++) {
358
                    x86_cpu_def->vendor1 |= ((uint8_t)val[i    ]) << (8 * i);
359
                    x86_cpu_def->vendor2 |= ((uint8_t)val[i + 4]) << (8 * i);
360
                    x86_cpu_def->vendor3 |= ((uint8_t)val[i + 8]) << (8 * i);
361
                }
362
            } else if (!strcmp(featurestr, "model_id")) {
363
                pstrcpy(x86_cpu_def->model_id, sizeof(x86_cpu_def->model_id),
364
                        val);
365
            } else {
366
                fprintf(stderr, "unrecognized feature %s\n", featurestr);
367
                goto error;
368
            }
369
        } else {
370
            fprintf(stderr, "feature string `%s' not in format (+feature|-feature|feature=xyz)\n", featurestr);
371
            goto error;
372
        }
373
        featurestr = strtok(NULL, ",");
374
    }
375
    x86_cpu_def->features |= plus_features;
376
    x86_cpu_def->ext_features |= plus_ext_features;
377
    x86_cpu_def->ext2_features |= plus_ext2_features;
378
    x86_cpu_def->ext3_features |= plus_ext3_features;
379
    x86_cpu_def->features &= ~minus_features;
380
    x86_cpu_def->ext_features &= ~minus_ext_features;
381
    x86_cpu_def->ext2_features &= ~minus_ext2_features;
382
    x86_cpu_def->ext3_features &= ~minus_ext3_features;
383
    free(s);
384
    return 0;
385

    
386
error:
387
    free(s);
388
    return -1;
389
}
390

    
391
void x86_cpu_list (FILE *f, int (*cpu_fprintf)(FILE *f, const char *fmt, ...))
392
{
393
    unsigned int i;
394

    
395
    for (i = 0; i < ARRAY_SIZE(x86_defs); i++)
396
        (*cpu_fprintf)(f, "x86 %16s\n", x86_defs[i].name);
397
}
398

    
399
static int cpu_x86_register (CPUX86State *env, const char *cpu_model)
400
{
401
    x86_def_t def1, *def = &def1;
402

    
403
    if (cpu_x86_find_by_name(def, cpu_model) < 0)
404
        return -1;
405
    if (def->vendor1) {
406
        env->cpuid_vendor1 = def->vendor1;
407
        env->cpuid_vendor2 = def->vendor2;
408
        env->cpuid_vendor3 = def->vendor3;
409
    } else {
410
        env->cpuid_vendor1 = CPUID_VENDOR_INTEL_1;
411
        env->cpuid_vendor2 = CPUID_VENDOR_INTEL_2;
412
        env->cpuid_vendor3 = CPUID_VENDOR_INTEL_3;
413
    }
414
    env->cpuid_level = def->level;
415
    if (def->family > 0x0f)
416
        env->cpuid_version = 0xf00 | ((def->family - 0x0f) << 20);
417
    else
418
        env->cpuid_version = def->family << 8;
419
    env->cpuid_version |= ((def->model & 0xf) << 4) | ((def->model >> 4) << 16);
420
    env->cpuid_version |= def->stepping;
421
    env->cpuid_features = def->features;
422
    env->pat = 0x0007040600070406ULL;
423
    env->cpuid_ext_features = def->ext_features;
424
    env->cpuid_ext2_features = def->ext2_features;
425
    env->cpuid_xlevel = def->xlevel;
426
    env->cpuid_ext3_features = def->ext3_features;
427
    {
428
        const char *model_id = def->model_id;
429
        int c, len, i;
430
        if (!model_id)
431
            model_id = "";
432
        len = strlen(model_id);
433
        for(i = 0; i < 48; i++) {
434
            if (i >= len)
435
                c = '\0';
436
            else
437
                c = (uint8_t)model_id[i];
438
            env->cpuid_model[i >> 2] |= c << (8 * (i & 3));
439
        }
440
    }
441
    return 0;
442
}
443

    
444
/* NOTE: must be called outside the CPU execute loop */
445
void cpu_reset(CPUX86State *env)
446
{
447
    int i;
448

    
449
    if (qemu_loglevel_mask(CPU_LOG_RESET)) {
450
        qemu_log("CPU Reset (CPU %d)\n", env->cpu_index);
451
        log_cpu_state(env, X86_DUMP_FPU | X86_DUMP_CCOP);
452
    }
453

    
454
    memset(env, 0, offsetof(CPUX86State, breakpoints));
455

    
456
    tlb_flush(env, 1);
457

    
458
    env->old_exception = -1;
459

    
460
    /* init to reset state */
461

    
462
#ifdef CONFIG_SOFTMMU
463
    env->hflags |= HF_SOFTMMU_MASK;
464
#endif
465
    env->hflags2 |= HF2_GIF_MASK;
466

    
467
    cpu_x86_update_cr0(env, 0x60000010);
468
    env->a20_mask = ~0x0;
469
    env->smbase = 0x30000;
470

    
471
    env->idt.limit = 0xffff;
472
    env->gdt.limit = 0xffff;
473
    env->ldt.limit = 0xffff;
474
    env->ldt.flags = DESC_P_MASK | (2 << DESC_TYPE_SHIFT);
475
    env->tr.limit = 0xffff;
476
    env->tr.flags = DESC_P_MASK | (11 << DESC_TYPE_SHIFT);
477

    
478
    cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff,
479
                           DESC_P_MASK | DESC_S_MASK | DESC_CS_MASK | DESC_R_MASK);
480
    cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff,
481
                           DESC_P_MASK | DESC_S_MASK | DESC_W_MASK);
482
    cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff,
483
                           DESC_P_MASK | DESC_S_MASK | DESC_W_MASK);
484
    cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff,
485
                           DESC_P_MASK | DESC_S_MASK | DESC_W_MASK);
486
    cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff,
487
                           DESC_P_MASK | DESC_S_MASK | DESC_W_MASK);
488
    cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff,
489
                           DESC_P_MASK | DESC_S_MASK | DESC_W_MASK);
490

    
491
    env->eip = 0xfff0;
492
    env->regs[R_EDX] = env->cpuid_version;
493

    
494
    env->eflags = 0x2;
495

    
496
    /* FPU init */
497
    for(i = 0;i < 8; i++)
498
        env->fptags[i] = 1;
499
    env->fpuc = 0x37f;
500

    
501
    env->mxcsr = 0x1f80;
502

    
503
    memset(env->dr, 0, sizeof(env->dr));
504
    env->dr[6] = DR6_FIXED_1;
505
    env->dr[7] = DR7_FIXED_1;
506
    cpu_breakpoint_remove_all(env, BP_CPU);
507
    cpu_watchpoint_remove_all(env, BP_CPU);
508
}
509

    
510
void cpu_x86_close(CPUX86State *env)
511
{
512
    qemu_free(env);
513
}
514

    
515
/***********************************************************/
516
/* x86 debug */
517

    
518
static const char *cc_op_str[] = {
519
    "DYNAMIC",
520
    "EFLAGS",
521

    
522
    "MULB",
523
    "MULW",
524
    "MULL",
525
    "MULQ",
526

    
527
    "ADDB",
528
    "ADDW",
529
    "ADDL",
530
    "ADDQ",
531

    
532
    "ADCB",
533
    "ADCW",
534
    "ADCL",
535
    "ADCQ",
536

    
537
    "SUBB",
538
    "SUBW",
539
    "SUBL",
540
    "SUBQ",
541

    
542
    "SBBB",
543
    "SBBW",
544
    "SBBL",
545
    "SBBQ",
546

    
547
    "LOGICB",
548
    "LOGICW",
549
    "LOGICL",
550
    "LOGICQ",
551

    
552
    "INCB",
553
    "INCW",
554
    "INCL",
555
    "INCQ",
556

    
557
    "DECB",
558
    "DECW",
559
    "DECL",
560
    "DECQ",
561

    
562
    "SHLB",
563
    "SHLW",
564
    "SHLL",
565
    "SHLQ",
566

    
567
    "SARB",
568
    "SARW",
569
    "SARL",
570
    "SARQ",
571
};
572

    
573
void cpu_dump_state(CPUState *env, FILE *f,
574
                    int (*cpu_fprintf)(FILE *f, const char *fmt, ...),
575
                    int flags)
576
{
577
    int eflags, i, nb;
578
    char cc_op_name[32];
579
    static const char *seg_name[6] = { "ES", "CS", "SS", "DS", "FS", "GS" };
580

    
581
    if (kvm_enabled())
582
        kvm_arch_get_registers(env);
583

    
584
    eflags = env->eflags;
585
#ifdef TARGET_X86_64
586
    if (env->hflags & HF_CS64_MASK) {
587
        cpu_fprintf(f,
588
                    "RAX=%016" PRIx64 " RBX=%016" PRIx64 " RCX=%016" PRIx64 " RDX=%016" PRIx64 "\n"
589
                    "RSI=%016" PRIx64 " RDI=%016" PRIx64 " RBP=%016" PRIx64 " RSP=%016" PRIx64 "\n"
590
                    "R8 =%016" PRIx64 " R9 =%016" PRIx64 " R10=%016" PRIx64 " R11=%016" PRIx64 "\n"
591
                    "R12=%016" PRIx64 " R13=%016" PRIx64 " R14=%016" PRIx64 " R15=%016" PRIx64 "\n"
592
                    "RIP=%016" PRIx64 " RFL=%08x [%c%c%c%c%c%c%c] CPL=%d II=%d A20=%d SMM=%d HLT=%d\n",
593
                    env->regs[R_EAX],
594
                    env->regs[R_EBX],
595
                    env->regs[R_ECX],
596
                    env->regs[R_EDX],
597
                    env->regs[R_ESI],
598
                    env->regs[R_EDI],
599
                    env->regs[R_EBP],
600
                    env->regs[R_ESP],
601
                    env->regs[8],
602
                    env->regs[9],
603
                    env->regs[10],
604
                    env->regs[11],
605
                    env->regs[12],
606
                    env->regs[13],
607
                    env->regs[14],
608
                    env->regs[15],
609
                    env->eip, eflags,
610
                    eflags & DF_MASK ? 'D' : '-',
611
                    eflags & CC_O ? 'O' : '-',
612
                    eflags & CC_S ? 'S' : '-',
613
                    eflags & CC_Z ? 'Z' : '-',
614
                    eflags & CC_A ? 'A' : '-',
615
                    eflags & CC_P ? 'P' : '-',
616
                    eflags & CC_C ? 'C' : '-',
617
                    env->hflags & HF_CPL_MASK,
618
                    (env->hflags >> HF_INHIBIT_IRQ_SHIFT) & 1,
619
                    (int)(env->a20_mask >> 20) & 1,
620
                    (env->hflags >> HF_SMM_SHIFT) & 1,
621
                    env->halted);
622
    } else
623
#endif
624
    {
625
        cpu_fprintf(f, "EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n"
626
                    "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n"
627
                    "EIP=%08x EFL=%08x [%c%c%c%c%c%c%c] CPL=%d II=%d A20=%d SMM=%d HLT=%d\n",
628
                    (uint32_t)env->regs[R_EAX],
629
                    (uint32_t)env->regs[R_EBX],
630
                    (uint32_t)env->regs[R_ECX],
631
                    (uint32_t)env->regs[R_EDX],
632
                    (uint32_t)env->regs[R_ESI],
633
                    (uint32_t)env->regs[R_EDI],
634
                    (uint32_t)env->regs[R_EBP],
635
                    (uint32_t)env->regs[R_ESP],
636
                    (uint32_t)env->eip, eflags,
637
                    eflags & DF_MASK ? 'D' : '-',
638
                    eflags & CC_O ? 'O' : '-',
639
                    eflags & CC_S ? 'S' : '-',
640
                    eflags & CC_Z ? 'Z' : '-',
641
                    eflags & CC_A ? 'A' : '-',
642
                    eflags & CC_P ? 'P' : '-',
643
                    eflags & CC_C ? 'C' : '-',
644
                    env->hflags & HF_CPL_MASK,
645
                    (env->hflags >> HF_INHIBIT_IRQ_SHIFT) & 1,
646
                    (int)(env->a20_mask >> 20) & 1,
647
                    (env->hflags >> HF_SMM_SHIFT) & 1,
648
                    env->halted);
649
    }
650

    
651
#ifdef TARGET_X86_64
652
    if (env->hflags & HF_LMA_MASK) {
653
        for(i = 0; i < 6; i++) {
654
            SegmentCache *sc = &env->segs[i];
655
            cpu_fprintf(f, "%s =%04x %016" PRIx64 " %08x %08x\n",
656
                        seg_name[i],
657
                        sc->selector,
658
                        sc->base,
659
                        sc->limit,
660
                        sc->flags);
661
        }
662
        cpu_fprintf(f, "LDT=%04x %016" PRIx64 " %08x %08x\n",
663
                    env->ldt.selector,
664
                    env->ldt.base,
665
                    env->ldt.limit,
666
                    env->ldt.flags);
667
        cpu_fprintf(f, "TR =%04x %016" PRIx64 " %08x %08x\n",
668
                    env->tr.selector,
669
                    env->tr.base,
670
                    env->tr.limit,
671
                    env->tr.flags);
672
        cpu_fprintf(f, "GDT=     %016" PRIx64 " %08x\n",
673
                    env->gdt.base, env->gdt.limit);
674
        cpu_fprintf(f, "IDT=     %016" PRIx64 " %08x\n",
675
                    env->idt.base, env->idt.limit);
676
        cpu_fprintf(f, "CR0=%08x CR2=%016" PRIx64 " CR3=%016" PRIx64 " CR4=%08x\n",
677
                    (uint32_t)env->cr[0],
678
                    env->cr[2],
679
                    env->cr[3],
680
                    (uint32_t)env->cr[4]);
681
        for(i = 0; i < 4; i++)
682
            cpu_fprintf(f, "DR%d=%016" PRIx64 " ", i, env->dr[i]);
683
        cpu_fprintf(f, "\nDR6=%016" PRIx64 " DR7=%016" PRIx64 "\n",
684
                    env->dr[6], env->dr[7]);
685
    } else
686
#endif
687
    {
688
        for(i = 0; i < 6; i++) {
689
            SegmentCache *sc = &env->segs[i];
690
            cpu_fprintf(f, "%s =%04x %08x %08x %08x\n",
691
                        seg_name[i],
692
                        sc->selector,
693
                        (uint32_t)sc->base,
694
                        sc->limit,
695
                        sc->flags);
696
        }
697
        cpu_fprintf(f, "LDT=%04x %08x %08x %08x\n",
698
                    env->ldt.selector,
699
                    (uint32_t)env->ldt.base,
700
                    env->ldt.limit,
701
                    env->ldt.flags);
702
        cpu_fprintf(f, "TR =%04x %08x %08x %08x\n",
703
                    env->tr.selector,
704
                    (uint32_t)env->tr.base,
705
                    env->tr.limit,
706
                    env->tr.flags);
707
        cpu_fprintf(f, "GDT=     %08x %08x\n",
708
                    (uint32_t)env->gdt.base, env->gdt.limit);
709
        cpu_fprintf(f, "IDT=     %08x %08x\n",
710
                    (uint32_t)env->idt.base, env->idt.limit);
711
        cpu_fprintf(f, "CR0=%08x CR2=%08x CR3=%08x CR4=%08x\n",
712
                    (uint32_t)env->cr[0],
713
                    (uint32_t)env->cr[2],
714
                    (uint32_t)env->cr[3],
715
                    (uint32_t)env->cr[4]);
716
        for(i = 0; i < 4; i++)
717
            cpu_fprintf(f, "DR%d=%08x ", i, env->dr[i]);
718
        cpu_fprintf(f, "\nDR6=%08x DR7=%08x\n", env->dr[6], env->dr[7]);
719
    }
720
    if (flags & X86_DUMP_CCOP) {
721
        if ((unsigned)env->cc_op < CC_OP_NB)
722
            snprintf(cc_op_name, sizeof(cc_op_name), "%s", cc_op_str[env->cc_op]);
723
        else
724
            snprintf(cc_op_name, sizeof(cc_op_name), "[%d]", env->cc_op);
725
#ifdef TARGET_X86_64
726
        if (env->hflags & HF_CS64_MASK) {
727
            cpu_fprintf(f, "CCS=%016" PRIx64 " CCD=%016" PRIx64 " CCO=%-8s\n",
728
                        env->cc_src, env->cc_dst,
729
                        cc_op_name);
730
        } else
731
#endif
732
        {
733
            cpu_fprintf(f, "CCS=%08x CCD=%08x CCO=%-8s\n",
734
                        (uint32_t)env->cc_src, (uint32_t)env->cc_dst,
735
                        cc_op_name);
736
        }
737
    }
738
    if (flags & X86_DUMP_FPU) {
739
        int fptag;
740
        fptag = 0;
741
        for(i = 0; i < 8; i++) {
742
            fptag |= ((!env->fptags[i]) << i);
743
        }
744
        cpu_fprintf(f, "FCW=%04x FSW=%04x [ST=%d] FTW=%02x MXCSR=%08x\n",
745
                    env->fpuc,
746
                    (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11,
747
                    env->fpstt,
748
                    fptag,
749
                    env->mxcsr);
750
        for(i=0;i<8;i++) {
751
#if defined(USE_X86LDOUBLE)
752
            union {
753
                long double d;
754
                struct {
755
                    uint64_t lower;
756
                    uint16_t upper;
757
                } l;
758
            } tmp;
759
            tmp.d = env->fpregs[i].d;
760
            cpu_fprintf(f, "FPR%d=%016" PRIx64 " %04x",
761
                        i, tmp.l.lower, tmp.l.upper);
762
#else
763
            cpu_fprintf(f, "FPR%d=%016" PRIx64,
764
                        i, env->fpregs[i].mmx.q);
765
#endif
766
            if ((i & 1) == 1)
767
                cpu_fprintf(f, "\n");
768
            else
769
                cpu_fprintf(f, " ");
770
        }
771
        if (env->hflags & HF_CS64_MASK)
772
            nb = 16;
773
        else
774
            nb = 8;
775
        for(i=0;i<nb;i++) {
776
            cpu_fprintf(f, "XMM%02d=%08x%08x%08x%08x",
777
                        i,
778
                        env->xmm_regs[i].XMM_L(3),
779
                        env->xmm_regs[i].XMM_L(2),
780
                        env->xmm_regs[i].XMM_L(1),
781
                        env->xmm_regs[i].XMM_L(0));
782
            if ((i & 1) == 1)
783
                cpu_fprintf(f, "\n");
784
            else
785
                cpu_fprintf(f, " ");
786
        }
787
    }
788
}
789

    
790
/***********************************************************/
791
/* x86 mmu */
792
/* XXX: add PGE support */
793

    
794
void cpu_x86_set_a20(CPUX86State *env, int a20_state)
795
{
796
    a20_state = (a20_state != 0);
797
    if (a20_state != ((env->a20_mask >> 20) & 1)) {
798
#if defined(DEBUG_MMU)
799
        printf("A20 update: a20=%d\n", a20_state);
800
#endif
801
        /* if the cpu is currently executing code, we must unlink it and
802
           all the potentially executing TB */
803
        cpu_interrupt(env, CPU_INTERRUPT_EXITTB);
804

    
805
        /* when a20 is changed, all the MMU mappings are invalid, so
806
           we must flush everything */
807
        tlb_flush(env, 1);
808
        env->a20_mask = (~0x100000) | (a20_state << 20);
809
    }
810
}
811

    
812
void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0)
813
{
814
    int pe_state;
815

    
816
#if defined(DEBUG_MMU)
817
    printf("CR0 update: CR0=0x%08x\n", new_cr0);
818
#endif
819
    if ((new_cr0 & (CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK)) !=
820
        (env->cr[0] & (CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK))) {
821
        tlb_flush(env, 1);
822
    }
823

    
824
#ifdef TARGET_X86_64
825
    if (!(env->cr[0] & CR0_PG_MASK) && (new_cr0 & CR0_PG_MASK) &&
826
        (env->efer & MSR_EFER_LME)) {
827
        /* enter in long mode */
828
        /* XXX: generate an exception */
829
        if (!(env->cr[4] & CR4_PAE_MASK))
830
            return;
831
        env->efer |= MSR_EFER_LMA;
832
        env->hflags |= HF_LMA_MASK;
833
    } else if ((env->cr[0] & CR0_PG_MASK) && !(new_cr0 & CR0_PG_MASK) &&
834
               (env->efer & MSR_EFER_LMA)) {
835
        /* exit long mode */
836
        env->efer &= ~MSR_EFER_LMA;
837
        env->hflags &= ~(HF_LMA_MASK | HF_CS64_MASK);
838
        env->eip &= 0xffffffff;
839
    }
840
#endif
841
    env->cr[0] = new_cr0 | CR0_ET_MASK;
842

    
843
    /* update PE flag in hidden flags */
844
    pe_state = (env->cr[0] & CR0_PE_MASK);
845
    env->hflags = (env->hflags & ~HF_PE_MASK) | (pe_state << HF_PE_SHIFT);
846
    /* ensure that ADDSEG is always set in real mode */
847
    env->hflags |= ((pe_state ^ 1) << HF_ADDSEG_SHIFT);
848
    /* update FPU flags */
849
    env->hflags = (env->hflags & ~(HF_MP_MASK | HF_EM_MASK | HF_TS_MASK)) |
850
        ((new_cr0 << (HF_MP_SHIFT - 1)) & (HF_MP_MASK | HF_EM_MASK | HF_TS_MASK));
851
}
852

    
853
/* XXX: in legacy PAE mode, generate a GPF if reserved bits are set in
854
   the PDPT */
855
void cpu_x86_update_cr3(CPUX86State *env, target_ulong new_cr3)
856
{
857
    env->cr[3] = new_cr3;
858
    if (env->cr[0] & CR0_PG_MASK) {
859
#if defined(DEBUG_MMU)
860
        printf("CR3 update: CR3=" TARGET_FMT_lx "\n", new_cr3);
861
#endif
862
        tlb_flush(env, 0);
863
    }
864
}
865

    
866
void cpu_x86_update_cr4(CPUX86State *env, uint32_t new_cr4)
867
{
868
#if defined(DEBUG_MMU)
869
    printf("CR4 update: CR4=%08x\n", (uint32_t)env->cr[4]);
870
#endif
871
    if ((new_cr4 & (CR4_PGE_MASK | CR4_PAE_MASK | CR4_PSE_MASK)) !=
872
        (env->cr[4] & (CR4_PGE_MASK | CR4_PAE_MASK | CR4_PSE_MASK))) {
873
        tlb_flush(env, 1);
874
    }
875
    /* SSE handling */
876
    if (!(env->cpuid_features & CPUID_SSE))
877
        new_cr4 &= ~CR4_OSFXSR_MASK;
878
    if (new_cr4 & CR4_OSFXSR_MASK)
879
        env->hflags |= HF_OSFXSR_MASK;
880
    else
881
        env->hflags &= ~HF_OSFXSR_MASK;
882

    
883
    env->cr[4] = new_cr4;
884
}
885

    
886
#if defined(CONFIG_USER_ONLY)
887

    
888
int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr,
889
                             int is_write, int mmu_idx, int is_softmmu)
890
{
891
    /* user mode only emulation */
892
    is_write &= 1;
893
    env->cr[2] = addr;
894
    env->error_code = (is_write << PG_ERROR_W_BIT);
895
    env->error_code |= PG_ERROR_U_MASK;
896
    env->exception_index = EXCP0E_PAGE;
897
    return 1;
898
}
899

    
900
target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
901
{
902
    return addr;
903
}
904

    
905
#else
906

    
907
/* XXX: This value should match the one returned by CPUID
908
 * and in exec.c */
909
#if defined(USE_KQEMU)
910
#define PHYS_ADDR_MASK 0xfffff000LL
911
#else
912
# if defined(TARGET_X86_64)
913
# define PHYS_ADDR_MASK 0xfffffff000LL
914
# else
915
# define PHYS_ADDR_MASK 0xffffff000LL
916
# endif
917
#endif
918

    
919
/* return value:
920
   -1 = cannot handle fault
921
   0  = nothing more to do
922
   1  = generate PF fault
923
   2  = soft MMU activation required for this block
924
*/
925
int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr,
926
                             int is_write1, int mmu_idx, int is_softmmu)
927
{
928
    uint64_t ptep, pte;
929
    target_ulong pde_addr, pte_addr;
930
    int error_code, is_dirty, prot, page_size, ret, is_write, is_user;
931
    target_phys_addr_t paddr;
932
    uint32_t page_offset;
933
    target_ulong vaddr, virt_addr;
934

    
935
    is_user = mmu_idx == MMU_USER_IDX;
936
#if defined(DEBUG_MMU)
937
    printf("MMU fault: addr=" TARGET_FMT_lx " w=%d u=%d eip=" TARGET_FMT_lx "\n",
938
           addr, is_write1, is_user, env->eip);
939
#endif
940
    is_write = is_write1 & 1;
941

    
942
    if (!(env->cr[0] & CR0_PG_MASK)) {
943
        pte = addr;
944
        virt_addr = addr & TARGET_PAGE_MASK;
945
        prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
946
        page_size = 4096;
947
        goto do_mapping;
948
    }
949

    
950
    if (env->cr[4] & CR4_PAE_MASK) {
951
        uint64_t pde, pdpe;
952
        target_ulong pdpe_addr;
953

    
954
#ifdef TARGET_X86_64
955
        if (env->hflags & HF_LMA_MASK) {
956
            uint64_t pml4e_addr, pml4e;
957
            int32_t sext;
958

    
959
            /* test virtual address sign extension */
960
            sext = (int64_t)addr >> 47;
961
            if (sext != 0 && sext != -1) {
962
                env->error_code = 0;
963
                env->exception_index = EXCP0D_GPF;
964
                return 1;
965
            }
966

    
967
            pml4e_addr = ((env->cr[3] & ~0xfff) + (((addr >> 39) & 0x1ff) << 3)) &
968
                env->a20_mask;
969
            pml4e = ldq_phys(pml4e_addr);
970
            if (!(pml4e & PG_PRESENT_MASK)) {
971
                error_code = 0;
972
                goto do_fault;
973
            }
974
            if (!(env->efer & MSR_EFER_NXE) && (pml4e & PG_NX_MASK)) {
975
                error_code = PG_ERROR_RSVD_MASK;
976
                goto do_fault;
977
            }
978
            if (!(pml4e & PG_ACCESSED_MASK)) {
979
                pml4e |= PG_ACCESSED_MASK;
980
                stl_phys_notdirty(pml4e_addr, pml4e);
981
            }
982
            ptep = pml4e ^ PG_NX_MASK;
983
            pdpe_addr = ((pml4e & PHYS_ADDR_MASK) + (((addr >> 30) & 0x1ff) << 3)) &
984
                env->a20_mask;
985
            pdpe = ldq_phys(pdpe_addr);
986
            if (!(pdpe & PG_PRESENT_MASK)) {
987
                error_code = 0;
988
                goto do_fault;
989
            }
990
            if (!(env->efer & MSR_EFER_NXE) && (pdpe & PG_NX_MASK)) {
991
                error_code = PG_ERROR_RSVD_MASK;
992
                goto do_fault;
993
            }
994
            ptep &= pdpe ^ PG_NX_MASK;
995
            if (!(pdpe & PG_ACCESSED_MASK)) {
996
                pdpe |= PG_ACCESSED_MASK;
997
                stl_phys_notdirty(pdpe_addr, pdpe);
998
            }
999
        } else
1000
#endif
1001
        {
1002
            /* XXX: load them when cr3 is loaded ? */
1003
            pdpe_addr = ((env->cr[3] & ~0x1f) + ((addr >> 27) & 0x18)) &
1004
                env->a20_mask;
1005
            pdpe = ldq_phys(pdpe_addr);
1006
            if (!(pdpe & PG_PRESENT_MASK)) {
1007
                error_code = 0;
1008
                goto do_fault;
1009
            }
1010
            ptep = PG_NX_MASK | PG_USER_MASK | PG_RW_MASK;
1011
        }
1012

    
1013
        pde_addr = ((pdpe & PHYS_ADDR_MASK) + (((addr >> 21) & 0x1ff) << 3)) &
1014
            env->a20_mask;
1015
        pde = ldq_phys(pde_addr);
1016
        if (!(pde & PG_PRESENT_MASK)) {
1017
            error_code = 0;
1018
            goto do_fault;
1019
        }
1020
        if (!(env->efer & MSR_EFER_NXE) && (pde & PG_NX_MASK)) {
1021
            error_code = PG_ERROR_RSVD_MASK;
1022
            goto do_fault;
1023
        }
1024
        ptep &= pde ^ PG_NX_MASK;
1025
        if (pde & PG_PSE_MASK) {
1026
            /* 2 MB page */
1027
            page_size = 2048 * 1024;
1028
            ptep ^= PG_NX_MASK;
1029
            if ((ptep & PG_NX_MASK) && is_write1 == 2)
1030
                goto do_fault_protect;
1031
            if (is_user) {
1032
                if (!(ptep & PG_USER_MASK))
1033
                    goto do_fault_protect;
1034
                if (is_write && !(ptep & PG_RW_MASK))
1035
                    goto do_fault_protect;
1036
            } else {
1037
                if ((env->cr[0] & CR0_WP_MASK) &&
1038
                    is_write && !(ptep & PG_RW_MASK))
1039
                    goto do_fault_protect;
1040
            }
1041
            is_dirty = is_write && !(pde & PG_DIRTY_MASK);
1042
            if (!(pde & PG_ACCESSED_MASK) || is_dirty) {
1043
                pde |= PG_ACCESSED_MASK;
1044
                if (is_dirty)
1045
                    pde |= PG_DIRTY_MASK;
1046
                stl_phys_notdirty(pde_addr, pde);
1047
            }
1048
            /* align to page_size */
1049
            pte = pde & ((PHYS_ADDR_MASK & ~(page_size - 1)) | 0xfff);
1050
            virt_addr = addr & ~(page_size - 1);
1051
        } else {
1052
            /* 4 KB page */
1053
            if (!(pde & PG_ACCESSED_MASK)) {
1054
                pde |= PG_ACCESSED_MASK;
1055
                stl_phys_notdirty(pde_addr, pde);
1056
            }
1057
            pte_addr = ((pde & PHYS_ADDR_MASK) + (((addr >> 12) & 0x1ff) << 3)) &
1058
                env->a20_mask;
1059
            pte = ldq_phys(pte_addr);
1060
            if (!(pte & PG_PRESENT_MASK)) {
1061
                error_code = 0;
1062
                goto do_fault;
1063
            }
1064
            if (!(env->efer & MSR_EFER_NXE) && (pte & PG_NX_MASK)) {
1065
                error_code = PG_ERROR_RSVD_MASK;
1066
                goto do_fault;
1067
            }
1068
            /* combine pde and pte nx, user and rw protections */
1069
            ptep &= pte ^ PG_NX_MASK;
1070
            ptep ^= PG_NX_MASK;
1071
            if ((ptep & PG_NX_MASK) && is_write1 == 2)
1072
                goto do_fault_protect;
1073
            if (is_user) {
1074
                if (!(ptep & PG_USER_MASK))
1075
                    goto do_fault_protect;
1076
                if (is_write && !(ptep & PG_RW_MASK))
1077
                    goto do_fault_protect;
1078
            } else {
1079
                if ((env->cr[0] & CR0_WP_MASK) &&
1080
                    is_write && !(ptep & PG_RW_MASK))
1081
                    goto do_fault_protect;
1082
            }
1083
            is_dirty = is_write && !(pte & PG_DIRTY_MASK);
1084
            if (!(pte & PG_ACCESSED_MASK) || is_dirty) {
1085
                pte |= PG_ACCESSED_MASK;
1086
                if (is_dirty)
1087
                    pte |= PG_DIRTY_MASK;
1088
                stl_phys_notdirty(pte_addr, pte);
1089
            }
1090
            page_size = 4096;
1091
            virt_addr = addr & ~0xfff;
1092
            pte = pte & (PHYS_ADDR_MASK | 0xfff);
1093
        }
1094
    } else {
1095
        uint32_t pde;
1096

    
1097
        /* page directory entry */
1098
        pde_addr = ((env->cr[3] & ~0xfff) + ((addr >> 20) & 0xffc)) &
1099
            env->a20_mask;
1100
        pde = ldl_phys(pde_addr);
1101
        if (!(pde & PG_PRESENT_MASK)) {
1102
            error_code = 0;
1103
            goto do_fault;
1104
        }
1105
        /* if PSE bit is set, then we use a 4MB page */
1106
        if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1107
            page_size = 4096 * 1024;
1108
            if (is_user) {
1109
                if (!(pde & PG_USER_MASK))
1110
                    goto do_fault_protect;
1111
                if (is_write && !(pde & PG_RW_MASK))
1112
                    goto do_fault_protect;
1113
            } else {
1114
                if ((env->cr[0] & CR0_WP_MASK) &&
1115
                    is_write && !(pde & PG_RW_MASK))
1116
                    goto do_fault_protect;
1117
            }
1118
            is_dirty = is_write && !(pde & PG_DIRTY_MASK);
1119
            if (!(pde & PG_ACCESSED_MASK) || is_dirty) {
1120
                pde |= PG_ACCESSED_MASK;
1121
                if (is_dirty)
1122
                    pde |= PG_DIRTY_MASK;
1123
                stl_phys_notdirty(pde_addr, pde);
1124
            }
1125

    
1126
            pte = pde & ~( (page_size - 1) & ~0xfff); /* align to page_size */
1127
            ptep = pte;
1128
            virt_addr = addr & ~(page_size - 1);
1129
        } else {
1130
            if (!(pde & PG_ACCESSED_MASK)) {
1131
                pde |= PG_ACCESSED_MASK;
1132
                stl_phys_notdirty(pde_addr, pde);
1133
            }
1134

    
1135
            /* page directory entry */
1136
            pte_addr = ((pde & ~0xfff) + ((addr >> 10) & 0xffc)) &
1137
                env->a20_mask;
1138
            pte = ldl_phys(pte_addr);
1139
            if (!(pte & PG_PRESENT_MASK)) {
1140
                error_code = 0;
1141
                goto do_fault;
1142
            }
1143
            /* combine pde and pte user and rw protections */
1144
            ptep = pte & pde;
1145
            if (is_user) {
1146
                if (!(ptep & PG_USER_MASK))
1147
                    goto do_fault_protect;
1148
                if (is_write && !(ptep & PG_RW_MASK))
1149
                    goto do_fault_protect;
1150
            } else {
1151
                if ((env->cr[0] & CR0_WP_MASK) &&
1152
                    is_write && !(ptep & PG_RW_MASK))
1153
                    goto do_fault_protect;
1154
            }
1155
            is_dirty = is_write && !(pte & PG_DIRTY_MASK);
1156
            if (!(pte & PG_ACCESSED_MASK) || is_dirty) {
1157
                pte |= PG_ACCESSED_MASK;
1158
                if (is_dirty)
1159
                    pte |= PG_DIRTY_MASK;
1160
                stl_phys_notdirty(pte_addr, pte);
1161
            }
1162
            page_size = 4096;
1163
            virt_addr = addr & ~0xfff;
1164
        }
1165
    }
1166
    /* the page can be put in the TLB */
1167
    prot = PAGE_READ;
1168
    if (!(ptep & PG_NX_MASK))
1169
        prot |= PAGE_EXEC;
1170
    if (pte & PG_DIRTY_MASK) {
1171
        /* only set write access if already dirty... otherwise wait
1172
           for dirty access */
1173
        if (is_user) {
1174
            if (ptep & PG_RW_MASK)
1175
                prot |= PAGE_WRITE;
1176
        } else {
1177
            if (!(env->cr[0] & CR0_WP_MASK) ||
1178
                (ptep & PG_RW_MASK))
1179
                prot |= PAGE_WRITE;
1180
        }
1181
    }
1182
 do_mapping:
1183
    pte = pte & env->a20_mask;
1184

    
1185
    /* Even if 4MB pages, we map only one 4KB page in the cache to
1186
       avoid filling it too fast */
1187
    page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1);
1188
    paddr = (pte & TARGET_PAGE_MASK) + page_offset;
1189
    vaddr = virt_addr + page_offset;
1190

    
1191
    ret = tlb_set_page_exec(env, vaddr, paddr, prot, mmu_idx, is_softmmu);
1192
    return ret;
1193
 do_fault_protect:
1194
    error_code = PG_ERROR_P_MASK;
1195
 do_fault:
1196
    error_code |= (is_write << PG_ERROR_W_BIT);
1197
    if (is_user)
1198
        error_code |= PG_ERROR_U_MASK;
1199
    if (is_write1 == 2 &&
1200
        (env->efer & MSR_EFER_NXE) &&
1201
        (env->cr[4] & CR4_PAE_MASK))
1202
        error_code |= PG_ERROR_I_D_MASK;
1203
    if (env->intercept_exceptions & (1 << EXCP0E_PAGE)) {
1204
        /* cr2 is not modified in case of exceptions */
1205
        stq_phys(env->vm_vmcb + offsetof(struct vmcb, control.exit_info_2), 
1206
                 addr);
1207
    } else {
1208
        env->cr[2] = addr;
1209
    }
1210
    env->error_code = error_code;
1211
    env->exception_index = EXCP0E_PAGE;
1212
    return 1;
1213
}
1214

    
1215
target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
1216
{
1217
    target_ulong pde_addr, pte_addr;
1218
    uint64_t pte;
1219
    target_phys_addr_t paddr;
1220
    uint32_t page_offset;
1221
    int page_size;
1222

    
1223
    if (env->cr[4] & CR4_PAE_MASK) {
1224
        target_ulong pdpe_addr;
1225
        uint64_t pde, pdpe;
1226

    
1227
#ifdef TARGET_X86_64
1228
        if (env->hflags & HF_LMA_MASK) {
1229
            uint64_t pml4e_addr, pml4e;
1230
            int32_t sext;
1231

    
1232
            /* test virtual address sign extension */
1233
            sext = (int64_t)addr >> 47;
1234
            if (sext != 0 && sext != -1)
1235
                return -1;
1236

    
1237
            pml4e_addr = ((env->cr[3] & ~0xfff) + (((addr >> 39) & 0x1ff) << 3)) &
1238
                env->a20_mask;
1239
            pml4e = ldq_phys(pml4e_addr);
1240
            if (!(pml4e & PG_PRESENT_MASK))
1241
                return -1;
1242

    
1243
            pdpe_addr = ((pml4e & ~0xfff) + (((addr >> 30) & 0x1ff) << 3)) &
1244
                env->a20_mask;
1245
            pdpe = ldq_phys(pdpe_addr);
1246
            if (!(pdpe & PG_PRESENT_MASK))
1247
                return -1;
1248
        } else
1249
#endif
1250
        {
1251
            pdpe_addr = ((env->cr[3] & ~0x1f) + ((addr >> 27) & 0x18)) &
1252
                env->a20_mask;
1253
            pdpe = ldq_phys(pdpe_addr);
1254
            if (!(pdpe & PG_PRESENT_MASK))
1255
                return -1;
1256
        }
1257

    
1258
        pde_addr = ((pdpe & ~0xfff) + (((addr >> 21) & 0x1ff) << 3)) &
1259
            env->a20_mask;
1260
        pde = ldq_phys(pde_addr);
1261
        if (!(pde & PG_PRESENT_MASK)) {
1262
            return -1;
1263
        }
1264
        if (pde & PG_PSE_MASK) {
1265
            /* 2 MB page */
1266
            page_size = 2048 * 1024;
1267
            pte = pde & ~( (page_size - 1) & ~0xfff); /* align to page_size */
1268
        } else {
1269
            /* 4 KB page */
1270
            pte_addr = ((pde & ~0xfff) + (((addr >> 12) & 0x1ff) << 3)) &
1271
                env->a20_mask;
1272
            page_size = 4096;
1273
            pte = ldq_phys(pte_addr);
1274
        }
1275
        if (!(pte & PG_PRESENT_MASK))
1276
            return -1;
1277
    } else {
1278
        uint32_t pde;
1279

    
1280
        if (!(env->cr[0] & CR0_PG_MASK)) {
1281
            pte = addr;
1282
            page_size = 4096;
1283
        } else {
1284
            /* page directory entry */
1285
            pde_addr = ((env->cr[3] & ~0xfff) + ((addr >> 20) & 0xffc)) & env->a20_mask;
1286
            pde = ldl_phys(pde_addr);
1287
            if (!(pde & PG_PRESENT_MASK))
1288
                return -1;
1289
            if ((pde & PG_PSE_MASK) && (env->cr[4] & CR4_PSE_MASK)) {
1290
                pte = pde & ~0x003ff000; /* align to 4MB */
1291
                page_size = 4096 * 1024;
1292
            } else {
1293
                /* page directory entry */
1294
                pte_addr = ((pde & ~0xfff) + ((addr >> 10) & 0xffc)) & env->a20_mask;
1295
                pte = ldl_phys(pte_addr);
1296
                if (!(pte & PG_PRESENT_MASK))
1297
                    return -1;
1298
                page_size = 4096;
1299
            }
1300
        }
1301
        pte = pte & env->a20_mask;
1302
    }
1303

    
1304
    page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1);
1305
    paddr = (pte & TARGET_PAGE_MASK) + page_offset;
1306
    return paddr;
1307
}
1308

    
1309
void hw_breakpoint_insert(CPUState *env, int index)
1310
{
1311
    int type, err = 0;
1312

    
1313
    switch (hw_breakpoint_type(env->dr[7], index)) {
1314
    case 0:
1315
        if (hw_breakpoint_enabled(env->dr[7], index))
1316
            err = cpu_breakpoint_insert(env, env->dr[index], BP_CPU,
1317
                                        &env->cpu_breakpoint[index]);
1318
        break;
1319
    case 1:
1320
        type = BP_CPU | BP_MEM_WRITE;
1321
        goto insert_wp;
1322
    case 2:
1323
         /* No support for I/O watchpoints yet */
1324
        break;
1325
    case 3:
1326
        type = BP_CPU | BP_MEM_ACCESS;
1327
    insert_wp:
1328
        err = cpu_watchpoint_insert(env, env->dr[index],
1329
                                    hw_breakpoint_len(env->dr[7], index),
1330
                                    type, &env->cpu_watchpoint[index]);
1331
        break;
1332
    }
1333
    if (err)
1334
        env->cpu_breakpoint[index] = NULL;
1335
}
1336

    
1337
void hw_breakpoint_remove(CPUState *env, int index)
1338
{
1339
    if (!env->cpu_breakpoint[index])
1340
        return;
1341
    switch (hw_breakpoint_type(env->dr[7], index)) {
1342
    case 0:
1343
        if (hw_breakpoint_enabled(env->dr[7], index))
1344
            cpu_breakpoint_remove_by_ref(env, env->cpu_breakpoint[index]);
1345
        break;
1346
    case 1:
1347
    case 3:
1348
        cpu_watchpoint_remove_by_ref(env, env->cpu_watchpoint[index]);
1349
        break;
1350
    case 2:
1351
        /* No support for I/O watchpoints yet */
1352
        break;
1353
    }
1354
}
1355

    
1356
int check_hw_breakpoints(CPUState *env, int force_dr6_update)
1357
{
1358
    target_ulong dr6;
1359
    int reg, type;
1360
    int hit_enabled = 0;
1361

    
1362
    dr6 = env->dr[6] & ~0xf;
1363
    for (reg = 0; reg < 4; reg++) {
1364
        type = hw_breakpoint_type(env->dr[7], reg);
1365
        if ((type == 0 && env->dr[reg] == env->eip) ||
1366
            ((type & 1) && env->cpu_watchpoint[reg] &&
1367
             (env->cpu_watchpoint[reg]->flags & BP_WATCHPOINT_HIT))) {
1368
            dr6 |= 1 << reg;
1369
            if (hw_breakpoint_enabled(env->dr[7], reg))
1370
                hit_enabled = 1;
1371
        }
1372
    }
1373
    if (hit_enabled || force_dr6_update)
1374
        env->dr[6] = dr6;
1375
    return hit_enabled;
1376
}
1377

    
1378
static CPUDebugExcpHandler *prev_debug_excp_handler;
1379

    
1380
void raise_exception(int exception_index);
1381

    
1382
static void breakpoint_handler(CPUState *env)
1383
{
1384
    CPUBreakpoint *bp;
1385

    
1386
    if (env->watchpoint_hit) {
1387
        if (env->watchpoint_hit->flags & BP_CPU) {
1388
            env->watchpoint_hit = NULL;
1389
            if (check_hw_breakpoints(env, 0))
1390
                raise_exception(EXCP01_DB);
1391
            else
1392
                cpu_resume_from_signal(env, NULL);
1393
        }
1394
    } else {
1395
        TAILQ_FOREACH(bp, &env->breakpoints, entry)
1396
            if (bp->pc == env->eip) {
1397
                if (bp->flags & BP_CPU) {
1398
                    check_hw_breakpoints(env, 1);
1399
                    raise_exception(EXCP01_DB);
1400
                }
1401
                break;
1402
            }
1403
    }
1404
    if (prev_debug_excp_handler)
1405
        prev_debug_excp_handler(env);
1406
}
1407
#endif /* !CONFIG_USER_ONLY */
1408

    
1409
static void host_cpuid(uint32_t function, uint32_t count,
1410
                       uint32_t *eax, uint32_t *ebx,
1411
                       uint32_t *ecx, uint32_t *edx)
1412
{
1413
#if defined(CONFIG_KVM)
1414
    uint32_t vec[4];
1415

    
1416
#ifdef __x86_64__
1417
    asm volatile("cpuid"
1418
                 : "=a"(vec[0]), "=b"(vec[1]),
1419
                   "=c"(vec[2]), "=d"(vec[3])
1420
                 : "0"(function), "c"(count) : "cc");
1421
#else
1422
    asm volatile("pusha \n\t"
1423
                 "cpuid \n\t"
1424
                 "mov %%eax, 0(%2) \n\t"
1425
                 "mov %%ebx, 4(%2) \n\t"
1426
                 "mov %%ecx, 8(%2) \n\t"
1427
                 "mov %%edx, 12(%2) \n\t"
1428
                 "popa"
1429
                 : : "a"(function), "c"(count), "S"(vec)
1430
                 : "memory", "cc");
1431
#endif
1432

    
1433
    if (eax)
1434
        *eax = vec[0];
1435
    if (ebx)
1436
        *ebx = vec[1];
1437
    if (ecx)
1438
        *ecx = vec[2];
1439
    if (edx)
1440
        *edx = vec[3];
1441
#endif
1442
}
1443

    
1444
void cpu_x86_cpuid(CPUX86State *env, uint32_t index, uint32_t count,
1445
                   uint32_t *eax, uint32_t *ebx,
1446
                   uint32_t *ecx, uint32_t *edx)
1447
{
1448
    /* test if maximum index reached */
1449
    if (index & 0x80000000) {
1450
        if (index > env->cpuid_xlevel)
1451
            index = env->cpuid_level;
1452
    } else {
1453
        if (index > env->cpuid_level)
1454
            index = env->cpuid_level;
1455
    }
1456

    
1457
    switch(index) {
1458
    case 0:
1459
        *eax = env->cpuid_level;
1460
        *ebx = env->cpuid_vendor1;
1461
        *edx = env->cpuid_vendor2;
1462
        *ecx = env->cpuid_vendor3;
1463

    
1464
        /* sysenter isn't supported on compatibility mode on AMD.  and syscall
1465
         * isn't supported in compatibility mode on Intel.  so advertise the
1466
         * actuall cpu, and say goodbye to migration between different vendors
1467
         * is you use compatibility mode. */
1468
        if (kvm_enabled())
1469
            host_cpuid(0, 0, NULL, ebx, ecx, edx);
1470
        break;
1471
    case 1:
1472
        *eax = env->cpuid_version;
1473
        *ebx = (env->cpuid_apic_id << 24) | 8 << 8; /* CLFLUSH size in quad words, Linux wants it. */
1474
        *ecx = env->cpuid_ext_features;
1475
        *edx = env->cpuid_features;
1476

    
1477
        /* "Hypervisor present" bit required for Microsoft SVVP */
1478
        if (kvm_enabled())
1479
            *ecx |= (1 << 31);
1480
        break;
1481
    case 2:
1482
        /* cache info: needed for Pentium Pro compatibility */
1483
        *eax = 1;
1484
        *ebx = 0;
1485
        *ecx = 0;
1486
        *edx = 0x2c307d;
1487
        break;
1488
    case 4:
1489
        /* cache info: needed for Core compatibility */
1490
        switch (count) {
1491
            case 0: /* L1 dcache info */
1492
                *eax = 0x0000121;
1493
                *ebx = 0x1c0003f;
1494
                *ecx = 0x000003f;
1495
                *edx = 0x0000001;
1496
                break;
1497
            case 1: /* L1 icache info */
1498
                *eax = 0x0000122;
1499
                *ebx = 0x1c0003f;
1500
                *ecx = 0x000003f;
1501
                *edx = 0x0000001;
1502
                break;
1503
            case 2: /* L2 cache info */
1504
                *eax = 0x0000143;
1505
                *ebx = 0x3c0003f;
1506
                *ecx = 0x0000fff;
1507
                *edx = 0x0000001;
1508
                break;
1509
            default: /* end of info */
1510
                *eax = 0;
1511
                *ebx = 0;
1512
                *ecx = 0;
1513
                *edx = 0;
1514
                break;
1515
        }
1516
        break;
1517
    case 5:
1518
        /* mwait info: needed for Core compatibility */
1519
        *eax = 0; /* Smallest monitor-line size in bytes */
1520
        *ebx = 0; /* Largest monitor-line size in bytes */
1521
        *ecx = CPUID_MWAIT_EMX | CPUID_MWAIT_IBE;
1522
        *edx = 0;
1523
        break;
1524
    case 6:
1525
        /* Thermal and Power Leaf */
1526
        *eax = 0;
1527
        *ebx = 0;
1528
        *ecx = 0;
1529
        *edx = 0;
1530
        break;
1531
    case 9:
1532
        /* Direct Cache Access Information Leaf */
1533
        *eax = 0; /* Bits 0-31 in DCA_CAP MSR */
1534
        *ebx = 0;
1535
        *ecx = 0;
1536
        *edx = 0;
1537
        break;
1538
    case 0xA:
1539
        /* Architectural Performance Monitoring Leaf */
1540
        *eax = 0;
1541
        *ebx = 0;
1542
        *ecx = 0;
1543
        *edx = 0;
1544
        break;
1545
    case 0x80000000:
1546
        *eax = env->cpuid_xlevel;
1547
        *ebx = env->cpuid_vendor1;
1548
        *edx = env->cpuid_vendor2;
1549
        *ecx = env->cpuid_vendor3;
1550
        break;
1551
    case 0x80000001:
1552
        *eax = env->cpuid_features;
1553
        *ebx = 0;
1554
        *ecx = env->cpuid_ext3_features;
1555
        *edx = env->cpuid_ext2_features;
1556

    
1557
        if (kvm_enabled()) {
1558
            uint32_t h_eax, h_edx;
1559

    
1560
            host_cpuid(index, 0, &h_eax, NULL, NULL, &h_edx);
1561

    
1562
            /* disable CPU features that the host does not support */
1563

    
1564
            /* long mode */
1565
            if ((h_edx & 0x20000000) == 0 /* || !lm_capable_kernel */)
1566
                *edx &= ~0x20000000;
1567
            /* syscall */
1568
            if ((h_edx & 0x00000800) == 0)
1569
                *edx &= ~0x00000800;
1570
            /* nx */
1571
            if ((h_edx & 0x00100000) == 0)
1572
                *edx &= ~0x00100000;
1573

    
1574
            /* disable CPU features that KVM cannot support */
1575

    
1576
            /* svm */
1577
            *ecx &= ~4UL;
1578
            /* 3dnow */
1579
            *edx &= ~0xc0000000;
1580
        }
1581
        break;
1582
    case 0x80000002:
1583
    case 0x80000003:
1584
    case 0x80000004:
1585
        *eax = env->cpuid_model[(index - 0x80000002) * 4 + 0];
1586
        *ebx = env->cpuid_model[(index - 0x80000002) * 4 + 1];
1587
        *ecx = env->cpuid_model[(index - 0x80000002) * 4 + 2];
1588
        *edx = env->cpuid_model[(index - 0x80000002) * 4 + 3];
1589
        break;
1590
    case 0x80000005:
1591
        /* cache info (L1 cache) */
1592
        *eax = 0x01ff01ff;
1593
        *ebx = 0x01ff01ff;
1594
        *ecx = 0x40020140;
1595
        *edx = 0x40020140;
1596
        break;
1597
    case 0x80000006:
1598
        /* cache info (L2 cache) */
1599
        *eax = 0;
1600
        *ebx = 0x42004200;
1601
        *ecx = 0x02008140;
1602
        *edx = 0;
1603
        break;
1604
    case 0x80000008:
1605
        /* virtual & phys address size in low 2 bytes. */
1606
/* XXX: This value must match the one used in the MMU code. */ 
1607
        if (env->cpuid_ext2_features & CPUID_EXT2_LM) {
1608
            /* 64 bit processor */
1609
#if defined(USE_KQEMU)
1610
            *eax = 0x00003020;        /* 48 bits virtual, 32 bits physical */
1611
#else
1612
/* XXX: The physical address space is limited to 42 bits in exec.c. */
1613
            *eax = 0x00003028;        /* 48 bits virtual, 40 bits physical */
1614
#endif
1615
        } else {
1616
#if defined(USE_KQEMU)
1617
            *eax = 0x00000020;        /* 32 bits physical */
1618
#else
1619
            if (env->cpuid_features & CPUID_PSE36)
1620
                *eax = 0x00000024; /* 36 bits physical */
1621
            else
1622
                *eax = 0x00000020; /* 32 bits physical */
1623
#endif
1624
        }
1625
        *ebx = 0;
1626
        *ecx = 0;
1627
        *edx = 0;
1628
        break;
1629
    case 0x8000000A:
1630
        *eax = 0x00000001; /* SVM Revision */
1631
        *ebx = 0x00000010; /* nr of ASIDs */
1632
        *ecx = 0;
1633
        *edx = 0; /* optional features */
1634
        break;
1635
    default:
1636
        /* reserved values: zero */
1637
        *eax = 0;
1638
        *ebx = 0;
1639
        *ecx = 0;
1640
        *edx = 0;
1641
        break;
1642
    }
1643
}
1644

    
1645
CPUX86State *cpu_x86_init(const char *cpu_model)
1646
{
1647
    CPUX86State *env;
1648
    static int inited;
1649

    
1650
    env = qemu_mallocz(sizeof(CPUX86State));
1651
    cpu_exec_init(env);
1652
    env->cpu_model_str = cpu_model;
1653

    
1654
    /* init various static tables */
1655
    if (!inited) {
1656
        inited = 1;
1657
        optimize_flags_init();
1658
#ifndef CONFIG_USER_ONLY
1659
        prev_debug_excp_handler =
1660
            cpu_set_debug_excp_handler(breakpoint_handler);
1661
#endif
1662
    }
1663
    if (cpu_x86_register(env, cpu_model) < 0) {
1664
        cpu_x86_close(env);
1665
        return NULL;
1666
    }
1667
    cpu_reset(env);
1668
#ifdef USE_KQEMU
1669
    kqemu_init(env);
1670
#endif
1671
    if (kvm_enabled())
1672
        kvm_init_vcpu(env);
1673
    return env;
1674
}