]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
s390/kaslr: store KASLR offset for early dumps
authorGerald Schaefer <gerald.schaefer@de.ibm.com>
Tue, 19 Nov 2019 11:30:53 +0000 (12:30 +0100)
committerSeth Forshee <seth.forshee@canonical.com>
Mon, 6 Jan 2020 13:39:22 +0000 (07:39 -0600)
BugLink: https://bugs.launchpad.net/bugs/1858424
commit a9f2f6865d784477e1c7b59269d3a384abafd9ca upstream.

The KASLR offset is added to vmcoreinfo in arch_crash_save_vmcoreinfo(),
so that it can be found by crash when processing kernel dumps.

However, arch_crash_save_vmcoreinfo() is called during a subsys_initcall,
so if the kernel crashes before that, we have no vmcoreinfo and no KASLR
offset.

Fix this by storing the KASLR offset in the lowcore, where the vmcore_info
pointer will be stored, and where it can be found by crash. In order to
make it distinguishable from a real vmcore_info pointer, mark it as uneven
(KASLR offset itself is aligned to THREAD_SIZE).

When arch_crash_save_vmcoreinfo() stores the real vmcore_info pointer in
the lowcore, it overwrites the KASLR offset. At that point, the KASLR
offset is not yet added to vmcoreinfo, so we also need to move the
mem_assign_absolute() behind the vmcoreinfo_append_str().

Fixes: b2d24b97b2a9 ("s390/kernel: add support for kernel address space layout randomization (KASLR)")
Cc: <stable@vger.kernel.org> # v5.2+
Signed-off-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
arch/s390/boot/startup.c
arch/s390/kernel/machine_kexec.c

index 5367950510f695ae4c970dfa511f78456259a933..fa0150285d388da6b381dd7bdf8d813a56ea0506 100644 (file)
@@ -170,6 +170,11 @@ void startup_kernel(void)
                handle_relocs(__kaslr_offset);
 
        if (__kaslr_offset) {
+               /*
+                * Save KASLR offset for early dumps, before vmcore_info is set.
+                * Mark as uneven to distinguish from real vmcore_info pointer.
+                */
+               S390_lowcore.vmcore_info = __kaslr_offset | 0x1UL;
                /* Clear non-relocated kernel */
                if (IS_ENABLED(CONFIG_KERNEL_UNCOMPRESSED))
                        memset(img, 0, vmlinux.image_size);
index 444a19125a815c4578a60cb5e5284b7706717627..d402ced7f7c38e100226eb2b5df323d037b1ea07 100644 (file)
@@ -254,10 +254,10 @@ void arch_crash_save_vmcoreinfo(void)
        VMCOREINFO_SYMBOL(lowcore_ptr);
        VMCOREINFO_SYMBOL(high_memory);
        VMCOREINFO_LENGTH(lowcore_ptr, NR_CPUS);
-       mem_assign_absolute(S390_lowcore.vmcore_info, paddr_vmcoreinfo_note());
        vmcoreinfo_append_str("SDMA=%lx\n", __sdma);
        vmcoreinfo_append_str("EDMA=%lx\n", __edma);
        vmcoreinfo_append_str("KERNELOFFSET=%lx\n", kaslr_offset());
+       mem_assign_absolute(S390_lowcore.vmcore_info, paddr_vmcoreinfo_note());
 }
 
 void machine_shutdown(void)