1/*
2 * Xtensa hardware breakpoints/watchpoints handling functions
3 *
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License.  See the file "COPYING" in the main directory of this archive
6 * for more details.
7 *
8 * Copyright (C) 2016 Cadence Design Systems Inc.
9 */
10
11#ifndef __ASM_XTENSA_HW_BREAKPOINT_H
12#define __ASM_XTENSA_HW_BREAKPOINT_H
13
14#ifdef CONFIG_HAVE_HW_BREAKPOINT
15
16#include <linux/kdebug.h>
17#include <linux/types.h>
18#include <uapi/linux/hw_breakpoint.h>
19
20/* Breakpoint */
21#define XTENSA_BREAKPOINT_EXECUTE	0
22
23/* Watchpoints */
24#define XTENSA_BREAKPOINT_LOAD		1
25#define XTENSA_BREAKPOINT_STORE		2
26
27struct arch_hw_breakpoint {
28	unsigned long address;
29	u16 len;
30	u16 type;
31};
32
33struct perf_event_attr;
34struct perf_event;
35struct pt_regs;
36struct task_struct;
37
38int hw_breakpoint_slots(int type);
39int arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw);
40int hw_breakpoint_arch_parse(struct perf_event *bp,
41			     const struct perf_event_attr *attr,
42			     struct arch_hw_breakpoint *hw);
43int hw_breakpoint_exceptions_notify(struct notifier_block *unused,
44				    unsigned long val, void *data);
45
46int arch_install_hw_breakpoint(struct perf_event *bp);
47void arch_uninstall_hw_breakpoint(struct perf_event *bp);
48void hw_breakpoint_pmu_read(struct perf_event *bp);
49int check_hw_breakpoint(struct pt_regs *regs);
50void clear_ptrace_hw_breakpoint(struct task_struct *tsk);
51void restore_dbreak(void);
52
53#else
54
55struct task_struct;
56
57static inline void clear_ptrace_hw_breakpoint(struct task_struct *tsk)
58{
59}
60
61#endif /* CONFIG_HAVE_HW_BREAKPOINT */
62#endif /* __ASM_XTENSA_HW_BREAKPOINT_H */
63