1bbeb3f4c55f666df7bcd2655b303dfb8c4d1a119Stephen Rothwell#ifndef _ASM_POWERPC_KPROBES_H
2bbeb3f4c55f666df7bcd2655b303dfb8c4d1a119Stephen Rothwell#define _ASM_POWERPC_KPROBES_H
388ced0314938814e1772b4d0d7ab20c52e4472b6Arnd Bergmann#ifdef __KERNEL__
414cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras/*
514cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *  Kernel Probes (KProbes)
614cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *
714cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * This program is free software; you can redistribute it and/or modify
814cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * it under the terms of the GNU General Public License as published by
914cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * the Free Software Foundation; either version 2 of the License, or
1014cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * (at your option) any later version.
1114cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *
1214cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * This program is distributed in the hope that it will be useful,
1314cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * but WITHOUT ANY WARRANTY; without even the implied warranty of
1414cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1514cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * GNU General Public License for more details.
1614cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *
1714cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * You should have received a copy of the GNU General Public License
1814cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * along with this program; if not, write to the Free Software
1914cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
2014cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *
2114cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * Copyright (C) IBM Corporation, 2002, 2004
2214cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *
2314cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * 2002-Oct	Created by Vamsi Krishna S <vamsi_krishna@in.ibm.com> Kernel
2414cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *		Probes initial implementation ( includes suggestions from
2514cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *		Rusty Russell).
2614cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras * 2004-Nov	Modified for PPC64 by Ananth N Mavinakayanahalli
2714cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras *		<ananth@in.ibm.com>
2814cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras */
2914cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras#include <linux/types.h>
3014cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras#include <linux/ptrace.h>
310dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli#include <linux/percpu.h>
327118e7e648e0a902bf4f38c55a25fcff730f33d7Ananth N Mavinakayanahalli#include <asm/probes.h>
3347f86b4e07afd4652ab0b092cbf493bf8b96559eAnton Blanchard#include <asm/code-patching.h>
3414cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras
352d14e39da8712cff8a92298f464a25afb4283ccfAnil S Keshavamurthy#define  __ARCH_WANT_KPROBES_INSN_SLOT
362d14e39da8712cff8a92298f464a25afb4283ccfAnil S Keshavamurthy
3714cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasstruct pt_regs;
380498b63504f818e5ab39c818cd6f7b41319a1187Ananth N Mavinakayanahallistruct kprobe;
3914cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras
4028e1e58fb668e262648fb8ee8a24154633f40507Ananth N Mavinakayanahallitypedef ppc_opcode_t kprobe_opcode_t;
4114cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras#define MAX_INSN_SIZE 1
4214cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras
438209003547c4b1006943eac8dc6c1fb6493cafdaKumar Gala#ifdef CONFIG_PPC64
443a872d89baae821a0f6e2c1055d4b47650661137Ananth N Mavinakayanahalli/*
453a872d89baae821a0f6e2c1055d4b47650661137Ananth N Mavinakayanahalli * 64bit powerpc uses function descriptors.
463a872d89baae821a0f6e2c1055d4b47650661137Ananth N Mavinakayanahalli * Handle cases where:
47412998cf6bce78b8dc5f68660e09bf3b4fcbb210Ananth N Mavinakayanahalli * 		- User passes a <.symbol> or <module:.symbol>
48412998cf6bce78b8dc5f68660e09bf3b4fcbb210Ananth N Mavinakayanahalli * 		- User passes a <symbol> or <module:symbol>
4925985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * 		- User passes a non-existent symbol, kallsyms_lookup_name
503a872d89baae821a0f6e2c1055d4b47650661137Ananth N Mavinakayanahalli * 		  returns 0. Don't deref the NULL pointer in that case
513a872d89baae821a0f6e2c1055d4b47650661137Ananth N Mavinakayanahalli */
523a872d89baae821a0f6e2c1055d4b47650661137Ananth N Mavinakayanahalli#define kprobe_lookup_name(name, addr)					\
533a872d89baae821a0f6e2c1055d4b47650661137Ananth N Mavinakayanahalli{									\
543a872d89baae821a0f6e2c1055d4b47650661137Ananth N Mavinakayanahalli	addr = (kprobe_opcode_t *)kallsyms_lookup_name(name);		\
55412998cf6bce78b8dc5f68660e09bf3b4fcbb210Ananth N Mavinakayanahalli	if (addr) {							\
56412998cf6bce78b8dc5f68660e09bf3b4fcbb210Ananth N Mavinakayanahalli		char *colon;						\
57412998cf6bce78b8dc5f68660e09bf3b4fcbb210Ananth N Mavinakayanahalli		if ((colon = strchr(name, ':')) != NULL) {		\
58412998cf6bce78b8dc5f68660e09bf3b4fcbb210Ananth N Mavinakayanahalli			colon++;					\
59412998cf6bce78b8dc5f68660e09bf3b4fcbb210Ananth N Mavinakayanahalli			if (*colon != '\0' && *colon != '.')		\
6047f86b4e07afd4652ab0b092cbf493bf8b96559eAnton Blanchard				addr = (kprobe_opcode_t *)ppc_function_entry(addr); \
61412998cf6bce78b8dc5f68660e09bf3b4fcbb210Ananth N Mavinakayanahalli		} else if (name[0] != '.')				\
6247f86b4e07afd4652ab0b092cbf493bf8b96559eAnton Blanchard			addr = (kprobe_opcode_t *)ppc_function_entry(addr); \
63eb609e52d188775da738a1ffd1e982e6212c77d7Srinivasa Ds	} else {							\
649281acea6a3687ff0f262e0be31eac34895b95d7Tejun Heo		char dot_name[KSYM_NAME_LEN];				\
65eb609e52d188775da738a1ffd1e982e6212c77d7Srinivasa Ds		dot_name[0] = '.';					\
66eb609e52d188775da738a1ffd1e982e6212c77d7Srinivasa Ds		dot_name[1] = '\0';					\
679281acea6a3687ff0f262e0be31eac34895b95d7Tejun Heo		strncat(dot_name, name, KSYM_NAME_LEN - 2);		\
68eb609e52d188775da738a1ffd1e982e6212c77d7Srinivasa Ds		addr = (kprobe_opcode_t *)kallsyms_lookup_name(dot_name); \
69412998cf6bce78b8dc5f68660e09bf3b4fcbb210Ananth N Mavinakayanahalli	}								\
703a872d89baae821a0f6e2c1055d4b47650661137Ananth N Mavinakayanahalli}
718209003547c4b1006943eac8dc6c1fb6493cafdaKumar Gala#endif
7214cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras
73a9ad965ea9a6d719daf333847a2ceb0e363994bdbibo, mao#define flush_insn_slot(p)	do { } while (0)
74f438d914b220051d4cbc65cbc5d98e163c85c93bMasami Hiramatsu#define kretprobe_blacklist_size 0
75e6f47f978bcd5413fff610613b18e9e0eab9bc1bAnil S Keshavamurthy
7614cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasvoid kretprobe_trampoline(void);
770498b63504f818e5ab39c818cd6f7b41319a1187Ananth N Mavinakayanahalliextern void arch_remove_kprobe(struct kprobe *p);
7814cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras
7914cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras/* Architecture specific copy of original instruction */
8014cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasstruct arch_specific_insn {
8114cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras	/* copy of original instruction */
8214cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras	kprobe_opcode_t *insn;
83e6349a958b3577da6e5c5eacda85c07f9a364cb5Ananth N Mavinakayanahalli	/*
84e6349a958b3577da6e5c5eacda85c07f9a364cb5Ananth N Mavinakayanahalli	 * Set in kprobes code, initially to 0. If the instruction can be
85e6349a958b3577da6e5c5eacda85c07f9a364cb5Ananth N Mavinakayanahalli	 * eumulated, this is set to 1, if not, to -1.
86e6349a958b3577da6e5c5eacda85c07f9a364cb5Ananth N Mavinakayanahalli	 */
87e6349a958b3577da6e5c5eacda85c07f9a364cb5Ananth N Mavinakayanahalli	int boostable;
8814cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras};
8914cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerras
900dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahallistruct prev_kprobe {
910dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli	struct kprobe *kp;
920dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli	unsigned long status;
930dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli	unsigned long saved_msr;
940dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli};
950dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli
960dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli/* per-cpu kprobe control block */
970dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahallistruct kprobe_ctlblk {
980dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli	unsigned long kprobe_status;
990dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli	unsigned long kprobe_saved_msr;
1000dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli	struct pt_regs jprobe_saved_regs;
1010dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli	struct prev_kprobe prev_kprobe;
1020dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli};
1030dc036c91ac11b2b76bb91b59d8c7af919aa4a8dAnanth N Mavinakayanahalli
10414cf11af6cf608eb8c23e989ddb17a715ddce109Paul Mackerrasextern int kprobe_exceptions_notify(struct notifier_block *self,
10541dead49ccb4d7f0a34d56478f487342a3c3ab2bAnil S Keshavamurthy					unsigned long val, void *data);
1069f90b997de4efd5404a8c52f89c400f0f4e2d216Christoph Hellwigextern int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
10788ced0314938814e1772b4d0d7ab20c52e4472b6Arnd Bergmann#endif /* __KERNEL__ */
108bbeb3f4c55f666df7bcd2655b303dfb8c4d1a119Stephen Rothwell#endif	/* _ASM_POWERPC_KPROBES_H */
109