Skip to content

Commit fbe934d

Browse files
RISC-V: Build Infrastructure
This patch contains all the build infrastructure that actually enables the RISC-V port. This includes Makefiles, linker scripts, and Kconfig files. It also contains the only top-level change, which adds RISC-V to the list of architectures that need a sed run to produce the ARCH variable when building locally. Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent e2c0cdf commit fbe934d

File tree

10 files changed

+581
-1
lines changed

10 files changed

+581
-1
lines changed

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,8 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ \
225225
-e s/arm.*/arm/ -e s/sa110/arm/ \
226226
-e s/s390x/s390/ -e s/parisc64/parisc/ \
227227
-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
228-
-e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ )
228+
-e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ \
229+
-e s/riscv.*/riscv/)
229230

230231
# Cross compiling and selecting different set of gcc/bin-utils
231232
# ---------------------------------------------------------------------------

arch/riscv/Kconfig

Lines changed: 310 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
1+
#
2+
# For a description of the syntax of this configuration file,
3+
# see Documentation/kbuild/kconfig-language.txt.
4+
#
5+
6+
config RISCV
7+
def_bool y
8+
select OF
9+
select OF_EARLY_FLATTREE
10+
select OF_IRQ
11+
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
12+
select ARCH_WANT_FRAME_POINTERS
13+
select CLONE_BACKWARDS
14+
select COMMON_CLK
15+
select GENERIC_CLOCKEVENTS
16+
select GENERIC_CPU_DEVICES
17+
select GENERIC_IRQ_SHOW
18+
select GENERIC_PCI_IOMAP
19+
select GENERIC_STRNCPY_FROM_USER
20+
select GENERIC_STRNLEN_USER
21+
select GENERIC_SMP_IDLE_THREAD
22+
select GENERIC_ATOMIC64 if !64BIT || !RISCV_ISA_A
23+
select ARCH_WANT_OPTIONAL_GPIOLIB
24+
select HAVE_MEMBLOCK
25+
select HAVE_DMA_API_DEBUG
26+
select HAVE_DMA_CONTIGUOUS
27+
select HAVE_GENERIC_DMA_COHERENT
28+
select IRQ_DOMAIN
29+
select NO_BOOTMEM
30+
select RISCV_ISA_A if SMP
31+
select SPARSE_IRQ
32+
select SYSCTL_EXCEPTION_TRACE
33+
select HAVE_ARCH_TRACEHOOK
34+
select MODULES_USE_ELF_RELA if MODULES
35+
select THREAD_INFO_IN_TASK
36+
select RISCV_IRQ_INTC
37+
select RISCV_TIMER
38+
39+
config MMU
40+
def_bool y
41+
42+
# even on 32-bit, physical (and DMA) addresses are > 32-bits
43+
config ARCH_PHYS_ADDR_T_64BIT
44+
def_bool y
45+
46+
config ARCH_DMA_ADDR_T_64BIT
47+
def_bool y
48+
49+
config PAGE_OFFSET
50+
hex
51+
default 0xC0000000 if 32BIT && MAXPHYSMEM_2GB
52+
default 0xffffffff80000000 if 64BIT && MAXPHYSMEM_2GB
53+
default 0xffffffe000000000 if 64BIT && MAXPHYSMEM_128GB
54+
55+
config STACKTRACE_SUPPORT
56+
def_bool y
57+
58+
config RWSEM_GENERIC_SPINLOCK
59+
def_bool y
60+
61+
config GENERIC_BUG
62+
def_bool y
63+
depends on BUG
64+
select GENERIC_BUG_RELATIVE_POINTERS if 64BIT
65+
66+
config GENERIC_BUG_RELATIVE_POINTERS
67+
bool
68+
69+
config GENERIC_CALIBRATE_DELAY
70+
def_bool y
71+
72+
config GENERIC_CSUM
73+
def_bool y
74+
75+
config GENERIC_HWEIGHT
76+
def_bool y
77+
78+
config PGTABLE_LEVELS
79+
int
80+
default 3 if 64BIT
81+
default 2
82+
83+
config HAVE_KPROBES
84+
def_bool n
85+
86+
config DMA_NOOP_OPS
87+
def_bool y
88+
89+
menu "Platform type"
90+
91+
choice
92+
prompt "Base ISA"
93+
default ARCH_RV64I
94+
help
95+
This selects the base ISA that this kernel will traget and must match
96+
the target platform.
97+
98+
config ARCH_RV32I
99+
bool "RV32I"
100+
select CPU_SUPPORTS_32BIT_KERNEL
101+
select 32BIT
102+
select GENERIC_ASHLDI3
103+
select GENERIC_ASHRDI3
104+
select GENERIC_LSHRDI3
105+
106+
config ARCH_RV64I
107+
bool "RV64I"
108+
select CPU_SUPPORTS_64BIT_KERNEL
109+
select 64BIT
110+
111+
endchoice
112+
113+
# We must be able to map all physical memory into the kernel, but the compiler
114+
# is still a bit more efficient when generating code if it's setup in a manner
115+
# such that it can only map 2GiB of memory.
116+
choice
117+
prompt "Kernel Code Model"
118+
default CMODEL_MEDLOW if 32BIT
119+
default CMODEL_MEDANY if 64BIT
120+
121+
config CMODEL_MEDLOW
122+
bool "medium low code model"
123+
config CMODEL_MEDANY
124+
bool "medium any code model"
125+
endchoice
126+
127+
choice
128+
prompt "Maximum Physical Memory"
129+
default MAXPHYSMEM_2GB if 32BIT
130+
default MAXPHYSMEM_2GB if 64BIT && CMODEL_MEDLOW
131+
default MAXPHYSMEM_128GB if 64BIT && CMODEL_MEDANY
132+
133+
config MAXPHYSMEM_2GB
134+
bool "2GiB"
135+
config MAXPHYSMEM_128GB
136+
depends on 64BIT && CMODEL_MEDANY
137+
bool "128GiB"
138+
endchoice
139+
140+
141+
config SMP
142+
bool "Symmetric Multi-Processing"
143+
help
144+
This enables support for systems with more than one CPU. If
145+
you say N here, the kernel will run on single and
146+
multiprocessor machines, but will use only one CPU of a
147+
multiprocessor machine. If you say Y here, the kernel will run
148+
on many, but not all, single processor machines. On a single
149+
processor machine, the kernel will run faster if you say N
150+
here.
151+
152+
If you don't know what to do here, say N.
153+
154+
config NR_CPUS
155+
int "Maximum number of CPUs (2-32)"
156+
range 2 32
157+
depends on SMP
158+
default "8"
159+
160+
config CPU_SUPPORTS_32BIT_KERNEL
161+
bool
162+
config CPU_SUPPORTS_64BIT_KERNEL
163+
bool
164+
165+
choice
166+
prompt "CPU Tuning"
167+
default TUNE_GENERIC
168+
169+
config TUNE_GENERIC
170+
bool "generic"
171+
172+
endchoice
173+
174+
config RISCV_ISA_C
175+
bool "Emit compressed instructions when building Linux"
176+
default y
177+
help
178+
Adds "C" to the ISA subsets that the toolchain is allowed to emit
179+
when building Linux, which results in compressed instructions in the
180+
Linux binary.
181+
182+
If you don't know what to do here, say Y.
183+
184+
config RISCV_ISA_A
185+
def_bool y
186+
187+
endmenu
188+
189+
menu "Kernel type"
190+
191+
choice
192+
prompt "Kernel code model"
193+
default 64BIT
194+
195+
config 32BIT
196+
bool "32-bit kernel"
197+
depends on CPU_SUPPORTS_32BIT_KERNEL
198+
help
199+
Select this option to build a 32-bit kernel.
200+
201+
config 64BIT
202+
bool "64-bit kernel"
203+
depends on CPU_SUPPORTS_64BIT_KERNEL
204+
help
205+
Select this option to build a 64-bit kernel.
206+
207+
endchoice
208+
209+
source "mm/Kconfig"
210+
211+
source "kernel/Kconfig.preempt"
212+
213+
source "kernel/Kconfig.hz"
214+
215+
endmenu
216+
217+
menu "Bus support"
218+
219+
config PCI
220+
bool "PCI support"
221+
select PCI_MSI
222+
help
223+
This feature enables support for PCI bus system. If you say Y
224+
here, the kernel will include drivers and infrastructure code
225+
to support PCI bus devices.
226+
227+
If you don't know what to do here, say Y.
228+
229+
config PCI_DOMAINS
230+
def_bool PCI
231+
232+
config PCI_DOMAINS_GENERIC
233+
def_bool PCI
234+
235+
source "drivers/pci/Kconfig"
236+
237+
endmenu
238+
239+
source "init/Kconfig"
240+
241+
source "kernel/Kconfig.freezer"
242+
243+
menu "Executable file formats"
244+
245+
source "fs/Kconfig.binfmt"
246+
247+
endmenu
248+
249+
menu "Power management options"
250+
251+
source kernel/power/Kconfig
252+
253+
endmenu
254+
255+
source "net/Kconfig"
256+
257+
source "drivers/Kconfig"
258+
259+
source "fs/Kconfig"
260+
261+
menu "Kernel hacking"
262+
263+
config CMDLINE_BOOL
264+
bool "Built-in kernel command line"
265+
help
266+
For most platforms, it is firmware or second stage bootloader
267+
that by default specifies the kernel command line options.
268+
However, it might be necessary or advantageous to either override
269+
the default kernel command line or add a few extra options to it.
270+
For such cases, this option allows hardcoding command line options
271+
directly into the kernel.
272+
273+
For that, choose 'Y' here and fill in the extra boot parameters
274+
in CONFIG_CMDLINE.
275+
276+
The built-in options will be concatenated to the default command
277+
line if CMDLINE_OVERRIDE is set to 'N'. Otherwise, the default
278+
command line will be ignored and replaced by the built-in string.
279+
280+
config CMDLINE
281+
string "Built-in kernel command string"
282+
depends on CMDLINE_BOOL
283+
default ""
284+
help
285+
Supply command-line options at build time by entering them here.
286+
287+
config CMDLINE_OVERRIDE
288+
bool "Built-in command line overrides bootloader arguments"
289+
depends on CMDLINE_BOOL
290+
help
291+
Set this option to 'Y' to have the kernel ignore the bootloader
292+
or firmware command line. Instead, the built-in command line
293+
will be used exclusively.
294+
295+
If you don't know what to do here, say N.
296+
297+
config EARLY_PRINTK
298+
def_bool y
299+
300+
source "lib/Kconfig.debug"
301+
302+
config CMDLINE_BOOL
303+
bool
304+
endmenu
305+
306+
source "security/Kconfig"
307+
308+
source "crypto/Kconfig"
309+
310+
source "lib/Kconfig"

