98 lines
2.2 KiB
C
98 lines
2.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (C) 2023 Loongson Technology Corporation Limited
|
|
*/
|
|
|
|
#ifndef _ASM_LOONGARCH_KGDB_H
|
|
#define _ASM_LOONGARCH_KGDB_H
|
|
|
|
#define GDB_SIZEOF_REG sizeof(u64)
|
|
|
|
/* gdb remote procotol expects the following register layout. */
|
|
|
|
/*
|
|
* General purpose registers:
|
|
* r0-r31: 64 bit
|
|
* orig_a0: 64 bit
|
|
* pc : 64 bit
|
|
* csr_badvaddr: 64 bit
|
|
*/
|
|
#define DBG_PT_REGS_BASE 0
|
|
#define DBG_PT_REGS_NUM 35
|
|
#define DBG_PT_REGS_END (DBG_PT_REGS_BASE + DBG_PT_REGS_NUM - 1)
|
|
|
|
/*
|
|
* Floating point registers:
|
|
* f0-f31: 64 bit
|
|
*/
|
|
#define DBG_FPR_BASE (DBG_PT_REGS_END + 1)
|
|
#define DBG_FPR_NUM 32
|
|
#define DBG_FPR_END (DBG_FPR_BASE + DBG_FPR_NUM - 1)
|
|
|
|
/*
|
|
* Condition Flag registers:
|
|
* fcc0-fcc8: 8 bit
|
|
*/
|
|
#define DBG_FCC_BASE (DBG_FPR_END + 1)
|
|
#define DBG_FCC_NUM 8
|
|
#define DBG_FCC_END (DBG_FCC_BASE + DBG_FCC_NUM - 1)
|
|
|
|
/*
|
|
* Floating-point Control and Status registers:
|
|
* fcsr: 32 bit
|
|
*/
|
|
#define DBG_FCSR_NUM 1
|
|
#define DBG_FCSR (DBG_FCC_END + 1)
|
|
|
|
#define DBG_MAX_REG_NUM (DBG_FCSR + 1)
|
|
|
|
/*
|
|
* Size of I/O buffer for gdb packet.
|
|
* considering to hold all register contents, size is set
|
|
*/
|
|
#define BUFMAX 2048
|
|
|
|
/*
|
|
* Number of bytes required for gdb_regs buffer.
|
|
* PT_REGS and FPR: 8 bytes; FCSR: 4 bytes; FCC: 1 bytes.
|
|
* GDB fails to connect for size beyond this with error
|
|
* "'g' packet reply is too long"
|
|
*/
|
|
#define NUMREGBYTES ((DBG_PT_REGS_NUM + DBG_FPR_NUM) * GDB_SIZEOF_REG + DBG_FCC_NUM * 1 + DBG_FCSR_NUM * 4)
|
|
|
|
#define BREAK_INSTR_SIZE 4
|
|
#define CACHE_FLUSH_IS_SAFE 0
|
|
|
|
/* Register numbers of various important registers. */
|
|
enum dbg_loongarch_regnum {
|
|
DBG_LOONGARCH_ZERO = 0,
|
|
DBG_LOONGARCH_RA,
|
|
DBG_LOONGARCH_TP,
|
|
DBG_LOONGARCH_SP,
|
|
DBG_LOONGARCH_A0,
|
|
DBG_LOONGARCH_FP = 22,
|
|
DBG_LOONGARCH_S0,
|
|
DBG_LOONGARCH_S1,
|
|
DBG_LOONGARCH_S2,
|
|
DBG_LOONGARCH_S3,
|
|
DBG_LOONGARCH_S4,
|
|
DBG_LOONGARCH_S5,
|
|
DBG_LOONGARCH_S6,
|
|
DBG_LOONGARCH_S7,
|
|
DBG_LOONGARCH_S8,
|
|
DBG_LOONGARCH_ORIG_A0,
|
|
DBG_LOONGARCH_PC,
|
|
DBG_LOONGARCH_BADV
|
|
};
|
|
|
|
void kgdb_breakinst(void);
|
|
void arch_kgdb_breakpoint(void);
|
|
|
|
#ifdef CONFIG_KGDB
|
|
bool kgdb_breakpoint_handler(struct pt_regs *regs);
|
|
#else /* !CONFIG_KGDB */
|
|
static inline bool kgdb_breakpoint_handler(struct pt_regs *regs) { return false; }
|
|
#endif /* CONFIG_KGDB */
|
|
|
|
#endif /* __ASM_KGDB_H_ */
|