brintos

brintos / linux-shallow public Read only

0
0
Text · 3.4 KiB · ef09456 Raw
157 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2#include <linux/module.h>3 4#include <linux/sched.h> /* for wake_up_process() */5#include <linux/ftrace.h>6#ifndef CONFIG_ARM647#include <asm/asm-offsets.h>8#endif9 10extern void my_direct_func(struct task_struct *p);11 12void my_direct_func(struct task_struct *p)13{14	trace_printk("waking up %s-%d\n", p->comm, p->pid);15}16 17extern void my_tramp(void *);18 19#ifdef CONFIG_RISCV20#include <asm/asm.h>21 22asm (23"       .pushsection    .text, \"ax\", @progbits\n"24"       .type           my_tramp, @function\n"25"       .globl          my_tramp\n"26"   my_tramp:\n"27"       addi	sp,sp,-3*"SZREG"\n"28"       "REG_S"	a0,0*"SZREG"(sp)\n"29"       "REG_S"	t0,1*"SZREG"(sp)\n"30"       "REG_S"	ra,2*"SZREG"(sp)\n"31"       call	my_direct_func\n"32"       "REG_L"	a0,0*"SZREG"(sp)\n"33"       "REG_L"	t0,1*"SZREG"(sp)\n"34"       "REG_L"	ra,2*"SZREG"(sp)\n"35"       addi	sp,sp,3*"SZREG"\n"36"       jr	t0\n"37"       .size           my_tramp, .-my_tramp\n"38"       .popsection\n"39);40 41#endif /* CONFIG_RISCV */42 43#ifdef CONFIG_X86_6444 45#include <asm/ibt.h>46#include <asm/nospec-branch.h>47 48asm (49"	.pushsection    .text, \"ax\", @progbits\n"50"	.type		my_tramp, @function\n"51"	.globl		my_tramp\n"52"   my_tramp:"53	ASM_ENDBR54"	pushq %rbp\n"55"	movq %rsp, %rbp\n"56	CALL_DEPTH_ACCOUNT57"	pushq %rdi\n"58"	call my_direct_func\n"59"	popq %rdi\n"60"	leave\n"61	ASM_RET62"	.size		my_tramp, .-my_tramp\n"63"	.popsection\n"64);65 66#endif /* CONFIG_X86_64 */67 68#ifdef CONFIG_S39069 70asm (71"	.pushsection	.text, \"ax\", @progbits\n"72"	.type		my_tramp, @function\n"73"	.globl		my_tramp\n"74"   my_tramp:"75"	lgr		%r1,%r15\n"76"	stmg		%r0,%r5,"__stringify(__SF_GPRS)"(%r15)\n"77"	stg		%r14,"__stringify(__SF_GPRS+8*8)"(%r15)\n"78"	aghi		%r15,"__stringify(-STACK_FRAME_OVERHEAD)"\n"79"	stg		%r1,"__stringify(__SF_BACKCHAIN)"(%r15)\n"80"	brasl		%r14,my_direct_func\n"81"	aghi		%r15,"__stringify(STACK_FRAME_OVERHEAD)"\n"82"	lmg		%r0,%r5,"__stringify(__SF_GPRS)"(%r15)\n"83"	lg		%r14,"__stringify(__SF_GPRS+8*8)"(%r15)\n"84"	lgr		%r1,%r0\n"85"	br		%r1\n"86"	.size		my_tramp, .-my_tramp\n"87"	.popsection\n"88);89 90#endif /* CONFIG_S390 */91 92#ifdef CONFIG_ARM6493 94asm (95"	.pushsection	.text, \"ax\", @progbits\n"96"	.type		my_tramp, @function\n"97"	.globl		my_tramp\n"98"   my_tramp:"99"	hint	34\n" // bti	c100"	sub	sp, sp, #32\n"101"	stp	x9, x30, [sp]\n"102"	str	x0, [sp, #16]\n"103"	bl	my_direct_func\n"104"	ldp	x30, x9, [sp]\n"105"	ldr	x0, [sp, #16]\n"106"	add	sp, sp, #32\n"107"	ret	x9\n"108"	.size		my_tramp, .-my_tramp\n"109"	.popsection\n"110);111 112#endif /* CONFIG_ARM64 */113 114#ifdef CONFIG_LOONGARCH115 116asm (117"	.pushsection	.text, \"ax\", @progbits\n"118"	.type		my_tramp, @function\n"119"	.globl		my_tramp\n"120"   my_tramp:\n"121"	addi.d	$sp, $sp, -32\n"122"	st.d	$a0, $sp, 0\n"123"	st.d	$t0, $sp, 8\n"124"	st.d	$ra, $sp, 16\n"125"	bl	my_direct_func\n"126"	ld.d	$a0, $sp, 0\n"127"	ld.d	$t0, $sp, 8\n"128"	ld.d	$ra, $sp, 16\n"129"	addi.d	$sp, $sp, 32\n"130"	jr	$t0\n"131"	.size		my_tramp, .-my_tramp\n"132"	.popsection\n"133);134 135#endif /* CONFIG_LOONGARCH */136 137static struct ftrace_ops direct;138 139static int __init ftrace_direct_init(void)140{141	ftrace_set_filter_ip(&direct, (unsigned long) wake_up_process, 0, 0);142 143	return register_ftrace_direct(&direct, (unsigned long) my_tramp);144}145 146static void __exit ftrace_direct_exit(void)147{148	unregister_ftrace_direct(&direct, (unsigned long)my_tramp, true);149}150 151module_init(ftrace_direct_init);152module_exit(ftrace_direct_exit);153 154MODULE_AUTHOR("Steven Rostedt");155MODULE_DESCRIPTION("Example use case of using register_ftrace_direct()");156MODULE_LICENSE("GPL");157