| #ifndef GDBMACH_H |
| #define GDBMACH_H |
| |
| /** @file |
| * |
| * GDB architecture specifics |
| * |
| * This file declares functions for manipulating the machine state and |
| * debugging context. |
| * |
| */ |
| |
| #include <stdint.h> |
| |
| typedef unsigned long gdbreg_t; |
| |
| /* The register snapshot, this must be in sync with interrupt handler and the |
| * GDB protocol. */ |
| enum { |
| GDBMACH_EAX, |
| GDBMACH_ECX, |
| GDBMACH_EDX, |
| GDBMACH_EBX, |
| GDBMACH_ESP, |
| GDBMACH_EBP, |
| GDBMACH_ESI, |
| GDBMACH_EDI, |
| GDBMACH_EIP, |
| GDBMACH_EFLAGS, |
| GDBMACH_CS, |
| GDBMACH_SS, |
| GDBMACH_DS, |
| GDBMACH_ES, |
| GDBMACH_FS, |
| GDBMACH_GS, |
| GDBMACH_NREGS, |
| GDBMACH_SIZEOF_REGS = GDBMACH_NREGS * sizeof ( gdbreg_t ) |
| }; |
| |
| /* Breakpoint types */ |
| enum { |
| GDBMACH_BPMEM, |
| GDBMACH_BPHW, |
| GDBMACH_WATCH, |
| GDBMACH_RWATCH, |
| GDBMACH_AWATCH, |
| }; |
| |
| /* Interrupt vectors */ |
| extern void gdbmach_sigfpe ( void ); |
| extern void gdbmach_sigtrap ( void ); |
| extern void gdbmach_sigstkflt ( void ); |
| extern void gdbmach_sigill ( void ); |
| |
| static inline void gdbmach_set_pc ( gdbreg_t *regs, gdbreg_t pc ) { |
| regs [ GDBMACH_EIP ] = pc; |
| } |
| |
| static inline void gdbmach_set_single_step ( gdbreg_t *regs, int step ) { |
| regs [ GDBMACH_EFLAGS ] &= ~( 1 << 8 ); /* Trace Flag (TF) */ |
| regs [ GDBMACH_EFLAGS ] |= ( step << 8 ); |
| } |
| |
| static inline void gdbmach_breakpoint ( void ) { |
| __asm__ __volatile__ ( "int $3\n" ); |
| } |
| |
| extern int gdbmach_set_breakpoint ( int type, unsigned long addr, size_t len, int enable ); |
| |
| extern void gdbmach_init ( void ); |
| |
| #endif /* GDBMACH_H */ |