@@ -139,9 +139,9 @@ extern unsigned long calc_cam_sz(unsigned long ram, unsigned long virt,
extern void adjust_total_lowmem(void);
extern int switch_to_as1(void);
extern void restore_to_as0(int esel, int offset, void *dt_ptr, int bootcpu);
+#endif
void create_kaslr_tlb_entry(int entry, unsigned long virt, phys_addr_t phys);
extern int is_second_reloc;
-#endif
void reloc_kernel_entry(void *fdt, long addr);
extern void loadcam_entry(unsigned int index);
@@ -267,35 +267,37 @@ static unsigned long __init kaslr_legal_offset(void *dt_ptr, unsigned long rando
unsigned long start;
unsigned long offset;
-#ifdef CONFIG_PPC32
- /*
- * Decide which 64M we want to start
- * Only use the low 8 bits of the random seed
- */
- unsigned long index = random & 0xFF;
- index %= regions.linear_sz / SZ_64M;
-
- /* Decide offset inside 64M */
- offset = random % (SZ_64M - regions.kernel_size);
- offset = round_down(offset, SZ_16K);
+ if (IS_ENABLED(CONFIG_PPC32)) {
+ unsigned long index;
+
+ /*
+ * Decide which 64M we want to start
+ * Only use the low 8 bits of the random seed
+ */
+ index = random & 0xFF;
+ index %= regions.linear_sz / SZ_64M;
+
+ /* Decide offset inside 64M */
+ offset = random % (SZ_64M - regions.kernel_size);
+ offset = round_down(offset, SZ_16K);
+
+ while ((long)index >= 0) {
+ offset = memstart_addr + index * SZ_64M + offset;
+ start = memstart_addr + index * SZ_64M;
+ koffset = get_usable_address(dt_ptr, start, offset);
+ if (koffset)
+ break;
+ index--;
+ }
+ } else {
+ /* Decide kernel offset inside 1G */
+ offset = random % (SZ_1G - regions.kernel_size);
+ offset = round_down(offset, SZ_64K);
- while ((long)index >= 0) {
- offset = memstart_addr + index * SZ_64M + offset;
- start = memstart_addr + index * SZ_64M;
+ start = memstart_addr;
+ offset = memstart_addr + offset;
koffset = get_usable_address(dt_ptr, start, offset);
- if (koffset)
- break;
- index--;
}
-#else
- /* Decide kernel offset inside 1G */
- offset = random % (SZ_1G - regions.kernel_size);
- offset = round_down(offset, SZ_64K);
-
- start = memstart_addr;
- offset = memstart_addr + offset;
- koffset = get_usable_address(dt_ptr, start, offset);
-#endif
if (koffset != 0)
koffset -= memstart_addr;
@@ -342,6 +344,8 @@ static unsigned long __init kaslr_choose_location(void *dt_ptr, phys_addr_t size
/* If the linear size is smaller than 64M, do not randmize */
if (linear_sz < SZ_64M)
return 0;
+#else
+ linear_sz = ram = size;
#endif
/* check for a reserved-memory node and record its cell sizes */
@@ -373,17 +377,19 @@ notrace void __init kaslr_early_init(void *dt_ptr, phys_addr_t size)
{
unsigned long offset;
unsigned long kernel_sz;
+ unsigned int *__kaslr_offset;
+ unsigned int *__run_at_load;
-#ifdef CONFIG_PPC64
- unsigned int *__kaslr_offset = (unsigned int *)(KERNELBASE + 0x58);
- unsigned int *__run_at_load = (unsigned int *)(KERNELBASE + 0x5c);
+ if (IS_ENABLED(CONFIG_PPC64)) {
+ __kaslr_offset = (unsigned int *)(KERNELBASE + 0x58);
+ __run_at_load = (unsigned int *)(KERNELBASE + 0x5c);
- if (*__run_at_load == 1)
- return;
+ if (*__run_at_load == 1)
+ return;
- /* Setup flat device-tree pointer */
- initial_boot_params = dt_ptr;
-#endif
+ /* Setup flat device-tree pointer */
+ initial_boot_params = dt_ptr;
+ }
kernel_sz = (unsigned long)_end - (unsigned long)_stext;
@@ -394,20 +400,19 @@ notrace void __init kaslr_early_init(void *dt_ptr, phys_addr_t size)
kernstart_virt_addr += offset;
kernstart_addr += offset;
-#ifdef CONFIG_PPC32
- is_second_reloc = 1;
-
- if (offset >= SZ_64M) {
- unsigned long tlb_virt = round_down(kernstart_virt_addr, SZ_64M);
- phys_addr_t tlb_phys = round_down(kernstart_addr, SZ_64M);
+ if (IS_ENABLED(CONFIG_PPC32)) {
+ is_second_reloc = 1;
+ if (offset >= SZ_64M) {
+ unsigned long tlb_virt = round_down(kernstart_virt_addr, SZ_64M);
+ phys_addr_t tlb_phys = round_down(kernstart_addr, SZ_64M);
- /* Create kernel map to relocate in */
- create_kaslr_tlb_entry(1, tlb_virt, tlb_phys);
+ /* Create kernel map to relocate in */
+ create_kaslr_tlb_entry(1, tlb_virt, tlb_phys);
+ }
+ } else {
+ *__kaslr_offset = kernstart_virt_addr - KERNELBASE;
+ *__run_at_load = 1;
}
-#else
- *__kaslr_offset = kernstart_virt_addr - KERNELBASE;
- *__run_at_load = 1;
-#endif
/* Copy the kernel to it's new location and run */
memcpy((void *)kernstart_virt_addr, (void *)_stext, kernel_sz);