162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci#ifndef _ASM_POWERPC_KPROBES_H
362306a36Sopenharmony_ci#define _ASM_POWERPC_KPROBES_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <asm-generic/kprobes.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifdef __KERNEL__
862306a36Sopenharmony_ci/*
962306a36Sopenharmony_ci *  Kernel Probes (KProbes)
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * Copyright (C) IBM Corporation, 2002, 2004
1262306a36Sopenharmony_ci *
1362306a36Sopenharmony_ci * 2002-Oct	Created by Vamsi Krishna S <vamsi_krishna@in.ibm.com> Kernel
1462306a36Sopenharmony_ci *		Probes initial implementation ( includes suggestions from
1562306a36Sopenharmony_ci *		Rusty Russell).
1662306a36Sopenharmony_ci * 2004-Nov	Modified for PPC64 by Ananth N Mavinakayanahalli
1762306a36Sopenharmony_ci *		<ananth@in.ibm.com>
1862306a36Sopenharmony_ci */
1962306a36Sopenharmony_ci#include <linux/types.h>
2062306a36Sopenharmony_ci#include <linux/ptrace.h>
2162306a36Sopenharmony_ci#include <linux/percpu.h>
2262306a36Sopenharmony_ci#include <linux/module.h>
2362306a36Sopenharmony_ci#include <asm/probes.h>
2462306a36Sopenharmony_ci#include <asm/code-patching.h>
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#ifdef CONFIG_KPROBES
2762306a36Sopenharmony_ci#define  __ARCH_WANT_KPROBES_INSN_SLOT
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cistruct pt_regs;
3062306a36Sopenharmony_cistruct kprobe;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_citypedef u32 kprobe_opcode_t;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciextern kprobe_opcode_t optinsn_slot;
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/* Optinsn template address */
3762306a36Sopenharmony_ciextern kprobe_opcode_t optprobe_template_entry[];
3862306a36Sopenharmony_ciextern kprobe_opcode_t optprobe_template_op_address[];
3962306a36Sopenharmony_ciextern kprobe_opcode_t optprobe_template_call_handler[];
4062306a36Sopenharmony_ciextern kprobe_opcode_t optprobe_template_insn[];
4162306a36Sopenharmony_ciextern kprobe_opcode_t optprobe_template_call_emulate[];
4262306a36Sopenharmony_ciextern kprobe_opcode_t optprobe_template_ret[];
4362306a36Sopenharmony_ciextern kprobe_opcode_t optprobe_template_end[];
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci/* Fixed instruction size for powerpc */
4662306a36Sopenharmony_ci#define MAX_INSN_SIZE		2
4762306a36Sopenharmony_ci#define MAX_OPTIMIZED_LENGTH	sizeof(kprobe_opcode_t)	/* 4 bytes */
4862306a36Sopenharmony_ci#define MAX_OPTINSN_SIZE	(optprobe_template_end - optprobe_template_entry)
4962306a36Sopenharmony_ci#define RELATIVEJUMP_SIZE	sizeof(kprobe_opcode_t)	/* 4 bytes */
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci#define flush_insn_slot(p)	do { } while (0)
5262306a36Sopenharmony_ci#define kretprobe_blacklist_size 0
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_civoid __kretprobe_trampoline(void);
5562306a36Sopenharmony_ciextern void arch_remove_kprobe(struct kprobe *p);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci/* Architecture specific copy of original instruction */
5862306a36Sopenharmony_cistruct arch_specific_insn {
5962306a36Sopenharmony_ci	/* copy of original instruction */
6062306a36Sopenharmony_ci	kprobe_opcode_t *insn;
6162306a36Sopenharmony_ci	/*
6262306a36Sopenharmony_ci	 * Set in kprobes code, initially to 0. If the instruction can be
6362306a36Sopenharmony_ci	 * eumulated, this is set to 1, if not, to -1.
6462306a36Sopenharmony_ci	 */
6562306a36Sopenharmony_ci	int boostable;
6662306a36Sopenharmony_ci};
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cistruct prev_kprobe {
6962306a36Sopenharmony_ci	struct kprobe *kp;
7062306a36Sopenharmony_ci	unsigned long status;
7162306a36Sopenharmony_ci	unsigned long saved_msr;
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci/* per-cpu kprobe control block */
7562306a36Sopenharmony_cistruct kprobe_ctlblk {
7662306a36Sopenharmony_ci	unsigned long kprobe_status;
7762306a36Sopenharmony_ci	unsigned long kprobe_saved_msr;
7862306a36Sopenharmony_ci	struct prev_kprobe prev_kprobe;
7962306a36Sopenharmony_ci};
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistruct arch_optimized_insn {
8262306a36Sopenharmony_ci	kprobe_opcode_t copied_insn[1];
8362306a36Sopenharmony_ci	/* detour buffer */
8462306a36Sopenharmony_ci	kprobe_opcode_t *insn;
8562306a36Sopenharmony_ci};
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ciextern int kprobe_exceptions_notify(struct notifier_block *self,
8862306a36Sopenharmony_ci					unsigned long val, void *data);
8962306a36Sopenharmony_ciextern int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
9062306a36Sopenharmony_ciextern int kprobe_handler(struct pt_regs *regs);
9162306a36Sopenharmony_ciextern int kprobe_post_handler(struct pt_regs *regs);
9262306a36Sopenharmony_ci#else
9362306a36Sopenharmony_cistatic inline int kprobe_handler(struct pt_regs *regs) { return 0; }
9462306a36Sopenharmony_cistatic inline int kprobe_post_handler(struct pt_regs *regs) { return 0; }
9562306a36Sopenharmony_ci#endif /* CONFIG_KPROBES */
9662306a36Sopenharmony_ci#endif /* __KERNEL__ */
9762306a36Sopenharmony_ci#endif	/* _ASM_POWERPC_KPROBES_H */
98