summaryrefslogtreecommitdiff
path: root/flattree.c
diff options
context:
space:
mode:
authorDavid Gibson <dgibson@sneetch.(none)>2005-08-29 13:36:15 +1000
committerDavid Gibson <dgibson@sneetch.(none)>2005-08-29 13:36:15 +1000
commit6c0f36769af7e015030d033edf6b10f7ec50318c (patch)
treebb4611ff888253ac459431c4a3c9d9e15315e75f /flattree.c
parent230f253e9b187efd67787f98639aadb15916d0e9 (diff)
downloaddtc-6c0f36769af7e015030d033edf6b10f7ec50318c.tar.gz
Fix endian problems with handling of memreserve entries (bug pointed out
by Pantelis Antoniou). The rule is that the memreserve data in struct boot_info is always stored big-endian.
Diffstat (limited to 'flattree.c')
-rw-r--r--flattree.c35
1 files changed, 12 insertions, 23 deletions
diff --git a/flattree.c b/flattree.c
index 62b8903..92d99a5 100644
--- a/flattree.c
+++ b/flattree.c
@@ -437,8 +437,8 @@ void write_dt_asm(FILE *f, struct boot_info *bi, int version)
*/
asm_emit_align(f, 8);
emit_label(f, symprefix, "reserve_map");
- fprintf(f, "\t.long\t0, _%s_blob_start\n", symprefix);
- fprintf(f, "\t.long\t0, _%s_blob_end - _%s_blob_start\n",
+ fprintf(f, "\t.quad\t0, _%s_blob_start\n", symprefix);
+ fprintf(f, "\t.quad\t0, _%s_blob_end - _%s_blob_start\n",
symprefix, symprefix);
if (bi->mem_reserve_data.len > 0) {
@@ -446,8 +446,8 @@ void write_dt_asm(FILE *f, struct boot_info *bi, int version)
asm_emit_data(f, bi->mem_reserve_data);
}
- fprintf(f, "\t.llong\t0\n");
- fprintf(f, "\t.llong\t0\n");
+ fprintf(f, "\t.quad\t0\n");
+ fprintf(f, "\t.quad\t0\n");
emit_label(f, symprefix, "struct_start");
flatten_tree(bi->dt, &asm_emitter, f, &strbuf, vi);
@@ -585,12 +585,8 @@ static struct property *flat_read_property(struct inbuf *dtbuf,
static struct data flat_read_mem_reserve(struct inbuf *inb)
{
char *p;
- int len = 0;
- int done = 0;
- cell_t cells[4];
- struct data d;
-
- d = empty_data;
+ struct reserve_entry re;
+ struct data d = empty_data;
/*
* Each entry is a pair of u64 (addr, size) values for 4 cell_t's.
@@ -599,20 +595,13 @@ static struct data flat_read_mem_reserve(struct inbuf *inb)
* First pass, count entries.
*/
p = inb->ptr;
- do {
- flat_read_chunk(inb, &cells[0], 4 * sizeof(cell_t));
- if (cells[2] == 0 && cells[3] == 0) {
- done = 1;
- } else {
- ++len;
- }
- } while (!done);
+ while (1) {
+ flat_read_chunk(inb, &re, sizeof(re));
+ if (re.size == 0)
+ break;
- /*
- * Back up for pass two, reading the whole data value.
- */
- inb->ptr = p;
- d = flat_read_data(inb, len * 4 * sizeof(cell_t));
+ d = data_append_data(d, &re, sizeof(re));
+ }
return d;
}