[POWERPC] Add __read_mostly support for powerpc
[safe/jmp/linux-2.6] / arch / powerpc / kernel / vmlinux.lds.S
1 #ifdef CONFIG_PPC64
2 #include <asm/page.h>
3 #define PROVIDE32(x)    PROVIDE(__unused__##x)
4 #else
5 #define PAGE_SIZE       4096
6 #define KERNELBASE      CONFIG_KERNEL_START
7 #define PROVIDE32(x)    PROVIDE(x)
8 #endif
9 #include <asm-generic/vmlinux.lds.h>
10 #include <asm/cache.h>
11
12 ENTRY(_stext)
13
14 #ifdef CONFIG_PPC64
15 OUTPUT_ARCH(powerpc:common64)
16 jiffies = jiffies_64;
17 #else
18 OUTPUT_ARCH(powerpc:common)
19 jiffies = jiffies_64 + 4;
20 #endif
21 SECTIONS
22 {
23         /* Sections to be discarded. */
24         /DISCARD/ : {
25         *(.exitcall.exit)
26         *(.exit.data)
27         }
28
29         . = KERNELBASE;
30
31 /*
32  * Text, read only data and other permanent read-only sections
33  */
34
35         /* Text and gots */
36         .text : {
37                 _text = .;
38                 TEXT_TEXT
39                 SCHED_TEXT
40                 LOCK_TEXT
41                 KPROBES_TEXT
42                 *(.fixup)
43
44 #ifdef CONFIG_PPC32
45                 *(.got1)
46                 __got2_start = .;
47                 *(.got2)
48                 __got2_end = .;
49 #endif /* CONFIG_PPC32 */
50
51                 . = ALIGN(PAGE_SIZE);
52                 _etext = .;
53                 PROVIDE32 (etext = .);
54         }
55
56         /* Read-only data */
57         RODATA
58
59         /* Exception & bug tables */
60         __ex_table : {
61                 __start___ex_table = .;
62                 *(__ex_table)
63                 __stop___ex_table = .;
64         }
65
66         BUG_TABLE
67
68 /*
69  * Init sections discarded at runtime
70  */
71         . = ALIGN(PAGE_SIZE);
72         __init_begin = .;
73
74         .init.text : {
75                 _sinittext = .;
76                 *(.init.text)
77                 _einittext = .;
78         }
79
80         /* .exit.text is discarded at runtime, not link time,
81          * to deal with references from __bug_table
82          */
83         .exit.text : { *(.exit.text) }
84
85         .init.data : {
86                 *(.init.data);
87                 __vtop_table_begin = .;
88                 *(.vtop_fixup);
89                 __vtop_table_end = .;
90                 __ptov_table_begin = .;
91                 *(.ptov_fixup);
92                 __ptov_table_end = .;
93 #ifdef CONFIG_PPC_ISERIES
94                 __dt_strings_start = .;
95                 *(.dt_strings);
96                 __dt_strings_end = .;
97 #endif
98         }
99
100         . = ALIGN(16);
101         .init.setup : {
102                 __setup_start = .;
103                 *(.init.setup)
104                 __setup_end = .;
105         }
106
107         .initcall.init : {
108                 __initcall_start = .;
109                 INITCALLS
110                 __initcall_end = .;
111                 }
112
113         .con_initcall.init : {
114                 __con_initcall_start = .;
115                 *(.con_initcall.init)
116                 __con_initcall_end = .;
117         }
118
119         SECURITY_INIT
120
121         . = ALIGN(8);
122         __ftr_fixup : {
123                 __start___ftr_fixup = .;
124                 *(__ftr_fixup)
125                 __stop___ftr_fixup = .;
126         }
127 #ifdef CONFIG_PPC64
128         . = ALIGN(8);
129         __fw_ftr_fixup : {
130                 __start___fw_ftr_fixup = .;
131                 *(__fw_ftr_fixup)
132                 __stop___fw_ftr_fixup = .;
133         }
134 #endif
135 #ifdef CONFIG_BLK_DEV_INITRD
136         . = ALIGN(PAGE_SIZE);
137         .init.ramfs : {
138                 __initramfs_start = .;
139                 *(.init.ramfs)
140                 __initramfs_end = .;
141         }
142 #endif
143         . = ALIGN(PAGE_SIZE);
144         .data.percpu : {
145                 __per_cpu_start = .;
146                 *(.data.percpu)
147                 __per_cpu_end = .;
148         }
149
150         . = ALIGN(8);
151         .machine.desc : {
152                 __machine_desc_start = . ;
153                 *(.machine.desc)
154                 __machine_desc_end = . ;
155         }
156
157         /* freed after init ends here */
158         . = ALIGN(PAGE_SIZE);
159         __init_end = .;
160
161 /*
162  * And now the various read/write data
163  */
164
165         . = ALIGN(PAGE_SIZE);
166         _sdata = .;
167
168 #ifdef CONFIG_PPC32
169         .data    :
170         {
171                 DATA_DATA
172                 *(.sdata)
173                 *(.got.plt) *(.got)
174         }
175 #else
176         .data : {
177                 *(.data .data.rel* .toc1)
178                 *(.branch_lt)
179         }
180
181         .opd : {
182                 *(.opd)
183         }
184
185         .got : {
186                 __toc_start = .;
187                 *(.got)
188                 *(.toc)
189         }
190 #endif
191
192         . = ALIGN(PAGE_SIZE);
193         _edata  =  .;
194         PROVIDE32 (edata = .);
195
196         /* The initial task and kernel stack */
197 #ifdef CONFIG_PPC32
198         . = ALIGN(8192);
199 #else
200         . = ALIGN(16384);
201 #endif
202         .data.init_task : {
203                 *(.data.init_task)
204         }
205
206         . = ALIGN(PAGE_SIZE);
207         .data.page_aligned : {
208                 *(.data.page_aligned)
209         }
210
211         .data.cacheline_aligned : {
212                 *(.data.cacheline_aligned)
213         }
214
215         . = ALIGN(L1_CACHE_BYTES);
216         .data.read_mostly : {
217                 *(.data.read_mostly)
218         }
219
220         . = ALIGN(PAGE_SIZE);
221         __data_nosave : {
222                 __nosave_begin = .;
223                 *(.data.nosave)
224                 . = ALIGN(PAGE_SIZE);
225                 __nosave_end = .;
226         }
227
228 /*
229  * And finally the bss
230  */
231
232         .bss : {
233                 __bss_start = .;
234                 *(.sbss) *(.scommon)
235                 *(.dynbss)
236                 *(.bss)
237                 *(COMMON)
238                 __bss_stop = .;
239         }
240
241         . = ALIGN(PAGE_SIZE);
242         _end = . ;
243         PROVIDE32 (end = .);
244 }