Revision ffddfee3

b/target-i386/cpu.h
352 352
    CPUTLBEntry tlb_read[2][CPU_TLB_SIZE];
353 353
    CPUTLBEntry tlb_write[2][CPU_TLB_SIZE];
354 354
    
355
    /* from this point: preserved by CPU reset */
355 356
    /* ice debug support */
356 357
    uint32_t breakpoints[MAX_BREAKPOINTS];
357 358
    int nb_breakpoints;
b/target-i386/helper2.c
45 45
CPUX86State *cpu_x86_init(void)
46 46
{
47 47
    CPUX86State *env;
48
    int i;
49 48
    static int inited;
50 49

  
51 50
    cpu_exec_init();
......
54 53
    if (!env)
55 54
        return NULL;
56 55
    memset(env, 0, sizeof(CPUX86State));
56
    /* init various static tables */
57
    if (!inited) {
58
        inited = 1;
59
        optimize_flags_init();
60
    }
61
#ifdef USE_CODE_COPY
62
    /* testing code for code copy case */
63
    {
64
        struct modify_ldt_ldt_s ldt;
57 65

  
58
    /* init to reset state */
66
        ldt.entry_number = 1;
67
        ldt.base_addr = (unsigned long)env;
68
        ldt.limit = (sizeof(CPUState) + 0xfff) >> 12;
69
        ldt.seg_32bit = 1;
70
        ldt.contents = MODIFY_LDT_CONTENTS_DATA;
71
        ldt.read_exec_only = 0;
72
        ldt.limit_in_pages = 1;
73
        ldt.seg_not_present = 0;
74
        ldt.useable = 1;
75
        modify_ldt(1, &ldt, sizeof(ldt)); /* write ldt entry */
76
        
77
        asm volatile ("movl %0, %%fs" : : "r" ((1 << 3) | 7));
78
        cpu_single_env = env;
79
    }
80
#endif
81
    cpu_reset(env);
82
    return env;
83
}
84

  
85
/* NOTE: must be called outside the CPU execute loop */
86
void cpu_reset(CPUX86State *env)
87
{
88
    int i;
89

  
90
    memset(env, 0, offsetof(CPUX86State, breakpoints));
59 91

  
60 92
    tlb_flush(env, 1);
93

  
94
    /* init to reset state */
95

  
61 96
#ifdef CONFIG_SOFTMMU
62 97
    env->hflags |= HF_SOFTMMU_MASK;
63 98
#endif
......
89 124
    for(i = 0;i < 8; i++)
90 125
        env->fptags[i] = 1;
91 126
    env->fpuc = 0x37f;
92
    
93
    /* init various static tables */
94
    if (!inited) {
95
        inited = 1;
96
        optimize_flags_init();
97
    }
98
#ifdef USE_CODE_COPY
99
    /* testing code for code copy case */
100
    {
101
        struct modify_ldt_ldt_s ldt;
102

  
103
        ldt.entry_number = 1;
104
        ldt.base_addr = (unsigned long)env;
105
        ldt.limit = (sizeof(CPUState) + 0xfff) >> 12;
106
        ldt.seg_32bit = 1;
107
        ldt.contents = MODIFY_LDT_CONTENTS_DATA;
108
        ldt.read_exec_only = 0;
109
        ldt.limit_in_pages = 1;
110
        ldt.seg_not_present = 0;
111
        ldt.useable = 1;
112
        modify_ldt(1, &ldt, sizeof(ldt)); /* write ldt entry */
113
        
114
        asm volatile ("movl %0, %%fs" : : "r" ((1 << 3) | 7));
115
        cpu_single_env = env;
116
    }
117
#endif
118
    return env;
119 127
}
120 128

  
121 129
void cpu_x86_close(CPUX86State *env)

Also available in: Unified diff