diff options
author | Stephen Boyd <swboyd@chromium.org> | 2020-02-05 14:45:59 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-02-11 00:59:43 +0000 |
commit | 8ce25cc1b44a92340f59718f09bcd58dbad2b798 (patch) | |
tree | e5023ef981497e149c2183ae471ceb23a3df1d0e | |
parent | eed7020fba02ecaae74d9563fc264412c7d2a7d8 (diff) | |
download | crosvm-8ce25cc1b44a92340f59718f09bcd58dbad2b798.tar crosvm-8ce25cc1b44a92340f59718f09bcd58dbad2b798.tar.gz crosvm-8ce25cc1b44a92340f59718f09bcd58dbad2b798.tar.bz2 crosvm-8ce25cc1b44a92340f59718f09bcd58dbad2b798.tar.lz crosvm-8ce25cc1b44a92340f59718f09bcd58dbad2b798.tar.xz crosvm-8ce25cc1b44a92340f59718f09bcd58dbad2b798.tar.zst crosvm-8ce25cc1b44a92340f59718f09bcd58dbad2b798.zip |
aarch64: Support kaslr-seed to randomize kernel address
We're currently adding 'kaslr' to the chosen node, with a value of 0. I'm not sure what that does, but we should probably add an actual random value here. There is a 'kaslr-seed' property that can be written into chosen and used to randomize the kernel address in memory. Let's populate that property instead so we get some sort of random kernel location in memory. BUG=None TEST=Boot up guest on cheza, hexdump kaslr-seed in /sys/firmware/devicetree and see that it's been changed to 0 Change-Id: I3f7b1ac64174bcf2e9010df992c2b2553ff90979 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2040476 Reviewed-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Tested-by: Stephen Boyd <swboyd@chromium.org> Commit-Queue: Stephen Boyd <swboyd@chromium.org>
-rw-r--r-- | aarch64/src/fdt.rs | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/aarch64/src/fdt.rs b/aarch64/src/fdt.rs index dd15b0a..23d0481 100644 --- a/aarch64/src/fdt.rs +++ b/aarch64/src/fdt.rs @@ -4,6 +4,7 @@ use std::ffi::CStr; use std::fs::File; +use std::io::Read; use arch::fdt::{ begin_node, end_node, finish_fdt, generate_prop32, generate_prop64, property, property_cstring, @@ -187,7 +188,15 @@ fn create_chosen_node( begin_node(fdt, "chosen")?; property_u32(fdt, "linux,pci-probe-only", 1)?; property_cstring(fdt, "bootargs", cmdline)?; - property_u64(fdt, "kaslr", 0)?; + + let mut random_file = File::open("/dev/urandom").map_err(Error::FdtIoError)?; + let mut kaslr_seed_bytes = [0u8; 8]; + random_file + .read_exact(&mut kaslr_seed_bytes) + .map_err(Error::FdtIoError)?; + let kaslr_seed = u64::from_le_bytes(kaslr_seed_bytes); + property_u64(fdt, "kaslr-seed", kaslr_seed)?; + if let Some((initrd_addr, initrd_size)) = initrd { let initrd_start = initrd_addr.offset() as u32; let initrd_end = initrd_start + initrd_size as u32; |