@@ -1245,12 +1245,10 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread)
12451245
12461246 if (x64_is_xsave_supported ())
12471247 {
1248- U8 * xsave_raw = push_array (scratch .arena , U8 , process -> xsave_size );
1249- int xsave_get = OS_LNX_RETRY_ON_EINTR (ptrace (PTRACE_GETREGSET , tid , (void * )NT_PRSTATUS , & (struct iovec ){ .iov_base = xsave_raw , .iov_len = process -> xsave_size }));
1250- AssertAlways (xsave_get >= 0 );
1251-
1252- X64_XSave * dst = (X64_XSave * )xsave_raw ;
1248+ U8 * xsave_raw = push_array (scratch .arena , U8 , process -> xsave_size );
1249+ X64_XSave * dst = (X64_XSave * )xsave_raw ;
12531250 dst -> fxsave = dst_fxsave ;
1251+ dst -> header .xstate_bv |= X64_XStateComponentFlag_SSE ;
12541252
12551253 if (process -> xsave_layout .avx_offset )
12561254 {
@@ -1262,6 +1260,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread)
12621260 {
12631261 MemoryCopy (& avx_d [n ], & zmm_s [n ].v [16 ], sizeof (REGS_Reg128 ));
12641262 }
1263+ dst -> header .xstate_bv |= X64_XStateComponentFlag_AVX ;
12651264 }
12661265 }
12671266
@@ -1275,6 +1274,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread)
12751274 {
12761275 MemoryCopy (& kmask_d [n ], & kmask_s [n ], sizeof (REGS_Reg64 ));
12771276 }
1277+ dst -> header .xstate_bv |= X64_XStateComponentFlag_OPMASK ;
12781278 }
12791279 else { Assert (0 && "invalid xsave size" ); }
12801280 }
@@ -1289,6 +1289,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread)
12891289 {
12901290 MemoryCopy (& avx512h_d [n ], & zmmh_s [n ].v [32 ], sizeof (REGS_Reg256 ));
12911291 }
1292+ dst -> header .xstate_bv |= X64_XStateComponentFlag_ZMM_H ;
12921293 }
12931294 else { Assert (0 && "invalid xsave size" ); }
12941295 }
@@ -1303,6 +1304,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread)
13031304 {
13041305 MemoryCopy (& avx512_d [n ], & zmm_s [n ], sizeof (REGS_Reg512 ));
13051306 }
1307+ dst -> header .xstate_bv |= X64_XStateComponentFlag_ZMM ;
13061308 }
13071309 else { Assert (0 && "invalid xsave size" ); }
13081310 }
@@ -1314,11 +1316,13 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread)
13141316 REGS_Reg64 * cet_u = (REGS_Reg64 * )(xsave_raw + process -> xsave_layout .cet_u_offset );
13151317 cet_u [0 ] = src -> cetmsr ;
13161318 cet_u [1 ] = src -> cetssp ;
1319+ dst -> header .xstate_bv |= X64_XStateComponentFlag_CETU ;
13171320 }
13181321 else { Assert (0 && "invalid xsave size" ); }
13191322 }
13201323
13211324 // xsave
1325+ Assert (dst -> header .xcomp_bv == 0 ); // must always be zero
13221326 xsave_result = OS_LNX_RETRY_ON_EINTR (ptrace (PTRACE_SETREGSET , tid , (void * )NT_X86_XSTATE , & (struct iovec ){ .iov_base = dst , .iov_len = process -> xsave_size }));
13231327 Assert (xsave_result >= 0 );
13241328 }
0 commit comments