svn commit: r277962 - head/sys/boot/common
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Sat Jan 31 07:22:30 UTC 2015
Author: nwhitehorn
Date: Sat Jan 31 07:22:29 2015
New Revision: 277962
URL: https://svnweb.freebsd.org/changeset/base/277962
Log:
Add support for booting relocatable kernels on PowerPC.
Modified:
head/sys/boot/common/load_elf.c
Modified: head/sys/boot/common/load_elf.c
==============================================================================
--- head/sys/boot/common/load_elf.c Sat Jan 31 03:22:00 2015 (r277961)
+++ head/sys/boot/common/load_elf.c Sat Jan 31 07:22:29 2015 (r277962)
@@ -175,7 +175,33 @@ __elfN(loadfile_raw)(char *filename, u_i
* Check to see what sort of module we are.
*/
kfp = file_findfile(NULL, __elfN(kerneltype));
- if (ehdr->e_type == ET_DYN) {
+#ifdef __powerpc__
+ /*
+ * Kernels can be ET_DYN, so just assume the first loaded object is the
+ * kernel. This assumption will be checked later.
+ */
+ if (kfp == NULL)
+ ef.kernel = 1;
+#endif
+ if (ef.kernel || ehdr->e_type == ET_EXEC) {
+ /* Looks like a kernel */
+ if (kfp != NULL) {
+ printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: kernel already loaded\n");
+ err = EPERM;
+ goto oerr;
+ }
+ /*
+ * Calculate destination address based on kernel entrypoint
+ */
+ dest = (ehdr->e_entry & ~PAGE_MASK);
+ if (dest == 0) {
+ printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: not a kernel (maybe static binary?)\n");
+ err = EPERM;
+ goto oerr;
+ }
+ ef.kernel = 1;
+
+ } else if (ehdr->e_type == ET_DYN) {
/* Looks like a kld module */
if (multiboot != 0) {
printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: can't load module as multiboot\n");
@@ -195,24 +221,6 @@ __elfN(loadfile_raw)(char *filename, u_i
/* Looks OK, got ahead */
ef.kernel = 0;
- } else if (ehdr->e_type == ET_EXEC) {
- /* Looks like a kernel */
- if (kfp != NULL) {
- printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: kernel already loaded\n");
- err = EPERM;
- goto oerr;
- }
- /*
- * Calculate destination address based on kernel entrypoint
- */
- dest = (ehdr->e_entry & ~PAGE_MASK);
- if (dest == 0) {
- printf("elf" __XSTRING(__ELF_WORD_SIZE) "_loadfile: not a kernel (maybe static binary?)\n");
- err = EPERM;
- goto oerr;
- }
- ef.kernel = 1;
-
} else {
err = EFTYPE;
goto oerr;
More information about the svn-src-head
mailing list