diff options
-rw-r--r-- | util/cbfstool/cbfs-mkpayload.c | 17 | ||||
-rw-r--r-- | util/cbfstool/cbfs.h | 2 | ||||
-rw-r--r-- | util/cbfstool/cbfs_image.c | 46 |
3 files changed, 45 insertions, 20 deletions
diff --git a/util/cbfstool/cbfs-mkpayload.c b/util/cbfstool/cbfs-mkpayload.c index 67002b0e66..adbe313b18 100644 --- a/util/cbfstool/cbfs-mkpayload.c +++ b/util/cbfstool/cbfs-mkpayload.c @@ -50,6 +50,23 @@ void xdr_segs(struct buffer *output, xdr_be.put32(&outheader, segs[i].mem_len); } } + +void xdr_get_seg(struct cbfs_payload_segment *out, + struct cbfs_payload_segment *in) +{ + struct buffer inheader; + + inheader.data = (void *)in; + inheader.size = sizeof(*in); + + out->type = xdr_be.get32(&inheader); + out->compression = xdr_be.get32(&inheader); + out->offset = xdr_be.get32(&inheader); + out->load_addr = xdr_be.get64(&inheader); + out->len = xdr_be.get32(&inheader); + out->mem_len = xdr_be.get32(&inheader); +} + int parse_elf_to_payload(const struct buffer *input, struct buffer *output, uint32_t arch, comp_algo algo) { diff --git a/util/cbfstool/cbfs.h b/util/cbfstool/cbfs.h index 73ee49c1aa..52a4a5097b 100644 --- a/util/cbfstool/cbfs.h +++ b/util/cbfstool/cbfs.h @@ -131,5 +131,7 @@ void cbfs_file_get_header(struct buffer *buf, struct cbfs_file *file); /* cbfs-mkpayload.c */ void xdr_segs(struct buffer *output, struct cbfs_payload_segment *segs, int nseg); +void xdr_get_seg(struct cbfs_payload_segment *out, + struct cbfs_payload_segment *in); #endif diff --git a/util/cbfstool/cbfs_image.c b/util/cbfstool/cbfs_image.c index 12bc2fe74e..afe1298130 100644 --- a/util/cbfstool/cbfs_image.c +++ b/util/cbfstool/cbfs_image.c @@ -595,34 +595,40 @@ 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, +/* Return 1 when segment is of type PAYLOAD_SEGMENT_ENTRY. */ +static int cbfs_print_payload_segment_info(struct cbfs_payload_segment *seg_be, FILE *fp) { - switch(payload->type) { + struct cbfs_payload_segment payload; + + xdr_get_seg(&payload, seg_be); + + switch(payload.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 ? + (payload.type == PAYLOAD_SEGMENT_CODE ? "code " : "data"), lookup_name_by_type(types_cbfs_compression, - ntohl(payload->compression), + payload.compression, "(unknown)"), - ntohl(payload->offset), - ntohll(payload->load_addr), - ntohl(payload->len), ntohl(payload->mem_len)); + payload.offset, + payload.load_addr, + payload.len, payload.mem_len); break; case PAYLOAD_SEGMENT_ENTRY: fprintf(fp, " entry (0x%" PRIx64 ")\n", - ntohll(payload->load_addr)); + payload.load_addr); + return 1; break; case PAYLOAD_SEGMENT_BSS: fprintf(fp, " BSS (address 0x%016" PRIx64 ", " "length 0x%x)\n", - ntohll(payload->load_addr), - ntohl(payload->len)); + payload.load_addr, + payload.len); break; case PAYLOAD_SEGMENT_PARAMS: @@ -632,14 +638,14 @@ 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, + payload.type, lookup_name_by_type(types_cbfs_compression, - payload->compression, + payload.compression, "(unknown)"), - ntohl(payload->offset), - ntohll(payload->load_addr), - ntohl(payload->len), - ntohl(payload->mem_len)); + payload.offset, + payload.load_addr, + payload.len, + payload.mem_len); break; } return 0; @@ -685,11 +691,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) + /* Stop when PAYLOAD_SEGMENT_ENTRY seen. */ + if (cbfs_print_payload_segment_info(payload, + fp)) break; - else - payload ++; + payload ++; } break; default: |