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)
|