Author: nwhitehorn
Date: Tue Dec  1 17:01:27 2015
New Revision: 291598
URL: https://svnweb.freebsd.org/changeset/base/291598

Log:
  Allow loader to load 64-bit ELFv2 PowerPC kernels.

Modified:
  head/sys/boot/ofw/libofw/ppc64_elf_freebsd.c
  head/sys/boot/powerpc/kboot/ppc64_elf_freebsd.c
  head/sys/boot/powerpc/ps3/ppc64_elf_freebsd.c

Modified: head/sys/boot/ofw/libofw/ppc64_elf_freebsd.c
==============================================================================
--- head/sys/boot/ofw/libofw/ppc64_elf_freebsd.c        Tue Dec  1 17:00:31 
2015        (r291597)
+++ head/sys/boot/ofw/libofw/ppc64_elf_freebsd.c        Tue Dec  1 17:01:27 
2015        (r291598)
@@ -77,8 +77,11 @@ ppc64_ofw_elf_exec(struct preloaded_file
        }
        e = (Elf_Ehdr *)&fmp->md_data;
        
-       /* Handle function descriptor */
-       entry = *(uint64_t *)e->e_entry;
+       /* Handle function descriptor for ELFv1 kernels */
+       if ((e->e_flags & 3) == 2)
+               entry = e->e_entry;
+       else
+               entry = *(uint64_t *)e->e_entry;
 
        if ((error = md_load64(fp->f_args, &mdp, &dtbp)) != 0)
                return (error);

Modified: head/sys/boot/powerpc/kboot/ppc64_elf_freebsd.c
==============================================================================
--- head/sys/boot/powerpc/kboot/ppc64_elf_freebsd.c     Tue Dec  1 17:00:31 
2015        (r291597)
+++ head/sys/boot/powerpc/kboot/ppc64_elf_freebsd.c     Tue Dec  1 17:01:27 
2015        (r291598)
@@ -78,10 +78,15 @@ ppc64_elf_exec(struct preloaded_file *fp
        /* Figure out where to put it */
        trampolinebase = archsw.arch_loadaddr(LOAD_RAW, NULL, 0);
        
-       /* Set up interesting values in function descriptor */
+       /* Set up loader trampoline */
        trampoline = malloc(szkerneltramp);
        memcpy(trampoline, &kerneltramp, szkerneltramp);
-       archsw.arch_copyout(e->e_entry + elf64_relocation_offset, &entry, 8);
+       /* Parse function descriptor for ELFv1 kernels */
+       if ((e->e_flags & 3) == 2)
+               entry = e->e_entry;
+       else
+               archsw.arch_copyout(e->e_entry + elf64_relocation_offset,
+                   &entry, 8);
        trampoline[2] = entry + elf64_relocation_offset;
        trampoline[4] = 0; /* Phys. mem offset */
        trampoline[5] = 0; /* OF entry point */

Modified: head/sys/boot/powerpc/ps3/ppc64_elf_freebsd.c
==============================================================================
--- head/sys/boot/powerpc/ps3/ppc64_elf_freebsd.c       Tue Dec  1 17:00:31 
2015        (r291597)
+++ head/sys/boot/powerpc/ps3/ppc64_elf_freebsd.c       Tue Dec  1 17:01:27 
2015        (r291598)
@@ -75,8 +75,11 @@ ppc64_elf_exec(struct preloaded_file *fp
        }
        e = (Elf_Ehdr *)&fmp->md_data;
        
-       /* Handle function descriptor */
-       entry = (void *)(uintptr_t)(*(uint64_t *)e->e_entry);
+       /* Handle function descriptor for ELFv1 kernels */
+       if ((e->e_flags & 3) == 2)
+               entry = e->e_entry;
+       else
+               entry = (void *)(uintptr_t)(*(uint64_t *)e->e_entry);
 
        if ((error = md_load64(fp->f_args, &mdp)) != 0)
                return (error);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to