#ifndef GDBMACH_H #define GDBMACH_H /** @file * * GDB architecture specifics * * This file declares functions for manipulating the machine state and * debugging context. * */ #include typedef unsigned long gdbreg_t; /* Register snapshot */ enum { GDBMACH_RAX, GDBMACH_RBX, GDBMACH_RCX, GDBMACH_RDX, GDBMACH_RSI, GDBMACH_RDI, GDBMACH_RBP, GDBMACH_RSP, GDBMACH_R8, GDBMACH_R9, GDBMACH_R10, GDBMACH_R11, GDBMACH_R12, GDBMACH_R13, GDBMACH_R14, GDBMACH_R15, GDBMACH_RIP, GDBMACH_RFLAGS, GDBMACH_CS, GDBMACH_SS, GDBMACH_DS, GDBMACH_ES, GDBMACH_FS, GDBMACH_GS, GDBMACH_NREGS, }; #define GDBMACH_SIZEOF_REGS ( GDBMACH_NREGS * sizeof ( gdbreg_t ) ) /* Breakpoint types */ enum { GDBMACH_BPMEM, GDBMACH_BPHW, GDBMACH_WATCH, GDBMACH_RWATCH, GDBMACH_AWATCH, }; /* Exception 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_RIP] = pc; } static inline void gdbmach_set_single_step ( gdbreg_t *regs, int step ) { regs[GDBMACH_RFLAGS] &= ~( 1 << 8 ); /* Trace Flag (TF) */ regs[GDBMACH_RFLAGS] |= ( 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 */