Thu Jun 8 16:00:40 2017 UTC ()
Merge conflicts
(skrll)
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/.gitignore
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/.travis.yml
diff -r1.2 -r1.3 src/external/gpl2/dtc/dist/data.c
diff -r1.2 -r1.3 src/external/gpl2/dtc/dist/dtc-lexer.l
diff -r1.2 -r1.3 src/external/gpl2/dtc/dist/dtc-parser.y
diff -r1.2 -r1.3 src/external/gpl2/dtc/dist/dtc.h
diff -r1.2 -r1.3 src/external/gpl2/dtc/dist/fdtdump.c
diff -r1.2 -r1.3 src/external/gpl2/dtc/dist/fdtput.c
diff -r1.2 -r1.3 src/external/gpl2/dtc/dist/flattree.c
diff -r1.2 -r1.3 src/external/gpl2/dtc/dist/srcpos.c
diff -r1.2 -r1.3 src/external/gpl2/dtc/dist/util.h
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/Makefile.libfdt
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/TODO
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/fdt.c
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/fdt.h
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/fdt_addresses.c
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/fdt_empty_tree.c
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/fdt_ro.c
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/fdt_rw.c
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/fdt_strerror.c
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/fdt_sw.c
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/fdt_wip.c
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/libfdt.h
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/libfdt_env.h
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/libfdt_internal.h
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/libfdt/version.lds
diff -r1.2 -r1.3 src/external/gpl2/dtc/dist/tests/mangle-layout.c
diff -r1.2 -r1.3 src/external/gpl2/dtc/dist/tests/move_and_save.c
diff -r1.2 -r1.3 src/external/gpl2/dtc/dist/tests/tests.h
diff -r1.1.1.1 -r0 src/external/gpl2/dtc/dist/tests/test_tree1_body.dtsi
--- src/external/gpl2/dtc/dist/data.c 2017/06/06 20:19:04 1.2
+++ src/external/gpl2/dtc/dist/data.c 2017/06/08 16:00:40 1.3
@@ -1,3 +1,5 @@
+/* $NetBSD: data.c,v 1.3 2017/06/08 16:00:40 skrll Exp $ */
+
/*
* (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
*
@@ -171,9 +173,9 @@
struct data data_append_integer(struct data d, uint64_t value, int bits)
{
uint8_t value_8;
- uint16_t value_16;
- uint32_t value_32;
- uint64_t value_64;
+ fdt16_t value_16;
+ fdt32_t value_32;
+ fdt64_t value_64;
switch (bits) {
case 8:
@@ -197,14 +199,14 @@
}
}
-struct data data_append_re(struct data d, const struct fdt_reserve_entry *re)
+struct data data_append_re(struct data d, uint64_t address, uint64_t size)
{
- struct fdt_reserve_entry bere;
+ struct fdt_reserve_entry re;
- bere.address = cpu_to_fdt64(re->address);
- bere.size = cpu_to_fdt64(re->size);
+ re.address = cpu_to_fdt64(address);
+ re.size = cpu_to_fdt64(size);
- return data_append_data(d, &bere, sizeof(bere));
+ return data_append_data(d, &re, sizeof(re));
}
struct data data_append_cell(struct data d, cell_t word)
--- src/external/gpl2/dtc/dist/dtc-lexer.l 2017/06/05 18:59:10 1.2
+++ src/external/gpl2/dtc/dist/dtc-lexer.l 2017/06/08 16:00:40 1.3
@@ -1,3 +1,5 @@
+/* $NetBSD: dtc-lexer.l,v 1.3 2017/06/08 16:00:40 skrll Exp $ */
+
/*
* (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
*
@@ -62,7 +64,8 @@
static void push_input_file(const char *filename);
static bool pop_input_file(void);
-static void lexical_error(const char *fmt, ...);
+static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
+
%}
%%
@@ -73,24 +76,32 @@
}
<*>^"#"(line)?[ \t]+[0-9]+[ \t]+{STRING}([ \t]+[0-9]+)? {
- char *line, *tmp, *fn;
+ char *line, *fnstart, *fnend;
+ struct data fn;
/* skip text before line # */
line = yytext;
while (!isdigit((unsigned char)*line))
line++;
- /* skip digits in line # */
- tmp = line;
- while (!isspace((unsigned char)*tmp))
- tmp++;
- /* "NULL"-terminate line # */
- *tmp = '\0';
- /* start of filename */
- fn = strchr(tmp + 1, '"') + 1;
- /* strip trailing " from filename */
- tmp = strchr(fn, '"');
- *tmp = 0;
+
+ /* regexp ensures that first and list "
+ * in the whole yytext are those at
+ * beginning and end of the filename string */
+ fnstart = memchr(yytext, '"', yyleng);
+ for (fnend = yytext + yyleng - 1;
+ *fnend != '"'; fnend--)
+ ;
+ assert(fnstart && fnend && (fnend > fnstart));
+
+ fn = data_copy_escape_string(fnstart + 1,
+ fnend - fnstart - 1);
+
+ /* Don't allow nuls in filenames */
+ if (memchr(fn.val, '\0', fn.len - 1))
+ lexical_error("nul in line number directive");
+
/* -1 since #line is the number of the next line */
- srcpos_set_line(xstrdup(fn), atoi(line) - 1);
+ srcpos_set_line(xstrdup(fn.val), atoi(line) - 1);
+ data_free(fn);
}
<*><<EOF>> {
@@ -113,6 +124,11 @@
return DT_V1;
}
+<*>"/plugin/" {
+ DPRINT("Keyword: /plugin/\n");
+ return DT_PLUGIN;
+ }
+
<*>"/memreserve/" {
DPRINT("Keyword: /memreserve/\n");
BEGIN_DEFAULT();
@@ -153,7 +169,10 @@
errno = 0;
yylval.integer = strtoull(yytext, &e, 0);
- assert(!(*e) || !e[strspn(e, "UL")]);
+ if (*e && e[strspn(e, "UL")]) {
+ lexical_error("Bad integer literal '%s'",
+ yytext);
+ }
if (errno == ERANGE)
lexical_error("Integer literal '%s' out of range",
@@ -173,16 +192,16 @@
if (d.len == 1) {
lexical_error("Empty character literal");
yylval.integer = 0;
- return DT_CHAR_LITERAL;
+ } else {
+ yylval.integer = (unsigned char)d.val[0];
+
+ if (d.len > 2)
+ lexical_error("Character literal has %d"
+ " characters instead of 1",
+ d.len - 1);
}
- yylval.integer = (unsigned char)d.val[0];
-
- if (d.len > 2)
- lexical_error("Character literal has %d"
- " characters instead of 1",
- d.len - 1);
-
+ data_free(d);
return DT_CHAR_LITERAL;
}
--- src/external/gpl2/dtc/dist/dtc-parser.y 2017/06/05 18:59:21 1.2
+++ src/external/gpl2/dtc/dist/dtc-parser.y 2017/06/08 16:00:40 1.3
@@ -1,3 +1,5 @@
+/* $NetBSD: dtc-parser.y,v 1.3 2017/06/08 16:00:40 skrll Exp $ */
+
/*
* (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
*
@@ -19,6 +21,7 @@
*/
%{
#include <stdio.h>
+#include <inttypes.h>
#include "dtc.h"
#include "srcpos.h"
@@ -35,7 +38,7 @@
treesource_error = true; \
} while (0)
-extern struct boot_info *the_boot_info;
+extern struct dt_info *parser_output;
extern bool treesource_error;
%}
@@ -56,9 +59,11 @@
struct node *nodelist;
struct reserve_info *re;
uint64_t integer;
+ unsigned int flags;
}
%token DT_V1
+%token DT_PLUGIN
%token DT_MEMRESERVE
%token DT_LSHIFT DT_RSHIFT DT_LE DT_GE DT_EQ DT_NE DT_AND DT_OR
%token DT_BITS
@@ -75,6 +80,8 @@
%type <data> propdata
%type <data> propdataprefix
+%type <flags> header
+%type <flags> headers
%type <re> memreserve
%type <re> memreserves
%type <array> arrayprefix
@@ -105,13 +112,34 @@
%%
sourcefile:
- DT_V1 ';' memreserves devicetree
+ headers memreserves devicetree
{
- the_boot_info = build_boot_info($3, $4,
- guess_boot_cpuid($4));
+ parser_output = build_dt_info($1, $2, $3,
+ guess_boot_cpuid($3));
}
;
+header:
+ DT_V1 ';'
+ {
+ $$ = DTSF_V1;
+ }
+ | DT_V1 ';' DT_PLUGIN ';'
+ {
+ $$ = DTSF_V1 | DTSF_PLUGIN;
+ }
+ ;
+
+headers:
+ header
+ | header headers
+ {
+ if ($2 != $1)
+ ERROR(&@2, "Header flags don't match earlier ones");
+ $$ = $1;
+ }
+ ;
+
memreserves:
/* empty */
{
@@ -149,10 +177,10 @@
{
struct node *target = get_node_by_ref($1, $3);
- add_label(&target->labels, $2);
- if (target)
+ if (target) {
+ add_label(&target->labels, $2);
merge_nodes(target, $4);
- else
+ } else
ERROR(&@3, "Label or path %s not found", $3);
$$ = $1;
}
@@ -414,8 +442,24 @@
integer_mul:
integer_mul '*' integer_unary { $$ = $1 * $3; }
- | integer_mul '/' integer_unary { $$ = $1 / $3; }
- | integer_mul '%' integer_unary { $$ = $1 % $3; }
+ | integer_mul '/' integer_unary
+ {
+ if ($3 != 0) {
+ $$ = $1 / $3;
+ } else {
+ ERROR(&@$, "Division by zero");
+ $$ = 0;
+ }
+ }
+ | integer_mul '%' integer_unary
+ {
+ if ($3 != 0) {
+ $$ = $1 % $3;
+ } else {
+ ERROR(&@$, "Division by zero");
+ $$ = 0;
+ }
+ }
| integer_unary
;
--- src/external/gpl2/dtc/dist/dtc.h 2017/06/06 20:19:04 1.2
+++ src/external/gpl2/dtc/dist/dtc.h 2017/06/08 16:00:40 1.3
@@ -1,3 +1,5 @@
+/* $NetBSD: dtc.h,v 1.3 2017/06/08 16:00:40 skrll Exp $ */
+
#ifndef _DTC_H
#define _DTC_H
@@ -43,7 +45,6 @@
#define debug(...)
#endif
-
#define DEFAULT_FDT_VERSION 17
/*
@@ -53,7 +54,11 @@
extern int reservenum; /* Number of memory reservation slots */
extern int minsize; /* Minimum blob size */
extern int padsize; /* Additional padding to blob */
+extern int alignsize; /* Additional padding to blob accroding to the alignsize */
extern int phandle_format; /* Use linux,phandle or phandle properties */
+extern int generate_symbols; /* generate symbols for nodes with labels */
+extern int generate_fixups; /* generate fixups */
+extern int auto_label_aliases; /* auto generate labels -> aliases */
#define PHANDLE_LEGACY 0x1
#define PHANDLE_EPAPR 0x2
@@ -108,7 +113,7 @@
struct data data_merge(struct data d1, struct data d2);
struct data data_append_cell(struct data d, cell_t word);
struct data data_append_integer(struct data d, uint64_t word, int bits);
-struct data data_append_re(struct data d, const struct fdt_reserve_entry *re);
+struct data data_append_re(struct data d, uint64_t address, uint64_t size);
struct data data_append_addr(struct data d, uint64_t addr);
struct data data_append_byte(struct data d, uint8_t byte);
struct data data_append_zeroes(struct data d, int len);
@@ -199,6 +204,8 @@
void add_child(struct node *parent, struct node *child);
void delete_node_by_name(struct node *parent, char *name);
void delete_node(struct node *node);
+void append_to_property(struct node *node,
+ char *name, const void *data, int len);
const char *get_unitname(struct node *node);
struct property *get_property(struct node *node, const char *propname);
@@ -219,7 +226,7 @@
/* Boot info (tree plus memreserve information */
struct reserve_info {
- struct fdt_reserve_entry re;
+ uint64_t address, size;
struct reserve_info *next;
@@ -233,35 +240,45 @@
struct reserve_info *new);
-struct boot_info {
+struct dt_info {
+ unsigned int dtsflags;
struct reserve_info *reservelist;
- struct node *dt; /* the device tree */
uint32_t boot_cpuid_phys;
+ struct node *dt; /* the device tree */
+ const char *outname; /* filename being written to, "-" for stdout */
};
-struct boot_info *build_boot_info(struct reserve_info *reservelist,
- struct node *tree, uint32_t boot_cpuid_phys);
-void sort_tree(struct boot_info *bi);
+/* DTS version flags definitions */
+#define DTSF_V1 0x0001 /* /dts-v1/ */
+#define DTSF_PLUGIN 0x0002 /* /plugin/ */
+struct dt_info *build_dt_info(unsigned int dtsflags,
+ struct reserve_info *reservelist,
+ struct node *tree, uint32_t boot_cpuid_phys);
+void sort_tree(struct dt_info *dti);
+void generate_label_tree(struct dt_info *dti, char *name, bool allocph);
+void generate_fixups_tree(struct dt_info *dti, char *name);
+void generate_local_fixups_tree(struct dt_info *dti, char *name);
+
/* Checks */
void parse_checks_option(bool warn, bool error, const char *arg);
-void process_checks(bool force, struct boot_info *bi);
+void process_checks(bool force, struct dt_info *dti);
/* Flattened trees */
-void dt_to_blob(FILE *f, struct boot_info *bi, int version);
-void dt_to_asm(FILE *f, struct boot_info *bi, int version);
+void dt_to_blob(FILE *f, struct dt_info *dti, int version);
+void dt_to_asm(FILE *f, struct dt_info *dti, int version);
-struct boot_info *dt_from_blob(const char *fname);
+struct dt_info *dt_from_blob(const char *fname);
/* Tree source */
-void dt_to_source(FILE *f, struct boot_info *bi);
-struct boot_info *dt_from_source(const char *f);
+void dt_to_source(FILE *f, struct dt_info *dti);
+struct dt_info *dt_from_source(const char *f);
/* FS trees */
-struct boot_info *dt_from_fs(const char *dirname);
+struct dt_info *dt_from_fs(const char *dirname);
#endif /* _DTC_H */
--- src/external/gpl2/dtc/dist/fdtdump.c 2017/06/06 20:19:04 1.2
+++ src/external/gpl2/dtc/dist/fdtdump.c 2017/06/08 16:00:40 1.3
@@ -1,3 +1,5 @@
+/* $NetBSD: fdtdump.c,v 1.3 2017/06/08 16:00:40 skrll Exp $ */
+
/*
* fdtdump.c - Contributed by Pantelis Antoniou <pantelis.antoniou AT gmail.com>
*/
@@ -15,8 +17,11 @@
#include "util.h"
-#define GET_CELL(p) (p += 4, *((const uint32_t *)(p-4)))
+#define FDT_MAGIC_SIZE 4
+#define MAX_VERSION 17
+#define GET_CELL(p) (p += 4, *((const fdt32_t *)(p-4)))
+
static const char *tagname(uint32_t tag)
{
static const char * const names[] = {
@@ -155,6 +160,20 @@
USAGE_COMMON_OPTS_HELP
};
+static bool valid_header(char *p, off_t len)
+{
+ if (len < sizeof(struct fdt_header) ||
+ fdt_magic(p) != FDT_MAGIC ||
+ fdt_version(p) > MAX_VERSION ||
+ fdt_last_comp_version(p) >= MAX_VERSION ||
+ fdt_totalsize(p) >= len ||
+ fdt_off_dt_struct(p) >= len ||
+ fdt_off_dt_strings(p) >= len)
+ return 0;
+ else
+ return 1;
+}
+
int main(int argc, char *argv[])
{
int opt;
@@ -186,26 +205,21 @@
/* try and locate an embedded fdt in a bigger blob */
if (scan) {
- unsigned char smagic[4];
+ unsigned char smagic[FDT_MAGIC_SIZE];
char *p = buf;
char *endp = buf + len;
fdt_set_magic(smagic, FDT_MAGIC);
/* poor man's memmem */
- while (true) {
- p = memchr(p, smagic[0], endp - p - 4);
+ while ((endp - p) >= FDT_MAGIC_SIZE) {
+ p = memchr(p, smagic[0], endp - p - FDT_MAGIC_SIZE);
if (!p)
break;
if (fdt_magic(p) == FDT_MAGIC) {
/* try and validate the main struct */
off_t this_len = endp - p;
- fdt32_t max_version = 17;
- if (fdt_version(p) <= max_version &&
- fdt_last_comp_version(p) < max_version &&
- fdt_totalsize(p) < this_len &&
- fdt_off_dt_struct(p) < this_len &&
- fdt_off_dt_strings(p) < this_len)
+ if (valid_header(p, this_len))
break;
if (debug)
printf("%s: skipping fdt magic at offset %#zx\n",
@@ -213,11 +227,12 @@
}
++p;
}
- if (!p)
+ if (!p || endp - p < sizeof(struct fdt_header))
die("%s: could not locate fdt magic\n", file);
printf("%s: found fdt at offset %#zx\n", file, p - buf);
buf = p;
- }
+ } else if (!valid_header(buf, len))
+ die("%s: header is not valid\n", file);
dump_blob(buf, debug);
--- src/external/gpl2/dtc/dist/fdtput.c 2017/06/06 20:19:04 1.2
+++ src/external/gpl2/dtc/dist/fdtput.c 2017/06/08 16:00:40 1.3
@@ -1,3 +1,5 @@
+/* $NetBSD: fdtput.c,v 1.3 2017/06/08 16:00:40 skrll Exp $ */
+
/*
* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
*
@@ -67,7 +69,7 @@
* @param arg List of arguments from command line
* @param arg_count Number of arguments (may be 0)
* @param valuep Returns buffer containing value
- * @param *value_len Returns length of value encoded
+ * @param value_len Returns length of value encoded
*/
static int encode_value(struct display_info *disp, char **arg, int arg_count,
char **valuep, int *value_len)
@@ -107,7 +109,7 @@
if (disp->verbose)
fprintf(stderr, "\tstring: '%s'\n", ptr);
} else {
- int *iptr = (int *)ptr;
+ fdt32_t *iptr = (fdt32_t *)ptr;
sscanf(*arg, fmt, &ival);
if (len == 4)
*iptr = cpu_to_fdt32(ival);
@@ -328,7 +330,7 @@
static int do_fdtput(struct display_info *disp, const char *filename,
char **arg, int arg_count)
{
- char *value;
+ char *value = NULL;
char *blob;
char *node;
int len, ret = 0;
@@ -374,6 +376,11 @@
}
free(blob);
+
+ if (value) {
+ free(value);
+ }
+
return ret;
}
--- src/external/gpl2/dtc/dist/flattree.c 2017/06/06 20:19:04 1.2
+++ src/external/gpl2/dtc/dist/flattree.c 2017/06/08 16:00:40 1.3
@@ -1,3 +1,5 @@
+/* $NetBSD: flattree.c,v 1.3 2017/06/08 16:00:40 skrll Exp $ */
+
/*
* (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
*
@@ -49,7 +51,7 @@
struct emitter {
void (*cell)(void *, cell_t);
- void (*string)(void *, char *, int);
+ void (*string)(void *, const char *, int);
void (*align)(void *, int);
void (*data)(void *, struct data);
void (*beginnode)(void *, struct label *labels);
@@ -64,7 +66,7 @@
*dtbuf = data_append_cell(*dtbuf, val);
}
-static void bin_emit_string(void *e, char *str, int len)
+static void bin_emit_string(void *e, const char *str, int len)
{
struct data *dtbuf = e;
@@ -144,22 +146,14 @@
(val >> 8) & 0xff, val & 0xff);
}
-static void asm_emit_string(void *e, char *str, int len)
+static void asm_emit_string(void *e, const char *str, int len)
{
FILE *f = e;
- char c = 0;
- if (len != 0) {
- /* XXX: ewww */
- c = str[len];
- str[len] = '\0';
- }
-
- fprintf(f, "\t.string\t\"%s\"\n", str);
-
- if (len != 0) {
- str[len] = c;
- }
+ if (len != 0)
+ fprintf(f, "\t.string\t\"%.*s\"\n", len, str);
+ else
+ fprintf(f, "\t.string\t\"%s\"\n", str);
}
static void asm_emit_align(void *e, int a)
@@ -179,7 +173,7 @@
emit_offset_label(f, m->ref, m->offset);
while ((d.len - off) >= sizeof(uint32_t)) {
- asm_emit_cell(e, fdt32_to_cpu(*((uint32_t *)(d.val+off))));
+ asm_emit_cell(e, fdt32_to_cpu(*((fdt32_t *)(d.val+off))));
off += sizeof(uint32_t);
}
@@ -318,17 +312,16 @@
{
struct reserve_info *re;
struct data d = empty_data;
- static struct fdt_reserve_entry null_re = {0,0};
int j;
for (re = reservelist; re; re = re->next) {
- d = data_append_re(d, &re->re);
+ d = data_append_re(d, re->address, re->size);
}
/*
* Add additional reserved slots if the user asked for them.
*/
for (j = 0; j < reservenum; j++) {
- d = data_append_re(d, &null_re);
+ d = data_append_re(d, 0, 0);
}
return d;
@@ -366,7 +359,7 @@
fdt->size_dt_struct = cpu_to_fdt32(dtsize);
}
-void dt_to_blob(FILE *f, struct boot_info *bi, int version)
+void dt_to_blob(FILE *f, struct dt_info *dti, int version)
{
struct version_info *vi = NULL;
int i;
@@ -384,29 +377,36 @@
if (!vi)
die("Unknown device tree blob version %d\n", version);
- flatten_tree(bi->dt, &bin_emitter, &dtbuf, &strbuf, vi);
+ flatten_tree(dti->dt, &bin_emitter, &dtbuf, &strbuf, vi);
bin_emit_cell(&dtbuf, FDT_END);
- reservebuf = flatten_reserve_list(bi->reservelist, vi);
+ reservebuf = flatten_reserve_list(dti->reservelist, vi);
/* Make header */
make_fdt_header(&fdt, vi, reservebuf.len, dtbuf.len, strbuf.len,
- bi->boot_cpuid_phys);
+ dti->boot_cpuid_phys);
/*
* If the user asked for more space than is used, adjust the totalsize.
*/
if (minsize > 0) {
padlen = minsize - fdt32_to_cpu(fdt.totalsize);
- if ((padlen < 0) && (quiet < 1))
- fprintf(stderr,
- "Warning: blob size %d >= minimum size %d\n",
- fdt32_to_cpu(fdt.totalsize), minsize);
+ if (padlen < 0) {
+ padlen = 0;
+ if (quiet < 1)
+ fprintf(stderr,
+ "Warning: blob size %d >= minimum size %d\n",
+ fdt32_to_cpu(fdt.totalsize), minsize);
+ }
}
if (padsize > 0)
padlen = padsize;
+ if (alignsize > 0)
+ padlen = ALIGN(fdt32_to_cpu(fdt.totalsize) + padlen, alignsize)
+ - fdt32_to_cpu(fdt.totalsize);
+
if (padlen > 0) {
int tsize = fdt32_to_cpu(fdt.totalsize);
tsize += padlen;
@@ -460,7 +460,7 @@
}
}
-void dt_to_asm(FILE *f, struct boot_info *bi, int version)
+void dt_to_asm(FILE *f, struct dt_info *dti, int version)
{
struct version_info *vi = NULL;
int i;
@@ -500,7 +500,7 @@
if (vi->flags & FTF_BOOTCPUID) {
fprintf(f, "\t/* boot_cpuid_phys */\n");
- asm_emit_cell(f, bi->boot_cpuid_phys);
+ asm_emit_cell(f, dti->boot_cpuid_phys);
}
if (vi->flags & FTF_STRTABSIZE) {
@@ -530,18 +530,18 @@
* Use .long on high and low halfs of u64s to avoid .quad
* as it appears .quad isn't available in some assemblers.
*/
- for (re = bi->reservelist; re; re = re->next) {
+ for (re = dti->reservelist; re; re = re->next) {
struct label *l;
for_each_label(re->labels, l) {
fprintf(f, "\t.globl\t%s\n", l->label);
fprintf(f, "%s:\n", l->label);
}
- ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.address >> 32));
+ ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->address >> 32));
ASM_EMIT_BELONG(f, "0x%08x",
- (unsigned int)(re->re.address & 0xffffffff));
- ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size >> 32));
- ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size & 0xffffffff));
+ (unsigned int)(re->address & 0xffffffff));
+ ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->size >> 32));
+ ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->size & 0xffffffff));
}
for (i = 0; i < reservenum; i++) {
fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
@@ -550,7 +550,7 @@
fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n");
emit_label(f, symprefix, "struct_start");
- flatten_tree(bi->dt, &asm_emitter, f, &strbuf, vi);
+ flatten_tree(dti->dt, &asm_emitter, f, &strbuf, vi);
fprintf(f, "\t/* FDT_END */\n");
asm_emit_cell(f, FDT_END);
@@ -572,6 +572,8 @@
if (padsize > 0) {
fprintf(f, "\t.space\t%d, 0\n", padsize);
}
+ if (alignsize > 0)
+ asm_emit_align(f, alignsize);
emit_label(f, symprefix, "blob_abs_end");
data_free(strbuf);
@@ -600,7 +602,7 @@
static uint32_t flat_read_word(struct inbuf *inb)
{
- uint32_t val;
+ fdt32_t val;
assert(((inb->ptr - inb->base) % sizeof(val)) == 0);
@@ -709,13 +711,15 @@
* First pass, count entries.
*/
while (1) {
+ uint64_t address, size;
+
flat_read_chunk(inb, &re, sizeof(re));
- re.address = fdt64_to_cpu(re.address);
- re.size = fdt64_to_cpu(re.size);
- if (re.size == 0)
+ address = fdt64_to_cpu(re.address);
+ size = fdt64_to_cpu(re.size);
+ if (size == 0)
break;
- new = build_reserve_entry(re.address, re.size);
+ new = build_reserve_entry(address, size);
reservelist = add_reserve_entry(reservelist, new);
}
@@ -797,13 +801,18 @@
}
} while (val != FDT_END_NODE);
+ if (node->name != flatname) {
+ free(flatname);
+ }
+
return node;
}
-struct boot_info *dt_from_blob(const char *fname)
+struct dt_info *dt_from_blob(const char *fname)
{
FILE *f;
+ fdt32_t magic_buf, totalsize_buf;
uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys;
uint32_t off_dt, off_str, off_mem_rsvmap;
int rc;
@@ -820,7 +829,7 @@
f = srcfile_relative_open(fname, NULL);
- rc = fread(&magic, sizeof(magic), 1, f);
+ rc = fread(&magic_buf, sizeof(magic_buf), 1, f);
if (ferror(f))
die("Error reading DT blob magic number: %s\n",
strerror(errno));
@@ -831,11 +840,11 @@
die("Mysterious short read reading magic number\n");
}
- magic = fdt32_to_cpu(magic);
+ magic = fdt32_to_cpu(magic_buf);
if (magic != FDT_MAGIC)
die("Blob has incorrect magic number\n");
- rc = fread(&totalsize, sizeof(totalsize), 1, f);
+ rc = fread(&totalsize_buf, sizeof(totalsize_buf), 1, f);
if (ferror(f))
die("Error reading DT blob size: %s\n", strerror(errno));
if (rc < 1) {
@@ -845,7 +854,7 @@
die("Mysterious short read reading blob size\n");
}
- totalsize = fdt32_to_cpu(totalsize);
+ totalsize = fdt32_to_cpu(totalsize_buf);
if (totalsize < FDT_V1_SIZE)
die("DT blob size (%d) is too small\n", totalsize);
@@ -889,7 +898,7 @@
if (version >= 3) {
uint32_t size_str = fdt32_to_cpu(fdt->size_dt_strings);
- if (off_str+size_str > totalsize)
+ if ((off_str+size_str < off_str) || (off_str+size_str > totalsize))
die("String table extends past total size\n");
inbuf_init(&strbuf, blob + off_str, blob + off_str + size_str);
} else {
@@ -898,7 +907,7 @@
if (version >= 17) {
size_dt = fdt32_to_cpu(fdt->size_dt_struct);
- if (off_dt+size_dt > totalsize)
+ if ((off_dt+size_dt < off_dt) || (off_dt+size_dt > totalsize))
die("Structure block extends past total size\n");
}
@@ -929,5 +938,5 @@
fclose(f);
- return build_boot_info(reservelist, tree, boot_cpuid_phys);
+ return build_dt_info(DTSF_V1, reservelist, tree, boot_cpuid_phys);
}
--- src/external/gpl2/dtc/dist/srcpos.c 2017/06/06 20:19:04 1.2
+++ src/external/gpl2/dtc/dist/srcpos.c 2017/06/08 16:00:40 1.3
@@ -1,3 +1,5 @@
+/* $NetBSD: srcpos.c,v 1.3 2017/06/08 16:00:40 skrll Exp $ */
+
/*
* Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc.
*
@@ -246,46 +248,27 @@
return pos_new;
}
-
-
-void
-srcpos_dump(struct srcpos *pos)
-{
- printf("file : \"%s\"\n",
- pos->file ? (char *) pos->file : "<no file>");
- printf("first_line : %d\n", pos->first_line);
- printf("first_column: %d\n", pos->first_column);
- printf("last_line : %d\n", pos->last_line);
- printf("last_column : %d\n", pos->last_column);
- printf("file : %s\n", pos->file->name);
-}
-
-
char *
srcpos_string(struct srcpos *pos)
{
const char *fname = "<no-file>";
char *pos_str;
- int rc;
- if (pos)
+ if (pos->file && pos->file->name)
fname = pos->file->name;
if (pos->first_line != pos->last_line)
- rc = asprintf(&pos_str, "%s:%d.%d-%d.%d", fname,
- pos->first_line, pos->first_column,
- pos->last_line, pos->last_column);
+ xasprintf(&pos_str, "%s:%d.%d-%d.%d", fname,
+ pos->first_line, pos->first_column,
+ pos->last_line, pos->last_column);
else if (pos->first_column != pos->last_column)
- rc = asprintf(&pos_str, "%s:%d.%d-%d", fname,
- pos->first_line, pos->first_column,
- pos->last_column);
+ xasprintf(&pos_str, "%s:%d.%d-%d", fname,
+ pos->first_line, pos->first_column,
+ pos->last_column);
else
- rc = asprintf(&pos_str, "%s:%d.%d", fname,
- pos->first_line, pos->first_column);
-
- if (rc == -1)
- die("Couldn't allocate in srcpos string");
+ xasprintf(&pos_str, "%s:%d.%d", fname,
+ pos->first_line, pos->first_column);
return pos_str;
}
--- src/external/gpl2/dtc/dist/util.h 2017/06/06 20:19:04 1.2
+++ src/external/gpl2/dtc/dist/util.h 2017/06/08 16:00:40 1.3
@@ -1,3 +1,5 @@
+/* $NetBSD: util.h,v 1.3 2017/06/08 16:00:40 skrll Exp $ */
+
#ifndef _UTIL_H
#define _UTIL_H
@@ -25,11 +27,19 @@
* USA
*/
+#ifdef __GNUC__
+#define PRINTF(i, j) __attribute__((format (printf, i, j)))
+#define NORETURN __attribute__((noreturn))
+#else
+#define PRINTF(i, j)
+#define NORETURN
+#endif
+
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
#define FDTALIGN2(x, a) (((x) + (a) - 1) & ~((a) - 1))
#define PALIGN(p, a) ((void *)(FDTALIGN2((unsigned long)(p), (a))))
-static inline void __attribute__((noreturn)) die(const char *str, ...)
+static inline void NORETURN PRINTF(1, 2) die(const char *str, ...)
{
va_list ap;
@@ -55,12 +65,14 @@
void *new = realloc(p, len);
if (!new)
- die("realloc() failed (len=%d)\n", len);
+ die("realloc() failed (len=%zd)\n", len);
return new;
}
extern char *xstrdup(const char *s);
+
+extern int PRINTF(2, 3) xasprintf(char **strp, const char *fmt, ...);
extern char *join_path(const char *path, const char *name);
/**
@@ -189,7 +201,7 @@
/**
* Show source version and exit
*/
-void util_version(void) __attribute__((noreturn));
+void NORETURN util_version(void);
/**
* Show usage and exit
@@ -203,9 +215,10 @@
* @param long_opts The structure of long options
* @param opts_help An array of help strings (should align with long_opts)
*/
-void util_usage(const char *errmsg, const char *synopsis,
- const char *short_opts, struct option const long_opts[],
- const char * const opts_help[]) __attribute__((noreturn));
+void NORETURN util_usage(const char *errmsg, const char *synopsis,
+ const char *short_opts,
+ struct option const long_opts[],
+ const char * const opts_help[]);
/**
* Show usage and exit
--- src/external/gpl2/dtc/dist/tests/mangle-layout.c 2017/06/06 20:19:04 1.2
+++ src/external/gpl2/dtc/dist/tests/mangle-layout.c 2017/06/08 16:00:40 1.3
@@ -1,3 +1,5 @@
+/* $NetBSD: mangle-layout.c,v 1.3 2017/06/08 16:00:40 skrll Exp $ */
+
/*
* libfdt - Flat Device Tree manipulation
* Testcase/tool for rearranging blocks of a dtb
--- src/external/gpl2/dtc/dist/tests/move_and_save.c 2017/06/06 20:19:04 1.2
+++ src/external/gpl2/dtc/dist/tests/move_and_save.c 2017/06/08 16:00:40 1.3
@@ -1,3 +1,5 @@
+/* $NetBSD: move_and_save.c,v 1.3 2017/06/08 16:00:40 skrll Exp $ */
+
/*
* libfdt - Flat Device Tree manipulation
* Basic testcase for read-only access
--- src/external/gpl2/dtc/dist/tests/tests.h 2017/06/06 20:19:04 1.2
+++ src/external/gpl2/dtc/dist/tests/tests.h 2017/06/08 16:00:40 1.3
@@ -1,3 +1,5 @@
+/* $NetBSD: tests.h,v 1.3 2017/06/08 16:00:40 skrll Exp $ */
+
#ifndef _TESTS_H
#define _TESTS_H
/*
@@ -99,7 +101,7 @@
int len, const void *val);
#define check_property_cell(fdt, nodeoffset, name, val) \
({ \
- uint32_t x = cpu_to_fdt32(val); \
+ fdt32_t x = cpu_to_fdt32(val); \
check_property(fdt, nodeoffset, name, sizeof(x), &x); \
})
@@ -108,12 +110,12 @@
int len, const void *val);
#define check_getprop_cell(fdt, nodeoffset, name, val) \
({ \
- uint32_t x = cpu_to_fdt32(val); \
+ fdt32_t x = cpu_to_fdt32(val); \
check_getprop(fdt, nodeoffset, name, sizeof(x), &x); \
})
#define check_getprop_64(fdt, nodeoffset, name, val) \
({ \
- uint64_t x = cpu_to_fdt64(val); \
+ fdt64_t x = cpu_to_fdt64(val); \
check_getprop(fdt, nodeoffset, name, sizeof(x), &x); \
})
#define check_getprop_string(fdt, nodeoffset, name, s) \