util/cbfstool: Fix byte-ordering for payload type field.
In https://chromium-review.googlesource.com/181272 the payload->type has been changed to big-endian (network ordering) but the cbfs_image is still parsing type as host ordering, which caused printing cbfs image verbosely (cbfstool imge print -v) to fail to find entry field and print numerous garbage output. Payload fields should be always parsed in big-endian (network ordering). BUG=none TEST=make; cbfstool image.bin print -v -v -v # see payloads correctly Original-Change-Id: If1ac355b8847fb54988069f694bd2f317ce49a1a Original-Signed-off-by: Hung-Te Lin <hungte@chromium.org> Original-Reviewed-on: https://chromium-review.googlesource.com/200158 Original-Reviewed-by: Ronald Minnich <rminnich@chromium.org> (cherry picked from commit 423f7dd28f8b071692d57401e144232d5ee2e479) Signed-off-by: Marc Jones <marc.jones@se-eng.com> Change-Id: I5a4694e887c7ff48d8d0713bb5808c29256141a9 Reviewed-on: http://review.coreboot.org/8005 Reviewed-by: Ronald G. Minnich <rminnich@gmail.com> Tested-by: build bot (Jenkins)
This commit is contained in:
@@ -153,6 +153,22 @@ void cbfs_put_header(void *dest, const struct cbfs_header *header)
|
|||||||
xdr_be.put32(&outheader, header->architecture);
|
xdr_be.put32(&outheader, header->architecture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cbfs_decode_payload_segment(struct cbfs_payload_segment *output,
|
||||||
|
struct cbfs_payload_segment *input)
|
||||||
|
{
|
||||||
|
struct buffer seg = {
|
||||||
|
.data = (void *)input,
|
||||||
|
.size = sizeof(*input),
|
||||||
|
};
|
||||||
|
output->type = xdr_be.get32(&seg);
|
||||||
|
output->compression = xdr_be.get32(&seg);
|
||||||
|
output->offset = xdr_be.get32(&seg);
|
||||||
|
output->load_addr = xdr_be.get64(&seg);
|
||||||
|
output->len = xdr_be.get32(&seg);
|
||||||
|
output->mem_len = xdr_be.get32(&seg);
|
||||||
|
assert(seg.size == 0);
|
||||||
|
}
|
||||||
|
|
||||||
void cbfs_get_header(struct cbfs_header *header, const void *src)
|
void cbfs_get_header(struct cbfs_header *header, const void *src)
|
||||||
{
|
{
|
||||||
struct buffer outheader;
|
struct buffer outheader;
|
||||||
@@ -596,40 +612,35 @@ static int cbfs_print_stage_info(struct cbfs_stage *stage, FILE* fp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return 1 when segment is of type PAYLOAD_SEGMENT_ENTRY. */
|
static int cbfs_print_decoded_payload_segment_info(
|
||||||
static int cbfs_print_payload_segment_info(struct cbfs_payload_segment *seg_be,
|
struct cbfs_payload_segment *seg, FILE *fp)
|
||||||
FILE *fp)
|
|
||||||
{
|
{
|
||||||
struct cbfs_payload_segment payload;
|
/* The input (seg) must be already decoded by
|
||||||
|
* cbfs_decode_payload_segment.
|
||||||
xdr_get_seg(&payload, seg_be);
|
*/
|
||||||
|
switch (seg->type) {
|
||||||
switch(payload.type) {
|
|
||||||
case PAYLOAD_SEGMENT_CODE:
|
case PAYLOAD_SEGMENT_CODE:
|
||||||
case PAYLOAD_SEGMENT_DATA:
|
case PAYLOAD_SEGMENT_DATA:
|
||||||
fprintf(fp, " %s (%s compression, offset: 0x%x, "
|
fprintf(fp, " %s (%s compression, offset: 0x%x, "
|
||||||
"load: 0x%" PRIx64 ", length: %d/%d)\n",
|
"load: 0x%" PRIx64 ", length: %d/%d)\n",
|
||||||
(payload.type == PAYLOAD_SEGMENT_CODE ?
|
(seg->type == PAYLOAD_SEGMENT_CODE ?
|
||||||
"code " : "data"),
|
"code " : "data"),
|
||||||
lookup_name_by_type(types_cbfs_compression,
|
lookup_name_by_type(types_cbfs_compression,
|
||||||
payload.compression,
|
seg->compression,
|
||||||
"(unknown)"),
|
"(unknown)"),
|
||||||
payload.offset,
|
seg->offset, seg->load_addr, seg->len,
|
||||||
payload.load_addr,
|
seg->mem_len);
|
||||||
payload.len, payload.mem_len);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAYLOAD_SEGMENT_ENTRY:
|
case PAYLOAD_SEGMENT_ENTRY:
|
||||||
fprintf(fp, " entry (0x%" PRIx64 ")\n",
|
fprintf(fp, " entry (0x%" PRIx64 ")\n",
|
||||||
payload.load_addr);
|
seg->load_addr);
|
||||||
return 1;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAYLOAD_SEGMENT_BSS:
|
case PAYLOAD_SEGMENT_BSS:
|
||||||
fprintf(fp, " BSS (address 0x%016" PRIx64 ", "
|
fprintf(fp, " BSS (address 0x%016" PRIx64 ", "
|
||||||
"length 0x%x)\n",
|
"length 0x%x)\n",
|
||||||
payload.load_addr,
|
seg->load_addr, seg->len);
|
||||||
payload.len);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PAYLOAD_SEGMENT_PARAMS:
|
case PAYLOAD_SEGMENT_PARAMS:
|
||||||
@@ -639,14 +650,12 @@ static int cbfs_print_payload_segment_info(struct cbfs_payload_segment *seg_be,
|
|||||||
default:
|
default:
|
||||||
fprintf(fp, " 0x%x (%s compression, offset: 0x%x, "
|
fprintf(fp, " 0x%x (%s compression, offset: 0x%x, "
|
||||||
"load: 0x%" PRIx64 ", length: %d/%d\n",
|
"load: 0x%" PRIx64 ", length: %d/%d\n",
|
||||||
payload.type,
|
seg->type,
|
||||||
lookup_name_by_type(types_cbfs_compression,
|
lookup_name_by_type(types_cbfs_compression,
|
||||||
payload.compression,
|
seg->compression,
|
||||||
"(unknown)"),
|
"(unknown)"),
|
||||||
payload.offset,
|
seg->offset, seg->load_addr, seg->len,
|
||||||
payload.load_addr,
|
seg->mem_len);
|
||||||
payload.len,
|
|
||||||
payload.mem_len);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -692,10 +701,13 @@ int cbfs_print_entry_info(struct cbfs_image *image, struct cbfs_file *entry,
|
|||||||
payload = (struct cbfs_payload_segment *)
|
payload = (struct cbfs_payload_segment *)
|
||||||
CBFS_SUBHEADER(entry);
|
CBFS_SUBHEADER(entry);
|
||||||
while (payload) {
|
while (payload) {
|
||||||
/* Stop when PAYLOAD_SEGMENT_ENTRY seen. */
|
struct cbfs_payload_segment seg;
|
||||||
if (cbfs_print_payload_segment_info(payload,
|
cbfs_decode_payload_segment(&seg, payload);
|
||||||
fp))
|
cbfs_print_decoded_payload_segment_info(
|
||||||
|
&seg, fp);
|
||||||
|
if (seg.type == PAYLOAD_SEGMENT_ENTRY)
|
||||||
break;
|
break;
|
||||||
|
else
|
||||||
payload ++;
|
payload ++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user