Skip to content

Commit ce77442

Browse files
fix x87 register layout
1 parent f4ceaec commit ce77442

File tree

13 files changed

+404
-655
lines changed

13 files changed

+404
-655
lines changed

src/codeview/codeview.h

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,14 @@ X(IP, 31, eip, 0, 2) \
7878
X(FLAGS, 32, eflags, 0, 2) \
7979
X(EIP, 33, eip, 0, 4) \
8080
X(EFLAGS, 34, eflags, 0, 4) \
81-
X(MM0, 146, fpr0, 0, 8) \
82-
X(MM1, 147, fpr1, 0, 8) \
83-
X(MM2, 148, fpr2, 0, 8) \
84-
X(MM3, 149, fpr3, 0, 8) \
85-
X(MM4, 150, fpr4, 0, 8) \
86-
X(MM5, 151, fpr5, 0, 8) \
87-
X(MM6, 152, fpr6, 0, 8) \
88-
X(MM7, 153, fpr7, 0, 8) \
81+
X(MM0, 146, st0, 0, 8) \
82+
X(MM1, 147, st1, 0, 8) \
83+
X(MM2, 148, st2, 0, 8) \
84+
X(MM3, 149, st3, 0, 8) \
85+
X(MM4, 150, st4, 0, 8) \
86+
X(MM5, 151, st5, 0, 8) \
87+
X(MM6, 152, st6, 0, 8) \
88+
X(MM7, 153, st7, 0, 8) \
8989
X(XMM0, 154, ymm0, 0, 16) \
9090
X(XMM1, 155, ymm1, 0, 16) \
9191
X(XMM2, 156, ymm2, 0, 16) \
@@ -382,14 +382,14 @@ X(FPDS, 142, nil, 0, 0) \
382382
X(ISEM, 143, nil, 0, 0) \
383383
X(FPEIP, 144, nil, 0, 0) \
384384
X(FPEDO, 145, nil, 0, 0) \
385-
X(MM0, 146, fpr0, 0, 8) \
386-
X(MM1, 147, fpr1, 0, 8) \
387-
X(MM2, 148, fpr2, 0, 8) \
388-
X(MM3, 149, fpr3, 0, 8) \
389-
X(MM4, 150, fpr4, 0, 8) \
390-
X(MM5, 151, fpr5, 0, 8) \
391-
X(MM6, 152, fpr6, 0, 8) \
392-
X(MM7, 153, fpr7, 0, 8) \
385+
X(MM0, 146, st0, 0, 8) \
386+
X(MM1, 147, st1, 0, 8) \
387+
X(MM2, 148, st2, 0, 8) \
388+
X(MM3, 149, st3, 0, 8) \
389+
X(MM4, 150, st4, 0, 8) \
390+
X(MM5, 151, st5, 0, 8) \
391+
X(MM6, 152, st6, 0, 8) \
392+
X(MM7, 153, st7, 0, 8) \
393393
X(XMM0, 154, zmm0, 0, 16) \
394394
X(XMM1, 155, zmm1, 0, 16) \
395395
X(XMM2, 156, zmm2, 0, 16) \
@@ -463,22 +463,22 @@ X(EMM4H, 232, zmm4, 8, 8) \
463463
X(EMM5H, 233, zmm5, 8, 8) \
464464
X(EMM6H, 234, zmm6, 8, 8) \
465465
X(EMM7H, 235, zmm7, 8, 8) \
466-
X(MM00, 236, fpr0, 0, 4) \
467-
X(MM01, 237, fpr0, 4, 4) \
468-
X(MM10, 238, fpr1, 0, 4) \
469-
X(MM11, 239, fpr1, 4, 4) \
470-
X(MM20, 240, fpr2, 0, 4) \
471-
X(MM21, 241, fpr2, 4, 4) \
472-
X(MM30, 242, fpr3, 0, 4) \
473-
X(MM31, 243, fpr3, 4, 4) \
474-
X(MM40, 244, fpr4, 0, 4) \
475-
X(MM41, 245, fpr4, 4, 4) \
476-
X(MM50, 246, fpr5, 0, 4) \
477-
X(MM51, 247, fpr5, 4, 4) \
478-
X(MM60, 248, fpr6, 0, 4) \
479-
X(MM61, 249, fpr6, 4, 4) \
480-
X(MM70, 250, fpr7, 0, 4) \
481-
X(MM71, 251, fpr7, 4, 4) \
466+
X(MM00, 236, st0, 0, 4) \
467+
X(MM01, 237, st0, 4, 4) \
468+
X(MM10, 238, st1, 0, 4) \
469+
X(MM11, 239, st1, 4, 4) \
470+
X(MM20, 240, st2, 0, 4) \
471+
X(MM21, 241, st2, 4, 4) \
472+
X(MM30, 242, st3, 0, 4) \
473+
X(MM31, 243, st3, 4, 4) \
474+
X(MM40, 244, st4, 0, 4) \
475+
X(MM41, 245, st4, 4, 4) \
476+
X(MM50, 246, st5, 0, 4) \
477+
X(MM51, 247, st5, 4, 4) \
478+
X(MM60, 248, st6, 0, 4) \
479+
X(MM61, 249, st6, 4, 4) \
480+
X(MM70, 250, st7, 0, 4) \
481+
X(MM71, 251, st7, 4, 4) \
482482
X(XMM8, 252, zmm8, 0, 16) \
483483
X(XMM9, 253, zmm9, 0, 16) \
484484
X(XMM10, 254, zmm10, 0, 16) \

