diff options
Diffstat (limited to 'arch/arm64/include/asm/debug-monitors.h')
| -rw-r--r-- | arch/arm64/include/asm/debug-monitors.h | 85 | 
1 files changed, 68 insertions, 17 deletions
diff --git a/arch/arm64/include/asm/debug-monitors.h b/arch/arm64/include/asm/debug-monitors.h index a2232d07be9..6e9b5b36921 100644 --- a/arch/arm64/include/asm/debug-monitors.h +++ b/arch/arm64/include/asm/debug-monitors.h @@ -26,6 +26,53 @@  #define DBG_ESR_EVT_HWWP	0x2  #define DBG_ESR_EVT_BRK		0x6 +/* + * Break point instruction encoding + */ +#define BREAK_INSTR_SIZE		4 + +/* + * ESR values expected for dynamic and compile time BRK instruction + */ +#define DBG_ESR_VAL_BRK(x)	(0xf2000000 | ((x) & 0xfffff)) + +/* + * #imm16 values used for BRK instruction generation + * Allowed values for kgbd are 0x400 - 0x7ff + * 0x400: for dynamic BRK instruction + * 0x401: for compile time BRK instruction + */ +#define KGDB_DYN_DGB_BRK_IMM		0x400 +#define KDBG_COMPILED_DBG_BRK_IMM	0x401 + +/* + * BRK instruction encoding + * The #imm16 value should be placed at bits[20:5] within BRK ins + */ +#define AARCH64_BREAK_MON	0xd4200000 + +/* + * Extract byte from BRK instruction + */ +#define KGDB_DYN_DGB_BRK_INS_BYTE(x) \ +	((((AARCH64_BREAK_MON) & 0xffe0001f) >> (x * 8)) & 0xff) + +/* + * Extract byte from BRK #imm16 + */ +#define KGBD_DYN_DGB_BRK_IMM_BYTE(x) \ +	(((((KGDB_DYN_DGB_BRK_IMM) & 0xffff) << 5) >> (x * 8)) & 0xff) + +#define KGDB_DYN_DGB_BRK_BYTE(x) \ +	(KGDB_DYN_DGB_BRK_INS_BYTE(x) | KGBD_DYN_DGB_BRK_IMM_BYTE(x)) + +#define  KGDB_DYN_BRK_INS_BYTE0  KGDB_DYN_DGB_BRK_BYTE(0) +#define  KGDB_DYN_BRK_INS_BYTE1  KGDB_DYN_DGB_BRK_BYTE(1) +#define  KGDB_DYN_BRK_INS_BYTE2  KGDB_DYN_DGB_BRK_BYTE(2) +#define  KGDB_DYN_BRK_INS_BYTE3  KGDB_DYN_DGB_BRK_BYTE(3) + +#define CACHE_FLUSH_IS_SAFE		1 +  enum debug_el {  	DBG_ACTIVE_EL0 = 0,  	DBG_ACTIVE_EL1, @@ -43,25 +90,29 @@ enum debug_el {  #ifndef __ASSEMBLY__  struct task_struct; -#define local_dbg_save(flags)							\ -	do {									\ -		typecheck(unsigned long, flags);				\ -		asm volatile(							\ -		"mrs	%0, daif			// local_dbg_save\n"	\ -		"msr	daifset, #8"						\ -		: "=r" (flags) : : "memory");					\ -	} while (0) - -#define local_dbg_restore(flags)						\ -	do {									\ -		typecheck(unsigned long, flags);				\ -		asm volatile(							\ -		"msr	daif, %0			// local_dbg_restore\n"	\ -		: : "r" (flags) : "memory");					\ -	} while (0) -  #define DBG_ARCH_ID_RESERVED	0	/* In case of ptrace ABI updates. */ +#define DBG_HOOK_HANDLED	0 +#define DBG_HOOK_ERROR		1 + +struct step_hook { +	struct list_head node; +	int (*fn)(struct pt_regs *regs, unsigned int esr); +}; + +void register_step_hook(struct step_hook *hook); +void unregister_step_hook(struct step_hook *hook); + +struct break_hook { +	struct list_head node; +	u32 esr_val; +	u32 esr_mask; +	int (*fn)(struct pt_regs *regs, unsigned int esr); +}; + +void register_break_hook(struct break_hook *hook); +void unregister_break_hook(struct break_hook *hook); +  u8 debug_monitors_arch(void);  void enable_debug_monitors(enum debug_el el);  | 
