svn commit: r329190 - in head/stand: . common mips/beri/loader powerpc/kboot powerpc/ofw sparc64/loader uboot/common uboot/lib
Justin Hibbits
jhibbits at FreeBSD.org
Tue Feb 13 03:44:52 UTC 2018
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;
More information about the svn-src-all
mailing list