forked from Minki/linux
6ca6366220
This patch implements dynamic ftrace for PA-RISC. The required mcount call sequences can get pretty long, so instead of patching the whole call sequence out of the functions, we are using -fpatchable-function-entry from gcc. This puts a configurable amount of NOPS before/at the start of the function. Taking do_sys_open() as example, which would look like this when the call is patched out: 1036b248: 08 00 02 40 nop 1036b24c: 08 00 02 40 nop 1036b250: 08 00 02 40 nop 1036b254: 08 00 02 40 nop 1036b258 <do_sys_open>: 1036b258: 08 00 02 40 nop 1036b25c: 08 03 02 41 copy r3,r1 1036b260: 6b c2 3f d9 stw rp,-14(sp) 1036b264: 08 1e 02 43 copy sp,r3 1036b268: 6f c1 01 00 stw,ma r1,80(sp) When ftrace gets enabled for this function the kernel will patch these NOPs to: 1036b248: 10 19 57 20 <address of ftrace> 1036b24c: 6f c1 00 80 stw,ma r1,40(sp) 1036b250: 48 21 3f d1 ldw -18(r1),r1 1036b254: e8 20 c0 02 bv,n r0(r1) 1036b258 <do_sys_open>: 1036b258: e8 3f 1f df b,l,n .-c,r1 1036b25c: 08 03 02 41 copy r3,r1 1036b260: 6b c2 3f d9 stw rp,-14(sp) 1036b264: 08 1e 02 43 copy sp,r3 1036b268: 6f c1 01 00 stw,ma r1,80(sp) So the first NOP in do_sys_open() will be patched to jump backwards into some minimal trampoline code which pushes a stackframe, saves r1 which holds the return address, loads the address of the real ftrace function, and branches to that location. For 64 Bit things are getting a bit more complicated (and longer) because we must make sure that the address of ftrace location is 8 byte aligned, and the offset passed to ldd for fetching the address is 8 byte aligned as well. Note that gcc has a bug which misplaces the function label, and needs a patch to make dynamic ftrace work. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90751 for details. Signed-off-by: Sven Schnelle <svens@stackframe.org> Signed-off-by: Helge Deller <deller@gmx.de>
367 lines
9.2 KiB
Plaintext
367 lines
9.2 KiB
Plaintext
# SPDX-License-Identifier: GPL-2.0
|
|
config PARISC
|
|
def_bool y
|
|
select ARCH_32BIT_OFF_T if !64BIT
|
|
select ARCH_MIGHT_HAVE_PC_PARPORT
|
|
select HAVE_IDE
|
|
select HAVE_OPROFILE
|
|
select HAVE_FUNCTION_TRACER
|
|
select HAVE_FUNCTION_GRAPH_TRACER
|
|
select HAVE_SYSCALL_TRACEPOINTS
|
|
select ARCH_WANT_FRAME_POINTERS
|
|
select ARCH_HAS_ELF_RANDOMIZE
|
|
select ARCH_HAS_STRICT_KERNEL_RWX
|
|
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
|
select ARCH_NO_SG_CHAIN
|
|
select ARCH_SUPPORTS_MEMORY_FAILURE
|
|
select RTC_CLASS
|
|
select RTC_DRV_GENERIC
|
|
select INIT_ALL_POSSIBLE
|
|
select BUG
|
|
select BUILDTIME_EXTABLE_SORT
|
|
select HAVE_PCI
|
|
select HAVE_PERF_EVENTS
|
|
select HAVE_KERNEL_BZIP2
|
|
select HAVE_KERNEL_GZIP
|
|
select HAVE_KERNEL_LZ4
|
|
select HAVE_KERNEL_LZMA
|
|
select HAVE_KERNEL_LZO
|
|
select HAVE_KERNEL_XZ
|
|
select GENERIC_ATOMIC64 if !64BIT
|
|
select GENERIC_IRQ_PROBE
|
|
select GENERIC_PCI_IOMAP
|
|
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
|
select GENERIC_SMP_IDLE_THREAD
|
|
select GENERIC_CPU_DEVICES
|
|
select GENERIC_STRNCPY_FROM_USER
|
|
select SYSCTL_ARCH_UNALIGN_ALLOW
|
|
select SYSCTL_EXCEPTION_TRACE
|
|
select HAVE_MOD_ARCH_SPECIFIC
|
|
select VIRT_TO_BUS
|
|
select MODULES_USE_ELF_RELA
|
|
select CLONE_BACKWARDS
|
|
select TTY # Needed for pdc_cons.c
|
|
select HAVE_DEBUG_STACKOVERFLOW
|
|
select HAVE_ARCH_AUDITSYSCALL
|
|
select HAVE_ARCH_HASH
|
|
select HAVE_ARCH_JUMP_LABEL
|
|
select HAVE_ARCH_JUMP_LABEL_RELATIVE
|
|
select HAVE_ARCH_SECCOMP_FILTER
|
|
select HAVE_ARCH_TRACEHOOK
|
|
select HAVE_REGS_AND_STACK_ACCESS_API
|
|
select GENERIC_SCHED_CLOCK
|
|
select HAVE_UNSTABLE_SCHED_CLOCK if SMP
|
|
select GENERIC_CLOCKEVENTS
|
|
select ARCH_NO_COHERENT_DMA_MMAP
|
|
select CPU_NO_EFFICIENT_FFS
|
|
select NEED_DMA_MAP_STATE
|
|
select NEED_SG_DMA_LENGTH
|
|
select HAVE_ARCH_KGDB
|
|
select HAVE_KPROBES
|
|
select HAVE_KRETPROBES
|
|
select HAVE_DYNAMIC_FTRACE if $(cc-option,-fpatchable-function-entry=1,1)
|
|
select HAVE_FTRACE_MCOUNT_RECORD if HAVE_DYNAMIC_FTRACE
|
|
|
|
help
|
|
The PA-RISC microprocessor is designed by Hewlett-Packard and used
|
|
in many of their workstations & servers (HP9000 700 and 800 series,
|
|
and later HP3000 series). The PA-RISC Linux project home page is
|
|
at <http://www.parisc-linux.org/>.
|
|
|
|
config CPU_BIG_ENDIAN
|
|
def_bool y
|
|
|
|
config MMU
|
|
def_bool y
|
|
|
|
config STACK_GROWSUP
|
|
def_bool y
|
|
|
|
config GENERIC_LOCKBREAK
|
|
bool
|
|
default y
|
|
depends on SMP && PREEMPT
|
|
|
|
config ARCH_HAS_ILOG2_U32
|
|
bool
|
|
default n
|
|
|
|
config ARCH_HAS_ILOG2_U64
|
|
bool
|
|
default n
|
|
|
|
config GENERIC_BUG
|
|
bool
|
|
default y
|
|
depends on BUG
|
|
|
|
config GENERIC_HWEIGHT
|
|
bool
|
|
default y
|
|
|
|
config GENERIC_CALIBRATE_DELAY
|
|
bool
|
|
default y
|
|
|
|
config TIME_LOW_RES
|
|
bool
|
|
depends on SMP
|
|
default y
|
|
|
|
# unless you want to implement ACPI on PA-RISC ... ;-)
|
|
config PM
|
|
bool
|
|
|
|
config STACKTRACE_SUPPORT
|
|
def_bool y
|
|
|
|
config ISA_DMA_API
|
|
bool
|
|
|
|
config ARCH_MAY_HAVE_PC_FDC
|
|
bool
|
|
depends on BROKEN
|
|
default y
|
|
|
|
config PGTABLE_LEVELS
|
|
int
|
|
default 3 if 64BIT && PARISC_PAGE_SIZE_4KB
|
|
default 2
|
|
|
|
config SYS_SUPPORTS_HUGETLBFS
|
|
def_bool y if PA20
|
|
|
|
|
|
menu "Processor type and features"
|
|
|
|
choice
|
|
prompt "Processor type"
|
|
default PA7000
|
|
|
|
config PA7000
|
|
bool "PA7000/PA7100"
|
|
---help---
|
|
This is the processor type of your CPU. This information is
|
|
used for optimizing purposes. In order to compile a kernel
|
|
that can run on all 32-bit PA CPUs (albeit not optimally fast),
|
|
you can specify "PA7000" here.
|
|
|
|
Specifying "PA8000" here will allow you to select a 64-bit kernel
|
|
which is required on some machines.
|
|
|
|
config PA7100LC
|
|
bool "PA7100LC"
|
|
help
|
|
Select this option for the PCX-L processor, as used in the
|
|
712, 715/64, 715/80, 715/100, 715/100XC, 725/100, 743, 748,
|
|
D200, D210, D300, D310 and E-class
|
|
|
|
config PA7200
|
|
bool "PA7200"
|
|
help
|
|
Select this option for the PCX-T' processor, as used in the
|
|
C100, C110, J100, J110, J210XC, D250, D260, D350, D360,
|
|
K100, K200, K210, K220, K400, K410 and K420
|
|
|
|
config PA7300LC
|
|
bool "PA7300LC"
|
|
help
|
|
Select this option for the PCX-L2 processor, as used in the
|
|
744, A180, B132L, B160L, B180L, C132L, C160L, C180L,
|
|
D220, D230, D320 and D330.
|
|
|
|
config PA8X00
|
|
bool "PA8000 and up"
|
|
help
|
|
Select this option for PCX-U to PCX-W2 processors.
|
|
|
|
endchoice
|
|
|
|
# Define implied options from the CPU selection here
|
|
|
|
config PA20
|
|
def_bool y
|
|
depends on PA8X00
|
|
|
|
config PA11
|
|
def_bool y
|
|
depends on PA7000 || PA7100LC || PA7200 || PA7300LC
|
|
select ARCH_HAS_SYNC_DMA_FOR_CPU
|
|
select ARCH_HAS_SYNC_DMA_FOR_DEVICE
|
|
select DMA_NONCOHERENT_CACHE_SYNC
|
|
|
|
config PREFETCH
|
|
def_bool y
|
|
depends on PA8X00 || PA7200
|
|
|
|
config MLONGCALLS
|
|
bool "Enable the -mlong-calls compiler option for big kernels"
|
|
default y if !MODULES || UBSAN || FTRACE
|
|
default n
|
|
depends on PA8X00
|
|
help
|
|
If you configure the kernel to include many drivers built-in instead
|
|
as modules, the kernel executable may become too big, so that the
|
|
linker will not be able to resolve some long branches and fails to link
|
|
your vmlinux kernel. In that case enabling this option will help you
|
|
to overcome this limit by using the -mlong-calls compiler option.
|
|
|
|
Usually you want to say N here, unless you e.g. want to build
|
|
a kernel which includes all necessary drivers built-in and which can
|
|
be used for TFTP booting without the need to have an initrd ramdisk.
|
|
|
|
Enabling this option will probably slow down your kernel.
|
|
|
|
config 64BIT
|
|
bool "64-bit kernel"
|
|
depends on PA8X00
|
|
help
|
|
Enable this if you want to support 64bit kernel on PA-RISC platform.
|
|
|
|
At the moment, only people willing to use more than 2GB of RAM,
|
|
or having a 64bit-only capable PA-RISC machine should say Y here.
|
|
|
|
Since there is no 64bit userland on PA-RISC, there is no point to
|
|
enable this option otherwise. The 64bit kernel is significantly bigger
|
|
and slower than the 32bit one.
|
|
|
|
choice
|
|
prompt "Kernel page size"
|
|
default PARISC_PAGE_SIZE_4KB
|
|
|
|
config PARISC_PAGE_SIZE_4KB
|
|
bool "4KB"
|
|
help
|
|
This lets you select the page size of the kernel. For best
|
|
performance, a page size of 16KB is recommended. For best
|
|
compatibility with 32bit applications, a page size of 4KB should be
|
|
selected (the vast majority of 32bit binaries work perfectly fine
|
|
with a larger page size).
|
|
|
|
4KB For best 32bit compatibility
|
|
16KB For best performance
|
|
64KB For best performance, might give more overhead.
|
|
|
|
If you don't know what to do, choose 4KB.
|
|
|
|
config PARISC_PAGE_SIZE_16KB
|
|
bool "16KB"
|
|
depends on PA8X00 && BROKEN
|
|
|
|
config PARISC_PAGE_SIZE_64KB
|
|
bool "64KB"
|
|
depends on PA8X00 && BROKEN
|
|
|
|
endchoice
|
|
|
|
config PARISC_SELF_EXTRACT
|
|
bool "Build kernel as self-extracting executable"
|
|
default y
|
|
help
|
|
Say Y if you want to build the parisc kernel as a kind of
|
|
self-extracting executable.
|
|
|
|
If you say N here, the kernel will be compressed with gzip
|
|
which can be loaded by the palo bootloader directly too.
|
|
|
|
If you don't know what to do here, say Y.
|
|
|
|
config SMP
|
|
bool "Symmetric multi-processing support"
|
|
---help---
|
|
This enables support for systems with more than one CPU. If you have
|
|
a system with only one CPU, say N. If you have a system with more
|
|
than one CPU, say Y.
|
|
|
|
If you say N here, the kernel will run on uni- and multiprocessor
|
|
machines, but will use only one CPU of a multiprocessor machine.
|
|
On a uniprocessor machine, the kernel will run faster if you say N.
|
|
|
|
See also <file:Documentation/lockup-watchdogs.txt> and the SMP-HOWTO
|
|
available at <http://www.tldp.org/docs.html#howto>.
|
|
|
|
If you don't know what to do here, say N.
|
|
|
|
config PARISC_CPU_TOPOLOGY
|
|
bool "Support cpu topology definition"
|
|
depends on SMP
|
|
default y
|
|
help
|
|
Support PARISC cpu topology definition.
|
|
|
|
config SCHED_MC
|
|
bool "Multi-core scheduler support"
|
|
depends on PARISC_CPU_TOPOLOGY && PA8X00
|
|
help
|
|
Multi-core scheduler support improves the CPU scheduler's decision
|
|
making when dealing with multi-core CPU chips at a cost of slightly
|
|
increased overhead in some places. If unsure say N here.
|
|
|
|
config IRQSTACKS
|
|
bool "Use separate kernel stacks when processing interrupts"
|
|
default y
|
|
help
|
|
If you say Y here the kernel will use separate kernel stacks
|
|
for handling hard and soft interrupts. This can help avoid
|
|
overflowing the process kernel stacks.
|
|
|
|
config HOTPLUG_CPU
|
|
bool
|
|
default y if SMP
|
|
|
|
config ARCH_SELECT_MEMORY_MODEL
|
|
def_bool y
|
|
depends on 64BIT
|
|
|
|
config ARCH_SPARSEMEM_ENABLE
|
|
def_bool y
|
|
depends on 64BIT
|
|
|
|
config ARCH_FLATMEM_ENABLE
|
|
def_bool y
|
|
|
|
config ARCH_SPARSEMEM_DEFAULT
|
|
def_bool y
|
|
depends on ARCH_SPARSEMEM_ENABLE
|
|
|
|
source "kernel/Kconfig.hz"
|
|
|
|
config COMPAT
|
|
def_bool y
|
|
depends on 64BIT
|
|
select COMPAT_BINFMT_ELF if BINFMT_ELF
|
|
|
|
config SYSVIPC_COMPAT
|
|
def_bool y
|
|
depends on COMPAT && SYSVIPC
|
|
|
|
config AUDIT_ARCH
|
|
def_bool y
|
|
|
|
config NR_CPUS
|
|
int "Maximum number of CPUs (2-32)"
|
|
range 2 32
|
|
depends on SMP
|
|
default "4"
|
|
|
|
endmenu
|
|
|
|
|
|
source "drivers/parisc/Kconfig"
|
|
|
|
config SECCOMP
|
|
def_bool y
|
|
prompt "Enable seccomp to safely compute untrusted bytecode"
|
|
---help---
|
|
This kernel feature is useful for number crunching applications
|
|
that may need to compute untrusted bytecode during their
|
|
execution. By using pipes or other transports made available to
|
|
the process as file descriptors supporting the read/write
|
|
syscalls, it's possible to isolate those applications in
|
|
their own address space using seccomp. Once seccomp is
|
|
enabled via prctl(PR_SET_SECCOMP), it cannot be disabled
|
|
and the task is only allowed to execute a few safe syscalls
|
|
defined by each seccomp mode.
|
|
|
|
If unsure, say Y. Only embedded should say N here.
|