blob: bd7f5886a7898185ffe55b03e34d634957290000 [file] [log] [blame]
Thomas Gleixner1a59d1b82019-05-27 08:55:05 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
H. Peter Anvin1965aae2008-10-22 22:26:29 -07002#ifndef _ASM_X86_KPROBES_H
3#define _ASM_X86_KPROBES_H
Masami Hiramatsud6be29b2008-01-30 13:31:21 +01004/*
5 * Kernel Probes (KProbes)
6 *
Masami Hiramatsud6be29b2008-01-30 13:31:21 +01007 * Copyright (C) IBM Corporation, 2002, 2004
8 *
9 * See arch/x86/kernel/kprobes.c for x86 kprobes history.
10 */
Luis R. Rodriguez7d134b22017-02-27 14:26:56 -080011
12#include <asm-generic/kprobes.h>
13
Luis R. Rodriguez7d134b22017-02-27 14:26:56 -080014#ifdef CONFIG_KPROBES
Masami Hiramatsud6be29b2008-01-30 13:31:21 +010015#include <linux/types.h>
16#include <linux/ptrace.h>
17#include <linux/percpu.h>
Peter Zijlstraab09e952019-10-09 13:57:17 +020018#include <asm/text-patching.h>
Peter Zijlstra30a813a2010-03-04 13:49:21 +010019#include <asm/insn.h>
Masami Hiramatsud6be29b2008-01-30 13:31:21 +010020
21#define __ARCH_WANT_KPROBES_INSN_SLOT
22
23struct pt_regs;
24struct kprobe;
25
26typedef u8 kprobe_opcode_t;
Peter Zijlstraab09e952019-10-09 13:57:17 +020027
Masami Hiramatsud6be29b2008-01-30 13:31:21 +010028#define MAX_STACK_SIZE 64
Linus Torvaldsaca9c292016-06-24 16:55:53 -070029#define CUR_STACK_SIZE(ADDR) \
30 (current_top_of_stack() - (unsigned long)(ADDR))
31#define MIN_STACK_SIZE(ADDR) \
32 (MAX_STACK_SIZE < CUR_STACK_SIZE(ADDR) ? \
33 MAX_STACK_SIZE : CUR_STACK_SIZE(ADDR))
Masami Hiramatsud6be29b2008-01-30 13:31:21 +010034
Masami Hiramatsud6be29b2008-01-30 13:31:21 +010035#define flush_insn_slot(p) do { } while (0)
36
Masami Hiramatsuc0f7ac32010-02-25 08:34:46 -050037/* optinsn template addresses */
Linus Torvalds54a7d502017-07-20 11:34:47 -070038extern __visible kprobe_opcode_t optprobe_template_entry[];
Peter Zijlstrad8a73862020-03-05 10:21:30 +010039extern __visible kprobe_opcode_t optprobe_template_clac[];
Linus Torvalds54a7d502017-07-20 11:34:47 -070040extern __visible kprobe_opcode_t optprobe_template_val[];
41extern __visible kprobe_opcode_t optprobe_template_call[];
42extern __visible kprobe_opcode_t optprobe_template_end[];
Peter Zijlstraab09e952019-10-09 13:57:17 +020043#define MAX_OPTIMIZED_LENGTH (MAX_INSN_SIZE + DISP32_SIZE)
Masami Hiramatsuc0f7ac32010-02-25 08:34:46 -050044#define MAX_OPTINSN_SIZE \
Masami Hiramatsua8976fc2017-08-18 17:25:08 +090045 (((unsigned long)optprobe_template_end - \
46 (unsigned long)optprobe_template_entry) + \
Peter Zijlstraab09e952019-10-09 13:57:17 +020047 MAX_OPTIMIZED_LENGTH + JMP32_INSN_SIZE)
Masami Hiramatsuc0f7ac32010-02-25 08:34:46 -050048
Masami Hiramatsud6be29b2008-01-30 13:31:21 +010049extern const int kretprobe_blacklist_size;
50
51void arch_remove_kprobe(struct kprobe *p);
Andi Kleen04bb5912013-08-05 15:02:41 -070052asmlinkage void kretprobe_trampoline(void);
Masami Hiramatsud6be29b2008-01-30 13:31:21 +010053
Masami Hiramatsub4da3342018-01-13 02:54:04 +090054extern void arch_kprobe_override_function(struct pt_regs *regs);
Josef Bacik9802d862017-12-11 11:36:48 -050055
Masami Hiramatsud6be29b2008-01-30 13:31:21 +010056/* Architecture specific copy of original instruction*/
57struct arch_specific_insn {
58 /* copy of the original instruction */
59 kprobe_opcode_t *insn;
60 /*
Masami Hiramatsuabd82e52020-12-18 23:12:05 +090061 * boostable = 0: This instruction type is not boostable.
62 * boostable = 1: This instruction has been boosted: we have
Masami Hiramatsud6be29b2008-01-30 13:31:21 +010063 * added a relative jump after the instruction copy in insn,
64 * so no single-step and fixup are needed (unless there's
Masami Hiramatsue704e342018-06-20 01:10:55 +090065 * a post_handler).
Masami Hiramatsud6be29b2008-01-30 13:31:21 +010066 */
Masami Hiramatsuabd82e52020-12-18 23:12:05 +090067 unsigned boostable:1;
Masami Hiramatsu6256e662021-03-03 00:25:46 +090068 unsigned char size; /* The size of insn */
69 union {
70 unsigned char opcode;
71 struct {
72 unsigned char type;
73 } jcc;
74 struct {
75 unsigned char type;
76 unsigned char asize;
77 } loop;
78 struct {
79 unsigned char reg;
80 } indirect;
81 };
82 s32 rel32; /* relative offset must be s32, s16, or s8 */
83 void (*emulate_op)(struct kprobe *p, struct pt_regs *regs);
Adrian Hunter3e46bb42020-05-12 15:19:12 +030084 /* Number of bytes of text poked */
85 int tp_len;
Masami Hiramatsud6be29b2008-01-30 13:31:21 +010086};
87
Masami Hiramatsuc0f7ac32010-02-25 08:34:46 -050088struct arch_optimized_insn {
89 /* copy of the original instructions */
Peter Zijlstraab09e952019-10-09 13:57:17 +020090 kprobe_opcode_t copied_insn[DISP32_SIZE];
Masami Hiramatsuc0f7ac32010-02-25 08:34:46 -050091 /* detour code buffer */
92 kprobe_opcode_t *insn;
93 /* the size of instructions copied to detour code buffer */
94 size_t size;
95};
96
97/* Return true (!0) if optinsn is prepared for optimization. */
98static inline int arch_prepared_optinsn(struct arch_optimized_insn *optinsn)
99{
100 return optinsn->size;
101}
102
Masami Hiramatsud6be29b2008-01-30 13:31:21 +0100103struct prev_kprobe {
104 struct kprobe *kp;
105 unsigned long status;
106 unsigned long old_flags;
107 unsigned long saved_flags;
108};
109
110/* per-cpu kprobe control block */
111struct kprobe_ctlblk {
112 unsigned long kprobe_status;
113 unsigned long kprobe_old_flags;
114 unsigned long kprobe_saved_flags;
Masami Hiramatsud6be29b2008-01-30 13:31:21 +0100115 struct prev_kprobe prev_kprobe;
116};
117
Masami Hiramatsud6be29b2008-01-30 13:31:21 +0100118extern int kprobe_fault_handler(struct pt_regs *regs, int trapnr);
119extern int kprobe_exceptions_notify(struct notifier_block *self,
120 unsigned long val, void *data);
Masami Hiramatsu6f6343f2014-04-17 17:17:33 +0900121extern int kprobe_int3_handler(struct pt_regs *regs);
Luis R. Rodriguez7d134b22017-02-27 14:26:56 -0800122
Peter Zijlstra20a6e352020-09-02 15:25:53 +0200123#else
124
125static inline int kprobe_debug_handler(struct pt_regs *regs) { return 0; }
126
Luis R. Rodriguez7d134b22017-02-27 14:26:56 -0800127#endif /* CONFIG_KPROBES */
H. Peter Anvin1965aae2008-10-22 22:26:29 -0700128#endif /* _ASM_X86_KPROBES_H */