Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5372
-gerrit
commit de123803a6e8dcd9d1fc2f4c1dd7e2708867d3c1
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Fri Mar 7 15:23:05 2014 -0600
cbfstool: elfparsing: check segment and section regions
While parsing the section and program headers ensure the
locations of their contents are within the elf file proper.
Change-Id: I856f7de45f82ac15977abc06e51bedb51c58dde1
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
util/cbfstool/elfheaders.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/util/cbfstool/elfheaders.c b/util/cbfstool/elfheaders.c
index 3af82a6..505af78 100644
--- a/util/cbfstool/elfheaders.c
+++ b/util/cbfstool/elfheaders.c
@@ -272,9 +272,16 @@ phdr_read(const struct buffer *in, Elf64_Ehdr *ehdr, struct xdr *xdr, int bit64)
* than one loop over all the phdrs.
*/
phdr = calloc(ehdr->e_phnum, sizeof(*phdr));
- for (i = 0; i < ehdr->e_phnum; i++)
+ for (i = 0; i < ehdr->e_phnum; i++) {
+ DEBUG("Parsing segment %d\n", i);
elf_phdr(&b, &phdr[i], ehdr->e_phentsize, xdr, bit64);
+ /* Ensure the contents are valid within the elf file. */
+ if (check_size(in, phdr[i].p_offset, phdr[i].p_filesz,
+ "segment contents"))
+ return NULL;
+ }
+
return phdr;
}
@@ -296,9 +303,16 @@ shdr_read(const struct buffer *in, Elf64_Ehdr *ehdr, struct xdr *xdr, int bit64)
/* gather up all the shdrs. */
shdr = calloc(ehdr->e_shnum, sizeof(*shdr));
- for (i = 0; i < ehdr->e_shnum; i++)
+ for (i = 0; i < ehdr->e_shnum; i++) {
+ DEBUG("Parsing section %d\n", i);
elf_shdr(&b, &shdr[i], ehdr->e_shentsize, xdr, bit64);
+ /* Ensure the contents are valid within the elf file. */
+ if (check_size(in, shdr[i].sh_offset, shdr[i].sh_size,
+ "section contents"))
+ return NULL;
+ }
+
return shdr;
}
Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5371
-gerrit
commit 0c70e2ca93cf61777adc077971bbd6724d844f2a
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Wed Mar 5 14:54:13 2014 -0600
cbfstool: elfheaders: use proper parameters to calloc()
Though the result doesn't matter much, the callers of calloc()
should order the parameters correctly. i.e. the first paramter
is the number of elements in an array and the second is the
size of each element.
Change-Id: Ic7c2910d623d96f380feb4e5f6fa432376f49e9b
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
util/cbfstool/elfheaders.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/util/cbfstool/elfheaders.c b/util/cbfstool/elfheaders.c
index 0b05255..3af82a6 100644
--- a/util/cbfstool/elfheaders.c
+++ b/util/cbfstool/elfheaders.c
@@ -271,7 +271,7 @@ phdr_read(const struct buffer *in, Elf64_Ehdr *ehdr, struct xdr *xdr, int bit64)
* We do them all at once because there is more
* than one loop over all the phdrs.
*/
- phdr = calloc(sizeof(*phdr), ehdr->e_phnum);
+ phdr = calloc(ehdr->e_phnum, sizeof(*phdr));
for (i = 0; i < ehdr->e_phnum; i++)
elf_phdr(&b, &phdr[i], ehdr->e_phentsize, xdr, bit64);
@@ -295,7 +295,7 @@ shdr_read(const struct buffer *in, Elf64_Ehdr *ehdr, struct xdr *xdr, int bit64)
return NULL;
/* gather up all the shdrs. */
- shdr = calloc(sizeof(*shdr), ehdr->e_shnum);
+ shdr = calloc(ehdr->e_shnum, sizeof(*shdr));
for (i = 0; i < ehdr->e_shnum; i++)
elf_shdr(&b, &shdr[i], ehdr->e_shentsize, xdr, bit64);
Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5370
-gerrit
commit 9d1e92f75ab8df0fee2546812e8afa584e4e9c2c
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Wed Mar 5 12:12:09 2014 -0600
cbfstool: add eflparsing.h
elfparsing.h serves as the header to working with the elf
parser. Additionally, only include what is needed by the other
files. Many had no reason to be including elf.h aside from fixing
compilation problems when including cbfs.h.
Change-Id: I9eb5f09f3122aa18beeca52d2e4dc2102d70fb9d
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
util/cbfstool/cbfs-mkpayload.c | 2 +-
util/cbfstool/cbfs-mkstage.c | 2 +-
util/cbfstool/cbfs.h | 9 ---------
util/cbfstool/cbfs_image.c | 1 -
util/cbfstool/cbfstool.c | 1 -
util/cbfstool/elfheaders.c | 2 +-
util/cbfstool/elfparsing.h | 32 ++++++++++++++++++++++++++++++++
util/cbfstool/fit.c | 1 -
8 files changed, 35 insertions(+), 15 deletions(-)
diff --git a/util/cbfstool/cbfs-mkpayload.c b/util/cbfstool/cbfs-mkpayload.c
index 8c9f934..67002b0 100644
--- a/util/cbfstool/cbfs-mkpayload.c
+++ b/util/cbfstool/cbfs-mkpayload.c
@@ -23,7 +23,7 @@
#include <stdlib.h>
#include <string.h>
-#include "elf.h"
+#include "elfparsing.h"
#include "common.h"
#include "cbfs.h"
#include "fv.h"
diff --git a/util/cbfstool/cbfs-mkstage.c b/util/cbfstool/cbfs-mkstage.c
index 233ec57..6aa3746 100644
--- a/util/cbfstool/cbfs-mkstage.c
+++ b/util/cbfstool/cbfs-mkstage.c
@@ -24,7 +24,7 @@
#include <stdlib.h>
#include <string.h>
-#include "elf.h"
+#include "elfparsing.h"
#include "common.h"
#include "cbfs.h"
diff --git a/util/cbfstool/cbfs.h b/util/cbfstool/cbfs.h
index 1839646..a561b2b 100644
--- a/util/cbfstool/cbfs.h
+++ b/util/cbfstool/cbfs.h
@@ -20,7 +20,6 @@
#define __CBFS_H
#include <stdint.h>
-#include "elf.h"
/* create a magic number in host-byte order.
* b3 is the high order byte.
@@ -129,14 +128,6 @@ 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,
- uint32_t arch,
- Elf64_Ehdr *ehdr,
- Elf64_Phdr **pphdr,
- Elf64_Shdr **pshdr);
-
/* cbfs-mkpayload.c */
void xdr_segs(struct buffer *output,
struct cbfs_payload_segment *segs, int nseg);
diff --git a/util/cbfstool/cbfs_image.c b/util/cbfstool/cbfs_image.c
index 6ecffd1..b9d5f28 100644
--- a/util/cbfstool/cbfs_image.c
+++ b/util/cbfstool/cbfs_image.c
@@ -24,7 +24,6 @@
#include <string.h>
#include "common.h"
-#include "elf.h"
#include "cbfs_image.h"
/* The file name align is not defined in CBFS spec -- only a preference by
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index ead2d88..73b1cf0 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -26,7 +26,6 @@
#include <unistd.h>
#include <getopt.h>
#include "common.h"
-#include "elf.h"
#include "cbfs.h"
#include "cbfs_image.h"
#include "fit.h"
diff --git a/util/cbfstool/elfheaders.c b/util/cbfstool/elfheaders.c
index f987747..0b05255 100644
--- a/util/cbfstool/elfheaders.c
+++ b/util/cbfstool/elfheaders.c
@@ -21,7 +21,7 @@
#include <stdlib.h>
#include <string.h>
-#include "elf.h"
+#include "elfparsing.h"
#include "common.h"
#include "cbfs.h"
diff --git a/util/cbfstool/elfparsing.h b/util/cbfstool/elfparsing.h
new file mode 100644
index 0000000..3cfa1cd
--- /dev/null
+++ b/util/cbfstool/elfparsing.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014 Google, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
+ */
+
+#ifndef ELFPARSING_H
+#define ELFPARSING_H
+
+#include "elf.h"
+
+struct buffer;
+
+int
+elf_headers(const struct buffer *pinput,
+ uint32_t arch,
+ Elf64_Ehdr *ehdr,
+ Elf64_Phdr **pphdr,
+ Elf64_Shdr **pshdr);
+
+#endif /* ELFPARSING_H */
diff --git a/util/cbfstool/fit.c b/util/cbfstool/fit.c
index 84f0bff..bf6c6d4 100644
--- a/util/cbfstool/fit.c
+++ b/util/cbfstool/fit.c
@@ -23,7 +23,6 @@
#include <stdio.h>
#include "common.h"
-#include "elf.h"
#include "cbfs.h"
#include "cbfs_image.h"
#include "fit.h"
Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5368
-gerrit
commit f0bdc15503b836a27ef1f4bcd6020540f928f034
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Tue Mar 4 22:08:05 2014 -0600
cbfstool: elfheaders: use common checks and buffer helpers
The elfheaders code was manipulating struct buffers. Use
the introduced buffer helper functions. Additionally fix
up offset and size checks for the program headers and section
headers by using common code paths.
Change-Id: I279c77f77aaa1860a0be43fb111df890dd1d84d5
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
util/cbfstool/elfheaders.c | 147 ++++++++++++++++++++++++---------------------
1 file changed, 79 insertions(+), 68 deletions(-)
diff --git a/util/cbfstool/elfheaders.c b/util/cbfstool/elfheaders.c
index 0d874a1..78c864f 100644
--- a/util/cbfstool/elfheaders.c
+++ b/util/cbfstool/elfheaders.c
@@ -128,12 +128,25 @@
static void
elf_eident(struct buffer *input, Elf64_Ehdr *ehdr)
{
- memmove(ehdr->e_ident, input->data, sizeof(ehdr->e_ident));
- input->data += sizeof(ehdr->e_ident);
- input->size -= sizeof(ehdr->e_ident);
+ bgets(input, ehdr->e_ident, sizeof(ehdr->e_ident));
}
+static int
+check_size(const struct buffer *b, size_t offset, size_t size, const char *desc)
+{
+ if (size == 0)
+ return 0;
+
+ if (offset >= buffer_size(b) || (offset + size) > buffer_size(b)) {
+ ERROR("The file is not large enough for the '%s'. "
+ "%ld bytes @ offset %zu, input %zu bytes.\n",
+ desc, size, offset, buffer_size(b));
+ return -1;
+ }
+ return 0;
+}
+
static void
elf_ehdr(struct buffer *input, Elf64_Ehdr *ehdr, struct xdr *xdr, int bit64)
{
@@ -169,7 +182,8 @@ elf_phdr(struct buffer *pinput, Elf64_Phdr *phdr,
* pointer the full entsize; rather than get tricky
* we just advance it below.
*/
- struct buffer input = *pinput;
+ struct buffer input;
+ buffer_clone(&input, pinput);
if (bit64){
phdr->p_type = xdr->get32(&input);
phdr->p_flags = xdr->get32(&input);
@@ -189,8 +203,7 @@ elf_phdr(struct buffer *pinput, Elf64_Phdr *phdr,
phdr->p_flags = xdr->get32(&input);
phdr->p_align = xdr->get32(&input);
}
- pinput->size -= entsize;
- pinput->data += entsize;
+ buffer_seek(pinput, entsize);
}
static void
@@ -228,8 +241,58 @@ elf_shdr(struct buffer *pinput, Elf64_Shdr *shdr,
shdr->sh_addralign = xdr->get32(&input);
shdr->sh_entsize = xdr->get32(&input);
}
- pinput->size -= entsize;
- pinput->data += entsize;
+ buffer_seek(pinput, entsize);
+}
+
+static Elf64_Phdr *
+phdr_read(const struct buffer *in, Elf64_Ehdr *ehdr, struct xdr *xdr, int bit64)
+{
+ struct buffer b;
+ Elf64_Phdr *phdr;
+ int i;
+
+ /* cons up an input buffer for the headers.
+ * Note that the program headers can be anywhere,
+ * per the ELF spec, You'd be surprised how many ELF
+ * readers miss this little detail.
+ */
+ buffer_splice(&b, in, ehdr->e_phoff, ehdr->e_phentsize * ehdr->e_phnum);
+ if (check_size(in, ehdr->e_phoff, buffer_size(&b), "program headers"))
+ return NULL;
+
+ /* gather up all the phdrs.
+ * We do them all at once because there is more
+ * than one loop over all the phdrs.
+ */
+ phdr = calloc(sizeof(*phdr), ehdr->e_phnum);
+ for (i = 0; i < ehdr->e_phnum; i++)
+ elf_phdr(&b, &phdr[i], ehdr->e_phentsize, xdr, bit64);
+
+ return phdr;
+}
+
+static Elf64_Shdr *
+shdr_read(const struct buffer *in, Elf64_Ehdr *ehdr, struct xdr *xdr, int bit64)
+{
+ struct buffer b;
+ Elf64_Shdr *shdr;
+ int i;
+
+ /* cons up an input buffer for the section headers.
+ * Note that the section headers can be anywhere,
+ * per the ELF spec, You'd be surprised how many ELF
+ * readers miss this little detail.
+ */
+ buffer_splice(&b, in, ehdr->e_shoff, ehdr->e_shentsize * ehdr->e_shnum);
+ if (check_size(in, ehdr->e_shoff, buffer_size(&b), "section headers"))
+ return NULL;
+
+ /* gather up all the shdrs. */
+ shdr = calloc(sizeof(*shdr), ehdr->e_shnum);
+ for (i = 0; i < ehdr->e_shnum; i++)
+ elf_shdr(&b, &shdr[i], ehdr->e_shentsize, xdr, bit64);
+
+ return shdr;
}
/* Get the headers from the buffer.
@@ -246,16 +309,13 @@ elf_headers(const struct buffer *pinput,
Elf64_Phdr **pphdr,
Elf64_Shdr **pshdr)
{
- int i;
struct xdr *xdr = &xdr_le;
int bit64 = 0;
- struct buffer input = *(struct buffer *)pinput;
- struct buffer phdr_buf;
- struct buffer shdr_buf;
- Elf64_Phdr *phdr;
- Elf64_Shdr *shdr;
+ struct buffer input;
+
+ buffer_clone(&input, pinput);
- if (!iself((unsigned char *)pinput->data)) {
+ if (!iself(buffer_get(pinput))) {
ERROR("The stage file is not in ELF format!\n");
return -1;
}
@@ -280,65 +340,16 @@ elf_headers(const struct buffer *pinput,
return -1;
}
- if (pinput->size < ehdr->e_phoff){
- ERROR("The program header offset is greater than "
- "the remaining file size."
- "%ld bytes left, program header offset is %ld \n",
- pinput->size, ehdr->e_phoff);
+ *pphdr = phdr_read(pinput, ehdr, xdr, bit64);
+ if (*pphdr == NULL)
return -1;
- }
- /* cons up an input buffer for the headers.
- * Note that the program headers can be anywhere,
- * per the ELF spec, You'd be surprised how many ELF
- * readers miss this little detail.
- */
- phdr_buf.data = &pinput->data[ehdr->e_phoff];
- phdr_buf.size = ehdr->e_phentsize * ehdr->e_phnum;
- if (phdr_buf.size > (pinput->size - ehdr->e_phoff)){
- ERROR("The file is not large enough for the program headers."
- "%ld bytes left, %ld bytes of headers\n",
- pinput->size - ehdr->e_phoff, phdr_buf.size);
- return -1;
- }
- /* gather up all the phdrs.
- * We do them all at once because there is more
- * than one loop over all the phdrs.
- */
- phdr = calloc(sizeof(*phdr), ehdr->e_phnum);
- for (i = 0; i < ehdr->e_phnum; i++)
- elf_phdr(&phdr_buf, &phdr[i], ehdr->e_phentsize, xdr, bit64);
- *pphdr = phdr;
if (!pshdr)
return 0;
- if (pinput->size < ehdr->e_shoff){
- ERROR("The section header offset is greater than "
- "the remaining file size."
- "%ld bytes left, program header offset is %ld \n",
- pinput->size, ehdr->e_shoff);
- return -1;
- }
- /* cons up an input buffer for the section headers.
- * Note that the section headers can be anywhere,
- * per the ELF spec, You'd be surprised how many ELF
- * readers miss this little detail.
- */
- shdr_buf.data = &pinput->data[ehdr->e_shoff];
- shdr_buf.size = ehdr->e_shentsize * ehdr->e_shnum;
- if (shdr_buf.size > (pinput->size - ehdr->e_shoff)){
- ERROR("The file is not large enough for the section headers."
- "%ld bytes left, %ld bytes of headers\n",
- pinput->size - ehdr->e_shoff, shdr_buf.size);
+ *pshdr = shdr_read(pinput, ehdr, xdr, bit64);
+ if (*pshdr == NULL)
return -1;
- }
- /* gather up all the shdrs. */
-
- shdr = calloc(sizeof(*shdr), ehdr->e_shnum);
- for (i = 0; i < ehdr->e_shnum; i++)
- elf_shdr(&shdr_buf, &shdr[i], ehdr->e_shentsize, xdr, bit64);
- *pshdr = shdr;
return 0;
}
-
Aaron Durbin (adurbin(a)google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5363
-gerrit
commit 736ed7b9a962f6a3327ec57eb61aade870f3330a
Author: Aaron Durbin <adurbin(a)chromium.org>
Date: Mon Mar 10 09:53:34 2014 -0500
rmodule: allow rmodule header structure to be used by userland
In order for userland to create rmodules the common code should be
shareable. Therefore, convert the short u<width> name types to the
posix uint<width>_t types. Additionally, move the definition of the
header structure to a new rmodule-defs.h header file so that userland
can include that without pulling in the coreboot state.
Change-Id: I54acd3bfd8c207b9efd50a3b6d89efd5fcbfc1d9
Signed-off-by: Aaron Durbin <adurbin(a)chromium.org>
---
src/include/rmodule-defs.h | 87 ++++++++++++++++++++++++++++++++++++++++++++++
src/include/rmodule.h | 63 +--------------------------------
src/lib/rmodule.c | 14 ++++----
3 files changed, 95 insertions(+), 69 deletions(-)
diff --git a/src/include/rmodule-defs.h b/src/include/rmodule-defs.h
new file mode 100644
index 0000000..ee2d3f7
--- /dev/null
+++ b/src/include/rmodule-defs.h
@@ -0,0 +1,87 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2014 Google Inc
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#ifndef RMODULE_DEFS_H
+#define RMODULE_DEFS_H
+
+#include <stdint.h>
+#include <stddef.h>
+
+#define RMODULE_MAGIC 0xf8fe
+#define RMODULE_VERSION_1 1
+
+#define FIELD_ENTRY(x_) ((uint32_t)&x_)
+#define RMODULE_HEADER(entry_, type_) \
+{ \
+ .magic = RMODULE_MAGIC, \
+ .version = RMODULE_VERSION_1, \
+ .type = type_, \
+ .payload_begin_offset = FIELD_ENTRY(_payload_begin_offset), \
+ .payload_end_offset = FIELD_ENTRY(_payload_end_offset), \
+ .relocations_begin_offset = \
+ FIELD_ENTRY(_relocations_begin_offset), \
+ .relocations_end_offset = \
+ FIELD_ENTRY(_relocations_end_offset), \
+ .module_link_start_address = \
+ FIELD_ENTRY(_module_link_start_addr), \
+ .module_program_size = FIELD_ENTRY(_module_program_size), \
+ .module_entry_point = FIELD_ENTRY(entry_), \
+ .parameters_begin = FIELD_ENTRY(_module_params_begin), \
+ .parameters_end = FIELD_ENTRY(_module_params_end), \
+ .bss_begin = FIELD_ENTRY(_bss), \
+ .bss_end = FIELD_ENTRY(_ebss), \
+}
+
+/* Private data structures below should not be used directly. */
+
+/* All fields with '_offset' in the name are byte offsets into the flat blob.
+ * The linker and the linker script takes are of assigning the values. */
+struct rmodule_header {
+ uint16_t magic;
+ uint8_t version;
+ uint8_t type;
+ /* The payload represents the program's loadable code and data. */
+ uint32_t payload_begin_offset;
+ uint32_t payload_end_offset;
+ /* Begin and of relocation information about the program module. */
+ uint32_t relocations_begin_offset;
+ uint32_t relocations_end_offset;
+ /* The starting address of the linked program. This address is vital
+ * for determining relocation offsets as the relocation info and other
+ * symbols (bss, entry point) need this value as a basis to calculate
+ * the offsets.
+ */
+ uint32_t module_link_start_address;
+ /* The module_program_size is the size of memory used while running
+ * the program. The program is assumed to consume a contiguous amount
+ * of memory. */
+ uint32_t module_program_size;
+ /* This is program's execution entry point. */
+ uint32_t module_entry_point;
+ /* Optional parameter structure that can be used to pass data into
+ * the module. */
+ uint32_t parameters_begin;
+ uint32_t parameters_end;
+ /* BSS section information so the loader can clear the bss. */
+ uint32_t bss_begin;
+ uint32_t bss_end;
+ /* Add some room for growth. */
+ uint32_t padding[4];
+} __attribute__ ((packed));
+
+#endif /* RMODULE_DEFS_H */
diff --git a/src/include/rmodule.h b/src/include/rmodule.h
index 41da3a9..2147ab0 100644
--- a/src/include/rmodule.h
+++ b/src/include/rmodule.h
@@ -21,9 +21,7 @@
#include <stdint.h>
#include <stddef.h>
-
-#define RMODULE_MAGIC 0xf8fe
-#define RMODULE_VERSION_1 1
+#include <rmodule-defs.h>
enum {
RMODULE_TYPE_SMM,
@@ -52,28 +50,6 @@ int rmodule_load_alignment(const struct rmodule *m);
int rmodule_calc_region(unsigned int region_alignment, size_t rmodule_size,
size_t *region_size, int *load_offset);
-#define FIELD_ENTRY(x_) ((u32)&x_)
-#define RMODULE_HEADER(entry_, type_) \
-{ \
- .magic = RMODULE_MAGIC, \
- .version = RMODULE_VERSION_1, \
- .type = type_, \
- .payload_begin_offset = FIELD_ENTRY(_payload_begin_offset), \
- .payload_end_offset = FIELD_ENTRY(_payload_end_offset), \
- .relocations_begin_offset = \
- FIELD_ENTRY(_relocations_begin_offset), \
- .relocations_end_offset = \
- FIELD_ENTRY(_relocations_end_offset), \
- .module_link_start_address = \
- FIELD_ENTRY(_module_link_start_addr), \
- .module_program_size = FIELD_ENTRY(_module_program_size), \
- .module_entry_point = FIELD_ENTRY(entry_), \
- .parameters_begin = FIELD_ENTRY(_module_params_begin), \
- .parameters_end = FIELD_ENTRY(_module_params_end), \
- .bss_begin = FIELD_ENTRY(_bss), \
- .bss_end = FIELD_ENTRY(_ebss), \
-}
-
#define DEFINE_RMODULE_HEADER(name_, entry_, type_) \
struct rmodule_header name_ \
__attribute__ ((section (".module_header"))) = \
@@ -100,43 +76,6 @@ int rmodule_stage_load(struct rmod_stage_load *rsl, struct cbfs_stage *stage);
int rmodule_stage_load_from_cbfs(struct rmod_stage_load *rsl);
#endif
-/* Private data structures below should not be used directly. */
-
-/* All fields with '_offset' in the name are byte offsets into the flat blob.
- * The linker and the linker script takes are of assigning the values. */
-struct rmodule_header {
- u16 magic;
- u8 version;
- u8 type;
- /* The payload represents the program's loadable code and data. */
- u32 payload_begin_offset;
- u32 payload_end_offset;
- /* Begin and of relocation information about the program module. */
- u32 relocations_begin_offset;
- u32 relocations_end_offset;
- /* The starting address of the linked program. This address is vital
- * for determining relocation offsets as the relocation info and other
- * symbols (bss, entry point) need this value as a basis to calculate
- * the offsets.
- */
- u32 module_link_start_address;
- /* The module_program_size is the size of memory used while running
- * the program. The program is assumed to consume a contiguous amount
- * of memory. */
- u32 module_program_size;
- /* This is program's execution entry point. */
- u32 module_entry_point;
- /* Optional parameter structure that can be used to pass data into
- * the module. */
- u32 parameters_begin;
- u32 parameters_end;
- /* BSS section information so the loader can clear the bss. */
- u32 bss_begin;
- u32 bss_end;
- /* Add some room for growth. */
- u32 padding[4];
-} __attribute__ ((packed));
-
struct rmodule {
void *location;
struct rmodule_header *header;
diff --git a/src/lib/rmodule.c b/src/lib/rmodule.c
index a3e2184..2cb70b8 100644
--- a/src/lib/rmodule.c
+++ b/src/lib/rmodule.c
@@ -34,8 +34,8 @@
* locations.
*/
typedef struct {
- u32 r_offset;
- u32 r_info;
+ uint32_t r_offset;
+ uint32_t r_info;
} Elf32_Rel;
#define R_386_RELATIVE 8
@@ -71,7 +71,7 @@ static inline int rmodule_is_loaded(const struct rmodule *module)
/* Calculate a loaded program address based on the blob address. */
static inline void *rmodule_load_addr(const struct rmodule *module,
- u32 blob_addr)
+ uint32_t blob_addr)
{
char *loc = module->location;
return &loc[blob_addr - module->header->module_link_start_address];
@@ -176,7 +176,7 @@ static void rmodule_copy_payload(const struct rmodule *module)
memcpy(module->location, module->payload, module->payload_size);
}
-static inline u32 *rmodule_adjustment_location(const struct rmodule *module,
+static inline uint32_t *rmodule_adjustment_location(const struct rmodule *module,
const void *reloc)
{
int reloc_offset;
@@ -193,11 +193,11 @@ static int rmodule_relocate(const struct rmodule *module)
{
int num_relocations;
const void *reloc;
- u32 adjustment;
+ uint32_t adjustment;
/* Each relocation needs to be adjusted relative to the beginning of
* the loaded program. */
- adjustment = (u32)rmodule_load_addr(module, 0);
+ adjustment = (uint32_t)rmodule_load_addr(module, 0);
reloc = module->relocations;
num_relocations = rmodule_number_relocations(module);
@@ -206,7 +206,7 @@ static int rmodule_relocate(const struct rmodule *module)
num_relocations, adjustment);
while (num_relocations > 0) {
- u32 *adjust_loc;
+ uint32_t *adjust_loc;
if (!rmodule_reloc_valid(reloc))
return -1;