[coreboot-gerrit] New patch to review for coreboot: 98e9029 util/cbfstool: Fix byte-ordering for payload type field.

Marc Jones (marc.jones@se-eng.com) gerrit at coreboot.org
Wed Dec 31 07:22:43 CET 2014


Marc Jones (marc.jones at se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8005

-gerrit

commit 98e90292535a594f63f8cc72eb501ed2a367bb76
Author: Hung-Te Lin <hungte at chromium.org>
Date:   Fri May 16 10:14:05 2014 +0800

    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
    
    Original-Change-Id: If1ac355b8847fb54988069f694bd2f317ce49a1a
    Original-Signed-off-by: Hung-Te Lin <hungte at chromium.org>
    Original-Reviewed-on: https://chromium-review.googlesource.com/200158
    Original-Reviewed-by: Ronald Minnich <rminnich at chromium.org>
    (cherry picked from commit 423f7dd28f8b071692d57401e144232d5ee2e479)
    Signed-off-by: Marc Jones <marc.jones at se-eng.com>
    
    Change-Id: I5a4694e887c7ff48d8d0713bb5808c29256141a9
---
 util/cbfstool/cbfs_image.c | 64 +++++++++++++++++++++++++++-------------------
 1 file changed, 38 insertions(+), 26 deletions(-)

diff --git a/util/cbfstool/cbfs_image.c b/util/cbfstool/cbfs_image.c
index 1a522bd..6775b06 100644
--- a/util/cbfstool/cbfs_image.c
+++ b/util/cbfstool/cbfs_image.c
@@ -153,6 +153,22 @@ void cbfs_put_header(void *dest, const struct cbfs_header *header)
 	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)
 {
 	struct buffer outheader;
@@ -596,40 +612,35 @@ static int cbfs_print_stage_info(struct cbfs_stage *stage, FILE* fp)
 	return 0;
 }
 
-/* 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)
+static int cbfs_print_decoded_payload_segment_info(
+		struct cbfs_payload_segment *seg, FILE *fp)
 {
-	struct cbfs_payload_segment payload;
-
-	xdr_get_seg(&payload, seg_be);
-
-	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,
-						    payload.compression,
+						    seg->compression,
 						    "(unknown)"),
-				payload.offset,
-				payload.load_addr,
-				payload.len, payload.mem_len);
+				seg->offset, seg->load_addr, seg->len,
+				seg->mem_len);
 			break;
 
 		case PAYLOAD_SEGMENT_ENTRY:
 			fprintf(fp, "    entry (0x%" PRIx64 ")\n",
-				payload.load_addr);
-			return 1;
+				seg->load_addr);
 			break;
 
 		case PAYLOAD_SEGMENT_BSS:
 			fprintf(fp, "    BSS (address 0x%016" PRIx64 ", "
 				"length 0x%x)\n",
-				payload.load_addr,
-				payload.len);
+				seg->load_addr, seg->len);
 			break;
 
 		case PAYLOAD_SEGMENT_PARAMS:
@@ -639,14 +650,12 @@ static int cbfs_print_payload_segment_info(struct cbfs_payload_segment *seg_be,
 		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)"),
-				payload.offset,
-				payload.load_addr,
-				payload.len,
-				payload.mem_len);
+				seg->offset, seg->load_addr, seg->len,
+				seg->mem_len);
 			break;
 	}
 	return 0;
@@ -692,10 +701,13 @@ int cbfs_print_entry_info(struct cbfs_image *image, struct cbfs_file *entry,
 			payload  = (struct cbfs_payload_segment *)
 					CBFS_SUBHEADER(entry);
 			while (payload) {
-				/* Stop when PAYLOAD_SEGMENT_ENTRY seen. */
-				if (cbfs_print_payload_segment_info(payload,
-									fp))
+				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 ++;
 			}
 			break;



More information about the coreboot-gerrit mailing list