@@ -85,7 +85,10 @@ static void reg_reset(struct uc_struct *uc)
85
85
env -> fpstt = 0 ; /* top of stack index */
86
86
env -> fpus = 0 ;
87
87
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 );
89
92
90
93
env -> mxcsr = 0 ;
91
94
memset (env -> xmm_regs , 0 , sizeof (env -> xmm_regs ));
@@ -96,7 +99,10 @@ static void reg_reset(struct uc_struct *uc)
96
99
97
100
memset (env -> opmask_regs , 0 , sizeof (env -> opmask_regs ));
98
101
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
+
100
106
/* sysenter registers */
101
107
env -> sysenter_cs = 0 ;
102
108
env -> sysenter_esp = 0 ;
@@ -162,6 +168,15 @@ static void reg_reset(struct uc_struct *uc)
162
168
env -> hflags &= ~(HF_ADDSEG_MASK );
163
169
env -> efer |= MSR_EFER_LMA | MSR_EFER_LME ; // extended mode activated
164
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 );
165
180
/* If we are operating in 64bit mode then add the Long Mode flag
166
181
* to the CPUID feature flag
167
182
*/
0 commit comments