Add an xdr function for the cbfs_file header
And use it in fit.c and remove one more use of htonl. Change-Id: Ibf18dcc0a7f08d75c2374115de0db7a4bf64ec1e Signed-off-by: Ronald G. Minnich <rminnich@google.com> Reviewed-on: http://review.coreboot.org/5120 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
parent
c625d0983c
commit
3fcde22a30
|
@ -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);
|
const char *get_cbfs_entry_type_name(uint32_t type);
|
||||||
uint32_t get_cbfs_compression(const char *name, uint32_t unknown);
|
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 */
|
/* elfheaders.c */
|
||||||
int
|
int
|
||||||
elf_headers(const struct buffer *pinput,
|
elf_headers(const struct buffer *pinput,
|
||||||
|
|
|
@ -103,6 +103,15 @@ void buffer_delete(struct buffer *buffer) {
|
||||||
buffer->size = 0;
|
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 {
|
static struct {
|
||||||
uint32_t arch;
|
uint32_t arch;
|
||||||
const char *name;
|
const char *name;
|
||||||
|
|
|
@ -110,5 +110,6 @@ struct xdr {
|
||||||
|
|
||||||
/* xdr.c */
|
/* xdr.c */
|
||||||
extern struct xdr xdr_le, xdr_be;
|
extern struct xdr xdr_le, xdr_be;
|
||||||
|
int bgets(struct buffer *input, void *output, size_t len);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -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,
|
static int parse_microcode_blob(struct cbfs_image *image,
|
||||||
struct cbfs_file *mcode_file,
|
struct cbfs_file *mcode_file,
|
||||||
struct microcode_entry *mcus, int *total_mcus)
|
struct microcode_entry *mcus, int *total_mcus)
|
||||||
{
|
{
|
||||||
int num_mcus;
|
int num_mcus;
|
||||||
int current_offset;
|
uint32_t current_offset;
|
||||||
int file_length;
|
uint32_t file_length;
|
||||||
|
|
||||||
current_offset = (int)((char *)mcode_file - image->buffer.data);
|
current_offset = (int)((char *)mcode_file - image->buffer.data);
|
||||||
current_offset += ntohl(mcode_file->offset);
|
fit_header(mcode_file, ¤t_offset, &file_length);
|
||||||
file_length = ntohl(mcode_file->len);
|
|
||||||
|
|
||||||
num_mcus = 0;
|
num_mcus = 0;
|
||||||
while (file_length > sizeof(struct microcode_header))
|
while (file_length > sizeof(struct microcode_header))
|
||||||
|
|
|
@ -25,6 +25,15 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "common.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.
|
/* The assumption in all this code is that we're given a pointer to enough data.
|
||||||
* Hence, we do not check for underflow.
|
* Hence, we do not check for underflow.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue