aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/dtc/flattree.c
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/dtc/flattree.c')
-rw-r--r--scripts/dtc/flattree.c58
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
50struct emitter { 50struct 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
67static void bin_emit_string(void *e, char *str, int len) 67static 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
147static void asm_emit_string(void *e, char *str, int len) 147static 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
165static void asm_emit_align(void *e, int a) 157static 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
610static uint32_t flat_read_word(struct inbuf *inb) 601static 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,
817struct dt_info *dt_from_blob(const char *fname) 810struct 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