Loader: Add load offset to powerpc kernel entry point

Summary:
There is logic in ELF loadimage() to relocate kernels, but currently
only type ET_EXEC.  PowerPC kernels are ET_DYN, and can be relocated anywhere.
Add the load offset to kernel entry points on this platform.

Reviewed by:	imp, ian
Differential Revision:	https://reviews.freebsd.org/D21286
This commit is contained in:
Justin Hibbits 2019-09-06 02:28:03 +00:00
parent 7f0b970948
commit 2f6823d4c1
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=351920

View File

@ -455,7 +455,11 @@ __elfN(loadimage)(struct preloaded_file *fp, elf_file_t ef, uint64_t off)
ret = 0; ret = 0;
firstaddr = lastaddr = 0; firstaddr = lastaddr = 0;
ehdr = ef->ehdr; ehdr = ef->ehdr;
#ifdef __powerpc__
if (ef->kernel) {
#else
if (ehdr->e_type == ET_EXEC) { if (ehdr->e_type == ET_EXEC) {
#endif
#if defined(__i386__) || defined(__amd64__) #if defined(__i386__) || defined(__amd64__)
#if __ELF_WORD_SIZE == 64 #if __ELF_WORD_SIZE == 64
/* x86_64 relocates after locore */ /* x86_64 relocates after locore */
@ -481,12 +485,11 @@ __elfN(loadimage)(struct preloaded_file *fp, elf_file_t ef, uint64_t off)
* it's loaded at a 16MB boundary for now... * it's loaded at a 16MB boundary for now...
*/ */
off += 0x01000000; off += 0x01000000;
ehdr->e_entry += off; }
ehdr->e_entry += off;
#ifdef ELF_VERBOSE #ifdef ELF_VERBOSE
printf("Converted entry 0x%jx\n", (uintmax_t)ehdr->e_entry); printf("Converted entry 0x%jx\n", (uintmax_t)ehdr->e_entry);
#endif #endif
} else
off = 0;
#elif defined(__arm__) && !defined(EFI) #elif defined(__arm__) && !defined(EFI)
/* /*
* The elf headers in arm kernels specify virtual addresses in * The elf headers in arm kernels specify virtual addresses in