src/demon/linux/demon_core_linux.c

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,10 +1038,10 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread)
10381038
// copy x87 registers
10391039
dst->fcw.u16 = src->fcw;
10401040
dst->fsw.u16 = src->fsw;
1041-
dst->ftw.u16 = x64_xsave_tag_word_from_real_tag_word(src->ftw);
1041+
dst->ftw = src->ftw;
10421042
dst->fop.u16 = src->fop;
1043-
dst->fip.u64 = src->b64.fip;
1044-
dst->fdp.u64 = src->b64.fdp;
1043+
dst->fip.u64 = src->fip;
1044+
dst->fdp.u64 = src->fdp;
10451045
dst->mxcsr.u32 = src->mxcsr;
10461046
dst->mxcsr_mask.u32 = src->mxcsr_mask;
10471047
for EachIndex(i, 8)
@@ -1063,6 +1063,9 @@ dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread)
10631063
// copy xsave registers
10641064
if(xsave)
10651065
{
1066+
// compact register layout is not supported
1067+
AssertAlways(xsave->header.xcomp_bv == 0);
1068+
10661069
if(xsave->header.xstate_bv & X64_XStateComponentFlag_AVX)
10671070
{
10681071
AssertAlways(process->xsave_layout.avx_offset + 16*sizeof(REGS_Reg128) <= process->xsave_size);
@@ -1219,14 +1222,14 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread)
12191222

12201223
X64_FXSave dst_fxsave = {0};
12211224
{
1222-
dst_fxsave.fcw = src->fcw.u16;
1223-
dst_fxsave.fsw = src->fsw.u16;
1224-
dst_fxsave.ftw = src->ftw.u16;
1225-
dst_fxsave.fop = src->fop.u16;
1226-
dst_fxsave.b64.fip = src->fip.u64;
1227-
dst_fxsave.b64.fdp = src->fdp.u64;
1228-
dst_fxsave.mxcsr = src->mxcsr.u32;
1229-
dst_fxsave.mxcsr_mask = src->mxcsr_mask.u32;
1225+
dst_fxsave.fcw = src->fcw.u16;
1226+
dst_fxsave.fsw = src->fsw.u16;
1227+
dst_fxsave.ftw = src->ftw;
1228+
dst_fxsave.fop = src->fop.u16;
1229+
dst_fxsave.fip = src->fip.u64;
1230+
dst_fxsave.fdp = src->fdp.u64;
1231+
dst_fxsave.mxcsr = src->mxcsr.u32;
1232+
dst_fxsave.mxcsr_mask = src->mxcsr_mask.u32;
12301233

12311234
REGS_Reg128 *st_d = (REGS_Reg128 *)dst_fxsave.st_space;
12321235
REGS_Reg80 *st_s = &src->st0;
@@ -1248,6 +1251,7 @@ dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread)
12481251
U8 *xsave_raw = push_array(scratch.arena, U8, process->xsave_size);
12491252
X64_XSave *dst = (X64_XSave *)xsave_raw;
12501253
dst->fxsave = dst_fxsave;
1254+
dst->header.xstate_bv |= X64_XStateComponentFlag_FP;
12511255
dst->header.xstate_bv |= X64_XStateComponentFlag_SSE;
12521256

12531257
if(process->xsave_layout.avx_offset)

src/demon/win32/demon_core_win32.c

Lines changed: 12 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -582,57 +582,6 @@ dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr)
582582

