summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/cbfstool/cbfs.h3
-rw-r--r--util/cbfstool/common.c9
-rw-r--r--util/cbfstool/common.h1
-rw-r--r--util/cbfstool/fit.c19
-rw-r--r--util/cbfstool/xdr.c9
5 files changed, 37 insertions, 4 deletions
diff --git a/util/cbfstool/cbfs.h b/util/cbfstool/cbfs.h
index 527c867c50..1839646162 100644
--- a/util/cbfstool/cbfs.h
+++ b/util/cbfstool/cbfs.h
@@ -126,6 +126,9 @@ uint32_t get_cbfs_entry_type(const char *name, uint32_t default_value);
const char *get_cbfs_entry_type_name(uint32_t type);
uint32_t get_cbfs_compression(const char *name, uint32_t unknown);
+/* common.c */
+void cbfs_file_get_header(struct buffer *buf, struct cbfs_file *file);
+
/* elfheaders.c */
int
elf_headers(const struct buffer *pinput,
diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c
index 98d9517bf4..f594e8453b 100644
--- a/util/cbfstool/common.c
+++ b/util/cbfstool/common.c
@@ -103,6 +103,15 @@ void buffer_delete(struct buffer *buffer) {
buffer->size = 0;
}
+void cbfs_file_get_header(struct buffer *buf, struct cbfs_file *file)
+{
+ bgets(buf, &file->magic, sizeof(file->magic));
+ file->len = xdr_be.get32(buf);
+ file->type = xdr_be.get32(buf);
+ file->checksum = xdr_be.get32(buf);
+ file->offset = xdr_be.get32(buf);
+}
+
static struct {
uint32_t arch;
const char *name;
diff --git a/util/cbfstool/common.h b/util/cbfstool/common.h
index 5bcbcbedf8..5d3b900047 100644
--- a/util/cbfstool/common.h
+++ b/util/cbfstool/common.h
@@ -110,5 +110,6 @@ struct xdr {
/* xdr.c */
extern struct xdr xdr_le, xdr_be;
+int bgets(struct buffer *input, void *output, size_t len);
#endif
diff --git a/util/cbfstool/fit.c b/util/cbfstool/fit.c
index a368dad567..84f0bfff25 100644
--- a/util/cbfstool/fit.c
+++ b/util/cbfstool/fit.c
@@ -188,17 +188,28 @@ static void add_microcodde_entries(struct cbfs_image *image,
}
}
+static int fit_header(void *ptr, uint32_t *current_offset, uint32_t *file_length)
+{
+ struct buffer buf;
+ struct cbfs_file header;
+ buf.data = ptr;
+ buf.size = sizeof(header);
+ cbfs_file_get_header(&buf, &header);
+ *current_offset = header.offset;
+ *file_length = header.len;
+ return 0;
+}
+
static int parse_microcode_blob(struct cbfs_image *image,
struct cbfs_file *mcode_file,
struct microcode_entry *mcus, int *total_mcus)
{
int num_mcus;
- int current_offset;
- int file_length;
+ uint32_t current_offset;
+ uint32_t file_length;
current_offset = (int)((char *)mcode_file - image->buffer.data);
- current_offset += ntohl(mcode_file->offset);
- file_length = ntohl(mcode_file->len);
+ fit_header(mcode_file, &current_offset, &file_length);
num_mcus = 0;
while (file_length > sizeof(struct microcode_header))
diff --git a/util/cbfstool/xdr.c b/util/cbfstool/xdr.c
index d779675cd5..ddc282ed48 100644
--- a/util/cbfstool/xdr.c
+++ b/util/cbfstool/xdr.c
@@ -25,6 +25,15 @@
#include <stdint.h>
#include "common.h"
+int bgets(struct buffer *input, void *output, size_t len)
+{
+ len = input->size < len ? input->size : len;
+ memmove(output, input->data, len);
+ input->data += len;
+ input->size -= len;
+ return len;
+}
+
/* The assumption in all this code is that we're given a pointer to enough data.
* Hence, we do not check for underflow.
*/