diff options
author | 2016-05-17 22:41:20 +0000 | |
---|---|---|
committer | 2016-05-17 22:41:20 +0000 | |
commit | 154f84352e13ff58fbf11393218f88deb8041e64 (patch) | |
tree | a9a675e4060653bffa0d16187c0612901cf2d4a5 | |
parent | Fix a one-byte buffer underflow (read access only). (diff) | |
download | wireguard-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/Makefile | 3 | ||||
-rw-r--r-- | sys/arch/armv7/stand/efiboot/efiboot.c | 39 | ||||
-rw-r--r-- | sys/arch/armv7/stand/efiboot/efiboot.h | 4 | ||||
-rw-r--r-- | sys/arch/armv7/stand/efiboot/exec.c | 8 | ||||
-rw-r--r-- | sys/arch/armv7/stand/efiboot/fdt.c | 21 | ||||
-rw-r--r-- | sys/arch/armv7/stand/efiboot/fdt.h | 7 |
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); |