2019-05-27 08:55:05 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2005-09-27 13:51:59 +10:00
# ifndef _ASM_POWERPC_KPROBES_H
# define _ASM_POWERPC_KPROBES_H
2017-02-27 14:26:56 -08:00
# include <asm-generic/kprobes.h>
2005-12-16 22:43:46 +01:00
# ifdef __KERNEL__
2005-09-26 16:04:21 +10:00
/*
* Kernel Probes ( KProbes )
*
* Copyright ( C ) IBM Corporation , 2002 , 2004
*
* 2002 - Oct Created by Vamsi Krishna S < vamsi_krishna @ in . ibm . com > Kernel
* Probes initial implementation ( includes suggestions from
* Rusty Russell ) .
* 2004 - Nov Modified for PPC64 by Ananth N Mavinakayanahalli
* < ananth @ in . ibm . com >
*/
# include <linux/types.h>
# include <linux/ptrace.h>
2005-11-07 01:00:10 -08:00
# include <linux/percpu.h>
2017-02-08 14:27:31 +05:30
# include <linux/module.h>
2012-08-23 21:26:02 +00:00
# include <asm/probes.h>
2014-04-03 16:08:38 +11:00
# include <asm/code-patching.h>
2005-09-26 16:04:21 +10:00
2016-11-21 22:36:41 +05:30
# ifdef CONFIG_KPROBES
2006-01-09 20:52:41 -08:00
# define __ARCH_WANT_KPROBES_INSN_SLOT
2005-09-26 16:04:21 +10:00
struct pt_regs ;
2006-01-09 20:52:46 -08:00
struct kprobe ;
2005-09-26 16:04:21 +10:00
2022-07-07 16:55:14 +02:00
typedef u32 kprobe_opcode_t ;
2017-02-08 15:20:51 +05:30
extern kprobe_opcode_t optinsn_slot ;
/* Optinsn template address */
extern kprobe_opcode_t optprobe_template_entry [ ] ;
extern kprobe_opcode_t optprobe_template_op_address [ ] ;
extern kprobe_opcode_t optprobe_template_call_handler [ ] ;
extern kprobe_opcode_t optprobe_template_insn [ ] ;
extern kprobe_opcode_t optprobe_template_call_emulate [ ] ;
extern kprobe_opcode_t optprobe_template_ret [ ] ;
extern kprobe_opcode_t optprobe_template_end [ ] ;
/* Fixed instruction size for powerpc */
2020-05-15 12:12:55 +10:00
# define MAX_INSN_SIZE 2
2017-02-08 15:20:51 +05:30
# define MAX_OPTIMIZED_LENGTH sizeof(kprobe_opcode_t) /* 4 bytes */
# define MAX_OPTINSN_SIZE (optprobe_template_end - optprobe_template_entry)
# define RELATIVEJUMP_SIZE sizeof(kprobe_opcode_t) /* 4 bytes */
2005-09-26 16:04:21 +10:00
2006-07-30 03:03:26 -07:00
# define flush_insn_slot(p) do { } while (0)
2007-10-16 01:27:49 -07:00
# define kretprobe_blacklist_size 0
2006-06-26 00:25:29 -07:00
2021-09-14 23:40:54 +09:00
void __kretprobe_trampoline ( void ) ;
2006-01-09 20:52:46 -08:00
extern void arch_remove_kprobe ( struct kprobe * p ) ;
2005-09-26 16:04:21 +10:00
/* Architecture specific copy of original instruction */
struct arch_specific_insn {
/* copy of original instruction */
kprobe_opcode_t * insn ;
2007-04-18 15:57:51 +10:00
/*
* Set in kprobes code , initially to 0. If the instruction can be
* eumulated , this is set to 1 , if not , to - 1.
*/
int boostable ;
2005-09-26 16:04:21 +10:00
} ;
2005-11-07 01:00:10 -08:00
struct prev_kprobe {
struct kprobe * kp ;
unsigned long status ;
unsigned long saved_msr ;
} ;
/* per-cpu kprobe control block */
struct kprobe_ctlblk {
unsigned long kprobe_status ;
unsigned long kprobe_saved_msr ;
struct prev_kprobe prev_kprobe ;
} ;
2017-02-08 15:20:51 +05:30
struct arch_optimized_insn {
kprobe_opcode_t copied_insn [ 1 ] ;
/* detour buffer */
kprobe_opcode_t * insn ;
} ;
2005-09-26 16:04:21 +10:00
extern int kprobe_exceptions_notify ( struct notifier_block * self ,
2006-01-09 20:52:42 -08:00
unsigned long val , void * data ) ;
2007-04-30 11:56:46 +01:00
extern int kprobe_fault_handler ( struct pt_regs * regs , int trapnr ) ;
2016-11-21 22:36:41 +05:30
extern int kprobe_handler ( struct pt_regs * regs ) ;
extern int kprobe_post_handler ( struct pt_regs * regs ) ;
# else
static inline int kprobe_handler ( struct pt_regs * regs ) { return 0 ; }
static inline int kprobe_post_handler ( struct pt_regs * regs ) { return 0 ; }
# endif /* CONFIG_KPROBES */
2005-12-16 22:43:46 +01:00
# endif /* __KERNEL__ */
2005-09-27 13:51:59 +10:00
# endif /* _ASM_POWERPC_KPROBES_H */