aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/coreboot_ram.ld5
-rw-r--r--src/include/rmodule.h9
-rw-r--r--src/lib/rmodule.ld28
3 files changed, 35 insertions, 7 deletions
diff --git a/src/arch/x86/coreboot_ram.ld b/src/arch/x86/coreboot_ram.ld
index d9f09090d9..2dd51d515b 100644
--- a/src/arch/x86/coreboot_ram.ld
+++ b/src/arch/x86/coreboot_ram.ld
@@ -50,6 +50,10 @@ SECTIONS
.rodata : {
_rodata = .;
. = ALIGN(4);
+
+ /* If any changes are made to the driver start/symbols or the
+ * section names the equivalent changes need to made to
+ * rmodule.ld. */
console_drivers = .;
*(.rodata.console_drivers)
econsole_drivers = . ;
@@ -60,6 +64,7 @@ SECTIONS
cpu_drivers = . ;
*(.rodata.cpu_driver)
ecpu_drivers = . ;
+
*(.rodata)
*(.rodata.*)
/* kevinh/Ispiri - Added an align, because the objcopy tool
diff --git a/src/include/rmodule.h b/src/include/rmodule.h
index 30eee0ea05..5300c63766 100644
--- a/src/include/rmodule.h
+++ b/src/include/rmodule.h
@@ -27,6 +27,7 @@
enum {
RMODULE_TYPE_SMM,
RMODULE_TYPE_SIPI_VECTOR,
+ RMODULE_TYPE_STAGE,
};
struct rmodule;
@@ -58,8 +59,8 @@ int rmodule_load_alignment(const struct rmodule *m);
.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_begin), \
- .bss_end = FIELD_ENTRY(_bss_end), \
+ .bss_begin = FIELD_ENTRY(_bss), \
+ .bss_end = FIELD_ENTRY(_ebss), \
}
#define DEFINE_RMODULE_HEADER(name_, entry_, type_) \
@@ -119,8 +120,8 @@ extern char _relocations_begin_offset[];
extern char _relocations_end_offset[];
extern char _payload_end_offset[];
extern char _payload_begin_offset[];
-extern char _bss_begin[];
-extern char _bss_end[];
+extern char _bss[];
+extern char _ebss[];
extern char _module_program_size[];
extern char _module_link_start_addr[];
extern char _module_params_begin[];
diff --git a/src/lib/rmodule.ld b/src/lib/rmodule.ld
index fdee279697..c8bd297e51 100644
--- a/src/lib/rmodule.ld
+++ b/src/lib/rmodule.ld
@@ -41,6 +41,22 @@ SECTIONS
*(.text.*);
/* C read-only data. */
. = ALIGN(16);
+
+ /* The driver sections are to allow linking coreboot's
+ * ramstage with the rmodule linker. Any changes made in
+ * coreboot_ram.ld should be made here as well. */
+ console_drivers = .;
+ *(.rodata.console_drivers)
+ econsole_drivers = . ;
+ . = ALIGN(4);
+ pci_drivers = . ;
+ *(.rodata.pci_driver)
+ epci_drivers = . ;
+ cpu_drivers = . ;
+ *(.rodata.cpu_driver)
+ ecpu_drivers = . ;
+ . = ALIGN(4);
+
*(.rodata);
*(.rodata.*);
. = ALIGN(4);
@@ -67,13 +83,13 @@ SECTIONS
_payload_end_offset = LOADADDR(.data) + SIZEOF(.data);
.bss (NOLOAD) : {
- /* C uninitialized data of the SMM handler */
- _bss_begin = .;
+ /* C uninitialized data of the module. */
+ _bss = .;
*(.bss);
*(.sbss);
*(COMMON);
. = ALIGN(8);
- _bss_end = .;
+ _ebss = .;
/*
* Place the heap after BSS. The heap size is passed in by
@@ -87,6 +103,12 @@ SECTIONS
/* _module_program_size is the total memory used by the program. */
_module_program_size = _eheap - _module_link_start_addr;
+ /* coreboot's ramstage uses the _ram_seg and _eram_seg symbols
+ * for determining its load location. Provide those to help it out.
+ * It's a nop for any non-ramstage rmodule. */
+ _ram_seg = _module_link_start_addr;
+ _eram_seg = _module_link_start_addr + _module_program_size;
+
/* The relocation information is linked on top of the BSS section
* because the BSS section takes no space on disk. The relocation data
* resides directly after the data section in the flat binary. */