Skip to content

Commit d00d000

Browse files
committed
[win/asan] GetInstructionSize: Support some more 4 byte instructions.
This patch adds several instructions seen when trying to run a executable built with ASan with llvm-mingw. (x86 and x86_64, using the git tip in llvm-project). Also includes instructions collected by Roman Pišl and Eric Pouech in the Wine bug reports below. Related: #96270 Co-authored-by: Roman Pišl <[email protected]> https://bugs.winehq.org/show_bug.cgi?id=50993 https://bugs.winehq.org/attachment.cgi?id=70233 Co-authored-by: Eric Pouech <[email protected]> https://bugs.winehq.org/show_bug.cgi?id=52386 https://bugs.winehq.org/attachment.cgi?id=71626
1 parent 5790bfe commit d00d000

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

compiler-rt/lib/interception/interception_win.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,8 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {
654654
}
655655

656656
switch (0x00FFFFFF & *(u32 *)address) {
657+
case 0x244C8D: // 8D 4C 24 XX : lea ecx, [esp + XX]
658+
return 4;
657659
case 0x24A48D: // 8D A4 24 XX XX XX XX : lea esp, [esp + XX XX XX XX]
658660
return 7;
659661
}
@@ -817,6 +819,8 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {
817819
case 0x588948: // 48 89 58 XX : mov QWORD PTR[rax + XX], rbx
818820
case 0xec8348: // 48 83 ec XX : sub rsp, XX
819821
case 0xf88349: // 49 83 f8 XX : cmp r8, XX
822+
case 0x148d4e: // 4e 8d 14 XX : lea r10, [rcx+r8*XX]
823+
case 0x398366: // 66 83 39 XX : cmp WORD PTR [rcx], XX
820824
return 4;
821825

822826
case 0x246483: // 83 64 24 XX YY : and DWORD PTR [rsp+XX], YY
@@ -871,7 +875,13 @@ static size_t GetInstructionSize(uptr address, size_t* rel_offset = nullptr) {
871875
}
872876

873877
switch (*(u32*)(address)) {
878+
case 0x01b60f44: // 44 0f b6 01 : movzx r8d, BYTE PTR [rcx]
879+
case 0x09b60f44: // 44 0f b6 09 : movzx r9d, BYTE PTR [rcx]
880+
case 0x0ab60f44: // 44 0f b6 0a : movzx r8d, BYTE PTR [rdx]
881+
case 0x11b60f44: // 44 0f b6 11 : movzx r10d, BYTE PTR [rcx]
874882
case 0x1ab60f44: // 44 0f b6 1a : movzx r11d, BYTE PTR [rdx]
883+
case 0x11048d4c: // 4c 8d 04 11 : lea r8,[rcx+rdx*1]
884+
case 0xff488d49: // 49 8d 48 ff : lea rcx,[r8-0x1]
875885
return 4;
876886
case 0x24448b48: // 48 8b 44 24 XX : mov rax, QWORD ptr [rsp + XX]
877887
case 0x246c8948: // 48 89 6C 24 XX : mov QWORD ptr [rsp + XX], rbp

compiler-rt/lib/interception/tests/interception_win_test.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,7 @@ const struct InstructionSizeData {
889889
{ 3, {0x8B, 0x55, 0x72}, 0, "8B 55 XX : mov XX(%ebp), edx"},
890890
{ 3, {0x8B, 0x75, 0x72}, 0, "8B 75 XX : mov XX(%ebp), esp"},
891891
{ 3, {0xc2, 0x71, 0x72}, 0, "C2 XX XX : ret XX (needed for registering weak functions)"},
892+
{ 4, {0x8D, 0x4C, 0x24}, 0, "8D 4C 24 XX : lea ecx, [esp + XX]"},
892893
{ 5, {0x68, 0x71, 0x72, 0x73, 0x74}, 0, "68 XX XX XX XX : push imm32"},
893894
{ 5, {0xb8, 0x71, 0x72, 0x73, 0x74}, 0, "b8 XX XX XX XX : mov eax, XX XX XX XX"},
894895
{ 5, {0xB9, 0x71, 0x72, 0x73, 0x74}, 0, "b9 XX XX XX XX : mov ecx, XX XX XX XX"},
@@ -986,11 +987,19 @@ const struct InstructionSizeData {
986987
{ 3, {0x4d, 0x85, 0xf6}, 0, "4d 85 f6 : test r14, r14"},
987988
{ 3, {0x4d, 0x85, 0xff}, 0, "4d 85 ff : test r15, r15"},
988989
{ 3, {0xf6, 0xc1, 0x72}, 0, "f6 c1 XX : test cl, XX"},
990+
{ 4, {0x44, 0x0f, 0xb6, 0x01}, 0, "44 0f b6 01 : movzx r8d, BYTE PTR [rcx]"},
991+
{ 4, {0x44, 0x0f, 0xb6, 0x09}, 0, "44 0f b6 09 : movzx r9d, BYTE PTR [rcx]"},
992+
{ 4, {0x44, 0x0f, 0xb6, 0x0a}, 0, "44 0f b6 0a : movzx r8d, BYTE PTR [rdx]"},
993+
{ 4, {0x44, 0x0f, 0xb6, 0x11}, 0, "44 0f b6 11 : movzx r10d, BYTE PTR [rcx]"},
989994
{ 4, {0x44, 0x0f, 0xb6, 0x1a}, 0, "44 0f b6 1a : movzx r11d, BYTE PTR [rdx]"},
990995
{ 4, {0x44, 0x8d, 0x42, 0x73}, 0, "44 8d 42 XX : lea r8d , [rdx + XX]"},
991996
{ 4, {0x48, 0x83, 0xec, 0x73}, 0, "48 83 ec XX : sub rsp, XX"},
992997
{ 4, {0x48, 0x89, 0x58, 0x73}, 0, "48 89 58 XX : mov QWORD PTR[rax + XX], rbx"},
993998
{ 4, {0x49, 0x83, 0xf8, 0x73}, 0, "49 83 f8 XX : cmp r8, XX"},
999+
{ 4, {0x49, 0x8d, 0x48, 0xff}, 0, "49 8d 48 ff : lea rcx,[r8-0x1]"},
1000+
{ 4, {0x4c, 0x8d, 0x04, 0x11}, 0, "4c 8d 04 11 : lea r8,[rcx+rdx*1]"},
1001+
{ 4, {0x4e, 0x8d, 0x14, 0x73}, 0, "4e 8d 14 XX : lea r10, [rcx+r8*XX]"},
1002+
{ 4, {0x66, 0x83, 0x39, 0x73}, 0, "66 83 39 XX : cmp WORD PTR [rcx], XX"},
9941003
{ 4, {0x80, 0x78, 0x72, 0x73}, 0, "80 78 YY XX : cmp BYTE PTR [rax+YY], XX"},
9951004
{ 4, {0x80, 0x79, 0x72, 0x73}, 0, "80 79 YY XX : cmp BYTE ptr [rcx+YY], XX"},
9961005
{ 4, {0x80, 0x7A, 0x72, 0x73}, 0, "80 7A YY XX : cmp BYTE PTR [rdx+YY], XX"},

0 commit comments

Comments
 (0)