summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authornwhitehorn <nwhitehorn@FreeBSD.org>2015-02-21 23:20:05 +0000
committernwhitehorn <nwhitehorn@FreeBSD.org>2015-02-21 23:20:05 +0000
commit03bb9e58897ceb7ff3fdac83582df1de1cf249c0 (patch)
tree8f2a27a6691bdf9abb4cbe95cbc7329d4fc7d26f /sys/kern
parent32241f2de462a3c017304705d414b9dcc9725984 (diff)
downloadFreeBSD-src-03bb9e58897ceb7ff3fdac83582df1de1cf249c0.zip
FreeBSD-src-03bb9e58897ceb7ff3fdac83582df1de1cf249c0.tar.gz
Make kernel ELF image parsing not crash for kernels running at locations
other than their link address.
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/link_elf.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index 6274bf1..3cf19e1 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -381,6 +381,8 @@ link_elf_link_common_finish(linker_file_t lf)
return (0);
}
+extern vm_offset_t __startkernel;
+
static void
link_elf_init(void* arg)
{
@@ -409,7 +411,11 @@ link_elf_init(void* arg)
ef = (elf_file_t) linker_kernel_file;
ef->preloaded = 1;
+#ifdef __powerpc64__
+ ef->address = (caddr_t) (__startkernel - KERNBASE);
+#else
ef->address = 0;
+#endif
#ifdef SPARSE_MAPPING
ef->object = 0;
#endif
@@ -417,7 +423,7 @@ link_elf_init(void* arg)
if (dp != NULL)
parse_dynamic(ef);
- linker_kernel_file->address = (caddr_t) KERNBASE;
+ linker_kernel_file->address += KERNBASE;
linker_kernel_file->size = -(intptr_t)linker_kernel_file->address;
if (modptr != NULL) {
OpenPOWER on IntegriCloud