@@ -160,29 +160,40 @@ static void reg_reset(struct uc_struct *uc)
160
160
break ;
161
161
case UC_MODE_32 :
162
162
env -> hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_OSFXSR_MASK ;
163
- cpu_x86_update_cr0 (env , CR0_PE_MASK ); // protected mode
164
163
break ;
165
164
case UC_MODE_64 :
166
165
env -> hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK |
167
166
HF_LMA_MASK | HF_OSFXSR_MASK ;
168
167
env -> hflags &= ~(HF_ADDSEG_MASK );
169
168
env -> efer |= MSR_EFER_LMA | MSR_EFER_LME ; // extended mode activated
170
- cpu_x86_update_cr0 (env , CR0_PE_MASK ); // protected mode
171
- uint32_t cr4 = 0 ;
172
-
173
- if (env -> features [FEAT_1_ECX ] & CPUID_EXT_XSAVE ) {
174
- cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK ;
175
- }
176
- if (env -> features [FEAT_7_0_EBX ] & CPUID_7_0_EBX_FSGSBASE ) {
177
- cr4 |= CR4_FSGSBASE_MASK ;
178
- }
179
- cpu_x86_update_cr4 (env , cr4 );
169
+
180
170
/* If we are operating in 64bit mode then add the Long Mode flag
181
171
* to the CPUID feature flag
182
172
*/
183
173
env -> features [FEAT_8000_0001_EDX ] |= CPUID_EXT2_LM ;
184
174
break ;
185
175
}
176
+
177
+ // CR initialization
178
+ switch (uc -> mode ) {
179
+ case UC_MODE_32 :
180
+ case UC_MODE_64 : {
181
+ uint32_t cr4 = 0 ;
182
+
183
+ if (env -> features [FEAT_1_ECX ] & CPUID_EXT_XSAVE ) {
184
+ cr4 |= CR4_OSFXSR_MASK | CR4_OSXSAVE_MASK ;
185
+ }
186
+ if (env -> features [FEAT_7_0_EBX ] & CPUID_7_0_EBX_FSGSBASE ) {
187
+ cr4 |= CR4_FSGSBASE_MASK ;
188
+ }
189
+
190
+ cpu_x86_update_cr0 (env , CR0_PE_MASK ); // protected mode
191
+ cpu_x86_update_cr4 (env , cr4 );
192
+ break ;
193
+ }
194
+ default :
195
+ break ;
196
+ }
186
197
}
187
198
188
199
static int x86_msr_read (CPUX86State * env , uc_x86_msr * msr )
0 commit comments