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.main
parent
230f253e9b
commit
6c0f36769a
35
flattree.c
35
flattree.c
|
@ -437,8 +437,8 @@ void write_dt_asm(FILE *f, struct boot_info *bi, int version)
|
||||||
*/
|
*/
|
||||||
asm_emit_align(f, 8);
|
asm_emit_align(f, 8);
|
||||||
emit_label(f, symprefix, "reserve_map");
|
emit_label(f, symprefix, "reserve_map");
|
||||||
fprintf(f, "\t.long\t0, _%s_blob_start\n", symprefix);
|
fprintf(f, "\t.quad\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_end - _%s_blob_start\n",
|
||||||
symprefix, symprefix);
|
symprefix, symprefix);
|
||||||
|
|
||||||
if (bi->mem_reserve_data.len > 0) {
|
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);
|
asm_emit_data(f, bi->mem_reserve_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
fprintf(f, "\t.llong\t0\n");
|
fprintf(f, "\t.quad\t0\n");
|
||||||
fprintf(f, "\t.llong\t0\n");
|
fprintf(f, "\t.quad\t0\n");
|
||||||
|
|
||||||
emit_label(f, symprefix, "struct_start");
|
emit_label(f, symprefix, "struct_start");
|
||||||
flatten_tree(bi->dt, &asm_emitter, f, &strbuf, vi);
|
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)
|
static struct data flat_read_mem_reserve(struct inbuf *inb)
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
int len = 0;
|
struct reserve_entry re;
|
||||||
int done = 0;
|
struct data d = empty_data;
|
||||||
cell_t cells[4];
|
|
||||||
struct data d;
|
|
||||||
|
|
||||||
d = empty_data;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Each entry is a pair of u64 (addr, size) values for 4 cell_t's.
|
* 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.
|
* First pass, count entries.
|
||||||
*/
|
*/
|
||||||
p = inb->ptr;
|
p = inb->ptr;
|
||||||
do {
|
while (1) {
|
||||||
flat_read_chunk(inb, &cells[0], 4 * sizeof(cell_t));
|
flat_read_chunk(inb, &re, sizeof(re));
|
||||||
if (cells[2] == 0 && cells[3] == 0) {
|
if (re.size == 0)
|
||||||
done = 1;
|
break;
|
||||||
} else {
|
|
||||||
++len;
|
|
||||||
}
|
|
||||||
} while (!done);
|
|
||||||
|
|
||||||
/*
|
d = data_append_data(d, &re, sizeof(re));
|
||||||
* Back up for pass two, reading the whole data value.
|
}
|
||||||
*/
|
|
||||||
inb->ptr = p;
|
|
||||||
d = flat_read_data(inb, len * 4 * sizeof(cell_t));
|
|
||||||
|
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,8 +168,9 @@ void write_tree_source(FILE *f, struct boot_info *bi)
|
||||||
bi->mem_reserve_data.val) + i;
|
bi->mem_reserve_data.val) + i;
|
||||||
|
|
||||||
fprintf(f, "/memreserve/\t%016llx-%016llx;\n",
|
fprintf(f, "/memreserve/\t%016llx-%016llx;\n",
|
||||||
(unsigned long long)re->address,
|
(unsigned long long)be64_to_cpu(re->address),
|
||||||
(unsigned long long)re->address + re->size - 1);
|
(unsigned long long)(be64_to_cpu(re->address)
|
||||||
|
+ be64_to_cpu(re->size) - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
write_tree_source_node(f, bi->dt, 0);
|
write_tree_source_node(f, bi->dt, 0);
|
||||||
|
|
Loading…
Reference in New Issue