Author: nwhitehorn
Date: Sat Mar  3 23:39:07 2018
New Revision: 330365
URL: https://svnweb.freebsd.org/changeset/base/330365

Log:
  Move "common" Open Firmware parts of the loader used only on PowerPC to
  the powerpc/ subdirectory. These have never used by SPARC and we have
  no other (and almost certainly will have no other) Open Firmware platforms.
  This makes the directory structure simpler and lets us avoid some
  cargo-cult MI patterns on code that is, and always was,
  architecture-specific.

Added:
  head/stand/powerpc/ofw/elf_freebsd.c
     - copied, changed from r330364, head/stand/ofw/libofw/elf_freebsd.c
  head/stand/powerpc/ofw/main.c
     - copied unchanged from r330364, head/stand/ofw/common/main.c
  head/stand/powerpc/ofw/ppc64_elf_freebsd.c
     - copied unchanged from r330364, head/stand/ofw/libofw/ppc64_elf_freebsd.c
Deleted:
  head/stand/ofw/common/
  head/stand/ofw/libofw/elf_freebsd.c
  head/stand/ofw/libofw/ppc64_elf_freebsd.c
Modified:
  head/stand/ofw/libofw/Makefile
  head/stand/ofw/libofw/libofw.h
  head/stand/powerpc/ofw/Makefile
  head/stand/powerpc/ofw/conf.c

Modified: head/stand/ofw/libofw/Makefile
==============================================================================
--- head/stand/ofw/libofw/Makefile      Sat Mar  3 23:23:23 2018        
(r330364)
+++ head/stand/ofw/libofw/Makefile      Sat Mar  3 23:39:07 2018        
(r330365)
@@ -4,7 +4,7 @@
 
 LIB=           ofw
 
-SRCS=  devicename.c elf_freebsd.c ofw_console.c ofw_copy.c ofw_disk.c \
+SRCS=  devicename.c ofw_console.c ofw_copy.c ofw_disk.c \
        ofw_memory.c ofw_module.c ofw_net.c ofw_reboot.c \
        ofw_time.c openfirm.c
 .PATH: ${ZFSSRC}
@@ -12,10 +12,6 @@ SRCS+=  devicename_stubs.c
 
 # Pick up the bootstrap header for some interface items
 CFLAGS+=       -I${LDRSRC}
-
-.if ${MACHINE_CPUARCH} == "powerpc"
-SRCS+=         ppc64_elf_freebsd.c
-.endif
 
 .ifdef(BOOT_DISK_DEBUG)
 # Make the disk code more talkative

Modified: head/stand/ofw/libofw/libofw.h
==============================================================================
--- head/stand/ofw/libofw/libofw.h      Sat Mar  3 23:23:23 2018        
(r330364)
+++ head/stand/ofw/libofw/libofw.h      Sat Mar  3 23:39:07 2018        
(r330365)
@@ -62,17 +62,9 @@ void ofw_memmap(int);
 struct preloaded_file;
 struct file_format;
 
-int    ofw_elf_loadfile(char *, vm_offset_t, struct preloaded_file **);
-int    ofw_elf_exec(struct preloaded_file *);
-
 /* MD code implementing MI interfaces */
 vm_offset_t md_load(char *args, vm_offset_t *modulep, vm_offset_t *dtb);
 vm_offset_t md_load64(char *args, vm_offset_t *modulep, vm_offset_t *dtb);
-
-extern struct file_format      ofw_elf;
-#ifdef __powerpc__
-extern struct file_format      ofw_elf64;
-#endif
 
 extern void    reboot(void);
 

Modified: head/stand/powerpc/ofw/Makefile
==============================================================================
--- head/stand/powerpc/ofw/Makefile     Sat Mar  3 23:23:23 2018        
(r330364)
+++ head/stand/powerpc/ofw/Makefile     Sat Mar  3 23:39:07 2018        
(r330365)
@@ -17,7 +17,7 @@ NEWVERSWHAT=  "Open Firmware loader" ${MACHINE_ARCH}
 INSTALLFLAGS=  -b
 
 # Architecture-specific loader code
-SRCS=          conf.c vers.c start.c
+SRCS=          conf.c vers.c main.c elf_freebsd.c ppc64_elf_freebsd.c start.c
 SRCS+=         ucmpdi2.c
 
 .include       "${BOOTSRC}/fdt.mk"
@@ -37,10 +37,6 @@ RELOC?=              0x1C00000
 CFLAGS+=       -DRELOC=${RELOC}
 
 LDFLAGS=       -nostdlib -static -T ${.CURDIR}/ldscript.powerpc
-
-# Pull in common loader code
-.PATH:         ${BOOTSRC}/ofw/common
-.include       "${BOOTSRC}/ofw/common/Makefile.inc"
 
 # Open Firmware standalone support library
 LIBOFW=                ${BOOTOBJ}/ofw/libofw/libofw.a