arch/riscv/Makefile

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# This file is included by the global makefile so that you can add your own
2+
# architecture-specific flags and dependencies. Remember to do have actions
3+
# for "archclean" and "archdep" for cleaning up and making dependencies for
4+
# this architecture
5+
#
6+
# This file is subject to the terms and conditions of the GNU General Public
7+
# License. See the file "COPYING" in the main directory of this archive
8+
# for more details.
9+
#
10+
11+
LDFLAGS :=
12+
OBJCOPYFLAGS := -O binary
13+
LDFLAGS_vmlinux :=
14+
KBUILD_AFLAGS_MODULE += -fPIC
15+
KBUILD_CFLAGS_MODULE += -fPIC
16+
17+
KBUILD_DEFCONFIG = defconfig
18+
19+
export BITS
20+
ifeq ($(CONFIG_ARCH_RV64I),y)
21+
BITS := 64
22+
UTS_MACHINE := riscv64
23+
24+
KBUILD_CFLAGS += -mabi=lp64
25+
KBUILD_AFLAGS += -mabi=lp64
26+
KBUILD_MARCH = rv64im
27+
LDFLAGS += -melf64lriscv
28+
else
29+
BITS := 32
30+
UTS_MACHINE := riscv32
31+
32+
KBUILD_CFLAGS += -mabi=ilp32
33+
KBUILD_AFLAGS += -mabi=ilp32
34+
KBUILD_MARCH = rv32im
35+
LDFLAGS += -melf32lriscv
36+
endif
37+
38+
KBUILD_CFLAGS += -Wall
39+
40+
ifeq ($(CONFIG_RISCV_ISA_A),y)
41+
KBUILD_ARCH_A = a
42+
endif
43+
ifeq ($(CONFIG_RISCV_ISA_C),y)
44+
KBUILD_ARCH_C = c
45+
endif
46+
47+
KBUILD_AFLAGS += -march=$(KBUILD_MARCH)$(KBUILD_ARCH_A)fd$(KBUILD_ARCH_C)
48+
49+
KBUILD_CFLAGS += -march=$(KBUILD_MARCH)$(KBUILD_ARCH_A)$(KBUILD_ARCH_C)
50+
KBUILD_CFLAGS += -mno-save-restore
51+
KBUILD_CFLAGS += -DCONFIG_PAGE_OFFSET=$(CONFIG_PAGE_OFFSET)
52+
53+
ifeq ($(CONFIG_CMODEL_MEDLOW),y)
54+
KBUILD_CFLAGS += -mcmodel=medlow
55+
endif
56+
ifeq ($(CONFIG_CMODEL_MEDANY),y)
57+
KBUILD_CFLAGS += -mcmodel=medany
58+
endif
59+
60+
# GCC versions that support the "-mstrict-align" option default to allowing
61+
# unaligned accesses. While unaligned accesses are explicitly allowed in the
62+
# RISC-V ISA, they're emulated by machine mode traps on all extant
63+
# architectures. It's faster to have GCC emit only aligned accesses.
64+
KBUILD_CFLAGS += $(call cc-option,-mstrict-align)
65+
66+
head-y := arch/riscv/kernel/head.o
67+
68+
core-y += arch/riscv/kernel/ arch/riscv/mm/
69+
70+
libs-y += arch/riscv/lib/
71+
72+
all: vmlinux

arch/riscv/configs/defconfig

Whitespace-only changes.

0 commit comments

Comments
 (0)