From 8f4e7c64dc798e6c5471cb6844f08f5b35f1e4bf Mon Sep 17 00:00:00 2001 From: Karl Palsson Date: Fri, 7 Oct 2011 20:17:48 +0000 Subject: [PATCH] build gdbserver with new library Has a line hardcoding it to the the usb backend. I don't have a stm32vl board :( --- gdbserver/Makefile | 21 ++++++++++++++++++ gdbserver/gdb-server.c | 49 ++++++++++++++++++++++-------------------- src/stlink-common.c | 6 +++--- src/stlink-common.h | 4 ++-- src/stlink-sg.c | 3 +-- src/stlink-usb.c | 2 +- 6 files changed, 54 insertions(+), 31 deletions(-) create mode 100644 gdbserver/Makefile diff --git a/gdbserver/Makefile b/gdbserver/Makefile new file mode 100644 index 0000000..e9d2774 --- /dev/null +++ b/gdbserver/Makefile @@ -0,0 +1,21 @@ + +PRG := st-util +OBJS = gdb-remote.o gdb-server.o + +CFLAGS+=-g -Wall -Werror -std=gnu99 -I../src +CFLAGS+=-DCONFIG_USE_LIBUSB +CFLAGS+=-DCONFIG_USE_LIBSG +LIBS := -lstlink -lusb-1.0 -lsgutils2 +LDFLAGS+=$(LIBS) -L.. + + +all: $(PRG) + +$(PRG): $(OBJS) + $(CC) -o $@ $^ $(LDFLAGS) + +clean: + rm -rf $(OBJS) + rm -rf $(PRG) + +.PHONY: clean all diff --git a/gdbserver/gdb-server.c b/gdbserver/gdb-server.c index 04fd2bc..2520c30 100644 --- a/gdbserver/gdb-server.c +++ b/gdbserver/gdb-server.c @@ -14,8 +14,10 @@ #include #include #include + +#include + #include "gdb-remote.h" -#include "stlink-hw.h" #define FLASH_BASE 0x08000000 #define FLASH_PAGE (sl->flash_pgsz) @@ -50,7 +52,7 @@ struct chip_params { { 0 } }; -int serve(struct stlink* sl, int port); +int serve(stlink_t *sl, int port); char* make_memory_map(const struct chip_params *params, uint32_t flash_size); int main(int argc, char** argv) { @@ -59,7 +61,8 @@ int main(int argc, char** argv) { return 1; } - struct stlink *sl = stlink_quirk_open(argv[2], 0); + // FIXME - hardcoded to usb.... + stlink_t *sl =stlink_open_usb(argv[2], 10); if (sl == NULL) return 1; @@ -170,9 +173,7 @@ struct code_hw_watchpoint { struct code_hw_watchpoint data_watches[DATA_WATCH_NUM]; -static void init_data_watchpoints(struct stlink *sl) { - int i; - +static void init_data_watchpoints(stlink_t *sl) { #ifdef DEBUG printf("init watchpoints\n"); #endif @@ -190,10 +191,10 @@ static void init_data_watchpoints(struct stlink *sl) { } } -static int add_data_watchpoint(struct stlink* sl, enum watchfun wf, stm32_addr_t addr, unsigned int len) +static int add_data_watchpoint(stlink_t *sl, enum watchfun wf, stm32_addr_t addr, unsigned int len) { int i = 0; - uint32_t mask, temp; + uint32_t mask; // computer mask // find a free watchpoint @@ -249,7 +250,7 @@ static int add_data_watchpoint(struct stlink* sl, enum watchfun wf, stm32_addr_t return -1; } -static int delete_data_watchpoint(struct stlink* sl, stm32_addr_t addr) +static int delete_data_watchpoint(stlink_t *sl, stm32_addr_t addr) { int i; @@ -285,7 +286,7 @@ struct code_hw_breakpoint { struct code_hw_breakpoint code_breaks[CODE_BREAK_NUM]; -static void init_code_breakpoints(struct stlink* sl) { +static void init_code_breakpoints(stlink_t *sl) { memset(sl->q_buf, 0, 4); sl->q_buf[0] = 0x03; // KEY | ENABLE stlink_write_mem32(sl, 0xe0002000, 4); @@ -297,7 +298,7 @@ static void init_code_breakpoints(struct stlink* sl) { } } -static int update_code_breakpoint(struct stlink* sl, stm32_addr_t addr, int set) { +static int update_code_breakpoint(stlink_t *sl, stm32_addr_t addr, int set) { stm32_addr_t fpb_addr = addr & ~0x3; int type = addr & 0x2 ? CODE_BREAK_HIGH : CODE_BREAK_LOW; @@ -366,7 +367,7 @@ struct flash_block { static struct flash_block* flash_root; static int flash_add_block(stm32_addr_t addr, unsigned length, - struct stlink* sl) { + stlink_t *sl) { if(addr < FLASH_BASE || addr + length > FLASH_BASE + FLASH_SIZE) { fprintf(stderr, "flash_add_block: incorrect bounds\n"); return -1; @@ -429,7 +430,7 @@ static int flash_populate(stm32_addr_t addr, uint8_t* data, unsigned length) { return 0; } -static int flash_go(struct stlink* sl) { +static int flash_go(stlink_t *sl) { int error = -1; // Some kinds of clock settings do not allow writing to flash. @@ -471,7 +472,7 @@ error: return error; } -int serve(struct stlink* sl, int port) { +int serve(stlink_t *sl, int port) { int sock = socket(AF_INET, SOCK_STREAM, 0); if(sock < 0) { perror("socket"); @@ -533,6 +534,7 @@ int serve(struct stlink* sl, int port) { #endif char* reply = NULL; + reg regp; switch(packet[0]) { case 'q': { @@ -727,29 +729,30 @@ int serve(struct stlink* sl, int port) { break; case 'g': - stlink_read_all_regs(sl); + stlink_read_all_regs(sl, ®p); reply = calloc(8 * 16 + 1, 1); for(int i = 0; i < 16; i++) - sprintf(&reply[i * 8], "%08x", htonl(sl->reg.r[i])); + sprintf(&reply[i * 8], "%08x", htonl(regp.r[i])); break; case 'p': { - unsigned id = strtoul(&packet[1], NULL, 16), reg = 0xDEADDEAD; + unsigned id = strtoul(&packet[1], NULL, 16); + unsigned myreg = 0xDEADDEAD; if(id < 16) { - stlink_read_reg(sl, id); - reg = htonl(sl->reg.r[id]); + stlink_read_reg(sl, id, ®p); + myreg = htonl(regp.r[id]); } else if(id == 0x19) { - stlink_read_reg(sl, 16); - reg = htonl(sl->reg.xpsr); + stlink_read_reg(sl, 16, ®p); + myreg = htonl(regp.xpsr); } else { reply = strdup("E00"); } reply = calloc(8 + 1, 1); - sprintf(reply, "%08x", reg); + sprintf(reply, "%08x", myreg); break; } @@ -875,7 +878,7 @@ int serve(struct stlink* sl, int port) { case 'z': { char *endptr; stm32_addr_t addr = strtoul(&packet[3], &endptr, 16); - stm32_addr_t len = strtoul(&endptr[1], NULL, 16); + //stm32_addr_t len = strtoul(&endptr[1], NULL, 16); switch (packet[1]) { case '1': // remove breakpoint diff --git a/src/stlink-common.c b/src/stlink-common.c index ab0354f..5f1e0c3 100644 --- a/src/stlink-common.c +++ b/src/stlink-common.c @@ -329,9 +329,9 @@ void stlink_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len) { sl->backend->write_mem8(sl, addr, len); } -void stlink_read_all_reg(stlink_t *sl) { - D(sl, "\n*** stlink_read_all_reg ***\n"); - sl->backend->read_all_reg(sl); +void stlink_read_all_regs(stlink_t *sl, reg *regp) { + D(sl, "\n*** stlink_read_all_regs ***\n"); + sl->backend->read_all_regs(sl, regp); } void stlink_write_reg(stlink_t *sl, uint32_t reg, int idx) { diff --git a/src/stlink-common.h b/src/stlink-common.h index e47ac84..3e5d461 100644 --- a/src/stlink-common.h +++ b/src/stlink-common.h @@ -104,7 +104,7 @@ extern "C" { void (*read_mem32) (stlink_t *sl, uint32_t addr, uint16_t len); void (*write_mem32) (stlink_t *sl, uint32_t addr, uint16_t len); void (*write_mem8) (stlink_t *sl, uint32_t addr, uint16_t len); - void (*read_all_reg) (stlink_t * stl); + void (*read_all_regs) (stlink_t *sl, reg* regp); void (*read_reg) (stlink_t *sl, int r_idx, reg* regp); void (*write_reg) (stlink_t *sl, uint32_t reg, int idx); void (*step) (stlink_t * stl); @@ -168,7 +168,7 @@ extern "C" { void stlink_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len); void stlink_write_mem32(stlink_t *sl, uint32_t addr, uint16_t len); void stlink_write_mem8(stlink_t *sl, uint32_t addr, uint16_t len); - void stlink_read_all_regs(stlink_t *sl); + void stlink_read_all_regs(stlink_t *sl, reg *regp); void stlink_read_reg(stlink_t *sl, int r_idx, reg *regp); void stlink_write_reg(stlink_t *sl, uint32_t reg, int idx); void stlink_step(stlink_t *sl); diff --git a/src/stlink-sg.c b/src/stlink-sg.c index 15dc536..63640e6 100644 --- a/src/stlink-sg.c +++ b/src/stlink-sg.c @@ -465,9 +465,8 @@ void stlink_force_debug(stlink_t *sl) { // Read all arm-core registers. -void _stlink_sg_read_all_regs(stlink_t *sl) { +void _stlink_sg_read_all_regs(stlink_t *sl, reg *regp) { struct stlink_libsg *sg = sl->backend_data; - D(sl, "\n*** stlink_read_all_regs ***\n"); clear_cdb(sg); sg->cdb_cmd_blk[1] = STLINK_DEBUG_READALLREGS; sl->q_len = 84; diff --git a/src/stlink-usb.c b/src/stlink-usb.c index 478f6ac..50a7d58 100644 --- a/src/stlink-usb.c +++ b/src/stlink-usb.c @@ -375,7 +375,7 @@ void _stlink_usb_read_mem32(stlink_t *sl, uint32_t addr, uint16_t len) { stlink_print_data(sl); } -void _stlink_usb_read_all_regs(stlink_t *sl) { +void _stlink_usb_read_all_regs(stlink_t *sl, reg *regp) { DD(sl, "oops! read_all_regs not implemented for USB!\n"); } -- 2.47.2