583583
//- rjf: threads
584584

585-
internal U16
586-
dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave)
587-
{
588-
U16 result = 0;
589-
U32 top = (fxsave->StatusWord >> 11) & 7;
590-
for(U32 fpr = 0; fpr < 8; fpr += 1)
591-
{
592-
U32 tag = 3;
593-
if(fxsave->TagWord & (1 << fpr))
594-
{
595-
U32 st = (fpr - top)&7;
596-
597-
REGS_Reg80 *fp = (REGS_Reg80*)&fxsave->FloatRegisters[st*16];
598-
U16 exponent = fp->sign1_exp15 & bitmask15;
599-
U64 integer_part = fp->int1_frac63 >> 63;
600-
U64 fraction_part = fp->int1_frac63 & bitmask63;
601-
602-
// tag: 0 - normal; 1 - zero; 2 - special
603-
tag = 2;
604-
if(exponent == 0)
605-
{
606-
if(integer_part == 0 && fraction_part == 0)
607-
{
608-
tag = 1;
609-
}
610-
}
611-
else if(exponent != bitmask15 && integer_part != 0)
612-
{
613-
tag = 0;
614-
}
615-
}
616-
result |= tag << (2 * fpr);
617-
}
618-
return result;
619-
}
620-
621-
internal U16
622-
dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw)
623-
{
624-
U16 compact = 0;
625-
for(U32 fpr = 0; fpr < 8; fpr++)
626-
{
627-
U32 tag = (ftw >> (fpr * 2)) & 3;
628-
if(tag != 3)
629-
{
630-
compact |= (1 << fpr);
631-
}
632-
}
633-
return compact;
634-
}
635-
636585
internal B32
637586
dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block)
638587
{
@@ -694,7 +643,7 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block)
694643
dst->eflags.u32 = ctx.EFlags | 0x2;
695644
dst->fcw.u16 = fxsave->ControlWord;
696645
dst->fsw.u16 = fxsave->StatusWord;
697-
dst->ftw.u16 = dmn_w32_real_tag_word_from_xsave(fxsave);
646+
dst->ftw.u16 = fxsave->TagWord;
698647
dst->fop.u16 = fxsave->ErrorOpcode;
699648
dst->fip.u32 = fxsave->ErrorOffset;
700649
dst->fcs.u16 = fxsave->ErrorSelector;
@@ -704,7 +653,7 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block)
704653
dst->mxcsr_mask.u32 = fxsave->MxCsr_Mask;
705654
{
706655
M128A *float_s = fxsave->FloatRegisters;
707-
REGS_Reg80 *float_d = &dst->fpr0;
656+
REGS_Reg80 *float_d = &dst->st0;
708657
for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1)
709658
{
710659
MemoryCopy(float_d, float_s, sizeof(*float_d));
@@ -817,17 +766,15 @@ dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block)
817766
dst->rflags.u64 = ctx->EFlags | 0x2;
818767
dst->fcw.u16 = xsave->ControlWord;
819768
dst->fsw.u16 = xsave->StatusWord;
820-
dst->ftw.u16 = dmn_w32_real_tag_word_from_xsave(xsave);
769+
dst->ftw = xsave->TagWord;
821770
dst->fop.u16 = xsave->ErrorOpcode;
822-
dst->fcs.u16 = xsave->ErrorSelector;
823-
dst->fds.u16 = xsave->DataSelector;
824-
dst->fip.u64 = xsave->ErrorOffset;
825-
dst->fdp.u64 = xsave->DataOffset;
771+
MemoryCopy(&dst->fip.u64, &xsave->ErrorOffset, sizeof(U64));
772+
MemoryCopy(&dst->fdp.u64, &xsave->DataOffset, sizeof(U64));
826773
dst->mxcsr.u32 = xsave->MxCsr;
827774
dst->mxcsr_mask.u32 = xsave->MxCsr_Mask;
828775
{
829776
M128A *float_s = xsave->FloatRegisters;
830-
REGS_Reg80 *float_d = &dst->fpr0;
777+
REGS_Reg80 *float_d = &dst->st0;
831778
for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1)
832779
{
833780
MemoryCopy(float_d, float_s, sizeof(*float_d));
@@ -991,7 +938,7 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block)
991938
ctx.EFlags = src->eflags.u32;
992939
fxsave->ControlWord = src->fcw.u16;
993940
fxsave->StatusWord = src->fsw.u16;
994-
fxsave->TagWord = dmn_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16);
941+
fxsave->TagWord = src->ftw.u16;
995942
fxsave->ErrorOpcode = src->fop.u16;
996943
fxsave->ErrorSelector = src->fcs.u16;
997944
fxsave->DataSelector = src->fds.u16;
@@ -1001,7 +948,7 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block)
1001948
fxsave->MxCsr_Mask = src->mxcsr_mask.u32;
1002949
{
1003950
M128A *float_d = fxsave->FloatRegisters;
1004-
REGS_Reg80 *float_s = &src->fpr0;
951+
REGS_Reg80 *float_s = &src->st0;
1005952
for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1)
1006953
{
1007954
MemoryCopy(float_d, float_s, 10);
@@ -1098,15 +1045,13 @@ dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block)
10981045
ctx->EFlags = src->rflags.u64;
10991046
fxsave->ControlWord = src->fcw.u16;
11001047
fxsave->StatusWord = src->fsw.u16;
1101-
fxsave->TagWord = dmn_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16);
1048+
fxsave->TagWord = src->ftw;
11021049
fxsave->ErrorOpcode = src->fop.u16;
1103-
fxsave->ErrorSelector = src->fcs.u16;
1104-
fxsave->DataSelector = src->fds.u16;
1105-
fxsave->ErrorOffset = src->fip.u64;
1106-
fxsave->DataOffset = src->fdp.u64;
1050+
MemoryCopy(&fxsave->ErrorOffset, &src->fip.u64, sizeof(U64));
1051+
MemoryCopy(&fxsave->DataOffset, &src->fdp.u64, sizeof(U64));
11071052
{
11081053
M128A *float_d = fxsave->FloatRegisters;
1109-
REGS_Reg80 *float_s = &src->fpr0;
1054+
REGS_Reg80 *float_s = &src->st0;
11101055
for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1)
11111056
{
11121057
MemoryCopy(float_d, float_s, 10);

src/demon/win32/demon_core_win32.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,8 +350,6 @@ internal String16 dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle,
350350
internal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr);
351351

