summary refs log tree commit diff
diff options
context:
space:
mode:
authorStephen Boyd <swboyd@chromium.org>2020-02-05 14:45:59 -0800
committerCommit Bot <commit-bot@chromium.org>2020-02-11 00:59:43 +0000
commit8ce25cc1b44a92340f59718f09bcd58dbad2b798 (patch)
treee5023ef981497e149c2183ae471ceb23a3df1d0e
parenteed7020fba02ecaae74d9563fc264412c7d2a7d8 (diff)
downloadcrosvm-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.rs11
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;