Loading...
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Kernel Probes (KProbes)
4 * include/asm-mips/kprobes.h
5 *
6 * Copyright 2006 Sony Corp.
7 * Copyright 2010 Cavium Networks
8 */
9
10#ifndef _ASM_KPROBES_H
11#define _ASM_KPROBES_H
12
13#include <asm-generic/kprobes.h>
14
15#ifdef CONFIG_KPROBES
16#include <linux/ptrace.h>
17#include <linux/types.h>
18
19#include <asm/cacheflush.h>
20#include <asm/kdebug.h>
21#include <asm/inst.h>
22
23#define __ARCH_WANT_KPROBES_INSN_SLOT
24
25struct kprobe;
26struct pt_regs;
27
28typedef union mips_instruction kprobe_opcode_t;
29
30#define MAX_INSN_SIZE 2
31
32#define flush_insn_slot(p) \
33do { \
34 if (p->addr) \
35 flush_icache_range((unsigned long)p->addr, \
36 (unsigned long)p->addr + \
37 (MAX_INSN_SIZE * sizeof(kprobe_opcode_t))); \
38} while (0)
39
40
41#define kretprobe_blacklist_size 0
42
43void arch_remove_kprobe(struct kprobe *p);
44int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
45
46/* Architecture specific copy of original instruction*/
47struct arch_specific_insn {
48 /* copy of the original instruction */
49 kprobe_opcode_t *insn;
50};
51
52struct prev_kprobe {
53 struct kprobe *kp;
54 unsigned long status;
55 unsigned long old_SR;
56 unsigned long saved_SR;
57 unsigned long saved_epc;
58};
59
60#define SKIP_DELAYSLOT 0x0001
61
62/* per-cpu kprobe control block */
63struct kprobe_ctlblk {
64 unsigned long kprobe_status;
65 unsigned long kprobe_old_SR;
66 unsigned long kprobe_saved_SR;
67 unsigned long kprobe_saved_epc;
68 /* Per-thread fields, used while emulating branches */
69 unsigned long flags;
70 unsigned long target_epc;
71 struct prev_kprobe prev_kprobe;
72};
73
74extern int kprobe_exceptions_notify(struct notifier_block *self,
75 unsigned long val, void *data);
76
77#endif /* CONFIG_KPROBES */
78#endif /* _ASM_KPROBES_H */
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 <asm-generic/kprobes.h>
26
27#ifdef CONFIG_KPROBES
28#include <linux/ptrace.h>
29#include <linux/types.h>
30
31#include <asm/cacheflush.h>
32#include <asm/kdebug.h>
33#include <asm/inst.h>
34
35#define __ARCH_WANT_KPROBES_INSN_SLOT
36
37struct kprobe;
38struct pt_regs;
39
40typedef union mips_instruction kprobe_opcode_t;
41
42#define MAX_INSN_SIZE 2
43
44#define flush_insn_slot(p) \
45do { \
46 if (p->addr) \
47 flush_icache_range((unsigned long)p->addr, \
48 (unsigned long)p->addr + \
49 (MAX_INSN_SIZE * sizeof(kprobe_opcode_t))); \
50} while (0)
51
52
53#define kretprobe_blacklist_size 0
54
55void arch_remove_kprobe(struct kprobe *p);
56
57/* Architecture specific copy of original instruction*/
58struct arch_specific_insn {
59 /* copy of the original instruction */
60 kprobe_opcode_t *insn;
61};
62
63struct prev_kprobe {
64 struct kprobe *kp;
65 unsigned long status;
66 unsigned long old_SR;
67 unsigned long saved_SR;
68 unsigned long saved_epc;
69};
70
71#define MAX_JPROBES_STACK_SIZE 128
72#define MAX_JPROBES_STACK_ADDR \
73 (((unsigned long)current_thread_info()) + THREAD_SIZE - 32 - sizeof(struct pt_regs))
74
75#define MIN_JPROBES_STACK_SIZE(ADDR) \
76 ((((ADDR) + MAX_JPROBES_STACK_SIZE) > MAX_JPROBES_STACK_ADDR) \
77 ? MAX_JPROBES_STACK_ADDR - (ADDR) \
78 : MAX_JPROBES_STACK_SIZE)
79
80
81#define SKIP_DELAYSLOT 0x0001
82
83/* per-cpu kprobe control block */
84struct kprobe_ctlblk {
85 unsigned long kprobe_status;
86 unsigned long kprobe_old_SR;
87 unsigned long kprobe_saved_SR;
88 unsigned long kprobe_saved_epc;
89 unsigned long jprobe_saved_sp;
90 struct pt_regs jprobe_saved_regs;
91 /* Per-thread fields, used while emulating branches */
92 unsigned long flags;
93 unsigned long target_epc;
94 u8 jprobes_stack[MAX_JPROBES_STACK_SIZE];
95 struct prev_kprobe prev_kprobe;
96};
97
98extern int kprobe_exceptions_notify(struct notifier_block *self,
99 unsigned long val, void *data);
100
101#endif /* CONFIG_KPROBES */
102#endif /* _ASM_KPROBES_H */