summaryrefslogblamecommitdiffstats
path: root/c/src/lib/libbsp/i386/i386ex/startup/linkcmds
blob: 24202aa59c770920d39a8536f691f2a629b86ecd (plain) (tree)
1
2
3
4
5
6
7
8
9
10



                                                                       
                            
                                                    
                                                
  

                                                           
                                              
  
        





                      























                                                                                     




                               


















                                                                                          





                             


















                                                                                               





                             












                                                                                         





                                         
                                         
                                             
 




                                                                                       









                            
                                          
 
















                                                                                              

                            

                              

                         












                                                    
                       




                                                    

                               

         








                                                                                            



                    







                                                                                             


                  
 
/*
 *  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);
        }
}