diff options
Diffstat (limited to 'scripts/dtc/flattree.c')
-rw-r--r-- | scripts/dtc/flattree.c | 58 |
1 files changed, 26 insertions, 32 deletions
diff --git a/scripts/dtc/flattree.c b/scripts/dtc/flattree.c index ebac548b3fa8..fcf71541d8a7 100644 --- a/scripts/dtc/flattree.c +++ b/scripts/dtc/flattree.c | |||
@@ -49,7 +49,7 @@ static struct version_info { | |||
49 | 49 | ||
50 | struct emitter { | 50 | struct emitter { |
51 | void (*cell)(void *, cell_t); | 51 | void (*cell)(void *, cell_t); |
52 | void (*string)(void *, char *, int); | 52 | void (*string)(void *, const char *, int); |
53 | void (*align)(void *, int); | 53 | void (*align)(void *, int); |
54 | void (*data)(void *, struct data); | 54 | void (*data)(void *, struct data); |
55 | void (*beginnode)(void *, struct label *labels); | 55 | void (*beginnode)(void *, struct label *labels); |
@@ -64,7 +64,7 @@ static void bin_emit_cell(void *e, cell_t val) | |||
64 | *dtbuf = data_append_cell(*dtbuf, val); | 64 | *dtbuf = data_append_cell(*dtbuf, val); |
65 | } | 65 | } |
66 | 66 | ||
67 | static void bin_emit_string(void *e, char *str, int len) | 67 | static void bin_emit_string(void *e, const char *str, int len) |
68 | { | 68 | { |
69 | struct data *dtbuf = e; | 69 | struct data *dtbuf = e; |
70 | 70 | ||
@@ -144,22 +144,14 @@ static void asm_emit_cell(void *e, cell_t val) | |||
144 | (val >> 8) & 0xff, val & 0xff); | 144 | (val >> 8) & 0xff, val & 0xff); |
145 | } | 145 | } |
146 | 146 | ||
147 | static void asm_emit_string(void *e, char *str, int len) | 147 | static void asm_emit_string(void *e, const char *str, int len) |
148 | { | 148 | { |
149 | FILE *f = e; | 149 | FILE *f = e; |
150 | char c = 0; | ||
151 | 150 | ||
152 | if (len != 0) { | 151 | if (len != 0) |
153 | /* XXX: ewww */ | 152 | fprintf(f, "\t.string\t\"%.*s\"\n", len, str); |
154 | c = str[len]; | 153 | else |
155 | str[len] = '\0'; | 154 | fprintf(f, "\t.string\t\"%s\"\n", str); |
156 | } | ||
157 | |||
158 | fprintf(f, "\t.string\t\"%s\"\n", str); | ||
159 | |||
160 | if (len != 0) { | ||
161 | str[len] = c; | ||
162 | } | ||
163 | } | 155 | } |
164 | 156 | ||
165 | static void asm_emit_align(void *e, int a) | 157 | static void asm_emit_align(void *e, int a) |
@@ -179,7 +171,7 @@ static void asm_emit_data(void *e, struct data d) | |||
179 | emit_offset_label(f, m->ref, m->offset); | 171 | emit_offset_label(f, m->ref, m->offset); |
180 | 172 | ||
181 | while ((d.len - off) >= sizeof(uint32_t)) { | 173 | while ((d.len - off) >= sizeof(uint32_t)) { |
182 | asm_emit_cell(e, fdt32_to_cpu(*((uint32_t *)(d.val+off)))); | 174 | asm_emit_cell(e, fdt32_to_cpu(*((fdt32_t *)(d.val+off)))); |
183 | off += sizeof(uint32_t); | 175 | off += sizeof(uint32_t); |
184 | } | 176 | } |
185 | 177 | ||
@@ -318,17 +310,16 @@ static struct data flatten_reserve_list(struct reserve_info *reservelist, | |||
318 | { | 310 | { |
319 | struct reserve_info *re; | 311 | struct reserve_info *re; |
320 | struct data d = empty_data; | 312 | struct data d = empty_data; |
321 | static struct fdt_reserve_entry null_re = {0,0}; | ||
322 | int j; | 313 | int j; |
323 | 314 | ||
324 | for (re = reservelist; re; re = re->next) { | 315 | for (re = reservelist; re; re = re->next) { |
325 | d = data_append_re(d, &re->re); | 316 | d = data_append_re(d, re->address, re->size); |
326 | } | 317 | } |
327 | /* | 318 | /* |
328 | * Add additional reserved slots if the user asked for them. | 319 | * Add additional reserved slots if the user asked for them. |
329 | */ | 320 | */ |
330 | for (j = 0; j < reservenum; j++) { | 321 | for (j = 0; j < reservenum; j++) { |
331 | d = data_append_re(d, &null_re); | 322 | d = data_append_re(d, 0, 0); |
332 | } | 323 | } |
333 | 324 | ||
334 | return d; | 325 | return d; |
@@ -544,11 +535,11 @@ void dt_to_asm(FILE *f, struct dt_info *dti, int version) | |||
544 | fprintf(f, "\t.globl\t%s\n", l->label); | 535 | fprintf(f, "\t.globl\t%s\n", l->label); |
545 | fprintf(f, "%s:\n", l->label); | 536 | fprintf(f, "%s:\n", l->label); |
546 | } | 537 | } |
547 | ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.address >> 32)); | 538 | ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->address >> 32)); |
548 | ASM_EMIT_BELONG(f, "0x%08x", | 539 | ASM_EMIT_BELONG(f, "0x%08x", |
549 | (unsigned int)(re->re.address & 0xffffffff)); | 540 | (unsigned int)(re->address & 0xffffffff)); |
550 | ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size >> 32)); | 541 | ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->size >> 32)); |
551 | ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->re.size & 0xffffffff)); | 542 | ASM_EMIT_BELONG(f, "0x%08x", (unsigned int)(re->size & 0xffffffff)); |
552 | } | 543 | } |
553 | for (i = 0; i < reservenum; i++) { | 544 | for (i = 0; i < reservenum; i++) { |
554 | fprintf(f, "\t.long\t0, 0\n\t.long\t0, 0\n"); | 545 | 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) | |||
609 | 600 | ||
610 | static uint32_t flat_read_word(struct inbuf *inb) | 601 | static uint32_t flat_read_word(struct inbuf *inb) |
611 | { | 602 | { |
612 | uint32_t val; | 603 | fdt32_t val; |
613 | 604 | ||
614 | assert(((inb->ptr - inb->base) % sizeof(val)) == 0); | 605 | assert(((inb->ptr - inb->base) % sizeof(val)) == 0); |
615 | 606 | ||
@@ -718,13 +709,15 @@ static struct reserve_info *flat_read_mem_reserve(struct inbuf *inb) | |||
718 | * First pass, count entries. | 709 | * First pass, count entries. |
719 | */ | 710 | */ |
720 | while (1) { | 711 | while (1) { |
712 | uint64_t address, size; | ||
713 | |||
721 | flat_read_chunk(inb, &re, sizeof(re)); | 714 | flat_read_chunk(inb, &re, sizeof(re)); |
722 | re.address = fdt64_to_cpu(re.address); | 715 | address = fdt64_to_cpu(re.address); |
723 | re.size = fdt64_to_cpu(re.size); | 716 | size = fdt64_to_cpu(re.size); |
724 | if (re.size == 0) | 717 | if (size == 0) |
725 | break; | 718 | break; |
726 | 719 | ||
727 | new = build_reserve_entry(re.address, re.size); | 720 | new = build_reserve_entry(address, size); |
728 | reservelist = add_reserve_entry(reservelist, new); | 721 | reservelist = add_reserve_entry(reservelist, new); |
729 | } | 722 | } |
730 | 723 | ||
@@ -817,6 +810,7 @@ static struct node *unflatten_tree(struct inbuf *dtbuf, | |||
817 | struct dt_info *dt_from_blob(const char *fname) | 810 | struct dt_info *dt_from_blob(const char *fname) |
818 | { | 811 | { |
819 | FILE *f; | 812 | FILE *f; |
813 | fdt32_t magic_buf, totalsize_buf; | ||
820 | uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys; | 814 | uint32_t magic, totalsize, version, size_dt, boot_cpuid_phys; |
821 | uint32_t off_dt, off_str, off_mem_rsvmap; | 815 | uint32_t off_dt, off_str, off_mem_rsvmap; |
822 | int rc; | 816 | int rc; |
@@ -833,7 +827,7 @@ struct dt_info *dt_from_blob(const char *fname) | |||
833 | 827 | ||
834 | f = srcfile_relative_open(fname, NULL); | 828 | f = srcfile_relative_open(fname, NULL); |
835 | 829 | ||
836 | rc = fread(&magic, sizeof(magic), 1, f); | 830 | rc = fread(&magic_buf, sizeof(magic_buf), 1, f); |
837 | if (ferror(f)) | 831 | if (ferror(f)) |
838 | die("Error reading DT blob magic number: %s\n", | 832 | die("Error reading DT blob magic number: %s\n", |
839 | strerror(errno)); | 833 | strerror(errno)); |
@@ -844,11 +838,11 @@ struct dt_info *dt_from_blob(const char *fname) | |||
844 | die("Mysterious short read reading magic number\n"); | 838 | die("Mysterious short read reading magic number\n"); |
845 | } | 839 | } |
846 | 840 | ||
847 | magic = fdt32_to_cpu(magic); | 841 | magic = fdt32_to_cpu(magic_buf); |
848 | if (magic != FDT_MAGIC) | 842 | if (magic != FDT_MAGIC) |
849 | die("Blob has incorrect magic number\n"); | 843 | die("Blob has incorrect magic number\n"); |
850 | 844 | ||
851 | rc = fread(&totalsize, sizeof(totalsize), 1, f); | 845 | rc = fread(&totalsize_buf, sizeof(totalsize_buf), 1, f); |
852 | if (ferror(f)) | 846 | if (ferror(f)) |
853 | die("Error reading DT blob size: %s\n", strerror(errno)); | 847 | die("Error reading DT blob size: %s\n", strerror(errno)); |
854 | if (rc < 1) { | 848 | if (rc < 1) { |
@@ -858,7 +852,7 @@ struct dt_info *dt_from_blob(const char *fname) | |||
858 | die("Mysterious short read reading blob size\n"); | 852 | die("Mysterious short read reading blob size\n"); |
859 | } | 853 | } |
860 | 854 | ||
861 | totalsize = fdt32_to_cpu(totalsize); | 855 | totalsize = fdt32_to_cpu(totalsize_buf); |
862 | if (totalsize < FDT_V1_SIZE) | 856 | if (totalsize < FDT_V1_SIZE) |
863 | die("DT blob size (%d) is too small\n", totalsize); | 857 | die("DT blob size (%d) is too small\n", totalsize); |
864 | 858 | ||