summaryrefslogtreecommitdiff
path: root/yjit_asm.c
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2021-12-05 10:08:19 -0500
committerAlan Wu <XrXr@users.noreply.github.com>2021-12-05 10:26:35 -0500
commit26063d39546ccd6d0b9d42defc2ad1bb8d35cc27 (patch)
tree385f99a442896c952ad31de5f67c8ee85514abc2 /yjit_asm.c
parentbbfefd45c6c99c4371cc0789bdd1da9ea3ade701 (diff)
YJIT: Initialize code buffer with PUSH DS
PUSH DS triggers the #UD processor exception in 64-bit mode, which the OS translates to a SIGILL. Unlike INT3, this triggers the usual crash reporter, which makes failures easier to notice. When there is a debugger attached, the PUSH DS pauses execution just like INT3.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/5217
Diffstat (limited to 'yjit_asm.c')
-rw-r--r--yjit_asm.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/yjit_asm.c b/yjit_asm.c
index 98f4a4e515..3a43c80ef0 100644
--- a/yjit_asm.c
+++ b/yjit_asm.c
@@ -215,10 +215,11 @@ static uint8_t *alloc_exec_mem(uint32_t mem_size)
cb_init(cb, mem_block, mem_size);
- // Fill the executable memory with INT3 (0xCC) so that
- // executing uninitialized memory will fault
+ // Fill the executable memory with PUSH DS (0x1E) so that
+ // executing uninitialized memory will fault with #UD in
+ // 64-bit mode.
cb_mark_all_writeable(cb);
- memset(mem_block, 0xCC, mem_size);
+ memset(mem_block, 0x1E, mem_size);
cb_mark_all_executable(cb);
return mem_block;