Skip to content

Commit

Permalink
Merge pull request #3459 from Sonicadvance1/fix_591
Browse files Browse the repository at this point in the history
Capture a 64-bit process trying to jump to 32-bit syscall handler
  • Loading branch information
Sonicadvance1 authored Feb 27, 2024
2 parents 118b8b2 + 4f028b8 commit 946c805
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 0 deletions.
3 changes: 3 additions & 0 deletions FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5213,6 +5213,9 @@ void OpDispatchBuilder::INTOp(OpcodeArgs) {
constexpr uint8_t SYSCALL_LITERAL = 0x2E;
#endif
if (Literal == SYSCALL_LITERAL) {
if (CTX->Config.Is64BitMode()) [[unlikely]] {
ERROR_AND_DIE_FMT("[Unsupported] Trying to execute 32-bit syscall from a 64-bit process.");
}
// Syscall on linux
SyscallOp<false>(Op);
return;
Expand Down
32 changes: 32 additions & 0 deletions unittests/ASM/FEX_bugs/32bit_syscall.asm
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
%ifdef CONFIG
{
"RegData": {
"RAX": "0"
}
}
%endif

; 32-bit:
; 265 = clock_gettime
; 64-bit
; 265 = linkat

; rax = syscall on both 32-bit and 64-bit
mov rax, 265

; rdi/rbx = first argument on 64-bit and 32-bit respectively
mov rdi, 0
mov rbx, 0

; rsi/rcx = second argument on 64-bit and 32-bit respectively
lea rsi, [rel .data]
lea rcx, [rel .data]

; Do a 32-bit syscall
; On a real linux kernel this will execute clock_gettime
; Under FEX without 32-bit syscall support this might try to execute linkat and return -ENOENT.
int 0x80
hlt

.data:
dq 0, 0, 0, 0
2 changes: 2 additions & 0 deletions unittests/ASM/Known_Failures_jit
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# FPREM is incorrect
Test_X87/D9_F5_2.asm
Test_X87/D9_F5_3.asm

Test_FEX_bugs/32bit_syscall.asm

0 comments on commit 946c805

Please sign in to comment.