Skip to content

Commit 0f6ec4c

Browse files
committed
Also initialize CR4 for UC_MODE_32
1 parent 1dae6bb commit 0f6ec4c

File tree

1 file changed

+22
-11
lines changed

1 file changed

+22
-11
lines changed

qemu/target/i386/unicorn.c

+22-11
Original file line numberDiff line numberDiff line change
@@ -160,29 +160,40 @@ static void reg_reset(struct uc_struct *uc)
160160
break;
161161
case UC_MODE_32:
162162
env->hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_OSFXSR_MASK;
163-
cpu_x86_update_cr0(env, CR0_PE_MASK); // protected mode
164163
break;
165164
case UC_MODE_64:
166165
env->hflags |= HF_CS32_MASK | HF_SS32_MASK | HF_CS64_MASK |
167166
HF_LMA_MASK | HF_OSFXSR_MASK;
168167
env->hflags &= ~(HF_ADDSEG_MASK);
169168
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+
180170
/* If we are operating in 64bit mode then add the Long Mode flag
181171
* to the CPUID feature flag
182172
*/
183173
env->features[FEAT_8000_0001_EDX] |= CPUID_EXT2_LM;
184174
break;
185175
}
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+
}
186197
}
187198

188199
static int x86_msr_read(CPUX86State *env, uc_x86_msr *msr)

0 commit comments

Comments
 (0)