Modified: head/stand/powerpc/ofw/conf.c
==============================================================================
--- head/stand/powerpc/ofw/conf.c       Sat Mar  3 23:23:23 2018        
(r330364)
+++ head/stand/powerpc/ofw/conf.c       Sat Mar  3 23:39:07 2018        
(r330365)
@@ -97,6 +97,9 @@ struct netif_driver *netif_drivers[] = {
  * rather than reading the file go first.
  */
 
+struct file_format ofw_elf;
+struct file_format ofw_elf64;
+
 struct file_format *file_formats[] = {
     &ofw_elf,
     &ofw_elf64,

Copied and modified: head/stand/powerpc/ofw/elf_freebsd.c (from r330364, 
head/stand/ofw/libofw/elf_freebsd.c)
==============================================================================
--- head/stand/ofw/libofw/elf_freebsd.c Sat Mar  3 23:23:23 2018        
(r330364, copy source)
+++ head/stand/powerpc/ofw/elf_freebsd.c        Sat Mar  3 23:39:07 2018        
(r330365)
@@ -89,8 +89,8 @@ __elfN(ofw_exec)(struct preloaded_file *fp)
        dev_cleanup();
        if (dtbp != 0) {
                OF_quiesce();
-               ((int (*)(u_long, u_long, u_long, void *, u_long))entry)(dtbp, 
0, 0,
-                   (void *)mdp, sizeof(mdp));
+               ((int (*)(u_long, u_long, u_long, void *, u_long))entry)(dtbp,
+                   0, 0, (void *)mdp, 0xfb5d104d);
        } else {
                OF_chain((void *)reloc, end - (char *)reloc, (void *)entry,
                    (void *)mdp, 0xfb5d104d);

Copied: head/stand/powerpc/ofw/main.c (from r330364, 
head/stand/ofw/common/main.c)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/stand/powerpc/ofw/main.c       Sat Mar  3 23:39:07 2018        
(r330365, copy of r330364, head/stand/ofw/common/main.c)
@@ -0,0 +1,179 @@
+/*-
+ * Copyright (c) 2000 Benno Rice <be...@jeamland.net>
+ * Copyright (c) 2000 Stephane Potvin <sepot...@videotron.ca>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stand.h>
+#include "openfirm.h"
+#include "libofw.h"
+#include "bootstrap.h"
+
+struct arch_switch     archsw;         /* MI/MD interface boundary */
+
+extern char end[];
+extern char bootprog_info[];
+
+u_int32_t      acells, scells;
+
+static char bootargs[128];
+
+#define        HEAP_SIZE       0x800000
+static char heap[HEAP_SIZE]; // In BSS, so uses no space
+
+#define OF_puts(fd, text) OF_write(fd, text, strlen(text))
+
+void
+init_heap(void)
+{
+       bzero(heap, HEAP_SIZE);
+
+       setheap(heap, (void *)((int)heap + HEAP_SIZE));
+}
+
+uint64_t
+memsize(void)
+{
+       phandle_t       memoryp;
+       cell_t          reg[24];
+       int             i, sz;
+       u_int64_t       memsz;
+
+       memsz = 0;
+       memoryp = OF_instance_to_package(memory);
+
+       sz = OF_getprop(memoryp, "reg", &reg, sizeof(reg));
+       sz /= sizeof(reg[0]);
+
+       for (i = 0; i < sz; i += (acells + scells)) {
+               if (scells > 1)
+                       memsz += (uint64_t)reg[i + acells] << 32;
+               memsz += reg[i + acells + scells - 1];
+       }
+
+       return (memsz);
+}
+
+int
+main(int (*openfirm)(void *))
+{
+       phandle_t       root;
+       int             i;
+       char            bootpath[64];
+       char            *ch;
+       int             bargc;
+       char            **bargv;
+
+       /*
+        * Initialise the Open Firmware routines by giving them the entry point.
+        */
+       OF_init(openfirm);
+
+       root = OF_finddevice("/");
+
+       scells = acells = 1;
+       OF_getprop(root, "#address-cells", &acells, sizeof(acells));
+       OF_getprop(root, "#size-cells", &scells, sizeof(scells));
+
+       /*
+        * Initialise the heap as early as possible.  Once this is done,
+        * alloc() is usable. The stack is buried inside us, so this is
+        * safe.
+        */
+       init_heap();
+
+       /*
+         * Set up console.
+         */
+       cons_probe();
+
+       /*
+        * March through the device switch probing for things.
+        */
+       for (i = 0; devsw[i] != NULL; i++)
+               if (devsw[i]->dv_init != NULL)
+                       (devsw[i]->dv_init)();
+
+       printf("\n%s", bootprog_info);
+       printf("Memory: %lldKB\n", memsize() / 1024);
+
+       OF_getprop(chosen, "bootpath", bootpath, 64);
+       ch = strchr(bootpath, ':');
+       *ch = '\0';
+       printf("Booted from: %s\n", bootpath);
+
+       printf("\n");
+
+       /*
+        * Only parse the first bootarg if present. It should
+        * be simple to handle extra arguments
+        */
+       OF_getprop(chosen, "bootargs", bootargs, sizeof(bootargs));
+       bargc = 0;
+       parse(&bargc, &bargv, bootargs);
+       if (bargc == 1)
+               env_setenv("currdev", EV_VOLATILE, bargv[0], ofw_setcurrdev,
+                   env_nounset);
+       else
+               env_setenv("currdev", EV_VOLATILE, bootpath,
+                          ofw_setcurrdev, env_nounset);
+       env_setenv("loaddev", EV_VOLATILE, bootpath, env_noset,
+           env_nounset);
+       setenv("LINES", "24", 1);               /* optional */
+
+       archsw.arch_getdev = ofw_getdev;
+       archsw.arch_copyin = ofw_copyin;
+       archsw.arch_copyout = ofw_copyout;
+       archsw.arch_readin = ofw_readin;
+       archsw.arch_autoload = ofw_autoload;
+
+       interact();                             /* doesn't return */
+
+       OF_exit();
+
+       return 0;
+}
+
+COMMAND_SET(halt, "halt", "halt the system", command_halt);
+
+static int
+command_halt(int argc, char *argv[])
+{
+
+       OF_exit();
+       return (CMD_OK);
+}
+
+COMMAND_SET(memmap, "memmap", "print memory map", command_memmap);
+
+int
+command_memmap(int argc, char **argv)
+{
+
+       ofw_memmap(acells);
+       return (CMD_OK);
+}

Copied: head/stand/powerpc/ofw/ppc64_elf_freebsd.c (from r330364, 
head/stand/ofw/libofw/ppc64_elf_freebsd.c)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/stand/powerpc/ofw/ppc64_elf_freebsd.c  Sat Mar  3 23:39:07 2018        
(r330365, copy of r330364, head/stand/ofw/libofw/ppc64_elf_freebsd.c)
@@ -0,0 +1,110 @@
+/*-
+ * Copyright (c) 2001 Benno Rice <be...@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define __ELF_WORD_SIZE 64
+
+#include <sys/param.h>
+#include <sys/linker.h>
+
+#include <machine/metadata.h>
+#include <machine/elf.h>
+#include <machine/md_var.h>
+
+#include <stand.h>
+
+#include "bootstrap.h"
+#include "libofw.h"
+#include "openfirm.h"
+
+extern char            end[];
+extern vm_offset_t     reloc;  /* From <arch>/conf.c */
+
+int
+ppc64_ofw_elf_loadfile(char *filename, u_int64_t dest,
+    struct preloaded_file **result)
+{
+       int     r;
+
+       r = __elfN(loadfile)(filename, dest, result);
+       if (r != 0)
+               return (r);
+
+       /*
+        * No need to sync the icache for modules: this will
+        * be done by the kernel after relocation.
+        */
+       if (!strcmp((*result)->f_type, "elf kernel"))
+               __syncicache((void *) (*result)->f_addr, (*result)->f_size);
+       return (0);
+}
+
+int
+ppc64_ofw_elf_exec(struct preloaded_file *fp)
+{
+       struct file_metadata    *fmp;
+       vm_offset_t             mdp, dtbp;
+       Elf_Ehdr                *e;
+       int                     error;
+       intptr_t                entry;
+
+       if ((fmp = file_findmetadata(fp, MODINFOMD_ELFHDR)) == NULL) {
+               return(EFTYPE);
+       }
+       e = (Elf_Ehdr *)&fmp->md_data;
+       
+       /* Handle function descriptor for ELFv1 kernels */
+       if ((e->e_flags & 3) == 2)
+               entry = e->e_entry;
+       else
+               entry = *(uint64_t *)(intptr_t)e->e_entry;
+
+       if ((error = md_load64(fp->f_args, &mdp, &dtbp)) != 0)
+               return (error);
+
+       printf("Kernel entry at 0x%lx ...\n", entry);
+
+       dev_cleanup();
+
+       if (dtbp != 0) {
+               OF_quiesce();
+               ((int (*)(u_long, u_long, u_long, void *, u_long))entry)(dtbp,
+                   0, 0, (void *)mdp, 0xfb5d104d);
+       } else {
+               OF_chain((void *)reloc, end - (char *)reloc, (void *)entry,
+                   (void *)mdp, 0xfb5d104d);
+       }
+
+       panic("exec returned");
+}
+
+struct file_format     ofw_elf64 =
+{
+       ppc64_ofw_elf_loadfile,
+       ppc64_ofw_elf_exec
+};
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to