53a8ad65b255fb1e35b5bf1f54cdafc387769d80
[platform/kernel/linux-rpi.git] / arch / riscv / kernel / vmlinux.lds.S
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2012 Regents of the University of California
4  * Copyright (C) 2017 SiFive
5  */
6
7 #define RO_EXCEPTION_TABLE_ALIGN        4
8 #define RUNTIME_DISCARD_EXIT
9
10 #ifdef CONFIG_XIP_KERNEL
11 #include "vmlinux-xip.lds.S"
12 #else
13
14 #include <asm/pgtable.h>
15 #define LOAD_OFFSET KERNEL_LINK_ADDR
16
17 #include <asm/vmlinux.lds.h>
18 #include <asm/page.h>
19 #include <asm/cache.h>
20 #include <asm/thread_info.h>
21 #include <asm/set_memory.h>
22 #include "image-vars.h"
23
24 #include <linux/sizes.h>
25 OUTPUT_ARCH(riscv)
26 ENTRY(_start)
27
28 jiffies = jiffies_64;
29
30 PECOFF_SECTION_ALIGNMENT = 0x1000;
31 PECOFF_FILE_ALIGNMENT = 0x200;
32
33 SECTIONS
34 {
35         /* Beginning of code and text segment */
36         . = LOAD_OFFSET;
37         _start = .;
38         HEAD_TEXT_SECTION
39         . = ALIGN(PAGE_SIZE);
40
41         .text : {
42                 _text = .;
43                 _stext = .;
44                 TEXT_TEXT
45                 SCHED_TEXT
46                 LOCK_TEXT
47                 KPROBES_TEXT
48                 ENTRY_TEXT
49                 IRQENTRY_TEXT
50                 SOFTIRQENTRY_TEXT
51                 _etext = .;
52         }
53
54         . = ALIGN(SECTION_ALIGN);
55         __init_begin = .;
56         __init_text_begin = .;
57         .init.text : AT(ADDR(.init.text) - LOAD_OFFSET) ALIGN(SECTION_ALIGN) { \
58                 _sinittext = .;                                         \
59                 INIT_TEXT                                               \
60                 _einittext = .;                                         \
61         }
62
63         . = ALIGN(8);
64         __soc_early_init_table : {
65                 __soc_early_init_table_start = .;
66                 KEEP(*(__soc_early_init_table))
67                 __soc_early_init_table_end = .;
68         }
69         __soc_builtin_dtb_table : {
70                 __soc_builtin_dtb_table_start = .;
71                 KEEP(*(__soc_builtin_dtb_table))
72                 __soc_builtin_dtb_table_end = .;
73         }
74         /* we have to discard exit text and such at runtime, not link time */
75         .exit.text :
76         {
77                 EXIT_TEXT
78         }
79
80         __init_text_end = .;
81         . = ALIGN(SECTION_ALIGN);
82 #ifdef CONFIG_EFI
83         . = ALIGN(PECOFF_SECTION_ALIGNMENT);
84         __pecoff_text_end = .;
85 #endif
86         /* Start of init data section */
87         __init_data_begin = .;
88         INIT_DATA_SECTION(16)
89         .init.bss : {
90                 *(.init.bss)    /* from the EFI stub */
91         }
92         .exit.data :
93         {
94                 EXIT_DATA
95         }
96         PERCPU_SECTION(L1_CACHE_BYTES)
97
98         .rel.dyn : {
99                 *(.rel.dyn*)
100         }
101
102         .rela.dyn : {
103                 *(.rela*)
104         }
105
106         __init_data_end = .;
107
108         . = ALIGN(8);
109         .alternative : {
110                 __alt_start = .;
111                 *(.alternative)
112                 __alt_end = .;
113         }
114         __init_end = .;
115
116         /* Start of data section */
117         _sdata = .;
118         RO_DATA(SECTION_ALIGN)
119         .srodata : {
120                 *(.srodata*)
121         }
122
123         . = ALIGN(SECTION_ALIGN);
124         _data = .;
125
126         RW_DATA(L1_CACHE_BYTES, PAGE_SIZE, THREAD_ALIGN)
127         .sdata : {
128                 __global_pointer$ = . + 0x800;
129                 *(.sdata*)
130         }
131
132 #ifdef CONFIG_EFI
133         .pecoff_edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGNMENT); }
134         __pecoff_data_raw_size = ABSOLUTE(. - __pecoff_text_end);
135 #endif
136
137         /* End of data section */
138         _edata = .;
139
140         BSS_SECTION(PAGE_SIZE, PAGE_SIZE, 0)
141
142 #ifdef CONFIG_EFI
143         . = ALIGN(PECOFF_SECTION_ALIGNMENT);
144         __pecoff_data_virt_size = ABSOLUTE(. - __pecoff_text_end);
145 #endif
146         _end = .;
147
148         STABS_DEBUG
149         DWARF_DEBUG
150         ELF_DETAILS
151         .riscv.attributes 0 : { *(.riscv.attributes) }
152
153         DISCARDS
154 }
155 #endif /* CONFIG_XIP_KERNEL */