Author: jhibbits
Date: Tue Feb 13 03:44:50 2018
New Revision: 329190
URL: https://svnweb.freebsd.org/changeset/base/329190

Log:
  Unify metadata load files for arm, mips, powerpc, sparc64
  
  Summary:
  All metadata.c files are very similar, with only trivial changes.  Unify them
  into a single common file, with minor special-casing where needed.
  
  Reviewed By: imp
  Differential Revision: https://reviews.freebsd.org/D13978

Added:
  head/stand/common/metadata.c
     - copied, changed from r329189, head/stand/powerpc/ofw/metadata.c
Deleted:
  head/stand/mips/beri/loader/metadata.c
  head/stand/powerpc/kboot/metadata.c
  head/stand/powerpc/ofw/metadata.c
  head/stand/sparc64/loader/metadata.c
  head/stand/uboot/common/metadata.c
Modified:
  head/stand/loader.mk
  head/stand/mips/beri/loader/Makefile
  head/stand/mips/beri/loader/exec.c
  head/stand/mips/beri/loader/loader.h
  head/stand/powerpc/kboot/Makefile
  head/stand/powerpc/kboot/main.c
  head/stand/powerpc/ofw/Makefile
  head/stand/sparc64/loader/Makefile
  head/stand/uboot.mk
  head/stand/uboot/lib/elf_freebsd.c

Copied and modified: head/stand/common/metadata.c (from r329189, 
head/stand/powerpc/ofw/metadata.c)
==============================================================================
--- head/stand/powerpc/ofw/metadata.c   Tue Feb 13 02:11:39 2018        
(r329189, copy source)
+++ head/stand/common/metadata.c        Tue Feb 13 03:44:50 2018        
(r329190)
@@ -34,12 +34,63 @@ __FBSDID("$FreeBSD$");
 #include <sys/reboot.h>
 #include <sys/linker.h>
 #include <sys/boot.h>
+#if defined(LOADER_FDT_SUPPORT)
 #include <fdt_platform.h>
+#endif
 
 #include <machine/metadata.h>
 
 #include "bootstrap.h"
 
+#if defined(__sparc64__)
+#include <openfirm.h>
+
+extern struct tlb_entry *dtlb_store;
+extern struct tlb_entry *itlb_store;
+
+extern int dtlb_slot;
+extern int itlb_slot;
+
+static int
+md_bootserial(void)
+{
+    char        buf[64];
+    ihandle_t        inst;
+    phandle_t        input;
+    phandle_t        node;
+    phandle_t        output;
+
+    if ((node = OF_finddevice("/options")) == -1)
+        return(-1);
+    if (OF_getprop(node, "input-device", buf, sizeof(buf)) == -1)
+        return(-1);
+    input = OF_finddevice(buf);
+    if (OF_getprop(node, "output-device", buf, sizeof(buf)) == -1)
+        return(-1);
+    output = OF_finddevice(buf);
+    if (input == -1 || output == -1 ||
+        OF_getproplen(input, "keyboard") >= 0) {
+        if ((node = OF_finddevice("/chosen")) == -1)
+            return(-1);
+        if (OF_getprop(node, "stdin", &inst, sizeof(inst)) == -1)
+            return(-1);
+        if ((input = OF_instance_to_package(inst)) == -1)
+            return(-1);
+        if (OF_getprop(node, "stdout", &inst, sizeof(inst)) == -1)
+            return(-1);
+        if ((output = OF_instance_to_package(inst)) == -1)
+            return(-1);
+    }
+    if (input != output)
+        return(-1);
+    if (OF_getprop(input, "device_type", buf, sizeof(buf)) == -1)
+        return(-1);
+    if (strcmp(buf, "serial") != 0)
+        return(-1);
+    return(0);
+}
+#endif
+
 int
 md_getboothowto(char *kargs)
 {
@@ -47,7 +98,7 @@ md_getboothowto(char *kargs)
     int                howto;
     int                active;
     int                i;
-    
+
     /* Parse kargs */
     howto = 0;
     if (kargs != NULL) {
@@ -98,14 +149,20 @@ md_getboothowto(char *kargs)
            cp++;
        }
     }
