Skip to content

Commit 1dae6bb

Browse files
committed
Correctly implement CR4
1 parent 8dcaa33 commit 1dae6bb

File tree

1 file changed

+17
-2
lines changed

1 file changed

+17
-2
lines changed

qemu/target/i386/unicorn.c

+17-2
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,10 @@ static void reg_reset(struct uc_struct *uc)
8585
env->fpstt = 0; /* top of stack index */
8686
env->fpus = 0;
8787
env->fpuc = 0;
88-
memset(env->fptags, 0, sizeof(env->fptags)); /* 0 = valid, 1 = empty */
88+
for (int i = 0; i < 8; i++) {
89+
env->fptags[i] = 1;
90+
}
91+
cpu_set_fpuc(env, 0x37f);
8992

9093
env->mxcsr = 0;
9194
memset(env->xmm_regs, 0, sizeof(env->xmm_regs));
@@ -96,7 +99,10 @@ static void reg_reset(struct uc_struct *uc)
9699

97100
memset(env->opmask_regs, 0, sizeof(env->opmask_regs));
98101
memset(env->zmmh_regs, 0, sizeof(env->zmmh_regs));
99-
102+
memset(env->dr, 0, sizeof(env->dr));
103+
env->dr[6] = DR6_FIXED_1;
104+
env->dr[7] = DR7_FIXED_1;
105+
100106
/* sysenter registers */
101107
env->sysenter_cs = 0;
102108
env->sysenter_esp = 0;
@@ -162,6 +168,15 @@ static void reg_reset(struct uc_struct *uc)
162168
env->hflags &= ~(HF_ADDSEG_MASK);
163169
env->efer |= MSR_EFER_LMA | MSR_EFER_LME; // extended mode activated
164170
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);
165180
/* If we are operating in 64bit mode then add the Long Mode flag
166181
* to the CPUID feature flag
167182
*/

0 commit comments

Comments
 (0)