[PATCH v2 00/29] implement KASLR for ARM
From: Ard Biesheuvel <hidden>
Date: 2017-09-06 16:35:36
Subsystem:
arm port, the rest · Maintainers:
Russell King, Linus Torvalds
On 6 September 2017 at 17:31, Tony Lindgren [off-list ref] wrote:
* Ard Biesheuvel [off-list ref] [170906 09:26]:quoted
On 6 September 2017 at 17:22, Tony Lindgren [off-list ref] wrote:quoted
Sure was not able to reproduce it so far on BBB. But here's failed boot output from logicpd-torpedo-37xx-devkit. Will try some more booting on BBB too....quoted
quoted
8< ------------------- Kernel image @ 0x81000000 [ 0x000000 - 0x426810 ] ## Flattened Device Tree blob at 84000000 Booting using the fdt blob at 0x84000000 Loading Device Tree to 86feb000, end 86fff2d5 ... OK Starting kernel ... regions.image_size:00e00000 regions.pa_start:80000000 regions.pa_end:88000000 regions.zimage_start:81000000 regions.zimage_size:00437830 regions.dtb_start:86feb000 regions.dtb_size:00012000 regions.initrd_start:00000000 regions.initrd_size:00000000 num:0000002f num:00000029 *kaslr_offset:07400000 Uncompressing Linux...Is that all? Does it hang while decompressing the kernel?Yeah so it seems. If we had uncompress overwriting something because of the increase in size it should happen on every boot though, not once every five boots or so.
Turns out I am calculating the top of DRAM incorrectly for boards where less memory is present than the size of the lowmem region. Could you try this please? (Apologies for the whitespace)
diff --git a/arch/arm/boot/compressed/kaslr.c b/arch/arm/boot/compressed/kaslr.c
index d43c0be9b47b..e9c86809c857 100644
--- a/arch/arm/boot/compressed/kaslr.c
+++ b/arch/arm/boot/compressed/kaslr.c@@ -339,8 +339,7 @@ u32 kaslr_early_init(u32 *kaslr_offset, u32image_base, u32 image_size,
regions.image_size = round_up(image_size, SZ_2M);
regions.pa_start = round_down(image_base, SZ_128M);
- regions.pa_end = lowmem_top - PAGE_OFFSET + regions.pa_start -
- regions.image_size;
+ regions.pa_end = lowmem_top - PAGE_OFFSET + regions.pa_start;
regions.zimage_start = zimage_start;
regions.zimage_size = zimage_end - zimage_start;
regions.dtb_start = (u32)fdt;@@ -391,7 +390,8 @@ u32 kaslr_early_init(u32 *kaslr_offset, u32image_base, u32 image_size,
}
/* check the memory nodes for the size of the lowmem region */
- regions.pa_end = min(regions.pa_end, get_memory_end(fdt));
+ regions.pa_end = min(regions.pa_end, get_memory_end(fdt)) -
+ regions.image_size;
puthex32(regions.image_size);
puthex32(regions.pa_start);