summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/i386ex/startup/linkcmds
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/i386/i386ex/startup/linkcmds')
-rw-r--r--c/src/lib/libbsp/i386/i386ex/startup/linkcmds117
1 files changed, 27 insertions, 90 deletions
diff --git a/c/src/lib/libbsp/i386/i386ex/startup/linkcmds b/c/src/lib/libbsp/i386/i386ex/startup/linkcmds
index 24202aa59c..983e3993f5 100644
--- a/c/src/lib/libbsp/i386/i386ex/startup/linkcmds
+++ b/c/src/lib/libbsp/i386/i386ex/startup/linkcmds
@@ -11,108 +11,43 @@
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
+ *
+ * Memory layout:
+ *
+ * 0x3f80000 -> 0x3ff0000 : text section
+ * 0x3ff0000 -> 0x3ff0028 : global descriptor table in ROM
+ * 0x3ff0028 -> 0x3fff000 : data section ( copied by start.s to RAM )
+ * 0x3fff000 -> 0x3fffff0 : initial section ( init 386ex, goto protected mode, copy ROM-RAM )
+ * 0x3fffff0 -> 0x4000000 : reset section ( jmp to initial only )
*/
-
ENTRY(reset) ;
SECTIONS
{
-/*******************************************************************************
- * Interrupts section:
- *
- * This section defines the layout of the interrupts in ROM ( VMA ) as well as their
- * location in RAM (LMA). The _rom_ and _ram_ variables are used in start.s
- * in order for the code to move the interrupt vector tables from ROM to RAM
- * while still running in real-mode. The tables are moved from ROM, as the IDT
- * is initialized with only 16-bit offsets for the interrupt handlers.
- * This is purely an implementation issue. If you prefer the interrupt handlers
- * to be resident in flash, then you must provide the code to create the interrupt
- * gates with full 32bit offsets. The code in the current start.s does NOT support
- * interrupts in ROM by merely redefining their location.
- ******************************************************************************/
- _rom_ints = 0x3ff0000; /* was 0x3fb0000 */
- _rom_ints_segment = 0xF000 ;
- _rom_ints_offset = 0x0000 ;
-
- _ram_ints_segment = 0x0000 ;
- _ram_ints_offset = 0x0100 ;
-
-
- .ints _ram_ints_offset :
- AT ( _rom_ints )
- {
- _sints = .;
- *(.ints);
- _eints = ALIGN (0x010);
- }
-
- _ints_size = _eints - _sints ;
-/**************************************************************************************
- * GDT section:
- *
- * This section defines the locations of the GDT in ROM as well as in RAM. The _rom_ and
- * _ram_ variables are used by start.s to copy the GDT from ROM to RAM when still in
- * real-mode. The move from ROM to RAM is made as a writeable GDT is required for the
- * jump to protected mode to be successful.
- **************************************************************************************/
-
- _rom_gdt = _rom_ints + _ints_size;
- _rom_gdt_segment = 0xF000;
- _rom_gdt_offset = _rom_ints_offset + _ints_size;
-
- _ram_gdt_segment = 0x0000 ;
- _ram_gdt_offset = _ram_ints_offset + _ints_size;
-
- .gdt _ram_gdt_offset :
- AT ( _rom_gdt )
- {
- _sgdt = .;
- *(.gdt);
- _egdt = ALIGN (0x10);
- }
- _gdt_size = _egdt - _sgdt;
-
-/*****************************************************************************************
- * IDT section:
- *
- * This section defines the locations of the IDT in ROM as well as in RAM. The _rom_ and
- * _ram_ variables are used by start.s to copy the IDT from ROM to RAM when still in real-mode.
- * The move from ROM to RAM is required to enable RTEMS to hook the interrupts, however,
- * this move could be made when in protected mode.
- ****************************************************************************************/
-
- _rom_idt = _rom_gdt + _gdt_size ;
- _rom_idt_segment = 0xF000 ;
- _rom_idt_offset = _rom_gdt_offset + _gdt_size ;
-
- _ram_idt_segment = 0x0000 ;
- _ram_idt_offset = _ram_gdt_offset + _gdt_size ;
-
- .idt _ram_idt_offset :
- AT ( _rom_idt )
- {
- _sidt = .;
- *(.idt);
- _eidt = ALIGN (0x10);
- }
- _idt_size = _eidt - _sidt;
-
/****************************************************************************************
* data section:
*
* This section defines the locations of the data section in ROM as well as in RAM.
- * start.s copies the data section to RAM when in protected mode.
+ * start.s copies the data section to RAM in real mode. This is done PRIOR to the lgdt
+ * instruction since the data section contains the Global_descriptor_table and GDTR.
***********************************************************************************/
- _rom_data_start = _rom_idt + _idt_size ;
+ _rom_data_start = 0x3ff0000;
+
+ _rom_data_segment = 0xF000;
+ _rom_data_offset = 0x0;
+
+ _ram_data_segment = 0x0000 ;
+ _ram_data_offset = 0x0;
+ _ram_data_location = _ram_data_segment * 16 + _ram_data_offset;
.data :
- AT ( _rom_data_start )
+ AT ( _rom_data_start )
{
_sdata = .;
*(.data);
- _edata = ALIGN( 0x10 ) ;
+ _edata = .;
}
_data_start = ADDR(.data) ;
data_start = _data_start ;
@@ -123,6 +58,7 @@ SECTIONS
*
* The bss section is the last section in RAM.
*************************************************************************************/
+ _edata = ALIGN( 0x10 );
.bss :
{
_bss_start = .;
@@ -143,7 +79,7 @@ SECTIONS
* the heap used by RTEMS is as large as the RAM remaining after all workspace configurations
* are complete.
*************************************************************************************/
- stack_size = 0x1000 ;
+ stack_size = 0x8000 ;
stack_origin = end + stack_size ;
heap_bottom = stack_origin + 4 ;
@@ -186,7 +122,8 @@ SECTIONS
*
* This section is defined after the data section. It must be in the top 64K of memory
* to enable the initial short jmp from the reset section while still in real-mode. It
- * contains ALL initialization and data movement directives.
+ * initializes the i386ex, moves the gdt from ROM to RAM,loads the gdt,
+ * jumps to protected mode, copies the data section from ROM to RAM and loads the idt.
******************************************************************************************/
.initial _rom_data_start + _data_size :
@@ -195,14 +132,14 @@ SECTIONS
}
/*******************************************************************************************
- * reset section:
+ * board reset section:
*
* This section contains the short jmp from the reset section to the initial section. It is
* the first code executed on reset/power on.
******************************************************************************************/
- .reset 0x3fffff0:
+ .reset 0x3fffff0:
{
*(.reset);
}
-} \ No newline at end of file
+}