352352
//- rjf: threads
353-
internal U16 dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave);
354-
internal U16 dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw);
355353
internal B32 dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block);
356354
internal B32 dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block);
357355

src/dwarf/dwarf.h

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,14 +1618,14 @@ X(Xmm4, 25, ymm4, 0, 16) \
16181618
X(Xmm5, 26, ymm5, 0, 16) \
16191619
X(Xmm6, 27, ymm6, 0, 16) \
16201620
X(Xmm7, 28, ymm7, 0, 16) \
1621-
X(Mm0, 29, fpr0, 0, 8) \
1622-
X(Mm1, 30, fpr1, 0, 8) \
1623-
X(Mm2, 31, fpr2, 0, 8) \
1624-
X(Mm3, 32, fpr3, 0, 8) \
1625-
X(Mm4, 33, fpr4, 0, 8) \
1626-
X(Mm5, 34, fpr5, 0, 8) \
1627-
X(Mm6, 35, fpr6, 0, 8) \
1628-
X(Mm7, 36, fpr7, 0, 8) \
1621+
X(Mm0, 29, st0, 0, 8) \
1622+
X(Mm1, 30, st1, 0, 8) \
1623+
X(Mm2, 31, st2, 0, 8) \
1624+
X(Mm3, 32, st3, 0, 8) \
1625+
X(Mm4, 33, st4, 0, 8) \
1626+
X(Mm5, 34, st5, 0, 8) \
1627+
X(Mm6, 35, st6, 0, 8) \
1628+
X(Mm7, 36, st7, 0, 8) \
16291629
X(Fcw, 37, fcw, 0, 2) \
16301630
X(Fsw, 38, fsw, 0, 2) \
16311631
X(Mxcsr, 39, mxcsr, 0, 4) \
@@ -1635,8 +1635,8 @@ X(Ss, 42, ss, 0, 2) \
16351635
X(Ds, 43, ds, 0, 2) \
16361636
X(Fs, 44, fs, 0, 2) \
16371637
X(Gs, 45, gs, 0, 2) \
1638-
X(Tr, 48, tr, 0, 0) \
1639-
X(Ldtr, 49, ldtr, 0, 0)
1638+
X(Tr, 48, tr, 0, 0) \
1639+
X(Ldtr, 49, ldtr, 0, 0)
16401640

