123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785 |
- #include "ets_sys.h"
- #include "eagle_soc.h"
- #include "c_types.h"
- #include "gpio.h"
- #include "xtensa/corebits.h"
- #include "gdbstub/gdbstub.h"
- #include "gdbstub/gdbstub-entry.h"
- #include "gdbstub/gdbstub-cfg.h"
- struct XTensa_exception_frame_s {
- uint32_t pc;
- uint32_t ps;
- uint32_t sar;
- uint32_t vpri;
- uint32_t a0;
- uint32_t a[14];
- uint32_t litbase;
- uint32_t sr176;
- uint32_t sr208;
- uint32_t a1;
-
-
- uint32_t reason;
- };
- struct XTensa_rtos_int_frame_s {
- uint32_t exitPtr;
- uint32_t pc;
- uint32_t ps;
- uint32_t a[16];
- uint32_t sar;
- };
- #if GDBSTUB_FREERTOS
- #include <string.h>
- #include <stdio.h>
- void _xt_isr_attach(int inum, void *fn);
- void _xt_isr_unmask(int inum);
- void os_install_putc1(void (*p)(char c));
- #define os_printf(...) printf(__VA_ARGS__)
- #define os_memcpy(a,b,c) memcpy(a,b,c)
- typedef void wdtfntype();
- static wdtfntype *ets_wdt_disable=(wdtfntype *)0x400030f0;
- static wdtfntype *ets_wdt_enable=(wdtfntype *)0x40002fa0;
- #else
- #include "osapi.h"
- #include "user_interface.h"
- void _xtos_set_exception_handler(int cause, void (exhandler)(struct XTensa_exception_frame_s *frame));
- int os_printf_plus(const char *format, ...) __attribute__ ((format (printf, 1, 2)));
- #endif
- #define EXCEPTION_GDB_SP_OFFSET 0x100
- #define ETS_UART_INUM 5
- #define REG_UART_BASE( i ) (0x60000000+(i)*0xf00)
- #define UART_STATUS( i ) (REG_UART_BASE( i ) + 0x1C)
- #define UART_RXFIFO_CNT 0x000000FF
- #define UART_RXFIFO_CNT_S 0
- #define UART_TXFIFO_CNT 0x000000FF
- #define UART_TXFIFO_CNT_S 16
- #define UART_FIFO( i ) (REG_UART_BASE( i ) + 0x0)
- #define UART_INT_ENA(i) (REG_UART_BASE(i) + 0xC)
- #define UART_INT_CLR(i) (REG_UART_BASE(i) + 0x10)
- #define UART_RXFIFO_TOUT_INT_ENA (BIT(8))
- #define UART_RXFIFO_FULL_INT_ENA (BIT(0))
- #define UART_RXFIFO_TOUT_INT_CLR (BIT(8))
- #define UART_RXFIFO_FULL_INT_CLR (BIT(0))
- #define PBUFLEN 256
- #define OBUFLEN 32
- struct XTensa_exception_frame_s gdbstub_savedRegs;
- #if GDBSTUB_USE_OWN_STACK
- int exceptionStack[256];
- #endif
- static unsigned char cmd[PBUFLEN];
- static char chsum;
- #if GDBSTUB_REDIRECT_CONSOLE_OUTPUT
- static unsigned char obuf[OBUFLEN];
- static int obufpos=0;
- #endif
- static int32_t singleStepPs=-1;
- static void ATTR_GDBFN keepWDTalive() {
- uint64_t *wdtval=(uint64_t*)0x3ff21048;
- uint64_t *wdtovf=(uint64_t*)0x3ff210cc;
- int *wdtctl=(int*)0x3ff210c8;
- *wdtovf=*wdtval+1600000;
- *wdtctl|=(1<<31);
- }
- static int ATTR_GDBFN gdbRecvChar() {
- int i;
- while (((READ_PERI_REG(UART_STATUS(0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT)==0) {
- keepWDTalive();
- }
- i=READ_PERI_REG(UART_FIFO(0));
- return i;
- }
- static void ATTR_GDBFN gdbSendChar(char c) {
- while (((READ_PERI_REG(UART_STATUS(0))>>UART_TXFIFO_CNT_S)&UART_TXFIFO_CNT)>=126) ;
- WRITE_PERI_REG(UART_FIFO(0), c);
- }
- static void ATTR_GDBFN gdbPacketStart() {
- chsum=0;
- gdbSendChar('$');
- }
- static void ATTR_GDBFN gdbPacketChar(char c) {
- if (c=='#' || c=='$' || c=='}' || c=='*') {
- gdbSendChar('}');
- gdbSendChar(c^0x20);
- chsum+=(c^0x20)+'}';
- } else {
- gdbSendChar(c);
- chsum+=c;
- }
- }
- static void ATTR_GDBFN gdbPacketStr(char *c) {
- while (*c!=0) {
- gdbPacketChar(*c);
- c++;
- }
- }
- static void ATTR_GDBFN gdbPacketHex(int val, int bits) {
- char hexChars[]="0123456789abcdef";
- int i;
- for (i=bits; i>0; i-=4) {
- gdbPacketChar(hexChars[(val>>(i-4))&0xf]);
- }
- }
- static void ATTR_GDBFN gdbPacketEnd() {
- gdbSendChar('#');
- gdbPacketHex(chsum, 8);
- }
- #define ST_ENDPACKET -1
- #define ST_ERR -2
- #define ST_OK -3
- #define ST_CONT -4
- static long ATTR_GDBFN gdbGetHexVal(unsigned char **ptr, int bits) {
- int i;
- int no;
- unsigned int v=0;
- char c;
- no=bits/4;
- if (bits==-1) no=64;
- for (i=0; i<no; i++) {
- c=**ptr;
- (*ptr)++;
- if (c>='0' && c<='9') {
- v<<=4;
- v|=(c-'0');
- } else if (c>='A' && c<='F') {
- v<<=4;
- v|=(c-'A')+10;
- } else if (c>='a' && c<='f') {
- v<<=4;
- v|=(c-'a')+10;
- } else if (c=='#') {
- if (bits==-1) {
- (*ptr)--;
- return v;
- }
- return ST_ENDPACKET;
- } else {
- if (bits==-1) {
- (*ptr)--;
- return v;
- }
- return ST_ERR;
- }
- }
- return v;
- }
- static int ATTR_GDBFN iswap(int i) {
- int r;
- r=((i>>24)&0xff);
- r|=((i>>16)&0xff)<<8;
- r|=((i>>8)&0xff)<<16;
- r|=((i>>0)&0xff)<<24;
- return r;
- }
- static unsigned char ATTR_GDBFN readbyte(unsigned int p) {
- int *i=(int*)(p&(~3));
- if (p<0x20000000 || p>=0x60000000) return -1;
- return *i>>((p&3)*8);
- }
- static void ATTR_GDBFN writeByte(unsigned int p, unsigned char d) {
- int *i=(int*)(p&(~3));
- if (p<0x20000000 || p>=0x60000000) return;
- if ((p&3)==0) *i=(*i&0xffffff00)|(d<<0);
- if ((p&3)==1) *i=(*i&0xffff00ff)|(d<<8);
- if ((p&3)==2) *i=(*i&0xff00ffff)|(d<<16);
- if ((p&3)==3) *i=(*i&0x00ffffff)|(d<<24);
- }
- static int ATTR_GDBFN validWrAddr(int p) {
- if (p>=0x3ff00000 && p<0x40000000) return 1;
- if (p>=0x40100000 && p<0x40140000) return 1;
- if (p>=0x60000000 && p<0x60002000) return 1;
- return 0;
- }
- struct regfile {
- uint32_t a[16];
- uint32_t pc;
- uint32_t sar;
- uint32_t litbase;
- uint32_t sr176;
- uint32_t sr208;
- uint32_t ps;
- };
- static void ATTR_GDBFN sendReason() {
- #if 0
- char *reason="";
- #endif
-
- char exceptionSignal[]={4,31,11,11,2,6,8,0,6,7,0,0,7,7,7,7};
- int i=0;
- gdbPacketStart();
- gdbPacketChar('T');
- if (gdbstub_savedRegs.reason==0xff) {
- gdbPacketHex(2, 8);
- } else if (gdbstub_savedRegs.reason&0x80) {
-
- i=gdbstub_savedRegs.reason&0x7f;
- if (i<sizeof(exceptionSignal)) gdbPacketHex(exceptionSignal[i], 8); else gdbPacketHex(11, 8);
- } else {
-
- gdbPacketHex(5, 8);
- #if 0
- if (gdbstub_savedRegs.reason&(1<<0)) reason="break";
- if (gdbstub_savedRegs.reason&(1<<1)) reason="hwbreak";
- if (gdbstub_savedRegs.reason&(1<<2)) reason="watch";
- if (gdbstub_savedRegs.reason&(1<<3)) reason="swbreak";
- if (gdbstub_savedRegs.reason&(1<<4)) reason="swbreak";
- gdbPacketStr(reason);
- gdbPacketChar(':');
-
- #endif
- }
- gdbPacketEnd();
- }
- static int ATTR_GDBFN gdbHandleCommand(unsigned char *cmd, int len) {
-
- int i, j, k;
- unsigned char *data=cmd+1;
- if (cmd[0]=='g') {
- gdbPacketStart();
- gdbPacketHex(iswap(gdbstub_savedRegs.a0), 32);
- gdbPacketHex(iswap(gdbstub_savedRegs.a1), 32);
- for (i=2; i<16; i++) gdbPacketHex(iswap(gdbstub_savedRegs.a[i-2]), 32);
- gdbPacketHex(iswap(gdbstub_savedRegs.pc), 32);
- gdbPacketHex(iswap(gdbstub_savedRegs.sar), 32);
- gdbPacketHex(iswap(gdbstub_savedRegs.litbase), 32);
- gdbPacketHex(iswap(gdbstub_savedRegs.sr176), 32);
- gdbPacketHex(0, 32);
- gdbPacketHex(iswap(gdbstub_savedRegs.ps), 32);
- gdbPacketEnd();
- } else if (cmd[0]=='G') {
- gdbstub_savedRegs.a0=iswap(gdbGetHexVal(&data, 32));
- gdbstub_savedRegs.a1=iswap(gdbGetHexVal(&data, 32));
- for (i=2; i<16; i++) gdbstub_savedRegs.a[i-2]=iswap(gdbGetHexVal(&data, 32));
- gdbstub_savedRegs.pc=iswap(gdbGetHexVal(&data, 32));
- gdbstub_savedRegs.sar=iswap(gdbGetHexVal(&data, 32));
- gdbstub_savedRegs.litbase=iswap(gdbGetHexVal(&data, 32));
- gdbstub_savedRegs.sr176=iswap(gdbGetHexVal(&data, 32));
- gdbGetHexVal(&data, 32);
- gdbstub_savedRegs.ps=iswap(gdbGetHexVal(&data, 32));
- gdbPacketStart();
- gdbPacketStr("OK");
- gdbPacketEnd();
- } else if (cmd[0]=='m') {
- i=gdbGetHexVal(&data, -1);
- data++;
- j=gdbGetHexVal(&data, -1);
- gdbPacketStart();
- for (k=0; k<j; k++) {
- gdbPacketHex(readbyte(i++), 8);
- }
- gdbPacketEnd();
- } else if (cmd[0]=='M') {
- i=gdbGetHexVal(&data, -1);
- data++;
- j=gdbGetHexVal(&data, -1);
- data++;
- if (validWrAddr(i) && validWrAddr(i+j)) {
- for (k=0; k<j; k++) {
- writeByte(i, gdbGetHexVal(&data, 8));
- i++;
- }
-
- asm volatile("ISYNC\nISYNC\n");
- gdbPacketStart();
- gdbPacketStr("OK");
- gdbPacketEnd();
- } else {
-
- gdbPacketStart();
- gdbPacketStr("E01");
- gdbPacketEnd();
- }
- } else if (cmd[0]=='?') {
- sendReason();
- } else if (strncmp((char*)cmd, "vCont;c", 7)==0 || cmd[0]=='c') {
- return ST_CONT;
- } else if (strncmp((char*)cmd, "vCont;s", 7)==0 || cmd[0]=='s') {
-
-
-
- singleStepPs=gdbstub_savedRegs.ps;
- gdbstub_savedRegs.ps=(gdbstub_savedRegs.ps & ~0xf)|(XCHAL_DEBUGLEVEL-1);
- gdbstub_icount_ena_single_step();
- return ST_CONT;
- } else if (cmd[0]=='q') {
- if (strncmp((char*)&cmd[1], "Supported", 9)==0) {
- gdbPacketStart();
- gdbPacketStr("swbreak+;hwbreak+;PacketSize=255");
- gdbPacketEnd();
- } else {
-
- gdbPacketStart();
- gdbPacketEnd();
- return ST_ERR;
- }
- } else if (cmd[0]=='Z') {
- data+=2;
- i=gdbGetHexVal(&data, -1);
- data++;
- j=gdbGetHexVal(&data, -1);
- gdbPacketStart();
- if (cmd[1]=='1') {
- if (gdbstub_set_hw_breakpoint(i, j)) {
- gdbPacketStr("OK");
- } else {
- gdbPacketStr("E01");
- }
- } else if (cmd[1]=='2' || cmd[1]=='3' || cmd[1]=='4') {
- int access=0;
- int mask=0;
- if (cmd[1]=='2') access=2;
- if (cmd[1]=='3') access=1;
- if (cmd[1]=='4') access=3;
- if (j==1) mask=0x3F;
- if (j==2) mask=0x3E;
- if (j==4) mask=0x3C;
- if (j==8) mask=0x38;
- if (j==16) mask=0x30;
- if (j==32) mask=0x20;
- if (j==64) mask=0x00;
- if (mask!=0 && gdbstub_set_hw_watchpoint(i,mask, access)) {
- gdbPacketStr("OK");
- } else {
- gdbPacketStr("E01");
- }
- }
- gdbPacketEnd();
- } else if (cmd[0]=='z') {
- data+=2;
- i=gdbGetHexVal(&data, -1);
- data++;
- j=gdbGetHexVal(&data, -1);
- gdbPacketStart();
- if (cmd[1]=='1') {
- if (gdbstub_del_hw_breakpoint(i)) {
- gdbPacketStr("OK");
- } else {
- gdbPacketStr("E01");
- }
- } else if (cmd[1]=='2' || cmd[1]=='3' || cmd[1]=='4') {
- if (gdbstub_del_hw_watchpoint(i)) {
- gdbPacketStr("OK");
- } else {
- gdbPacketStr("E01");
- }
- }
- gdbPacketEnd();
- } else {
-
- gdbPacketStart();
- gdbPacketEnd();
- return ST_ERR;
- }
- return ST_OK;
- }
- static int ATTR_GDBFN gdbReadCommand() {
- unsigned char c;
- unsigned char chsum=0, rchsum;
- unsigned char sentchs[2];
- int p=0;
- unsigned char *ptr;
- c=gdbRecvChar();
- if (c!='$') return c;
- while(1) {
- c=gdbRecvChar();
- if (c=='#') {
- cmd[p]=0;
- break;
- }
- chsum+=c;
- if (c=='$') {
-
- chsum=0;
- p=0;
- continue;
- }
- if (c=='}') {
- c=gdbRecvChar();
- chsum+=c;
- c^=0x20;
- }
- cmd[p++]=c;
- if (p>=PBUFLEN) return ST_ERR;
- }
-
- sentchs[0]=gdbRecvChar();
- sentchs[1]=gdbRecvChar();
- ptr=&sentchs[0];
- rchsum=gdbGetHexVal(&ptr, 8);
- if (rchsum!=chsum) {
- gdbSendChar('-');
- return ST_ERR;
- } else {
- gdbSendChar('+');
- return gdbHandleCommand(cmd, p);
- }
- }
- static unsigned int ATTR_GDBFN getaregval(int reg) {
- if (reg==0) return gdbstub_savedRegs.a0;
- if (reg==1) return gdbstub_savedRegs.a1;
- return gdbstub_savedRegs.a[reg-2];
- }
- static void ATTR_GDBFN setaregval(int reg, unsigned int val) {
- os_printf("%x -> %x\n", val, reg);
- if (reg==0) gdbstub_savedRegs.a0=val;
- if (reg==1) gdbstub_savedRegs.a1=val;
- gdbstub_savedRegs.a[reg-2]=val;
- }
- static void ATTR_GDBFN emulLdSt() {
- unsigned char i0=readbyte(gdbstub_savedRegs.pc);
- unsigned char i1=readbyte(gdbstub_savedRegs.pc+1);
- unsigned char i2=readbyte(gdbstub_savedRegs.pc+2);
- int *p;
- if ((i0&0xf)==2 && (i1&0xf0)==0x20) {
-
- p=(int*)getaregval(i1&0xf)+(i2*4);
- setaregval(i0>>4, *p);
- gdbstub_savedRegs.pc+=3;
- } else if ((i0&0xf)==0x8) {
-
- p=(int*)getaregval(i1&0xf)+((i1>>4)*4);
- setaregval(i0>>4, *p);
- gdbstub_savedRegs.pc+=2;
- } else if ((i0&0xf)==2 && (i1&0xf0)==0x60) {
-
- p=(int*)getaregval(i1&0xf)+(i2*4);
- *p=getaregval(i0>>4);
- gdbstub_savedRegs.pc+=3;
- } else if ((i0&0xf)==0x9) {
-
- p=(int*)getaregval(i1&0xf)+((i1>>4)*4);
- *p=getaregval(i0>>4);
- gdbstub_savedRegs.pc+=2;
- } else {
- os_printf("GDBSTUB: No l32i/s32i instruction: %x %x %x. Huh?", i2, i1, i0);
- }
- }
- void ATTR_GDBFN gdbstub_handle_debug_exception() {
- ets_wdt_disable();
- if (singleStepPs!=-1) {
-
-
- gdbstub_savedRegs.ps=(gdbstub_savedRegs.ps&~0xf)|(singleStepPs&0xf);
- singleStepPs=-1;
- }
- sendReason();
- while(gdbReadCommand()!=ST_CONT);
- if ((gdbstub_savedRegs.reason&0x84)==0x4) {
-
-
-
- emulLdSt();
- } else if ((gdbstub_savedRegs.reason&0x88)==0x8) {
-
-
-
- if (readbyte(gdbstub_savedRegs.pc+2)==0 &&
- (readbyte(gdbstub_savedRegs.pc+1)&0xf0)==0x40 &&
- (readbyte(gdbstub_savedRegs.pc)&0x0f)==0x00) {
- gdbstub_savedRegs.pc+=3;
- }
- } else if ((gdbstub_savedRegs.reason&0x90)==0x10) {
-
-
- if ((readbyte(gdbstub_savedRegs.pc+1)&0xf0)==0xf0 &&
- readbyte(gdbstub_savedRegs.pc)==0x2d) {
- gdbstub_savedRegs.pc+=3;
- }
- }
- ets_wdt_enable();
- }
- #if GDBSTUB_FREERTOS
- void ATTR_GDBFN gdbstub_handle_user_exception() {
- ets_wdt_disable();
- gdbstub_savedRegs.reason|=0x80;
- sendReason();
- while(gdbReadCommand()!=ST_CONT);
- ets_wdt_enable();
- }
- #else
- static void ATTR_GDBFN gdb_exception_handler(struct XTensa_exception_frame_s *frame) {
-
- gdbstub_save_extra_sfrs_for_exception();
-
- os_memcpy(&gdbstub_savedRegs, frame, 19*4);
-
-
- gdbstub_savedRegs.a1=(uint32_t)frame+EXCEPTION_GDB_SP_OFFSET;
- gdbstub_savedRegs.reason|=0x80;
- ets_wdt_disable();
- sendReason();
- while(gdbReadCommand()!=ST_CONT);
- ets_wdt_enable();
-
- os_memcpy(frame, &gdbstub_savedRegs, 19*4);
- }
- #endif
- #if GDBSTUB_REDIRECT_CONSOLE_OUTPUT
- static void ATTR_GDBFN gdb_semihost_putchar1(char c) {
- int i;
- obuf[obufpos++]=c;
- if (c=='\n' || obufpos==OBUFLEN) {
- gdbPacketStart();
- gdbPacketChar('O');
- for (i=0; i<obufpos; i++) gdbPacketHex(obuf[i], 8);
- gdbPacketEnd();
- obufpos=0;
- }
- }
- #endif
- #if !GDBSTUB_FREERTOS
- static void ATTR_GDBINIT install_exceptions() {
- int i;
- int exno[]={EXCCAUSE_ILLEGAL, EXCCAUSE_SYSCALL, EXCCAUSE_INSTR_ERROR, EXCCAUSE_LOAD_STORE_ERROR,
- EXCCAUSE_DIVIDE_BY_ZERO, EXCCAUSE_UNALIGNED, EXCCAUSE_INSTR_DATA_ERROR, EXCCAUSE_LOAD_STORE_DATA_ERROR,
- EXCCAUSE_INSTR_ADDR_ERROR, EXCCAUSE_LOAD_STORE_ADDR_ERROR, EXCCAUSE_INSTR_PROHIBITED,
- EXCCAUSE_LOAD_PROHIBITED, EXCCAUSE_STORE_PROHIBITED};
- for (i=0; i<(sizeof(exno)/sizeof(exno[0])); i++) {
- _xtos_set_exception_handler(exno[i], gdb_exception_handler);
- }
- }
- #else
- extern void user_fatal_exception_handler();
- extern void gdbstub_user_exception_entry();
- static void ATTR_GDBINIT install_exceptions() {
-
- int *ufe=(int*)user_fatal_exception_handler;
-
- *ufe=((((int)gdbstub_user_exception_entry-(int)user_fatal_exception_handler)-4)<<6)|6;
- }
- #endif
- #if GDBSTUB_CTRLC_BREAK
- #if !GDBSTUB_FREERTOS
- static void ATTR_GDBFN uart_hdlr(void *arg, void *frame) {
- int doDebug=0, fifolen=0;
-
- gdbstub_save_extra_sfrs_for_exception();
- fifolen=(READ_PERI_REG(UART_STATUS(0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;
- while (fifolen!=0) {
- if ((READ_PERI_REG(UART_FIFO(0)) & 0xFF)==0x3) doDebug=1;
- fifolen--;
- }
- WRITE_PERI_REG(UART_INT_CLR(0), UART_RXFIFO_FULL_INT_CLR|UART_RXFIFO_TOUT_INT_CLR);
- if (doDebug) {
-
- os_memcpy(&gdbstub_savedRegs, frame, 19*4);
- gdbstub_savedRegs.a1=(uint32_t)frame+EXCEPTION_GDB_SP_OFFSET;
- gdbstub_savedRegs.reason=0xff;
- ets_wdt_disable();
- sendReason();
- while(gdbReadCommand()!=ST_CONT);
- ets_wdt_enable();
-
- os_memcpy(frame, &gdbstub_savedRegs, 19*4);
- }
- }
- static void ATTR_GDBINIT install_uart_hdlr() {
- ets_isr_attach(ETS_UART_INUM, uart_hdlr, NULL);
- SET_PERI_REG_MASK(UART_INT_ENA(0), UART_RXFIFO_FULL_INT_ENA|UART_RXFIFO_TOUT_INT_ENA);
- ets_isr_unmask((1<<ETS_UART_INUM));
- }
- #else
- void ATTR_GDBFN gdbstub_handle_uart_int(struct XTensa_rtos_int_frame_s *frame) {
- int doDebug=0, fifolen=0, x;
- fifolen=(READ_PERI_REG(UART_STATUS(0))>>UART_RXFIFO_CNT_S)&UART_RXFIFO_CNT;
- while (fifolen!=0) {
- if ((READ_PERI_REG(UART_FIFO(0)) & 0xFF)==0x3) doDebug=1;
- fifolen--;
- }
- WRITE_PERI_REG(UART_INT_CLR(0), UART_RXFIFO_FULL_INT_CLR|UART_RXFIFO_TOUT_INT_CLR);
- if (doDebug) {
-
- gdbstub_savedRegs.pc=frame->pc;
- gdbstub_savedRegs.ps=frame->ps;
- gdbstub_savedRegs.sar=frame->sar;
- gdbstub_savedRegs.a0=frame->a[0];
- gdbstub_savedRegs.a1=frame->a[1];
- for (x=2; x<16; x++) gdbstub_savedRegs.a[x-2]=frame->a[x];
- gdbstub_savedRegs.reason=0xff;
- sendReason();
- while(gdbReadCommand()!=ST_CONT);
-
- frame->pc=gdbstub_savedRegs.pc;
- frame->ps=gdbstub_savedRegs.ps;
- frame->sar=gdbstub_savedRegs.sar;
- frame->a[0]=gdbstub_savedRegs.a0;
- frame->a[1]=gdbstub_savedRegs.a1;
- for (x=2; x<16; x++) frame->a[x]=gdbstub_savedRegs.a[x-2];
- }
- }
- static void ATTR_GDBINIT install_uart_hdlr() {
- _xt_isr_attach(ETS_UART_INUM, gdbstub_uart_entry);
- SET_PERI_REG_MASK(UART_INT_ENA(0), UART_RXFIFO_FULL_INT_ENA|UART_RXFIFO_TOUT_INT_ENA);
- _xt_isr_unmask((1<<ETS_UART_INUM));
- }
- #endif
- #endif
- void ATTR_GDBINIT gdbstub_init() {
- #if GDBSTUB_REDIRECT_CONSOLE_OUTPUT
- os_install_putc1(gdb_semihost_putchar1);
- #endif
- #if GDBSTUB_CTRLC_BREAK
- install_uart_hdlr();
- #endif
- install_exceptions();
- gdbstub_init_debug_entry();
- #if GDBSTUB_BREAK_ON_INIT
- gdbstub_do_break();
- #endif
- }
|