Linux Audio

Check our new training course

Loading...
v5.4
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright (C) 2012 ARM Ltd.
  4 */
  5#ifndef __ASM_DEBUG_MONITORS_H
  6#define __ASM_DEBUG_MONITORS_H
  7
  8#include <linux/errno.h>
  9#include <linux/types.h>
 10#include <asm/brk-imm.h>
 11#include <asm/esr.h>
 12#include <asm/insn.h>
 13#include <asm/ptrace.h>
 14
 15/* Low-level stepping controls. */
 16#define DBG_MDSCR_SS		(1 << 0)
 17#define DBG_SPSR_SS		(1 << 21)
 18
 19/* MDSCR_EL1 enabling bits */
 20#define DBG_MDSCR_KDE		(1 << 13)
 21#define DBG_MDSCR_MDE		(1 << 15)
 22#define DBG_MDSCR_MASK		~(DBG_MDSCR_KDE | DBG_MDSCR_MDE)
 23
 24#define	DBG_ESR_EVT(x)		(((x) >> 27) & 0x7)
 25
 26/* AArch64 */
 27#define DBG_ESR_EVT_HWBP	0x0
 28#define DBG_ESR_EVT_HWSS	0x1
 29#define DBG_ESR_EVT_HWWP	0x2
 30#define DBG_ESR_EVT_BRK		0x6
 31
 32/*
 33 * Break point instruction encoding
 34 */
 35#define BREAK_INSTR_SIZE		AARCH64_INSN_SIZE
 36
 37/*
 38 * BRK instruction encoding
 39 * The #imm16 value should be placed at bits[20:5] within BRK ins
 40 */
 41#define AARCH64_BREAK_MON	0xd4200000
 42
 43/*
 44 * BRK instruction for provoking a fault on purpose
 45 * Unlike kgdb, #imm16 value with unallocated handler is used for faulting.
 46 */
 47#define AARCH64_BREAK_FAULT	(AARCH64_BREAK_MON | (FAULT_BRK_IMM << 5))
 48
 49#define AARCH64_BREAK_KGDB_DYN_DBG	\
 50	(AARCH64_BREAK_MON | (KGDB_DYN_DBG_BRK_IMM << 5))
 51
 52#define CACHE_FLUSH_IS_SAFE		1
 53
 54/* kprobes BRK opcodes with ESR encoding  */
 55#define BRK64_OPCODE_KPROBES	(AARCH64_BREAK_MON | (KPROBES_BRK_IMM << 5))
 
 56/* uprobes BRK opcodes with ESR encoding  */
 57#define BRK64_OPCODE_UPROBES	(AARCH64_BREAK_MON | (UPROBES_BRK_IMM << 5))
 58
 59/* AArch32 */
 60#define DBG_ESR_EVT_BKPT	0x4
 61#define DBG_ESR_EVT_VECC	0x5
 62
 63#define AARCH32_BREAK_ARM	0x07f001f0
 64#define AARCH32_BREAK_THUMB	0xde01
 65#define AARCH32_BREAK_THUMB2_LO	0xf7f0
 66#define AARCH32_BREAK_THUMB2_HI	0xa000
 67
 68#ifndef __ASSEMBLY__
 69struct task_struct;
 70
 71#define DBG_ARCH_ID_RESERVED	0	/* In case of ptrace ABI updates. */
 72
 73#define DBG_HOOK_HANDLED	0
 74#define DBG_HOOK_ERROR		1
 75
 76struct step_hook {
 77	struct list_head node;
 78	int (*fn)(struct pt_regs *regs, unsigned int esr);
 79};
 80
 81void register_user_step_hook(struct step_hook *hook);
 82void unregister_user_step_hook(struct step_hook *hook);
 83
 84void register_kernel_step_hook(struct step_hook *hook);
 85void unregister_kernel_step_hook(struct step_hook *hook);
 86
 87struct break_hook {
 88	struct list_head node;
 89	int (*fn)(struct pt_regs *regs, unsigned int esr);
 90	u16 imm;
 91	u16 mask; /* These bits are ignored when comparing with imm */
 92};
 93
 94void register_user_break_hook(struct break_hook *hook);
 95void unregister_user_break_hook(struct break_hook *hook);
 96
 97void register_kernel_break_hook(struct break_hook *hook);
 98void unregister_kernel_break_hook(struct break_hook *hook);
 99
100u8 debug_monitors_arch(void);
101
102enum dbg_active_el {
103	DBG_ACTIVE_EL0 = 0,
104	DBG_ACTIVE_EL1,
105};
106
107void enable_debug_monitors(enum dbg_active_el el);
108void disable_debug_monitors(enum dbg_active_el el);
109
110void user_rewind_single_step(struct task_struct *task);
111void user_fastforward_single_step(struct task_struct *task);
 
 
112
113void kernel_enable_single_step(struct pt_regs *regs);
114void kernel_disable_single_step(void);
115int kernel_active_single_step(void);
 
