arch/s390/kernel/mcount.S

Source file repositories/reference/linux-study-clean/arch/s390/kernel/mcount.S

File Facts

System
Linux kernel
Corpus path
arch/s390/kernel/mcount.S
Extension
.S
Size
5077 bytes
Lines
186
Domain
Architecture Layer
Bucket
arch/s390
Inferred role
Architecture Layer: arch/s390
Status
atlas-only

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

#include <linux/linkage.h>
#include <asm/asm-offsets.h>
#include <asm/ftrace.h>
#include <asm/nospec-insn.h>
#include <asm/ptrace.h>
#include <asm/march.h>

#define STACK_FRAME_SIZE_PTREGS		(STACK_FRAME_OVERHEAD + __PT_SIZE)
#define STACK_PTREGS			(STACK_FRAME_OVERHEAD)
#define STACK_PTREGS_GPRS		(STACK_PTREGS + __PT_GPRS)
#define STACK_PTREGS_PSW		(STACK_PTREGS + __PT_PSW)

#define STACK_FRAME_SIZE_FREGS		(STACK_FRAME_OVERHEAD + __FTRACE_REGS_SIZE)
#define STACK_FREGS			(STACK_FRAME_OVERHEAD)
#define STACK_FREGS_PTREGS		(STACK_FRAME_OVERHEAD + __FTRACE_REGS_PT_REGS)
#define STACK_FREGS_PTREGS_GPRS		(STACK_FREGS_PTREGS + __PT_GPRS)
#define STACK_FREGS_PTREGS_PSW		(STACK_FREGS_PTREGS + __PT_PSW)
#define STACK_FREGS_PTREGS_ORIG_GPR2	(STACK_FREGS_PTREGS + __PT_ORIG_GPR2)
#define STACK_FREGS_PTREGS_FLAGS	(STACK_FREGS_PTREGS + __PT_FLAGS)

/* packed stack: allocate just enough for r14, r15 and backchain */
#define TRACED_FUNC_FRAME_SIZE	24

#ifdef CONFIG_FUNCTION_TRACER

	GEN_BR_THUNK %r1
	GEN_BR_THUNK %r14

	.section .kprobes.text, "ax"

SYM_FUNC_START(ftrace_stub)
	BR_EX	%r14
SYM_FUNC_END(ftrace_stub)

SYM_CODE_START(ftrace_stub_direct_tramp)
	lgr	%r1, %r0
	BR_EX	%r1
SYM_CODE_END(ftrace_stub_direct_tramp)

	.macro	ftrace_regs_entry, allregs=0
	stg	%r14,(__SF_GPRS+8*8)(%r15)	# save traced function caller

	.if \allregs == 1
	# save psw mask
	# don't put any instructions clobbering CC before this point
	epsw	%r1,%r14
	risbg	%r14,%r1,0,31,32
	.endif

	lgr	%r1,%r15
	# allocate stack frame for ftrace_caller to contain traced function
	aghi	%r15,-TRACED_FUNC_FRAME_SIZE
	stg	%r1,__SF_BACKCHAIN(%r15)
	stg	%r0,(__SF_GPRS+8*8)(%r15)
	stg	%r15,(__SF_GPRS+9*8)(%r15)
	# allocate ftrace_regs and stack frame for ftrace_trace_function
	aghi	%r15,-STACK_FRAME_SIZE_FREGS
	stg	%r1,(STACK_FREGS_PTREGS_GPRS+15*8)(%r15)
	xc	STACK_FREGS_PTREGS_ORIG_GPR2(8,%r15),STACK_FREGS_PTREGS_ORIG_GPR2(%r15)

	.if \allregs == 1
	stg	%r14,(STACK_FREGS_PTREGS_PSW)(%r15)
	mvghi	STACK_FREGS_PTREGS_FLAGS(%r15),_PIF_FTRACE_FULL_REGS
	.else
	xc	STACK_FREGS_PTREGS_FLAGS(8,%r15),STACK_FREGS_PTREGS_FLAGS(%r15)
	.endif

	lg	%r14,(__SF_GPRS+8*8)(%r1)	# restore original return address
	aghi	%r1,-TRACED_FUNC_FRAME_SIZE
	stg	%r1,__SF_BACKCHAIN(%r15)

Annotation

Implementation Notes