| /* |
| * Copyright (c) 2015 Wind River Systems, Inc. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef _GDB_ARCH__H_ |
| #define _GDB_ARCH__H_ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #include <kernel_structs.h> |
| #include <debug/gdb_server.h> |
| |
| #define GDB_ARCH_HAS_ALL_REGS |
| |
| #ifndef CONFIG_GDB_SERVER_BOOTLOADER |
| #undef GDB_ARCH_HAS_HW_BP |
| #define GDB_ARCH_HAS_REMOTE_SERIAL_EXT_USING_NOTIF_PACKETS |
| #define GDB_ARCH_HAS_RUNCONTROL |
| #define GDB_ARCH_CAN_STEP gdb_arch_can_step |
| #endif |
| |
| #ifndef GDB_RAM_SIZE |
| #define GDB_RAM_SIZE (CONFIG_RAM_SIZE * 1024) |
| #endif |
| #ifndef CONFIG_GDB_RAM_ADDRESS |
| #define CONFIG_GDB_RAM_ADDRESS 0x100000 |
| #endif |
| |
| /* Default GDB buffer size */ |
| #ifdef CONFIG_GDB_SERVER_BOOTLOADER |
| #define GDB_BUF_SIZE 8192 |
| #else |
| #define GDB_BUF_SIZE 600 |
| #endif |
| |
| #define GDB_TGT_ARCH "i386" |
| |
| #define GDB_NUM_REGS 16 |
| #define GDB_NUM_REG_BYTES (GDB_NUM_REGS * 4) |
| |
| #define GDB_PC_REG 8 |
| |
| #define GDB_BREAK_INSTRUCTION 0xcc /* 'int3' opcode */ |
| |
| #ifndef _ASMLANGUAGE |
| |
| typedef unsigned char gdb_instr_t; |
| |
| struct gdb_reg_set { |
| NANO_ISF regs; |
| unsigned int pad1; /* padding for ss register */ |
| unsigned int pad2; /* padding for ds register */ |
| unsigned int pad3; /* padding for es register */ |
| unsigned int pad4; /* padding for fs register */ |
| unsigned int pad5; /* padding for gs register */ |
| }; |
| |
| struct gdb_debug_regs { |
| unsigned int db0; /* debug register 0 */ |
| unsigned int db1; /* debug register 1 */ |
| unsigned int db2; /* debug register 2 */ |
| unsigned int db3; /* debug register 3 */ |
| unsigned int db6; /* debug register 6 */ |
| unsigned int db7; /* debug register 7 */ |
| }; |
| |
| #if defined(GDB_ARCH_HAS_RUNCONTROL) && defined(GDB_ARCH_HAS_HW_BP) |
| extern volatile int gdb_cpu_stop_bp_type; |
| extern long gdb_cpu_stop_hw_bp_addr; |
| #define GDB_SET_STOP_BP_TYPE_SOFT(x) \ |
| do { gdb_cpu_stop_bp_type = (x); } while ((0)) |
| #else |
| #define GDB_SET_STOP_BP_TYPE_SOFT(x) |
| #endif |
| |
| extern void gdb_arch_init(void); |
| extern void gdb_arch_regs_from_esf(struct gdb_reg_set *regs, |
| NANO_ESF *esf); |
| extern void gdb_arch_regs_to_esf(struct gdb_reg_set *regs, |
| NANO_ESF *esf); |
| extern void gdb_arch_regs_from_isf(struct gdb_reg_set *regs, |
| NANO_ISF *esf); |
| extern void gdb_arch_regs_to_isf(struct gdb_reg_set *regs, |
| NANO_ISF *esf); |
| extern void gdb_arch_regs_get(struct gdb_reg_set *regs, char *buffer); |
| extern void gdb_arch_regs_set(struct gdb_reg_set *regs, char *buffer); |
| extern void gdb_arch_reg_info_get(int reg_id, int *size, int *offset); |
| extern void gdb_trace_mode_clear(struct gdb_reg_set *regs, int arg); |
| extern int gdb_trace_mode_set(struct gdb_reg_set *regs); |
| extern int gdb_arch_can_step(struct gdb_reg_set *regs); |
| #ifdef GDB_ARCH_HAS_HW_BP |
| extern int gdb_hw_bp_set(struct gdb_debug_regs *regs, long addr, |
| enum gdb_bp_type type, int length, |
| enum gdb_error_code *err); |
| extern int gdb_hw_bp_clear(struct gdb_debug_regs *regs, long addr, |
| enum gdb_bp_type type, int length, |
| enum gdb_error_code *err); |
| extern void gdb_dbg_regs_set(struct gdb_debug_regs *regs); |
| extern void gdb_dbg_regs_get(struct gdb_debug_regs *regs); |
| extern void gdb_dbg_regs_clear(void); |
| #endif |
| |
| #endif /* _ASMLANGUAGE */ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| #endif /* _GDB_ARCH__H_ */ |