|
@@ -49,7 +49,7 @@ static struct version_info {
|
|
|
|
|
|
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 +64,7 @@ static void bin_emit_cell(void *e, cell_t val)
|
|
|
*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 +144,14 @@ static void asm_emit_cell(void *e, cell_t val)
|
|
|
(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 +171,7 @@ static void asm_emit_data(void *e, struct data d)
|
|
|
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 +310,16 @@ static struct data flatten_reserve_list(struct reserve_info *reservelist,
|
|
|
{
|
|
|
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;
|
|
@@ -544,11 +535,11 @@ void dt_to_asm(FILE *f, struct dt_info *dti, int version)
|
|
|
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");
|
|
@@ -609,7 +600,7 @@ static void flat_read_chunk(struct inbuf *inb, void *p, int len)
|
|
|
|
|
|
static uint32_t flat_read_word(struct inbuf *inb)
|
|
|
{
|
|
|
- uint32_t val;
|
|
|
+ fdt32_t val;
|
|
|
|
|
|
assert(((inb->ptr - inb->base) % sizeof(val)) == 0);
|
|
|
|
|
@@ -718,13 +709,15 @@ static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb)
|
|
|
* 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);
|
|
|
}
|
|
|
|
|
@@ -817,6 +810,7 @@ static struct node *unflatten_tree(struct inbuf *dtbuf,
|
|
|
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;
|
|
@@ -833,7 +827,7 @@ struct dt_info *dt_from_blob(const char *fname)
|
|
|
|
|
|
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));
|
|
@@ -844,11 +838,11 @@ struct dt_info *dt_from_blob(const char *fname)
|
|
|
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) {
|
|
@@ -858,7 +852,7 @@ struct dt_info *dt_from_blob(const char *fname)
|
|
|
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);
|
|
|
|