]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
s390/mm: Prevent lowcore vs identity mapping overlap
authorAlexander Gordeev <agordeev@linux.ibm.com>
Fri, 9 Aug 2024 06:47:15 +0000 (08:47 +0200)
committerVasily Gorbik <gor@linux.ibm.com>
Wed, 21 Aug 2024 14:14:45 +0000 (16:14 +0200)
The identity mapping position in virtual memory is randomized
together with the kernel mapping. That position can never
overlap with the lowcore even when the lowcore is relocated.

Prevent overlapping with the lowcore to allow independent
positioning of the identity mapping. With the current value
of the alternative lowcore address of 0x70000 the overlap
could happen in case the identity mapping is placed at zero.

This is a prerequisite for uncoupling of randomization base
of kernel image and identity mapping in virtual memory.

Acked-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/kernel/setup.c

index 4ec99f73fa27e19b2cc612a92ac3507206bc23ac..a3fea683b22706d742813b1a72fd088978878874 100644 (file)
@@ -734,7 +734,23 @@ static void __init memblock_add_physmem_info(void)
 }
 
 /*
- * Reserve memory used for lowcore/command line/kernel image.
+ * Reserve memory used for lowcore.
+ */
+static void __init reserve_lowcore(void)
+{
+       void *lowcore_start = get_lowcore();
+       void *lowcore_end = lowcore_start + sizeof(struct lowcore);
+       void *start, *end;
+
+       if ((void *)__identity_base < lowcore_end) {
+               start = max(lowcore_start, (void *)__identity_base);
+               end = min(lowcore_end, (void *)(__identity_base + ident_map_size));
+               memblock_reserve(__pa(start), __pa(end));
+       }
+}
+
+/*
+ * Reserve memory used for absolute lowcore/command line/kernel image.
  */
 static void __init reserve_kernel(void)
 {
@@ -918,6 +934,7 @@ void __init setup_arch(char **cmdline_p)
 
        /* Do some memory reservations *before* memory is added to memblock */
        reserve_pgtables();
+       reserve_lowcore();
        reserve_kernel();
        reserve_initrd();
        reserve_certificate_list();