116
117#ifdef CONFIG_HAVE_HW_BREAKPOINT
118int reinstall_suspended_bps(struct pt_regs *regs);
119#else
120static inline int reinstall_suspended_bps(struct pt_regs *regs)
121{
122	return -ENODEV;
123}
124#endif
125
126int aarch32_break_handler(struct pt_regs *regs);
 
 
127
128#endif	/* __ASSEMBLY */
129#endif	/* __ASM_DEBUG_MONITORS_H */
v6.8
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright (C) 2012 ARM Ltd.
  4 */
  5#ifndef __ASM_DEBUG_MONITORS_H
  6#define __ASM_DEBUG_MONITORS_H
  7
  8#include <linux/errno.h>
  9#include <linux/types.h>
 10#include <asm/brk-imm.h>
 11#include <asm/esr.h>
 12#include <asm/insn.h>
 13#include <asm/ptrace.h>
 14
 15/* Low-level stepping controls. */
 16#define DBG_MDSCR_SS		(1 << 0)
 17#define DBG_SPSR_SS		(1 << 21)
 18
 19/* MDSCR_EL1 enabling bits */
 20#define DBG_MDSCR_KDE		(1 << 13)
 21#define DBG_MDSCR_MDE		(1 << 15)
 22#define DBG_MDSCR_MASK		~(DBG_MDSCR_KDE | DBG_MDSCR_MDE)
 23
 24#define	DBG_ESR_EVT(x)		(((x) >> 27) & 0x7)
 25
 26/* AArch64 */
 27#define DBG_ESR_EVT_HWBP	0x0
 28#define DBG_ESR_EVT_HWSS	0x1
 29#define DBG_ESR_EVT_HWWP	0x2
 30#define DBG_ESR_EVT_BRK		0x6
 31
 32/*
 33 * Break point instruction encoding
 34 */
 35#define BREAK_INSTR_SIZE		AARCH64_INSN_SIZE
 36
 
 
 
 
 
 
 
 
 
 
 
 
 37#define AARCH64_BREAK_KGDB_DYN_DBG	\
 38	(AARCH64_BREAK_MON | (KGDB_DYN_DBG_BRK_IMM << 5))
 39
 40#define CACHE_FLUSH_IS_SAFE		1
 41
 42/* kprobes BRK opcodes with ESR encoding  */
 43#define BRK64_OPCODE_KPROBES	(AARCH64_BREAK_MON | (KPROBES_BRK_IMM << 5))
 44#define BRK64_OPCODE_KPROBES_SS	(AARCH64_BREAK_MON | (KPROBES_BRK_SS_IMM << 5))
 45/* uprobes BRK opcodes with ESR encoding  */
 46#define BRK64_OPCODE_UPROBES	(AARCH64_BREAK_MON | (UPROBES_BRK_IMM << 5))
 47
 48/* AArch32 */
 49#define DBG_ESR_EVT_BKPT	0x4
 50#define DBG_ESR_EVT_VECC	0x5
 51
 52#define AARCH32_BREAK_ARM	0x07f001f0
 53#define AARCH32_BREAK_THUMB	0xde01
 54#define AARCH32_BREAK_THUMB2_LO	0xf7f0
 55#define AARCH32_BREAK_THUMB2_HI	0xa000
 56
 57#ifndef __ASSEMBLY__
 58struct task_struct;
 59
 60#define DBG_ARCH_ID_RESERVED	0	/* In case of ptrace ABI updates. */
 61
 62#define DBG_HOOK_HANDLED	0
 63#define DBG_HOOK_ERROR		1
 64
 65struct step_hook {
 66	struct list_head node;
 67	int (*fn)(struct pt_regs *regs, unsigned long esr);
 68};
 69
 70void register_user_step_hook(struct step_hook *hook);
 71void unregister_user_step_hook(struct step_hook *hook);
 72
 73void register_kernel_step_hook(struct step_hook *hook);
 74void unregister_kernel_step_hook(struct step_hook *hook);
 75
 76struct break_hook {
 77	struct list_head node;
 78	int (*fn)(struct pt_regs *regs, unsigned long esr);
 79	u16 imm;
 80	u16 mask; /* These bits are ignored when comparing with imm */
 81};
 82
 83void register_user_break_hook(struct break_hook *hook);
 84void unregister_user_break_hook(struct break_hook *hook);
 85
 86void register_kernel_break_hook(struct break_hook *hook);
 87void unregister_kernel_break_hook(struct break_hook *hook);
 88
 89u8 debug_monitors_arch(void);
 90
 91enum dbg_active_el {
 92	DBG_ACTIVE_EL0 = 0,
 93	DBG_ACTIVE_EL1,
 94};
 95
 96void enable_debug_monitors(enum dbg_active_el el);
 97void disable_debug_monitors(enum dbg_active_el el);
 98
 99void user_rewind_single_step(struct task_struct *task);
100void user_fastforward_single_step(struct task_struct *task);
101void user_regs_reset_single_step(struct user_pt_regs *regs,
102				 struct task_struct *task);
103
104void kernel_enable_single_step(struct pt_regs *regs);
105void kernel_disable_single_step(void);
106int kernel_active_single_step(void);
107void kernel_rewind_single_step(struct pt_regs *regs);
108
109#ifdef CONFIG_HAVE_HW_BREAKPOINT
110int reinstall_suspended_bps(struct pt_regs *regs);
111#else
112static inline int reinstall_suspended_bps(struct pt_regs *regs)
113{
114	return -ENODEV;
115}
116#endif
117
118int aarch32_break_handler(struct pt_regs *regs);
119
120void debug_traps_init(void);
121
122#endif	/* __ASSEMBLY */
123#endif	/* __ASM_DEBUG_MONITORS_H */