summaryrefslogtreecommitdiff
path: root/src/lib/rmodule.ld
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/rmodule.ld')
-rw-r--r--src/lib/rmodule.ld28
1 files changed, 25 insertions, 3 deletions
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. */