[coreboot-gerrit] Patch set updated for coreboot: 7e87e64 cbfstool: process cbfs_payload_segment(s) in host byte order

Aaron Durbin (adurbin@google.com) gerrit at coreboot.org
Wed Aug 6 15:42:19 CEST 2014


Aaron Durbin (adurbin at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/6498

-gerrit

commit 7e87e64049818065f42f49dc175e1205ef5d5aed
Author: Aaron Durbin <adurbin at chromium.org>
Date:   Tue Aug 5 10:48:20 2014 -0500

    cbfstool: process cbfs_payload_segment(s) in host byte order
    
    The printing routines of the cbfs_payload_segment assumed the type
    could be accessed in host order. Each of the fields need to be
    converted to the host order before inspecting the fields. In addition,
    this removes all the ntoh*() calls while processing the
    cbfs_payload_segment structures.
    
    cbfstool would crash adding entries or just printing entries
    containing a payload when -v was passed on the command line.
    
    Change-Id: Iff41c64a99001b9e3920e2e26828c5fd6e671239
    Signed-off-by: Aaron Durbin <adurbin at chromium.org>
---
 util/cbfstool/cbfs-mkpayload.c | 17 ++++++++++++++++
 util/cbfstool/cbfs.h           |  2 ++
 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 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:



More information about the coreboot-gerrit mailing list