summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2016-05-17 22:41:20 +0000
committerkettenis <kettenis@openbsd.org>2016-05-17 22:41:20 +0000
commit154f84352e13ff58fbf11393218f88deb8041e64 (patch)
treea9a675e4060653bffa0d16187c0612901cf2d4a5
parentFix a one-byte buffer underflow (read access only). (diff)
downloadwireguard-openbsd-154f84352e13ff58fbf11393218f88deb8041e64.tar.xz
wireguard-openbsd-154f84352e13ff58fbf11393218f88deb8041e64.zip
Enable -Wall -Werror. Fix warnings uncovered by this.
Set board IDs for i.IMX6 boards based on the "compatible" property of the root node for now to ease the transition to full FDT support in the kernel.
-rw-r--r--sys/arch/armv7/stand/efiboot/Makefile3
-rw-r--r--sys/arch/armv7/stand/efiboot/efiboot.c39
-rw-r--r--sys/arch/armv7/stand/efiboot/efiboot.h4
-rw-r--r--sys/arch/armv7/stand/efiboot/exec.c8
-rw-r--r--sys/arch/armv7/stand/efiboot/fdt.c21
-rw-r--r--sys/arch/armv7/stand/efiboot/fdt.h7
6 files changed, 65 insertions, 17 deletions
diff --git a/sys/arch/armv7/stand/efiboot/Makefile b/sys/arch/armv7/stand/efiboot/Makefile
index 4c1378a6e8e..894577cd089 100644
--- a/sys/arch/armv7/stand/efiboot/Makefile
+++ b/sys/arch/armv7/stand/efiboot/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.2 2016/05/17 21:26:32 kettenis Exp $
+# $OpenBSD: Makefile,v 1.3 2016/05/17 22:41:20 kettenis Exp $
PROG= BOOTARM.EFI
NOMAN= #
@@ -39,6 +39,7 @@ CPPFLAGS+= -DSMALL -DSLOW -DNOBYFOUR -D__INTERNAL_LIBSA_CREAD
CPPFLAGS+= -DNEEDS_HEAP_H
COPTS+= -ffreestanding -fno-stack-protector
COPTS+= -fshort-wchar -fPIC -fno-builtin
+COPTS+= -Wall -Werror
PROG.elf= ${PROG:S/.EFI/.elf/}
CLEANFILES+= ${PROG.elf} ${PROG.elf}.tmp
diff --git a/sys/arch/armv7/stand/efiboot/efiboot.c b/sys/arch/armv7/stand/efiboot/efiboot.c
index 822460e1e21..be0416509cc 100644
--- a/sys/arch/armv7/stand/efiboot/efiboot.c
+++ b/sys/arch/armv7/stand/efiboot/efiboot.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: efiboot.c,v 1.5 2016/05/17 21:26:32 kettenis Exp $ */
+/* $OpenBSD: efiboot.c,v 1.6 2016/05/17 22:41:20 kettenis Exp $ */
/*
* Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net>
@@ -27,6 +27,9 @@
#include <efiprot.h>
#include <eficonsctl.h>
+#include <lib/libkern/libkern.h>
+#include <stand/boot/cmd.h>
+
#include "eficall.h"
#include "fdt.h"
#include "libsa.h"
@@ -216,12 +219,28 @@ next:
free(handles, sz);
}
+struct board_id {
+ const char *name;
+ uint32_t board_id;
+};
+
+struct board_id board_id_table[] = {
+ { "phytec,imx6q-pbab01", 3529 },
+ { "fsl,imx6q-sabrelite", 3769 },
+ { "fsl,imx6q-sabresd", 3980 },
+ { "kosagi,imx6q-novena", 4269 },
+ { "solidrun,hummingboard/q", 4773 },
+ { "solidrun,cubox-i/q", 4821 },
+ { "wand,imx6q-wandboard", 4412 },
+ { "udoo,imx6q-udoo", 4800 },
+};
+
static EFI_GUID fdt_guid = FDT_TABLE_GUID;
#define efi_guidcmp(_a, _b) memcmp((_a), (_b), sizeof(EFI_GUID))
void *
-efi_makebootargs(char *bootargs)
+efi_makebootargs(char *bootargs, uint32_t *board_id)
{
void *fdt = NULL;
char *dummy;
@@ -236,19 +255,27 @@ efi_makebootargs(char *bootargs)
}
if (!fdt_init(fdt))
- return;
+ return NULL;
node = fdt_find_node("/chosen");
if (!node)
- return;
+ return NULL;
len = strlen(bootargs) + 1;
- if (fdt_node_property(node, "bootargs", &bootargs))
+ if (fdt_node_property(node, "bootargs", &dummy))
fdt_node_set_property(node, "bootargs", bootargs, len);
else
fdt_node_add_property(node, "bootargs", bootargs, len);
fdt_finalize();
+ node = fdt_find_node("/");
+ for (i = 0; i < nitems(board_id_table); i++) {
+ if (fdt_node_is_compatible(node, board_id_table[i].name)) {
+ *board_id = board_id_table[i].board_id;
+ break;
+ }
+ }
+
return fdt;
}
@@ -393,7 +420,7 @@ devparse(const char *fname, int *dev, int *unit, int *part, const char **file)
s = strchr(fname, ':');
if (s != NULL) {
int devlen;
- int i, u, p;
+ int i, u, p = 0;
struct devsw *dp;
char devname[MAXDEVNAME];
diff --git a/sys/arch/armv7/stand/efiboot/efiboot.h b/sys/arch/armv7/stand/efiboot/efiboot.h
index 9d9d7bf3b8f..accc8dba5dc 100644
--- a/sys/arch/armv7/stand/efiboot/efiboot.h
+++ b/sys/arch/armv7/stand/efiboot/efiboot.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: efiboot.h,v 1.2 2016/05/17 21:26:32 kettenis Exp $ */
+/* $OpenBSD: efiboot.h,v 1.3 2016/05/17 22:41:20 kettenis Exp $ */
/*
* Copyright (c) 2015 YASUOKA Masahiko <yasuoka@yasuoka.net>
@@ -18,7 +18,7 @@
void efi_cleanup(void);
void efi_diskprobe(void);
-void *efi_makebootargs(char *);
+void *efi_makebootargs(char *, uint32_t *);
void efi_cons_probe(struct consdev *);
void efi_cons_init(struct consdev *);
int efi_cons_getc(dev_t);
diff --git a/sys/arch/armv7/stand/efiboot/exec.c b/sys/arch/armv7/stand/efiboot/exec.c
index 1d16b271e8d..a8aef52a4a1 100644
--- a/sys/arch/armv7/stand/efiboot/exec.c
+++ b/sys/arch/armv7/stand/efiboot/exec.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: exec.c,v 1.5 2016/05/17 21:26:32 kettenis Exp $ */
+/* $OpenBSD: exec.c,v 1.6 2016/05/17 22:41:20 kettenis Exp $ */
/*
* Copyright (c) 2006, 2016 Mark Kettenis
@@ -86,6 +86,7 @@ run_loadfile(u_long *marks, int howto)
char args[256];
char *cp;
void *fdt;
+ uint32_t board_id;
int i;
/*
@@ -121,7 +122,7 @@ run_loadfile(u_long *marks, int howto)
else
*++cp = 0;
- fdt = efi_makebootargs(args);
+ fdt = efi_makebootargs(args, &board_id);
if (fdt == 0) {
tags[0].hdr.tag = ATAG_MEM;
tags[0].hdr.size = sizeof(struct uboot_tag) / sizeof(uint32_t);
@@ -134,11 +135,12 @@ run_loadfile(u_long *marks, int howto)
memcpy((void *)0x10000000, tags, sizeof(tags));
fdt = (void *)0x10000000;
+ board_id = 4821;
}
efi_cleanup();
- (*(startfuncp)(marks[MARK_ENTRY]))(NULL, (void *)4821, fdt);
+ (*(startfuncp)(marks[MARK_ENTRY]))(NULL, (void *)board_id, fdt);
/* NOTREACHED */
}
diff --git a/sys/arch/armv7/stand/efiboot/fdt.c b/sys/arch/armv7/stand/efiboot/fdt.c
index a0ceca48a66..da9552b7fc4 100644
--- a/sys/arch/armv7/stand/efiboot/fdt.c
+++ b/sys/arch/armv7/stand/efiboot/fdt.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: fdt.c,v 1.1 2016/05/17 21:26:32 kettenis Exp $ */
+/* $OpenBSD: fdt.c,v 1.2 2016/05/17 22:41:20 kettenis Exp $ */
/*
* Copyright (c) 2009 Dariusz Swiderski <sfires@sfires.net>
@@ -253,7 +253,7 @@ fdt_node_set_property(void *node, char *name, char *data, int len)
tree.end += delta;
*(ptr + 1) = htobe32(len);
memcpy(ptr + 3, data, len);
- return;
+ return 1;
}
ptr = next;
}
@@ -460,6 +460,23 @@ fdt_parent_node(void *node)
return fdt_parent_node_recurse(pnode, node);
}
+int
+fdt_node_is_compatible(void *node, const char *name)
+{
+ char *data;
+ int len;
+
+ len = fdt_node_property(node, "compatible", &data);
+ while (len > 0) {
+ if (strcmp(data, name) == 0)
+ return 1;
+ len -= strlen(data) + 1;
+ data += strlen(data) + 1;
+ }
+
+ return 0;
+}
+
#ifdef DEBUG
/*
* Debug methods for printing whole tree, particular odes and properies
diff --git a/sys/arch/armv7/stand/efiboot/fdt.h b/sys/arch/armv7/stand/efiboot/fdt.h
index 2fc4e6f3047..eb030d2bd60 100644
--- a/sys/arch/armv7/stand/efiboot/fdt.h
+++ b/sys/arch/armv7/stand/efiboot/fdt.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: fdt.h,v 1.1 2016/05/17 21:26:32 kettenis Exp $ */
+/* $OpenBSD: fdt.h,v 1.2 2016/05/17 22:41:20 kettenis Exp $ */
/*
* Copyright (c) 2009 Dariusz Swiderski <sfires@sfires.net>
@@ -57,9 +57,10 @@ void *fdt_child_node(void *);
char *fdt_node_name(void *);
void *fdt_find_node(char *);
int fdt_node_property(void *, char *, char **);
-int fdt_set_node_property(void *, char *, char *, int);
-int fdt_add_node_property(void *, char *, char *, int);
+int fdt_node_set_property(void *, char *, char *, int);
+int fdt_node_add_property(void *, char *, char *, int);
void *fdt_parent_node(void *);
+int fdt_node_is_compatible(void *, const char *);
#ifdef DEBUG
void *fdt_print_property(void *, int);
void fdt_print_node(void *, int);