YJIT: No need to fill to get UDF on ARM64

On ARM64, all zeros is already undefined, so we don't need to do extra
work to fill new memory with undefined instructions.
This commit is contained in:
Alan Wu 2022-10-12 16:19:55 -04:00
parent 2cc3963a00
commit 1b0c9d0e3d
Notes: git 2022-10-14 03:30:07 +09:00

View File

@ -141,10 +141,16 @@ impl<A: Allocator> VirtualMemory<A> {
if !alloc.mark_writable(mapped_region_end.cast(), alloc_size_u32) { if !alloc.mark_writable(mapped_region_end.cast(), alloc_size_u32) {
return Err(FailedPageMapping); return Err(FailedPageMapping);
} }
if cfg!(target_arch = "x86_64") {
// Fill new memory with PUSH DS (0x1E) so that executing uninitialized memory // Fill new memory with PUSH DS (0x1E) so that executing uninitialized memory
// will fault with #UD in 64-bit mode. On Linux it becomes SIGILL and use the // will fault with #UD in 64-bit mode. On Linux it becomes SIGILL and use the
// usual Ruby crash reporter. // usual Ruby crash reporter.
std::slice::from_raw_parts_mut(mapped_region_end, alloc_size).fill(0x1E); std::slice::from_raw_parts_mut(mapped_region_end, alloc_size).fill(0x1E);
} else if cfg!(target_arch = "aarch64") {
// In aarch64, all zeros encodes UDF, so it's already what we want.
} else {
unreachable!("unknown arch");
}
} }
self.mapped_region_bytes = self.mapped_region_bytes + alloc_size; self.mapped_region_bytes = self.mapped_region_bytes + alloc_size;
@ -309,6 +315,7 @@ pub mod tests {
} }
#[test] #[test]
#[cfg(target_arch = "x86_64")]
fn new_memory_is_initialized() { fn new_memory_is_initialized() {
let mut virt = new_dummy_virt_mem(); let mut virt = new_dummy_virt_mem();