x86: introduce kaslr_offset()
authorJiri Kosina <jkosina@suse.cz>
Mon, 27 Apr 2015 11:17:19 +0000 (13:17 +0200)
committerJiri Kosina <jkosina@suse.cz>
Wed, 29 Apr 2015 14:51:33 +0000 (16:51 +0200)
Offset that has been chosen for kaslr during kernel decompression can be
easily computed as a difference between _text and __START_KERNEL. We are
already making use of this in dump_kernel_offset() notifier and in
arch_crash_save_vmcoreinfo().

Introduce kaslr_offset() that makes this computation instead of hard-coding
it, so that other kernel code (such as live patching) can make use of it.
Also convert existing users to make use of it.

This patch is equivalent transofrmation without any effects on the resulting
code:

$ diff -u vmlinux.old.asm vmlinux.new.asm
--- vmlinux.old.asm     2015-04-28 17:55:19.520983368 +0200
+++ vmlinux.new.asm     2015-04-28 17:55:24.141206072 +0200
@@ -1,5 +1,5 @@

-vmlinux.old:     file format elf64-x86-64
+vmlinux.new:     file format elf64-x86-64

Disassembly of section .text:
$

Acked-by: Borislav Petkov <bp@suse.de>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
arch/x86/include/asm/setup.h
arch/x86/kernel/machine_kexec_64.c
arch/x86/kernel/setup.c

index f69e06b283fb9ee03e8704847558aa577aecf221..785ac2f27271f88beeff59f65b7f99b5edda9019 100644 (file)
@@ -65,12 +65,18 @@ static inline void x86_ce4100_early_setup(void) { }
  * This is set up by the setup-routine at boot-time
  */
 extern struct boot_params boot_params;
+extern char _text[];
 
 static inline bool kaslr_enabled(void)
 {
        return !!(boot_params.hdr.loadflags & KASLR_FLAG);
 }
 
+static inline unsigned long kaslr_offset(void)
+{
+       return (unsigned long)&_text - __START_KERNEL;
+}
+
 /*
  * Do NOT EVER look at the BIOS memory size location.
  * It does not work on many machines.
index 415480d3ea848bcf95e7ae26b56a5261add1cc8c..e1029633f6643c020919eeea31b8bb0daeb78f57 100644 (file)
@@ -25,6 +25,7 @@
 #include <asm/io_apic.h>
 #include <asm/debugreg.h>
 #include <asm/kexec-bzimage64.h>
+#include <asm/setup.h>
 
 #ifdef CONFIG_KEXEC_FILE
 static struct kexec_file_ops *kexec_file_loaders[] = {
@@ -334,7 +335,7 @@ void arch_crash_save_vmcoreinfo(void)
        VMCOREINFO_LENGTH(node_data, MAX_NUMNODES);
 #endif
        vmcoreinfo_append_str("KERNELOFFSET=%lx\n",
-                             (unsigned long)&_text - __START_KERNEL);
+                             kaslr_offset());
 }
 
 /* arch-dependent functionality related to kexec file-based syscall */
index d74ac33290ae3eeef46b923c4556d644b72f0d5a..5056d3cfe2667d47f54a0fc777f913bb13200fef 100644 (file)
@@ -834,7 +834,7 @@ dump_kernel_offset(struct notifier_block *self, unsigned long v, void *p)
 {
        if (kaslr_enabled()) {
                pr_emerg("Kernel Offset: 0x%lx from 0x%lx (relocation range: 0x%lx-0x%lx)\n",
-                        (unsigned long)&_text - __START_KERNEL,
+                        kaslr_offset(),
                         __START_KERNEL,
                         __START_KERNEL_map,
                         MODULES_VADDR-1);