2017-07-11 04:08:08 +03:00
# This file is included by the global makefile so that you can add your own
# architecture-specific flags and dependencies. Remember to do have actions
# for "archclean" and "archdep" for cleaning up and making dependencies for
# this architecture
#
# This file is subject to the terms and conditions of the GNU General Public
# License. See the file "COPYING" in the main directory of this archive
# for more details.
#
OBJCOPYFLAGS := -O binary
LDFLAGS_vmlinux :=
2018-02-13 08:13:16 +03:00
i f e q ( $( CONFIG_DYNAMIC_FTRACE ) , y )
LDFLAGS_vmlinux := --no-relax
riscv: Using PATCHABLE_FUNCTION_ENTRY instead of MCOUNT
This patch changes the current detour mechanism of dynamic ftrace
which has been discussed during LPC 2020 RISCV-MC [1].
Before the patch, we used mcount for detour:
<funca>:
addi sp,sp,-16
sd ra,8(sp)
sd s0,0(sp)
addi s0,sp,16
mv a5,ra
mv a0,a5
auipc ra,0x0 -> nop
jalr -296(ra) <_mcount@plt> ->nop
...
After the patch, we use nop call site area for detour:
<funca>:
nop -> REG_S ra, -SZREG(sp)
nop -> auipc ra, 0x?
nop -> jalr ?(ra)
nop -> REG_L ra, -SZREG(sp)
...
The mcount mechanism is mixed with gcc function prologue which is
not very clear. The patchable function entry just put 16 bytes nop
before the front of the function prologue which could be filled
with a separated detour mechanism.
[1] https://www.linuxplumbersconf.org/event/7/contributions/807/
Signed-off-by: Guo Ren <guoren@linux.alibaba.com>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>
2020-12-17 19:01:41 +03:00
KBUILD_CPPFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY
CC_FLAGS_FTRACE := -fpatchable-function-entry= 8
2018-02-13 08:13:16 +03:00
e n d i f
2020-02-21 05:47:55 +03:00
i f e q ( $( CONFIG_ 64BIT ) $( CONFIG_CMODEL_MEDLOW ) , y y )
KBUILD_CFLAGS_MODULE += -mcmodel= medany
e n d i f
2017-07-11 04:08:08 +03:00
export BITS
i f e q ( $( CONFIG_ARCH_RV 64I ) , y )
BITS := 64
UTS_MACHINE := riscv64
KBUILD_CFLAGS += -mabi= lp64
KBUILD_AFLAGS += -mabi= lp64
2018-07-29 04:14:47 +03:00
2018-08-24 02:20:39 +03:00
KBUILD_LDFLAGS += -melf64lriscv
2017-07-11 04:08:08 +03:00
e l s e
BITS := 32
UTS_MACHINE := riscv32
KBUILD_CFLAGS += -mabi= ilp32
KBUILD_AFLAGS += -mabi= ilp32
2018-08-24 02:20:39 +03:00
KBUILD_LDFLAGS += -melf32lriscv
2017-07-11 04:08:08 +03:00
e n d i f
2018-10-09 05:18:32 +03:00
# ISA string setting
2019-04-15 12:14:35 +03:00
riscv-march-$(CONFIG_ARCH_RV32I) := rv32ima
riscv-march-$(CONFIG_ARCH_RV64I) := rv64ima
2018-10-09 05:18:33 +03:00
riscv-march-$(CONFIG_FPU) := $( riscv-march-y) fd
2018-10-09 05:18:32 +03:00
riscv-march-$(CONFIG_RISCV_ISA_C) := $( riscv-march-y) c
KBUILD_CFLAGS += -march= $( subst fd,,$( riscv-march-y) )
KBUILD_AFLAGS += -march= $( riscv-march-y)
2017-07-11 04:08:08 +03:00
KBUILD_CFLAGS += -mno-save-restore
KBUILD_CFLAGS += -DCONFIG_PAGE_OFFSET= $( CONFIG_PAGE_OFFSET)
i f e q ( $( CONFIG_CMODEL_MEDLOW ) , y )
KBUILD_CFLAGS += -mcmodel= medlow
e n d i f
i f e q ( $( CONFIG_CMODEL_MEDANY ) , y )
KBUILD_CFLAGS += -mcmodel= medany
e n d i f
2019-08-29 09:57:00 +03:00
i f e q ( $( CONFIG_PERF_EVENTS ) , y )
KBUILD_CFLAGS += -fno-omit-frame-pointer
e n d i f
2018-03-15 11:50:41 +03:00
KBUILD_CFLAGS_MODULE += $( call cc-option,-mno-relax)
2017-07-11 04:08:08 +03:00
# GCC versions that support the "-mstrict-align" option default to allowing
# unaligned accesses. While unaligned accesses are explicitly allowed in the
# RISC-V ISA, they're emulated by machine mode traps on all extant
# architectures. It's faster to have GCC emit only aligned accesses.
KBUILD_CFLAGS += $( call cc-option,-mstrict-align)
2018-05-31 18:42:01 +03:00
# arch specific predefines for sparse
CHECKFLAGS += -D__riscv -D__riscv_xlen= $( BITS)
2018-11-12 08:55:15 +03:00
# Default target when executing plain make
boot := arch/riscv/boot
KBUILD_IMAGE := $( boot) /Image.gz
2017-07-11 04:08:08 +03:00
head-y := arch/riscv/kernel/head.o
2019-08-21 12:26:58 +03:00
core-y += arch/riscv/
2017-07-11 04:08:08 +03:00
libs-y += arch/riscv/lib/
2020-09-18 01:37:14 +03:00
libs-$(CONFIG_EFI_STUB) += $( objtree) /drivers/firmware/efi/libstub/lib.a
2017-07-11 04:08:08 +03:00
2018-11-05 17:35:37 +03:00
PHONY += vdso_install
vdso_install :
$( Q) $( MAKE) $( build) = arch/riscv/kernel/vdso $@
2020-12-13 16:50:38 +03:00
i f e q ( $( CONFIG_RISCV_M_MODE ) $( CONFIG_SOC_CANAAN ) , y y )
2020-03-16 03:47:43 +03:00
KBUILD_IMAGE := $( boot) /loader.bin
2019-10-28 15:10:42 +03:00
e l s e
KBUILD_IMAGE := $( boot) /Image.gz
e n d i f
2020-03-16 03:47:43 +03:00
BOOT_TARGETS := Image Image.gz loader loader.bin
2018-11-12 08:55:15 +03:00
2019-10-28 15:10:42 +03:00
all : $( notdir $ ( KBUILD_IMAGE ) )
2018-11-12 08:55:15 +03:00
2019-10-28 15:10:42 +03:00
$(BOOT_TARGETS) : vmlinux
2018-11-12 08:55:15 +03:00
$( Q) $( MAKE) $( build) = $( boot) $( boot) /$@
2019-10-28 15:10:42 +03:00
@$( kecho) ' Kernel: $(boot)/$@ is ready'
2018-11-12 08:55:15 +03:00
2020-11-04 09:14:59 +03:00
Image.% : Image
$( Q) $( MAKE) $( build) = $( boot) $( boot) /$@
2018-11-12 08:55:15 +03:00
zinstall install :
$( Q) $( MAKE) $( build) = $( boot) $@
2020-11-04 09:15:00 +03:00
archclean :
$( Q) $( MAKE) $( clean) = $( boot)