]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/kernel.arm.ld
5c8d029ea07d30acd90169198222089664d9751a
[l4.git] / kernel / fiasco / src / kernel.arm.ld
1 /* -*- c -*- */
2
3 /* this file defines the construction of the kernel's virtual address
4    space */
5
6 _tcbs_1            = 0xd0000000;        /* assumption: 256MB-aligned */
7 /*_unused1_1         = _mappings_end_1; /* assumption: 4MB-aligned */
8 _unused2_1         = 0xea400000;        /* assumption: 4MB-aligned */
9 _unused3_1         = 0xea800000;        /* assumption: 4MB-aligned */
10 _service           = 0xeac00000;        /* assumption: 4MB-aligned */
11 /* 0xeb000000 - 0xef800000 unused */
12 _kstatic1_1        = 0xef800000;        /* assumption: 4MB-aligned */
13 _iobitmap_1        = 0xefc00000;        /* assumption: 4MB-aligned */
14 _unused4_io_1      = 0xefc80000;        /* assumption: 2nd level field in 
15                                            page table for IO bitmap */
16 _physmem_1         = 0x0000000;         /* assumption: 256MB-aligned */
17 _kernel_phys_start = _physmem_1;
18 _kernel_phys_end   = 0xffffffff;
19
20
21 virt_address       = 0xf0000000;
22 phys_offset        = virt_address - kernel_load_addr;
23
24
25 OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm",
26               "elf32-littlearm")
27 OUTPUT_ARCH(arm)
28 ENTRY(_start)
29
30 SECTIONS {
31
32
33   /DISCARD/ : {                 /* Exit code and data           */
34                 *(.exitcall.exit)
35               }
36               
37   . = kernel_load_addr + 0x1000;
38               
39   .text : {
40     bootstrap*(.init)
41     bootstrap*(.text .text.* .gnu.linkonce.t.*)
42     bootstrap*(.glue_7t) *(.glue_7)
43     bootstrap*(.got .got.*)
44     bootstrap*(.fini)
45     
46     bootstrap*(.rodata .rodata.* .gnu.linkonce.r.* .rodata1)
47
48     . = ALIGN(0x40);
49     
50     bootstrap*(.data .data.* .gnu.linkonce.d.*)
51     bootstrap*(.anno)
52
53     bootstrap*(.data) 
54     bootstrap*(.gnu.linkonce.d*)
55   }
56
57   PROVIDE(bootstrap_bss_start = .);
58   .bss_bootstrap : {
59     bootstrap*(.bss .bss.* COMMON .gnu.linkonce.b.*)
60   }
61   PROVIDE(bootstrap_bss_end = .);
62
63   . = ALIGN(4K);
64   end_of_loader = .;
65
66   . = end_of_loader - kernel_load_addr + virt_address;
67
68   .kip : AT (end_of_loader) {
69     _kernel_image_start = .;
70     *(.kernel_info_page)
71     _initkip_start = .;
72     KEEP(*(.initkip.version))
73     KEEP(*(.initkip.features))
74     KEEP(*(.initkip.features.fini))
75     _initkip_end = .;
76     . = ALIGN(4K);
77   }
78
79   .koptions : AT (ADDR(.koptions) - phys_offset) {
80     *(.koptions)
81   }
82
83   .mp_tramp : AT (ADDR(.mp_tramp) - phys_offset) {
84     KEEP(*(.mp_tramp))
85   }
86
87   .text_kernel : AT (ADDR(.text_kernel) - phys_offset) {
88     crt0.o(.text)
89     *(.init)
90     *(.text .text.* .gnu.linkonce.t.*)
91     *(.glue_7t) *(.glue_7)
92     *(.got .got.*)
93     *(.fini)
94
95     *(.text.jdb)
96      
97     PROVIDE (_ecode = .);
98
99     *(.rodata .rodata.* .gnu.linkonce.r.* .rodata1)
100
101     . = ALIGN(4);
102     PROVIDE (_log_table = .);
103     /*
104      * The section must start with ".debug" because else the linker
105      * complains about references to discarded sections
106      */
107     KEEP(*(SORT(.debug.jdb.log_table)))
108     PROVIDE (_log_table_end = .);
109
110     . = ALIGN(0x40);
111     
112     PROVIDE (_etext = .);
113
114     *(.data .data.* .gnu.linkonce.d.*)
115     *(.anno)
116
117     *(.data) 
118     *(.gnu.linkonce.d*)
119     *(.anno)
120     *(.data.jdb)
121
122     *(.init.data)
123
124 /* Constructor and destructor lists, ordered by priority.  The lists
125    are traversed from end to start, therefore the *_END__ symbols
126    precede the *_LIST__ symbols. */
127     __PER_CPU_INIT_ARRAY_START__ = .;
128     KEEP (*(.init_array.65534))
129     KEEP (*(.init_array.65533))
130     KEEP (*(.init_array.65532))
131     KEEP (*(.init_array.65531))
132     KEEP (*(.init_array.65530))
133     KEEP (*(.init_array.65529))
134     KEEP (*(.init_array.65528))
135     KEEP (*(.init_array.65527))
136     KEEP (*(.init_array.65526))
137     KEEP (*(.init_array.65525))
138     __PER_CPU_INIT_ARRAY_END__ = .;
139
140     __PER_CPU_LATE_INIT_ARRAY_START__ = .;
141     KEEP (*(.init_array.65524))
142     KEEP (*(.init_array.65523))
143     KEEP (*(.init_array.65522))
144     KEEP (*(.init_array.65521))
145     KEEP (*(.init_array.65520))
146     KEEP (*(.init_array.65519))
147     KEEP (*(.init_array.65518))
148     KEEP (*(.init_array.65517))
149     KEEP (*(.init_array.65516))
150     KEEP (*(.init_array.65515))
151     __PER_CPU_LATE_INIT_ARRAY_END__ = .;
152
153     __INIT_ARRAY_START__ = .;
154     KEEP (*(SORT (.init_array.*)))
155     KEEP (*(.init_array))
156     __INIT_ARRAY_END__ = .;
157
158     __PER_CPU_CTORS_END__ = .;
159     KEEP (*(.ctors.00010))
160     KEEP (*(.ctors.00009))
161     KEEP (*(.ctors.00008))
162     KEEP (*(.ctors.00007))
163     KEEP (*(.ctors.00006))
164     KEEP (*(.ctors.00005))
165     KEEP (*(.ctors.00004))
166     KEEP (*(.ctors.00003))
167     KEEP (*(.ctors.00002))
168     KEEP (*(.ctors.00001))
169     __PER_CPU_CTORS_LIST__ = .;
170
171     __PER_CPU_LATE_CTORS_END__ = .;
172     KEEP (*(.ctors.00020))
173     KEEP (*(.ctors.00019))
174     KEEP (*(.ctors.00018))
175     KEEP (*(.ctors.00017))
176     KEEP (*(.ctors.00016))
177     KEEP (*(.ctors.00015))
178     KEEP (*(.ctors.00014))
179     KEEP (*(.ctors.00013))
180     KEEP (*(.ctors.00012))
181     KEEP (*(.ctors.00011))
182     __PER_CPU_LATE_CTORS_LIST__ = .;
183
184     __CTOR_END__ = .;
185     CONSTRUCTORS
186     KEEP (*(.ctors))
187     KEEP (*(SORT (.ctors.*)))
188     __CTOR_LIST__ = .;
189
190     __DTOR_END__ = .;    
191     KEEP (*(SORT(.dtors.*)))
192     KEEP (*(.dtors))
193     __DTOR_LIST__ = .;
194
195     PROVIDE(_edata  =  .);
196
197   }
198
199   . = ALIGN(8);
200   .per_cpu_data : AT (ADDR(.per_cpu_data) - phys_offset) {
201     PROVIDE (_per_cpu_data_start = .);
202     *(.per_cpu.data)
203     . = ALIGN(8);
204     PROVIDE (_per_cpu_data_end = .);
205   }
206
207   /* ARM AEABI */
208   . = ALIGN(8);
209   .ARM.exidx : { *(.ARM.exidx.*) }
210   .ARM.extab : { *(.ARM.extab.*) }
211
212
213
214   . = ALIGN(4K);
215   .bss : AT (ADDR(.bss) - phys_offset) {
216     PROVIDE(__bss_start = .);
217     . = ALIGN(4);
218     _per_cpu_ctor_data_start = .;
219     KEEP (*(.bss.per_cpu_ctor_data))
220     _per_cpu_ctor_data_end = .;
221     *(.bss .bss.* COMMON .gnu.linkonce.b.*)
222     *(.bss.jdb)
223     PROVIDE(__bss_end = .);
224     . = ALIGN(4K);
225   }
226   __end_of_the_kernel = .;
227
228   ivt_start = ADDR(.bss) + SIZEOF(.bss) - phys_offset;
229   .excp 0xffff0000 : AT (ivt_start) {
230     *(.vect .excp.text)
231     *(.vect.extra)
232   }
233
234   . = __end_of_the_kernel + SIZEOF(.excp);
235
236   PROVIDE( _end = . );
237     
238   . = ALIGN(4K);
239   .initcall : AT(ADDR(.initcall) - phys_offset) {
240     _initcall_start = .;
241     *(.initcall.*)
242     . = ALIGN(4K);
243     _initcall_end = .;
244   } 
245
246   /DISCARD/ :{
247     *(.stab .stabstr .stab.excl .stab.exclstr)
248     *(.stab.index .stab.indexstr .comment)
249   }
250
251 }