+
     /* get equivalents from the environment */
     for (i = 0; howto_names[i].ev != NULL; i++)
        if (getenv(howto_names[i].ev) != NULL)
            howto |= howto_names[i].mask;
+#if defined(__sparc64__)
+    if (md_bootserial() != -1)
+       howto |= RB_SERIAL;
+#else
     if (!strcmp(getenv("console"), "comconsole"))
        howto |= RB_SERIAL;
     if (!strcmp(getenv("console"), "nullconsole"))
        howto |= RB_MUTE;
+#endif
     return(howto);
 }
 
@@ -114,11 +171,11 @@ md_getboothowto(char *kargs)
  * Each variable is formatted as <name>=<value>, with a single nul
  * separating each variable, and a double nul terminating the environment.
  */
-vm_offset_t
+static vm_offset_t
 md_copyenv(vm_offset_t addr)
 {
     struct env_var     *ep;
-    
+
     /* traverse the environment */
     for (ep = environ; ep != NULL; ep = ep->ev_next) {
        archsw.arch_copyin(ep->ev_name, addr, strlen(ep->ev_name));
@@ -199,7 +256,7 @@ static int align;
     COPY32(0, a, c);                           \
 }
 
-vm_offset_t
+static vm_offset_t
 md_copymodules(vm_offset_t addr, int kern64)
 {
     struct preloaded_file      *fp;
@@ -235,7 +292,7 @@ md_copymodules(vm_offset_t addr, int kern64)
 }
 
 /*
- * Load the information expected by a powerpc kernel.
+ * Load the information expected by a kernel.
  *
  * - The 'boothowto' argument is constructed
  * - The 'bootdev' argument is constructed
@@ -251,7 +308,9 @@ md_load_dual(char *args, vm_offset_t *modulep, vm_offs
     vm_offset_t                        kernend;
     vm_offset_t                        addr;
     vm_offset_t                        envp;
+#if defined(LOADER_FDT_SUPPORT)
     vm_offset_t                        fdtp;
+#endif
     vm_offset_t                        size;
     uint64_t                   scratch64;
     char                       *rootdevname;
@@ -260,40 +319,45 @@ md_load_dual(char *args, vm_offset_t *modulep, vm_offs
     align = kern64 ? 8 : 4;
     howto = md_getboothowto(args);
 
-    /* 
-     * Allow the environment variable 'rootdev' to override the supplied 
device 
-     * This should perhaps go to MI code and/or have $rootdev tested/set by
-     * MI code before launching the kernel.
+    /*
+     * Allow the environment variable 'rootdev' to override the supplied
+     * device. This should perhaps go to MI code and/or have $rootdev
+     * tested/set by MI code before launching the kernel.
      */
     rootdevname = getenv("rootdev");
     if (rootdevname == NULL)
-           rootdevname = getenv("currdev");
+       rootdevname = getenv("currdev");
     /* Try reading the /etc/fstab file to select the root device */
     getrootmount(rootdevname);
 
-    /* find the last module in the chain */
+    /* Find the last module in the chain */
     addr = 0;
     for (xp = file_findfile(NULL, NULL); xp != NULL; xp = xp->f_next) {
        if (addr < (xp->f_addr + xp->f_size))
            addr = xp->f_addr + xp->f_size;
     }
-    /* pad to a page boundary */
+    /* Pad to a page boundary */
     addr = roundup(addr, PAGE_SIZE);
 
-    /* copy our environment */
+    /* Copy our environment */
     envp = addr;
     addr = md_copyenv(addr);
 
-    /* pad to a page boundary */
+    /* Pad to a page boundary */
     addr = roundup(addr, PAGE_SIZE);
 
+#if defined(LOADER_FDT_SUPPORT)
     /* Copy out FDT */
-    *dtb = fdtp = 0;
-    if (getenv("usefdt") != NULL) {
-        size = fdt_copy(addr);
-        *dtb = fdtp = addr;
-        addr = roundup(addr + size, PAGE_SIZE);
+    fdtp = 0;
+#if defined(__powerpc__)
+    if (getenv("usefdt") != NULL)
+#endif
+    {
+       size = fdt_copy(addr);
+       fdtp = addr;
+       addr = roundup(addr + size, PAGE_SIZE);
     }
+#endif
 
     kernend = 0;
     kfp = file_findfile(NULL, kern64 ? "elf64 kernel" : "elf32 kernel");
@@ -305,19 +369,35 @@ md_load_dual(char *args, vm_offset_t *modulep, vm_offs
     if (kern64) {
        scratch64 = envp;
        file_addmetadata(kfp, MODINFOMD_ENVP, sizeof scratch64, &scratch64);
-        if (fdtp != 0) {
+#if defined(LOADER_FDT_SUPPORT)
+       if (fdtp != 0) {
            scratch64 = fdtp;
            file_addmetadata(kfp, MODINFOMD_DTBP, sizeof scratch64, &scratch64);
-        }
+       }
+#endif
        scratch64 = kernend;
-       file_addmetadata(kfp, MODINFOMD_KERNEND, sizeof scratch64, &scratch64);
+       file_addmetadata(kfp, MODINFOMD_KERNEND,
+               sizeof scratch64, &scratch64);
     } else {
        file_addmetadata(kfp, MODINFOMD_ENVP, sizeof envp, &envp);
-        if (fdtp != 0)
+#if defined(LOADER_FDT_SUPPORT)
+       if (fdtp != 0)
            file_addmetadata(kfp, MODINFOMD_DTBP, sizeof fdtp, &fdtp);
+#endif
        file_addmetadata(kfp, MODINFOMD_KERNEND, sizeof kernend, &kernend);
     }
 
+#if defined(__sparc64__)
+    file_addmetadata(kfp, MODINFOMD_DTLB_SLOTS,
+       sizeof dtlb_slot, &dtlb_slot);
+    file_addmetadata(kfp, MODINFOMD_ITLB_SLOTS,
+       sizeof itlb_slot, &itlb_slot);
+    file_addmetadata(kfp, MODINFOMD_DTLB,
+       dtlb_slot * sizeof(*dtlb_store), dtlb_store);
+    file_addmetadata(kfp, MODINFOMD_ITLB,
+       itlb_slot * sizeof(*itlb_store), itlb_store);
+#endif
+
     *modulep = addr;
     size = md_copymodules(0, kern64);
     kernend = roundup(addr + size, PAGE_SIZE);
@@ -329,8 +409,12 @@ md_load_dual(char *args, vm_offset_t *modulep, vm_offs
     } else {
        bcopy(&kernend, md->md_data, sizeof kernend);
     }
-       
+
     (void)md_copymodules(addr, kern64);
+#if defined(LOADER_FDT_SUPPORT)
+    if (dtb != NULL)
+       *dtb = fdtp;
+#endif
 
     return(0);
 }
@@ -341,9 +425,10 @@ md_load(char *args, vm_offset_t *modulep, vm_offset_t 
     return (md_load_dual(args, modulep, dtb, 0));
 }
 
+#if defined(__mips__) || defined(__powerpc__)
 int
 md_load64(char *args, vm_offset_t *modulep, vm_offset_t *dtb)
 {
     return (md_load_dual(args, modulep, dtb, 1));
 }
-
+#endif

Modified: head/stand/loader.mk
==============================================================================
--- head/stand/loader.mk        Tue Feb 13 02:11:39 2018        (r329189)
+++ head/stand/loader.mk        Tue Feb 13 03:44:50 2018        (r329190)
@@ -20,12 +20,16 @@ SRCS+=      load_elf32.c reloc_elf32.c
 .elif ${MACHINE_CPUARCH} == "powerpc"
 SRCS+= load_elf32.c reloc_elf32.c
 SRCS+= load_elf64.c reloc_elf64.c
+SRCS+= metadata.c
 .elif ${MACHINE_CPUARCH} == "sparc64"
 SRCS+= load_elf64.c reloc_elf64.c
+SRCS+= metadata.c
 .elif ${MACHINE_ARCH:Mmips64*} != ""
 SRCS+= load_elf64.c reloc_elf64.c
+SRCS+= metadata.c
 .elif ${MACHINE} == "mips"
 SRCS+= load_elf32.c reloc_elf32.c
+SRCS+= metadata.c
 .endif
 
 .if ${LOADER_DISK_SUPPORT:Uyes} == "yes"

Modified: head/stand/mips/beri/loader/Makefile
==============================================================================
--- head/stand/mips/beri/loader/Makefile        Tue Feb 13 02:11:39 2018        
(r329189)
+++ head/stand/mips/beri/loader/Makefile        Tue Feb 13 03:44:50 2018        
(r329190)
@@ -47,7 +47,6 @@ SRCS=         start.S                                         
\
                main.c                                          \
                devicename.c                                    \
                exec.c                                          \
-               metadata.c                                      \
                vers.c                                          \
                arch.c
 

Modified: head/stand/mips/beri/loader/exec.c
==============================================================================
--- head/stand/mips/beri/loader/exec.c  Tue Feb 13 02:11:39 2018        
(r329189)
+++ head/stand/mips/beri/loader/exec.c  Tue Feb 13 03:44:50 2018        
(r329190)
@@ -85,7 +85,7 @@ beri_elf64_exec(struct preloaded_file *fp)
        }
        ehdr = (Elf_Ehdr *)md->md_data;
 
-       error = md_load64(fp->f_args, &mdp);
+       error = md_load64(fp->f_args, &mdp, NULL);
        if (error) {
                printf("%s: md_load64 failed\n", fp->f_name);
                return (error);

Modified: head/stand/mips/beri/loader/loader.h
==============================================================================
--- head/stand/mips/beri/loader/loader.h        Tue Feb 13 02:11:39 2018        
(r329189)
+++ head/stand/mips/beri/loader/loader.h        Tue Feb 13 03:44:50 2018        
(r329190)
@@ -56,7 +56,7 @@ extern char           **boot2_envv;
 extern struct bootinfo  boot2_bootinfo;
 
 /* metadata.c */
-int    md_load64(char *args, vm_offset_t *modulep);
+int    md_load64(char *args, vm_offset_t *modulep, vm_offset_t *dtbp);
 
 /* vers.c */
 extern char            bootprog_info[];

Modified: head/stand/powerpc/kboot/Makefile
==============================================================================
--- head/stand/powerpc/kboot/Makefile   Tue Feb 13 02:11:39 2018        
(r329189)
+++ head/stand/powerpc/kboot/Makefile   Tue Feb 13 03:44:50 2018        
(r329190)
@@ -17,7 +17,7 @@ NEWVERSWHAT=  "kboot loader" ${MACHINE_ARCH}
 INSTALLFLAGS=  -b
 
 # Architecture-specific loader code
-SRCS=          conf.c metadata.c vers.c main.c ppc64_elf_freebsd.c
+SRCS=          conf.c vers.c main.c ppc64_elf_freebsd.c
 SRCS+=         host_syscall.S hostcons.c hostdisk.c kerneltramp.S kbootfdt.c
 SRCS+=         ucmpdi2.c
 

Modified: head/stand/powerpc/kboot/main.c
==============================================================================
--- head/stand/powerpc/kboot/main.c     Tue Feb 13 02:11:39 2018        
(r329189)
+++ head/stand/powerpc/kboot/main.c     Tue Feb 13 03:44:50 2018        
(r329190)
@@ -291,6 +291,7 @@ main(int argc, const char **argv)
        setenv("currdev", bootdev, 1);
        setenv("loaddev", bootdev, 1);
        setenv("LINES", "24", 1);
+       setenv("usefdt", "1", 1);
 
        interact();                     /* doesn't return */
 

Modified: head/stand/powerpc/ofw/Makefile
==============================================================================
--- head/stand/powerpc/ofw/Makefile     Tue Feb 13 02:11:39 2018        
(r329189)
+++ head/stand/powerpc/ofw/Makefile     Tue Feb 13 03:44:50 2018        
(r329190)
@@ -17,7 +17,7 @@ NEWVERSWHAT=  "Open Firmware loader" ${MACHINE_ARCH}
 INSTALLFLAGS=  -b
 
 # Architecture-specific loader code
-SRCS=          conf.c metadata.c vers.c start.c
+SRCS=          conf.c vers.c start.c
 SRCS+=         ucmpdi2.c
 
 .include       "${BOOTSRC}/fdt.mk"

Modified: head/stand/sparc64/loader/Makefile
==============================================================================
--- head/stand/sparc64/loader/Makefile  Tue Feb 13 02:11:39 2018        
(r329189)
+++ head/stand/sparc64/loader/Makefile  Tue Feb 13 03:44:50 2018        
(r329190)
@@ -21,7 +21,7 @@ INSTALLFLAGS= -b
 
 # Architecture-specific loader code
 .PATH:         ${BOOTSRC}/sparc64/loader
-SRCS=          locore.S main.c metadata.c vers.c
+SRCS=          locore.S main.c vers.c
 
 .if ${LOADER_DEBUG} == "yes"
 CFLAGS+=       -DLOADER_DEBUG

Modified: head/stand/uboot.mk
==============================================================================
--- head/stand/uboot.mk Tue Feb 13 02:11:39 2018        (r329189)
+++ head/stand/uboot.mk Tue Feb 13 03:44:50 2018        (r329190)
@@ -1,6 +1,6 @@
 # $FreeBSD$
 
-SRCS+= main.c metadata.c
+SRCS+= main.c
 
 .PATH:         ${UBOOTSRC}/common
 
@@ -10,6 +10,9 @@ CFLAGS+=      -I${UBOOTSRC}/common
 LIBUBOOT=      ${BOOTOBJ}/uboot/lib/libuboot.a
 CFLAGS+=       -I${UBOOTSRC}/lib
 CFLAGS+=       -I${BOOTOBJ}/uboot/lib
+.if ${MACHINE_CPUARCH} == "arm"
+SRCS+= metadata.c
+.endif
 
 .include "${BOOTSRC}/fdt.mk"
 

Modified: head/stand/uboot/lib/elf_freebsd.c
==============================================================================
--- head/stand/uboot/lib/elf_freebsd.c  Tue Feb 13 02:11:39 2018        
(r329189)
+++ head/stand/uboot/lib/elf_freebsd.c  Tue Feb 13 03:44:50 2018        
(r329190)
@@ -44,7 +44,7 @@ __FBSDID("$FreeBSD$");
 #include "bootstrap.h"
 #include "libuboot.h"
 
-extern vm_offset_t md_load(char *, vm_offset_t *);
+extern vm_offset_t md_load(char *, vm_offset_t *, vm_offset_t *);
 
 int
 __elfN(uboot_load)(char *filename, u_int64_t dest,
@@ -81,7 +81,7 @@ __elfN(uboot_exec)(struct preloaded_file *fp)
 
        e = (Elf_Ehdr *)&fmp->md_data;
 
-       if ((error = md_load(fp->f_args, &mdp)) != 0)
+       if ((error = md_load(fp->f_args, &mdp, NULL)) != 0)
                return (error);
 
        entry = (void *)e->e_entry;
_______________________________________________
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