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) would 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 Change-Id: If1ac355b8847fb54988069f694bd2f317ce49a1a Signed-off-by: Hung-Te Lin <hungte@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/200158 Reviewed-by: Ronald Minnich <rminnich@chromium.org>
This commit is contained in:
parent
466a59967b
commit
423f7dd28f
1 changed files with 38 additions and 19 deletions
|
|
@ -133,6 +133,23 @@ void cbfs_put_header(void *dest, struct cbfs_header *header)
|
|||
xdr_be.put32(&outheader, header->offset);
|
||||
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);
|
||||
}
|
||||
|
||||
int cbfs_image_create(struct cbfs_image *image,
|
||||
uint32_t architecture,
|
||||
size_t size,
|
||||
|
|
@ -549,34 +566,35 @@ static int cbfs_print_stage_info(struct cbfs_stage *stage, FILE* fp)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cbfs_print_payload_segment_info(struct cbfs_payload_segment *payload,
|
||||
FILE *fp)
|
||||
static int cbfs_print_decoded_payload_segment_info(
|
||||
struct cbfs_payload_segment *seg, FILE *fp)
|
||||
{
|
||||
switch(payload->type) {
|
||||
/* The input (seg) must be already decoded by
|
||||
* cbfs_decode_payload_segment.
|
||||
*/
|
||||
switch (seg->type) {
|
||||
case PAYLOAD_SEGMENT_CODE:
|
||||
case PAYLOAD_SEGMENT_DATA:
|
||||
fprintf(fp, " %s (%s compression, offset: 0x%x, "
|
||||
"load: 0x%" PRIx64 ", length: %d/%d)\n",
|
||||
(payload->type == PAYLOAD_SEGMENT_CODE ?
|
||||
(seg->type == PAYLOAD_SEGMENT_CODE ?
|
||||
"code " : "data"),
|
||||
lookup_name_by_type(types_cbfs_compression,
|
||||
ntohl(payload->compression),
|
||||
seg->compression,
|
||||
"(unknown)"),
|
||||
ntohl(payload->offset),
|
||||
ntohll(payload->load_addr),
|
||||
ntohl(payload->len), ntohl(payload->mem_len));
|
||||
seg->offset, seg->load_addr, seg->len,
|
||||
seg->mem_len);
|
||||
break;
|
||||
|
||||
case PAYLOAD_SEGMENT_ENTRY:
|
||||
fprintf(fp, " entry (0x%" PRIx64 ")\n",
|
||||
ntohll(payload->load_addr));
|
||||
seg->load_addr);
|
||||
break;
|
||||
|
||||
case PAYLOAD_SEGMENT_BSS:
|
||||
fprintf(fp, " BSS (address 0x%016" PRIx64 ", "
|
||||
"length 0x%x)\n",
|
||||
ntohll(payload->load_addr),
|
||||
ntohl(payload->len));
|
||||
seg->load_addr, seg->len);
|
||||
break;
|
||||
|
||||
case PAYLOAD_SEGMENT_PARAMS:
|
||||
|
|
@ -586,14 +604,12 @@ static int cbfs_print_payload_segment_info(struct cbfs_payload_segment *payload,
|
|||
default:
|
||||
fprintf(fp, " 0x%x (%s compression, offset: 0x%x, "
|
||||
"load: 0x%" PRIx64 ", length: %d/%d\n",
|
||||
payload->type,
|
||||
seg->type,
|
||||
lookup_name_by_type(types_cbfs_compression,
|
||||
payload->compression,
|
||||
seg->compression,
|
||||
"(unknown)"),
|
||||
ntohl(payload->offset),
|
||||
ntohll(payload->load_addr),
|
||||
ntohl(payload->len),
|
||||
ntohl(payload->mem_len));
|
||||
seg->offset, seg->load_addr, seg->len,
|
||||
seg->mem_len);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
|
|
@ -639,8 +655,11 @@ int cbfs_print_entry_info(struct cbfs_image *image, struct cbfs_file *entry,
|
|||
payload = (struct cbfs_payload_segment *)
|
||||
CBFS_SUBHEADER(entry);
|
||||
while (payload) {
|
||||
cbfs_print_payload_segment_info(payload, fp);
|
||||
if (payload->type == PAYLOAD_SEGMENT_ENTRY)
|
||||
struct cbfs_payload_segment seg;
|
||||
cbfs_decode_payload_segment(&seg, payload);
|
||||
cbfs_print_decoded_payload_segment_info(
|
||||
&seg, fp);
|
||||
if (seg.type == PAYLOAD_SEGMENT_ENTRY)
|
||||
break;
|
||||
else
|
||||
payload ++;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue