Skip to content

Commit f4ceaec

Browse files
set flags in xstate_bv for updated registers
1 parent 38dbcde commit f4ceaec

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

src/demon/linux/demon_core_linux.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)