struct pt_regs;
struct kprobe;
- typedef unsigned int kprobe_opcode_t;
- #define BREAKPOINT_INSTRUCTION 0x7fe00008 /* trap */
-typedef opcode_t kprobe_opcode_t;
++typedef ppc_opcode_t kprobe_opcode_t;
#define MAX_INSN_SIZE 1
- #define IS_TW(instr) (((instr) & 0xfc0007fe) == 0x7c000008)
- #define IS_TD(instr) (((instr) & 0xfc0007fe) == 0x7c000088)
- #define IS_TDI(instr) (((instr) & 0xfc000000) == 0x08000000)
- #define IS_TWI(instr) (((instr) & 0xfc000000) == 0x0c000000)
-
#ifdef CONFIG_PPC64
/*
* 64bit powerpc uses function descriptors.
--- /dev/null
-typedef u32 opcode_t;
+ #ifndef _ASM_POWERPC_PROBES_H
+ #define _ASM_POWERPC_PROBES_H
+ #ifdef __KERNEL__
+ /*
+ * Definitions common to probes files
+ *
+ * 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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ * Copyright IBM Corporation, 2012
+ */
+ #include <linux/types.h>
+
++typedef u32 ppc_opcode_t;
+ #define BREAKPOINT_INSTRUCTION 0x7fe00008 /* trap */
+
+ /* Trap definitions per ISA */
+ #define IS_TW(instr) (((instr) & 0xfc0007fe) == 0x7c000008)
+ #define IS_TD(instr) (((instr) & 0xfc0007fe) == 0x7c000088)
+ #define IS_TDI(instr) (((instr) & 0xfc000000) == 0x08000000)
+ #define IS_TWI(instr) (((instr) & 0xfc000000) == 0x0c000000)
+
+ #ifdef CONFIG_PPC64
+ #define is_trap(instr) (IS_TW(instr) || IS_TD(instr) || \
+ IS_TWI(instr) || IS_TDI(instr))
+ #else
+ #define is_trap(instr) (IS_TW(instr) || IS_TWI(instr))
+ #endif /* CONFIG_PPC64 */
+
+ #endif /* __KERNEL__ */
+ #endif /* _ASM_POWERPC_PROBES_H */
--- /dev/null
-typedef opcode_t uprobe_opcode_t;
+ #ifndef _ASM_UPROBES_H
+ #define _ASM_UPROBES_H
+ /*
+ * User-space Probes (UProbes) for powerpc
+ *
+ * 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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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.
+ *
+ * Copyright IBM Corporation, 2007-2012
+ *
+ * Adapted from the x86 port by Ananth N Mavinakayanahalli <ananth@in.ibm.com>
+ */
+
+ #include <linux/notifier.h>
+ #include <asm/probes.h>
+
++typedef ppc_opcode_t uprobe_opcode_t;
+
+ #define MAX_UINSN_BYTES 4
+ #define UPROBE_XOL_SLOT_BYTES (MAX_UINSN_BYTES)
+
+ /* The following alias is needed for reference from arch-agnostic code */
+ #define UPROBE_SWBP_INSN BREAKPOINT_INSTRUCTION
+ #define UPROBE_SWBP_INSN_SIZE 4 /* swbp insn size in bytes */
+
+ struct arch_uprobe {
+ union {
+ u8 insn[MAX_UINSN_BYTES];
+ u32 ainsn;
+ };
+ };
+
+ struct arch_uprobe_task {
+ unsigned long saved_trap_nr;
+ };
+
+ extern int arch_uprobe_analyze_insn(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long addr);
+ extern int arch_uprobe_pre_xol(struct arch_uprobe *aup, struct pt_regs *regs);
+ extern int arch_uprobe_post_xol(struct arch_uprobe *aup, struct pt_regs *regs);
+ extern bool arch_uprobe_xol_was_trapped(struct task_struct *tsk);
+ extern int arch_uprobe_exception_notify(struct notifier_block *self, unsigned long val, void *data);
+ extern void arch_uprobe_abort_xol(struct arch_uprobe *aup, struct pt_regs *regs);
+ #endif /* _ASM_UPROBES_H */