cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

debug-monitors.h (3230B)


      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);
    107
    108#ifdef CONFIG_HAVE_HW_BREAKPOINT
    109int reinstall_suspended_bps(struct pt_regs *regs);
    110#else
    111static inline int reinstall_suspended_bps(struct pt_regs *regs)
    112{
    113	return -ENODEV;
    114}
    115#endif
    116
    117int aarch32_break_handler(struct pt_regs *regs);
    118
    119void debug_traps_init(void);
    120
    121#endif	/* __ASSEMBLY */
    122#endif	/* __ASM_DEBUG_MONITORS_H */