summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/i386ex/startup/linkcmds
blob: daf191927637931f04af40f38b07d1d913cd27a3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
 *  This file contains directives for the GNU linker which are specific
 *  to the Intel 386ex evaluation board.
 *
 *  COPYRIGHT (c) 1989-1999.
 *  On-Line Applications Research Corporation (OAR).
 *
 *  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$
 * 
 * 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
{

/****************************************************************************************
 * 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 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 = 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 ) 
        {
        _sdata = .;
        *(.data);
        _edata = .;
   	}
        _data_start       = ADDR(.data) ;
	 data_start       = _data_start ;
        _data_size        = _edata - _sdata ;

/**************************************************************************************
 * bss section:
 *
 * The bss section is the last section in RAM.  
 *************************************************************************************/
	_edata = ALIGN( 0x10 );  
	.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  = 0x8000 ;
	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__ = .;
	_rodata_start 5 . ;
	*(.rodata)
	*(.gnu.linkonce.r*)
	_erodata = ALIGN( 0x10 ) ;
        _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 
 * 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 :
	{
	*(.initial);
	}

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