Merge branch 'parisc-4.20-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
[sfrench/cifs-2.6.git] / arch / s390 / kernel / setup.c
index 36fb37d7a36ca612097cfa2f7e03255dc287ae9e..a2e952b662487453b8baedefc53402eb04d70a83 100644 (file)
@@ -90,8 +90,9 @@ char elf_platform[ELF_PLATFORM_SIZE];
 
 unsigned long int_hwcap = 0;
 
-int __initdata memory_end_set;
-unsigned long __initdata memory_end;
+int __bootdata(noexec_disabled);
+int __bootdata(memory_end_set);
+unsigned long __bootdata(memory_end);
 unsigned long __bootdata(max_physmem_end);
 struct mem_detect_info __bootdata(mem_detect);
 
@@ -286,15 +287,6 @@ void machine_power_off(void)
 void (*pm_power_off)(void) = machine_power_off;
 EXPORT_SYMBOL_GPL(pm_power_off);
 
-static int __init early_parse_mem(char *p)
-{
-       memory_end = memparse(p, &p);
-       memory_end &= PAGE_MASK;
-       memory_end_set = 1;
-       return 0;
-}
-early_param("mem", early_parse_mem);
-
 static int __init parse_vmalloc(char *arg)
 {
        if (!arg)
@@ -540,19 +532,26 @@ static void __init setup_memory_end(void)
 {
        unsigned long vmax, vmalloc_size, tmp;
 
-       /* Choose kernel address space layout: 2, 3, or 4 levels. */
+       /* Choose kernel address space layout: 3 or 4 levels. */
        vmalloc_size = VMALLOC_END ?: (128UL << 30) - MODULES_LEN;
-       tmp = (memory_end ?: max_physmem_end) / PAGE_SIZE;
-       tmp = tmp * (sizeof(struct page) + PAGE_SIZE);
-       if (tmp + vmalloc_size + MODULES_LEN <= _REGION2_SIZE)
-               vmax = _REGION2_SIZE; /* 3-level kernel page table */
-       else
-               vmax = _REGION1_SIZE; /* 4-level kernel page table */
+       if (IS_ENABLED(CONFIG_KASAN)) {
+               vmax = IS_ENABLED(CONFIG_KASAN_S390_4_LEVEL_PAGING)
+                          ? _REGION1_SIZE
+                          : _REGION2_SIZE;
+       } else {
+               tmp = (memory_end ?: max_physmem_end) / PAGE_SIZE;
+               tmp = tmp * (sizeof(struct page) + PAGE_SIZE);
+               if (tmp + vmalloc_size + MODULES_LEN <= _REGION2_SIZE)
+                       vmax = _REGION2_SIZE; /* 3-level kernel page table */
+               else
+                       vmax = _REGION1_SIZE; /* 4-level kernel page table */
+       }
+
        /* module area is at the end of the kernel address space. */
        MODULES_END = vmax;
        MODULES_VADDR = MODULES_END - MODULES_LEN;
        VMALLOC_END = MODULES_VADDR;
-       VMALLOC_START = vmax - vmalloc_size;
+       VMALLOC_START = VMALLOC_END - vmalloc_size;
 
        /* Split remaining virtual space between 1:1 mapping & vmemmap array */
        tmp = VMALLOC_START / (PAGE_SIZE + sizeof(struct page));
@@ -564,7 +563,12 @@ static void __init setup_memory_end(void)
        vmemmap = (struct page *) tmp;
 
        /* Take care that memory_end is set and <= vmemmap */
-       memory_end = min(memory_end ?: max_physmem_end, tmp);
+       memory_end = min(memory_end ?: max_physmem_end, (unsigned long)vmemmap);
+#ifdef CONFIG_KASAN
+       /* fit in kasan shadow memory region between 1:1 and vmemmap */
+       memory_end = min(memory_end, KASAN_SHADOW_START);
+       vmemmap = max(vmemmap, (struct page *)KASAN_SHADOW_END);
+#endif
        max_pfn = max_low_pfn = PFN_DOWN(memory_end);
        memblock_remove(memory_end, ULONG_MAX);
 
@@ -605,17 +609,8 @@ static struct notifier_block kdump_mem_nb = {
  */
 static void reserve_memory_end(void)
 {
-#ifdef CONFIG_CRASH_DUMP
-       if (ipl_info.type == IPL_TYPE_FCP_DUMP &&
-           !OLDMEM_BASE && sclp.hsa_size) {
-               memory_end = sclp.hsa_size;
-               memory_end &= PAGE_MASK;
-               memory_end_set = 1;
-       }
-#endif
-       if (!memory_end_set)
-               return;
-       memblock_reserve(memory_end, ULONG_MAX);
+       if (memory_end_set)
+               memblock_reserve(memory_end, ULONG_MAX);
 }
 
 /*