summaryrefslogtreecommitdiffstats
path: root/sys/boot/uboot
diff options
context:
space:
mode:
authorian <ian@FreeBSD.org>2014-03-01 19:02:00 +0000
committerian <ian@FreeBSD.org>2014-03-01 19:02:00 +0000
commit3cccc93a2647c00f24f62d4f88919ee60433d0bf (patch)
tree9c4d28d096e50543af30416154bce899de088f2b /sys/boot/uboot
parentc980900e52d22edcb779ce36a512c64a293c35ea (diff)
downloadFreeBSD-src-3cccc93a2647c00f24f62d4f88919ee60433d0bf.zip
FreeBSD-src-3cccc93a2647c00f24f62d4f88919ee60433d0bf.tar.gz
Prevent fdt data loaded from a file from overwriting the kernel environment,
by having uboot_autoload() do the fdt setup (which may load a file) rather than waiting until we're actually in the process of launching the kernel. As part of making this happen... - Define LOADER_FDT_SUPPORT on the uboot/lib compile command line when MK_FDT is set. - Make fdt_setup_fdtb() public. - Declare public fdt_whatever() functions in a header instead of using scattered extern decls in .c files.
Diffstat (limited to 'sys/boot/uboot')
-rw-r--r--sys/boot/uboot/common/metadata.c4
-rw-r--r--sys/boot/uboot/lib/Makefile12
-rw-r--r--sys/boot/uboot/lib/libuboot.h6
-rw-r--r--sys/boot/uboot/lib/module.c10
4 files changed, 25 insertions, 7 deletions
diff --git a/sys/boot/uboot/common/metadata.c b/sys/boot/uboot/common/metadata.c
index bbc1893..e0ab469 100644
--- a/sys/boot/uboot/common/metadata.c
+++ b/sys/boot/uboot/common/metadata.c
@@ -41,10 +41,6 @@ __FBSDID("$FreeBSD$");
#include "bootstrap.h"
#include "glue.h"
-#if defined(LOADER_FDT_SUPPORT)
-extern int fdt_copy(vm_offset_t);
-#endif
-
/*
* Return a 'boothowto' value corresponding to the kernel arguments in
* (kargs) and any relevant environment variables.
diff --git a/sys/boot/uboot/lib/Makefile b/sys/boot/uboot/lib/Makefile
index 7908f24..e5ed3ce 100644
--- a/sys/boot/uboot/lib/Makefile
+++ b/sys/boot/uboot/lib/Makefile
@@ -1,5 +1,7 @@
# $FreeBSD$
+.include <bsd.own.mk>
+
.PATH: ${.CURDIR}/../../common
LIB= uboot
@@ -18,6 +20,16 @@ SRCS+= disk.c
CFLAGS+= -DLOADER_DISK_SUPPORT
.endif
+.if ${MK_FDT} != "no"
+LOADER_FDT_SUPPORT= yes
+.else
+LOADER_FDT_SUPPORT= no
+.endif
+
+.if ${LOADER_FDT_SUPPORT} == "yes"
+CFLAGS+= -DLOADER_FDT_SUPPORT
+.endif
+
# Pick up FDT includes
CFLAGS+= -I${.CURDIR}/../../../../sys/contrib/libfdt/
diff --git a/sys/boot/uboot/lib/libuboot.h b/sys/boot/uboot/lib/libuboot.h
index 1f63bee..bf07ad3 100644
--- a/sys/boot/uboot/lib/libuboot.h
+++ b/sys/boot/uboot/lib/libuboot.h
@@ -69,3 +69,9 @@ struct file_format;
extern struct file_format uboot_elf;
void reboot(void);
+
+#if defined(LOADER_FDT_SUPPORT)
+extern int fdt_setup_fdtp();
+extern int fdt_copy(vm_offset_t);
+#endif
+
diff --git a/sys/boot/uboot/lib/module.c b/sys/boot/uboot/lib/module.c
index f03d644..d9b3dc0 100644
--- a/sys/boot/uboot/lib/module.c
+++ b/sys/boot/uboot/lib/module.c
@@ -29,19 +29,23 @@ __FBSDID("$FreeBSD$");
/*
* U-Boot-specific module functionality.
- *
- * XXX not much for now...
- *
*/
#include <stand.h>
#include <string.h>
#include "bootstrap.h"
+#include "libuboot.h"
int
uboot_autoload(void)
{
+#if defined(LOADER_FDT_SUPPORT)
+ int err;
+
+ if ((err = fdt_setup_fdtp()) != 0)
+ return (err);
+#endif
return(0);
}
OpenPOWER on IntegriCloud