int gdb_rx_mem(unsigned char *addr, size_t size) { unsigned char *p; void *prev; void *wctx; jmp_buf jb; size_t cnt; int ret; unsigned char c; if (size * 2 != gdb_rxsz) return (-1); wctx = gdb_begin_write(); prev = kdb_jmpbuf(jb); ret = setjmp(jb); if (ret == 0) { p = addr; cnt = size; while (cnt-- > 0) { c = (C2N(gdb_rxp[0]) << 4) & 0xf0; c |= C2N(gdb_rxp[1]) & 0x0f; *p++ = c; gdb_rxsz -= 2; gdb_rxp += 2; } kdb_cpu_sync_icache(addr, size); } (void)kdb_jmpbuf(prev); gdb_end_write(wctx); return ((ret == 0) ? 1 : 0); }
int db_write_bytes(vm_offset_t addr, size_t size, char *data) { jmp_buf jb; void *prev_jb; char *dst; size_t cnt; int ret; prev_jb = kdb_jmpbuf(jb); ret = setjmp(jb); if (ret == 0) { dst = (char *)addr; cnt = size; while (cnt-- > 0) *dst++ = *data++; kdb_cpu_sync_icache((void *)addr, size); } (void)kdb_jmpbuf(prev_jb); return (ret); }