1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

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);
} }
// Fill new memory with PUSH DS (0x1E) so that executing uninitialized memory if cfg!(target_arch = "x86_64") {
// will fault with #UD in 64-bit mode. On Linux it becomes SIGILL and use the // Fill new memory with PUSH DS (0x1E) so that executing uninitialized memory
// usual Ruby crash reporter. // will fault with #UD in 64-bit mode. On Linux it becomes SIGILL and use the
std::slice::from_raw_parts_mut(mapped_region_end, alloc_size).fill(0x1E); // usual Ruby crash reporter.
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();