linux/arch/mips/include/asm/kprobes.h
<<
>>
Prefs
   1/*
   2 *  Kernel Probes (KProbes)
   3 *  include/asm-mips/kprobes.h
   4 *
   5 *  Copyright 2006 Sony Corp.
   6 *  Copyright 2010 Cavium Networks
   7 *
   8 *  This program is free software; you can redistribute it and/or modify
   9 *  it under the terms of the GNU General Public License as published by
  10 *  the Free Software Foundation; version 2 of the License.
  11 *
  12 *  This program is distributed in the hope that it will be useful,
  13 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 *  GNU General Public License for more details.
  16 *
  17 *  You should have received a copy of the GNU General Public License
  18 *  along with this program; if not, write to the Free Software
  19 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  20 */
  21
  22#ifndef _ASM_KPROBES_H
  23#define _ASM_KPROBES_H
  24
  25#include <linux/ptrace.h>
  26#include <linux/types.h>
  27
  28#include <asm/cacheflush.h>
  29#include <asm/kdebug.h>
  30#include <asm/inst.h>
  31
  32#define  __ARCH_WANT_KPROBES_INSN_SLOT
  33
  34struct kprobe;
  35struct pt_regs;
  36
  37typedef union mips_instruction kprobe_opcode_t;
  38
  39#define MAX_INSN_SIZE 2
  40
  41#define flush_insn_slot(p)                                              \
  42do {                                                                    \
  43        flush_icache_range((unsigned long)p->addr,                      \
  44                           (unsigned long)p->addr +                     \
  45                           (MAX_INSN_SIZE * sizeof(kprobe_opcode_t)));  \
  46} while (0)
  47
  48
  49#define kretprobe_blacklist_size 0
  50
  51void arch_remove_kprobe(struct kprobe *p);
  52
  53/* Architecture specific copy of original instruction*/
  54struct arch_specific_insn {
  55        /* copy of the original instruction */
  56        kprobe_opcode_t *insn;
  57};
  58
  59struct prev_kprobe {
  60        struct kprobe *kp;
  61        unsigned long status;
  62        unsigned long old_SR;
  63        unsigned long saved_SR;
  64        unsigned long saved_epc;
  65};
  66
  67#define MAX_JPROBES_STACK_SIZE 128
  68#define MAX_JPROBES_STACK_ADDR \
  69        (((unsigned long)current_thread_info()) + THREAD_SIZE - 32 - sizeof(struct pt_regs))
  70
  71#define MIN_JPROBES_STACK_SIZE(ADDR)                                    \
  72        ((((ADDR) + MAX_JPROBES_STACK_SIZE) > MAX_JPROBES_STACK_ADDR)   \
  73                ? MAX_JPROBES_STACK_ADDR - (ADDR)                       \
  74                : MAX_JPROBES_STACK_SIZE)
  75
  76
  77#define SKIP_DELAYSLOT 0x0001
  78
  79/* per-cpu kprobe control block */
  80struct kprobe_ctlblk {
  81        unsigned long kprobe_status;
  82        unsigned long kprobe_old_SR;
  83        unsigned long kprobe_saved_SR;
  84        unsigned long kprobe_saved_epc;
  85        unsigned long jprobe_saved_sp;
  86        struct pt_regs jprobe_saved_regs;
  87        /* Per-thread fields, used while emulating branches */
  88        unsigned long flags;
  89        unsigned long target_epc;
  90        u8 jprobes_stack[MAX_JPROBES_STACK_SIZE];
  91        struct prev_kprobe prev_kprobe;
  92};
  93
  94extern int kprobe_exceptions_notify(struct notifier_block *self,
  95                                    unsigned long val, void *data);
  96
  97#endif                          /* _ASM_KPROBES_H */
  98