int gdb_get_byte(uint8_t *data, size_t len, uint8_t *store) { if(len < 2) return 0; return __hex_to_uint8(data, store); }
static int gdb_checksum_verify(uint8_t *data, size_t len, uint8_t *chk) { uint8_t chkv; if(!__hex_to_uint8(chk, &chkv)) return 0; if(__gdb_checksum(data, len) != chkv) return 0; return 1; }
static void gdb_cmd_wr_mem(uint8_t *data, size_t len) { offset_t addr; loc_t bytes; size_t size, lbytes, can, i; uint8_t store[128]; if(!__gdb_setup_mem_op(data, len, &addr, &size, &bytes)) return; debug(GDBSTUB_CMD, "write mem: addr 0x%X size %D\n", addr, size); lbytes = (size_t)data + len - bytes.linear; if(lbytes/2 != size) { debug(GDBSTUB_CMD, "gdb cmd_wr_mem missing bytes\n"); gdb_unsupported(); } while(size) { can = min(size, sizeof(store)); for(i=0 ; i<can ; i++, bytes.u16++) { if(!__hex_to_uint8(bytes.u8, &store[i])) { debug(GDBSTUB_CMD, "gdb cmd_wr_mem invalid byte\n"); gdb_unsupported(); } } if(!gdb_mem_write(addr, store, can)) { debug(GDBSTUB_CMD, "access failure\n"); gdb_err_mem(); return; } addr += can; size -= can; } gdb_ok(); }