blob: 24202aa59c770920d39a8536f691f2a629b86ecd (
plain) (
tree)
|
|
/*
* This file contains directives for the GNU linker which are specific
* to the Intel 386ex evaluation board.
*
* COPYRIGHT (c) 1989-1998.
* On-Line Applications Research Corporation (OAR).
* Copyright assigned to U.S. Government, 1994.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
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.
***********************************************************************************/
_rom_data_start = _rom_idt + _idt_size ;
.data :
AT ( _rom_data_start )
{
_sdata = .;
*(.data);
_edata = ALIGN( 0x10 ) ;
}
_data_start = ADDR(.data) ;
data_start = _data_start ;
_data_size = _edata - _sdata ;
/**************************************************************************************
* bss section:
*
* The bss section is the last section in RAM.
*************************************************************************************/
.bss :
{
_bss_start = .;
*(.bss);
*(COMMON);
_ebss = ALIGN(0x10);
end = _ebss;
_end = end;
__end = end;
}
_bss_size = _ebss - _bss_start ;
/**************************************************************************************
* General variables:
*
* The stack_size variable is customizable here. The heap is located directly after
* The stack in RAM. A routine within bspstart.c uses these variables to ensure that
* the heap used by RTEMS is as large as the RAM remaining after all workspace configurations
* are complete.
*************************************************************************************/
stack_size = 0x1000 ;
stack_origin = end + stack_size ;
heap_bottom = stack_origin + 4 ;
/***************************************************************************************
* text section:
*
* This section is NOT copied into RAM. It is left in ROM, as the flash ROM is quick enough.
***************************************************************************************/
.text ( 0x3f80000 ):
{
CREATE_OBJECT_SYMBOLS
text_start = . ;
_text_start = . ;
*(.text ) ;
. = ALIGN (16);
*(.eh_fram)
. = ALIGN (16);
/*
* C++ constructors
*/
__CTOR_LIST__ = .;
LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
*(.ctors)
LONG(0)
__CTOR_END__ = .;
. = ALIGN (4) ;
__DTOR_LIST__ = .;
LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
*(.dtors)
LONG(0)
__DTOR_END__ = .;
_etext = ALIGN( 0x10 );
_endtext = . ;
}
/*******************************************************************************************
* initial section:
*
* 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.
******************************************************************************************/
.initial _rom_data_start + _data_size :
{
*(.initial);
}
/*******************************************************************************************
* 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);
}
}
|