46 #define DR7_G( bp ) ( 2 << ( 2 * (bp) ) ) 49 #define DR7_GE ( 1 << 9 ) 52 #define DR7_RWLEN_WRITE 0x11110000 55 #define DR7_RWLEN_ACCESS 0x33330000 58 #define DR7_RWLEN_1 0x00000000 61 #define DR7_RWLEN_2 0x44440000 64 #define DR7_RWLEN_4 0xcccc0000 67 #define DR7_RWLEN_8 0x88880000 70 #define DR7_RWLEN_MASK( bp ) ( 0xf0000 << ( 4 * (bp) ) ) 104 for ( i = 0 ; i <
NUM_HWBP ; i++ ) {
177 return ( enable ? -
ENOBUFS : 0 );
180 DBGC ( &
dr[0],
"GDB bp %d at %p+%zx type %d (%sabled)\n",
181 bp, ( (
void * )
addr ),
len,
type, ( enable ?
"en" :
"dis" ) );
184 dr7 = ( (
dr7 & ~mask ) | ( rwlen & mask ) );
203 unsigned long dr7_disabled =
DR7_GE;
204 unsigned long dr6_clear = 0;
210 DBGC ( &
dr[0],
"GDB signal %d\n", signo );
213 DBGC ( &
dr[0],
"GDB signal %d returning\n", signo );
GDB architecture specifics.
#define DR7_RWLEN_MASK(bp)
Debug register 7: Breakpoint R/W and length mask.
#define ENOENT
No such file or directory.
int gdbmach_set_breakpoint(int type, unsigned long addr, size_t len, int enable)
Set hardware breakpoint.
void gdbmach_init(void)
Initialise GDB.
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
static __always_inline unsigned long virt_to_phys(volatile const void *addr)
Convert virtual address to a physical address.
Access to external ("user") memory.
#define DR7_RWLEN_1
Debug register 7: One-byte length.
#define DR7_GE
Debug register 7: Global exact breakpoint enable.
#define ENOTSUP
Operation not supported.
static int gdbmach_find(unsigned long addr, unsigned int rwlen)
Find reusable or available hardware breakpoint.
#define __asmcall
Declare a function with standard calling conventions.
#define NUM_HWBP
Number of hardware breakpoints.
void gdbmach_sigtrap(void)
__asmcall void gdbmach_handler(int signo, gdbreg_t *regs)
Handle exception.
#define DR7_RWLEN_ACCESS
Debug register 7: Break on data access.
void gdbstub_handler(int signo, gdbreg_t *regs)
Interrupt handler.
void gdbmach_sigstkflt(void)
__asm__ __volatile__("\n1:\n\t" "movb -1(%3,%1), %%al\n\t" "stosb\n\t" "loop 1b\n\t" "xorl %%eax, %%eax\n\t" "mov %4, %1\n\t" "rep stosb\n\t" :"=&D"(discard_D), "=&c"(discard_c), "+m"(*value) :"r"(data), "g"(pad_len), "0"(value0), "1"(len) :"eax")
static unsigned long dr[NUM_HWBP]
Hardware breakpoint addresses (debug registers 0-3)
#define DR7_RWLEN_2
Debug register 7: Two-byte length.
static void * gdbmach_vectors[]
CPU exception vectors.
__asm__(".section \".rodata\", \"a\", " PROGBITS "\n\t" "\nprivate_key_data:\n\t" ".size private_key_data, ( . - private_key_data )\n\t" ".equ private_key_len, ( . - private_key_data )\n\t" ".previous\n\t")
#define DR7_G(bp)
Debug register 7: Global breakpoint enable.
static void gdbmach_update(void)
Update debug registers.
uint32_t type
Operating system type.
#define ENOBUFS
No buffer space available.
void set_interrupt_vector(unsigned int intr, void *vector)
Set interrupt vector.
void gdbmach_sigfpe(void)
static unsigned long dr7
Active value of debug register 7.
void gdbmach_sigill(void)
#define DR7_RWLEN_8
Debug register 7: Eight-byte length.
#define NULL
NULL pointer (VOID *)
#define DR7_RWLEN_WRITE
Debug register 7: Break on data writes.
#define DR7_RWLEN_4
Debug register 7: Four-byte length.