16411641
#define DW_Regs_X64_XList(X) \
16421642
X(Rax, 0, rax, 0, 8) \
@@ -1696,14 +1696,14 @@ X(St4, 37, st4, 0, 10) \
16961696
X(St5, 38, st5, 0, 10) \
16971697
X(St6, 39, st6, 0, 10) \
16981698
X(St7, 40, st7, 0, 10) \
1699-
X(Mm0, 41, fpr0, 0, 8) \
1700-
X(Mm1, 42, fpr1, 0, 8) \
1701-
X(Mm2, 43, fpr2, 0, 8) \
1702-
X(Mm3, 44, fpr3, 0, 8) \
1703-
X(Mm4, 45, fpr4, 0, 8) \
1704-
X(Mm5, 46, fpr5, 0, 8) \
1705-
X(Mm6, 47, fpr6, 0, 8) \
1706-
X(Mm7, 48, fpr7, 0, 8) \
1699+
X(Mm0, 41, st0, 0, 8) \
1700+
X(Mm1, 42, st1, 0, 8) \
1701+
X(Mm2, 43, st2, 0, 8) \
1702+
X(Mm3, 44, st3, 0, 8) \
1703+
X(Mm4, 45, st4, 0, 8) \
1704+
X(Mm5, 46, st5, 0, 8) \
1705+
X(Mm6, 47, st6, 0, 8) \
1706+
X(Mm7, 48, st7, 0, 8) \
17071707
X(Rflags, 49, rflags, 0, 4) \
17081708
X(Es, 50, es, 0, 2) \
17091709
X(Cs, 51, cs, 0, 2) \

0 commit comments

Comments
 (0)