|
@@ -823,6 +823,20 @@ static void __init trim_low_memory_range(void)
|
|
|
memblock_reserve(0, ALIGN(reserve_low, PAGE_SIZE));
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Dump out kernel offset information on panic.
|
|
|
+ */
|
|
|
+static int
|
|
|
+dump_kernel_offset(struct notifier_block *self, unsigned long v, void *p)
|
|
|
+{
|
|
|
+ pr_emerg("Kernel Offset: 0x%lx from 0x%lx "
|
|
|
+ "(relocation range: 0x%lx-0x%lx)\n",
|
|
|
+ (unsigned long)&_text - __START_KERNEL, __START_KERNEL,
|
|
|
+ __START_KERNEL_map, MODULES_VADDR-1);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Determine if we were loaded by an EFI loader. If so, then we have also been
|
|
|
* passed the efi memmap, systab, etc., so we should use these data structures
|
|
@@ -1242,3 +1256,15 @@ void __init i386_reserve_resources(void)
|
|
|
}
|
|
|
|
|
|
#endif /* CONFIG_X86_32 */
|
|
|
+
|
|
|
+static struct notifier_block kernel_offset_notifier = {
|
|
|
+ .notifier_call = dump_kernel_offset
|
|
|
+};
|
|
|
+
|
|
|
+static int __init register_kernel_offset_dumper(void)
|
|
|
+{
|
|
|
+ atomic_notifier_chain_register(&panic_notifier_list,
|
|
|
+ &kernel_offset_notifier);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+__initcall(register_kernel_offset_dumper);
|