162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Xtensa hardware breakpoints/watchpoints handling functions
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
562306a36Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
662306a36Sopenharmony_ci * for more details.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Copyright (C) 2016 Cadence Design Systems Inc.
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#ifndef __ASM_XTENSA_HW_BREAKPOINT_H
1262306a36Sopenharmony_ci#define __ASM_XTENSA_HW_BREAKPOINT_H
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#ifdef CONFIG_HAVE_HW_BREAKPOINT
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <linux/kdebug.h>
1762306a36Sopenharmony_ci#include <linux/types.h>
1862306a36Sopenharmony_ci#include <uapi/linux/hw_breakpoint.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/* Breakpoint */
2162306a36Sopenharmony_ci#define XTENSA_BREAKPOINT_EXECUTE	0
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/* Watchpoints */
2462306a36Sopenharmony_ci#define XTENSA_BREAKPOINT_LOAD		1
2562306a36Sopenharmony_ci#define XTENSA_BREAKPOINT_STORE		2
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistruct arch_hw_breakpoint {
2862306a36Sopenharmony_ci	unsigned long address;
2962306a36Sopenharmony_ci	u16 len;
3062306a36Sopenharmony_ci	u16 type;
3162306a36Sopenharmony_ci};
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_cistruct perf_event_attr;
3462306a36Sopenharmony_cistruct perf_event;
3562306a36Sopenharmony_cistruct pt_regs;
3662306a36Sopenharmony_cistruct task_struct;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciint hw_breakpoint_slots(int type);
3962306a36Sopenharmony_ciint arch_check_bp_in_kernelspace(struct arch_hw_breakpoint *hw);
4062306a36Sopenharmony_ciint hw_breakpoint_arch_parse(struct perf_event *bp,
4162306a36Sopenharmony_ci			     const struct perf_event_attr *attr,
4262306a36Sopenharmony_ci			     struct arch_hw_breakpoint *hw);
4362306a36Sopenharmony_ciint hw_breakpoint_exceptions_notify(struct notifier_block *unused,
4462306a36Sopenharmony_ci				    unsigned long val, void *data);
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciint arch_install_hw_breakpoint(struct perf_event *bp);
4762306a36Sopenharmony_civoid arch_uninstall_hw_breakpoint(struct perf_event *bp);
4862306a36Sopenharmony_civoid hw_breakpoint_pmu_read(struct perf_event *bp);
4962306a36Sopenharmony_ciint check_hw_breakpoint(struct pt_regs *regs);
5062306a36Sopenharmony_civoid clear_ptrace_hw_breakpoint(struct task_struct *tsk);
5162306a36Sopenharmony_civoid restore_dbreak(void);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#else
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistruct task_struct;
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistatic inline void clear_ptrace_hw_breakpoint(struct task_struct *tsk)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci#endif /* CONFIG_HAVE_HW_BREAKPOINT */
6262306a36Sopenharmony_ci#endif /* __ASM_XTENSA_HW_BREAKPOINT_H */
63