arm64: kaslr: increase randomization granularity
[firefly-linux-kernel-4.4.55.git] / drivers / firmware / efi / libstub / arm64-stub.c
index e0e6b74fef8f7becdef4c0481919ead298023250..377d935a33803402c0c8a8d1085023e364368713 100644 (file)
@@ -60,16 +60,25 @@ efi_status_t __init handle_kernel_image(efi_system_table_t *sys_table_arg,
        kernel_memsize = kernel_size + (_end - _edata);
 
        if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && phys_seed != 0) {
+               /*
+                * If CONFIG_DEBUG_ALIGN_RODATA is not set, produce a
+                * displacement in the interval [0, MIN_KIMG_ALIGN) that
+                * is a multiple of the minimal segment alignment (SZ_64K)
+                */
+               u32 mask = (MIN_KIMG_ALIGN - 1) & ~(SZ_64K - 1);
+               u32 offset = !IS_ENABLED(CONFIG_DEBUG_ALIGN_RODATA) ?
+                            (phys_seed >> 32) & mask : TEXT_OFFSET;
+
                /*
                 * If KASLR is enabled, and we have some randomness available,
                 * locate the kernel at a randomized offset in physical memory.
                 */
-               *reserve_size = kernel_memsize + TEXT_OFFSET;
+               *reserve_size = kernel_memsize + offset;
                status = efi_random_alloc(sys_table_arg, *reserve_size,
                                          MIN_KIMG_ALIGN, reserve_addr,
-                                         phys_seed);
+                                         (u32)phys_seed);
 
-               *image_addr = *reserve_addr + TEXT_OFFSET;
+               *image_addr = *reserve_addr + offset;
        } else {
                /*
                 * Else, try a straight allocation at the preferred offset.