2010-08-03 11:22:20 -07:00
/*
* Kernel Probes ( KProbes )
* include / asm - mips / kprobes . h
*
* Copyright 2006 Sony Corp .
* Copyright 2010 Cavium Networks
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; version 2 of the License .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# ifndef _ASM_KPROBES_H
# define _ASM_KPROBES_H
# include <linux/ptrace.h>
# include <linux/types.h>
# include <asm/cacheflush.h>
# include <asm/kdebug.h>
# include <asm/inst.h>
2013-01-22 12:59:30 +01:00
# define __ARCH_WANT_KPROBES_INSN_SLOT
2010-08-03 11:22:20 -07:00
struct kprobe ;
struct pt_regs ;
typedef union mips_instruction kprobe_opcode_t ;
# define MAX_INSN_SIZE 2
# define flush_insn_slot(p) \
do { \
flush_icache_range ( ( unsigned long ) p - > addr , \
( unsigned long ) p - > addr + \
( MAX_INSN_SIZE * sizeof ( kprobe_opcode_t ) ) ) ; \
} while ( 0 )
# define kretprobe_blacklist_size 0
void arch_remove_kprobe ( struct kprobe * p ) ;
/* Architecture specific copy of original instruction*/
struct arch_specific_insn {
/* copy of the original instruction */
kprobe_opcode_t * insn ;
} ;
struct prev_kprobe {
struct kprobe * kp ;
unsigned long status ;
unsigned long old_SR ;
unsigned long saved_SR ;
unsigned long saved_epc ;
} ;
# define MAX_JPROBES_STACK_SIZE 128
# define MAX_JPROBES_STACK_ADDR \
( ( ( unsigned long ) current_thread_info ( ) ) + THREAD_SIZE - 32 - sizeof ( struct pt_regs ) )
# define MIN_JPROBES_STACK_SIZE(ADDR) \
( ( ( ( ADDR ) + MAX_JPROBES_STACK_SIZE ) > MAX_JPROBES_STACK_ADDR ) \
? MAX_JPROBES_STACK_ADDR - ( ADDR ) \
: MAX_JPROBES_STACK_SIZE )
2011-11-08 17:08:26 +05:30
# define SKIP_DELAYSLOT 0x0001
2010-08-03 11:22:20 -07:00
/* per-cpu kprobe control block */
struct kprobe_ctlblk {
unsigned long kprobe_status ;
unsigned long kprobe_old_SR ;
unsigned long kprobe_saved_SR ;
unsigned long kprobe_saved_epc ;
unsigned long jprobe_saved_sp ;
struct pt_regs jprobe_saved_regs ;
2011-11-08 17:08:26 +05:30
/* Per-thread fields, used while emulating branches */
unsigned long flags ;
unsigned long target_epc ;
2010-08-03 11:22:20 -07:00
u8 jprobes_stack [ MAX_JPROBES_STACK_SIZE ] ;
struct prev_kprobe prev_kprobe ;
} ;
extern int kprobe_exceptions_notify ( struct notifier_block * self ,
unsigned long val , void * data ) ;
# endif /* _ASM_KPROBES_H */