summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--util/cbfstool/cbfs-mkpayload.c17
-rw-r--r--util/cbfstool/cbfs.h2
-rw-r--r--util/cbfstool/cbfs_image.c46
3 files changed, 45 insertions, 20 deletions
diff --git a/util/cbfstool/cbfs-mkpayload.c b/util/cbfstool/cbfs-mkpayload.c
index 67002b0..adbe313 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 73ee49c..52a4a50 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 12bc2fe..afe1298 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:
OpenPOWER on IntegriCloud