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:
parent
2cc3963a00
commit
1b0c9d0e3d
Notes:
git
2022-10-14 03:30:07 +09:00
1 changed files with 11 additions and 4 deletions
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue