1 #ifndef GDBMACH_H 2 #define GDBMACH_H 3 4 /** @file 5 * 6 * GDB architecture specifics 7 * 8 * This file declares functions for manipulating the machine state and 9 * debugging context. 10 * 11 */ 12 13 #include <stdint.h> 14 15 typedef unsigned long gdbreg_t; 16 17 /* The register snapshot, this must be in sync with interrupt handler and the 18 * GDB protocol. */ 19 enum { 20 GDBMACH_EAX, 21 GDBMACH_ECX, 22 GDBMACH_EDX, 23 GDBMACH_EBX, 24 GDBMACH_ESP, 25 GDBMACH_EBP, 26 GDBMACH_ESI, 27 GDBMACH_EDI, 28 GDBMACH_EIP, 29 GDBMACH_EFLAGS, 30 GDBMACH_CS, 31 GDBMACH_SS, 32 GDBMACH_DS, 33 GDBMACH_ES, 34 GDBMACH_FS, 35 GDBMACH_GS, 36 GDBMACH_NREGS, 37 GDBMACH_SIZEOF_REGS = GDBMACH_NREGS * sizeof ( gdbreg_t ) 38 }; 39 40 /* Breakpoint types */ 41 enum { 42 GDBMACH_BPMEM, 43 GDBMACH_BPHW, 44 GDBMACH_WATCH, 45 GDBMACH_RWATCH, 46 GDBMACH_AWATCH, 47 }; 48 49 static inline void gdbmach_set_pc ( gdbreg_t *regs, gdbreg_t pc ) { 50 regs [ GDBMACH_EIP ] = pc; 51 } 52 53 static inline void gdbmach_set_single_step ( gdbreg_t *regs, int step ) { 54 regs [ GDBMACH_EFLAGS ] &= ~( 1 << 8 ); /* Trace Flag (TF) */ 55 regs [ GDBMACH_EFLAGS ] |= ( step << 8 ); 56 } 57 58 static inline void gdbmach_breakpoint ( void ) { 59 __asm__ __volatile__ ( "int $3\n" ); 60 } 61 62 extern int gdbmach_set_breakpoint ( int type, unsigned long addr, size_t len, int enable ); 63 64 #endif /* GDBMACH_H */ 65