// CPU1 Functions. Note that 2 CPUs are not currently supported by GDB, so these are never actually // called from the GDB interface. They are included for completeness and future use. // read a register from cpu1 int dbg_cpu1_read(unsigned long adr, unsigned long *data) { int err; pthread_mutex_lock(&dbg_access_mutex); if(DEBUG_HARDWARE == DBG_HW_ADVANCED) { if ((err = adbg_select_module(DC_CPU1))) { cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; } err = adbg_wb_burst_read(4, 1, adr, (void *) data); // All CPU register reads / writes are bursts } else if(DEBUG_HARDWARE == DBG_HW_LEGACY) { if (APP_ERR_NONE == (err = legacy_dbg_set_chain(DC_CPU1))) if (APP_ERR_NONE == (err = legacy_dbg_command(0x6, adr, 4))) err = legacy_dbg_go((unsigned char*)data, 4, 1); *data = ntohl(*data); } cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; }
/* write a word to wishbone */ int dbg_wb_write32(unsigned long adr, unsigned long data) { int err; pthread_mutex_lock(&dbg_access_mutex); if(DEBUG_HARDWARE == DBG_HW_ADVANCED) { if ((err = adbg_select_module(DC_WISHBONE))) { cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; } err = adbg_wb_burst_write((void *)&data, 4, 1, adr); } else if(DEBUG_HARDWARE == DBG_HW_LEGACY) { data = ntohl(data); if (APP_ERR_NONE == (err = legacy_dbg_set_chain(DC_WISHBONE))) if (APP_ERR_NONE == (err = legacy_dbg_command(0x2, adr, 4))) err = legacy_dbg_go((unsigned char*)&data, 4, 0); } cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; }
// write a block to wishbone int dbg_wb_write_block8(unsigned long adr, uint8_t *data, int len) { int err; pthread_mutex_lock(&dbg_access_mutex); if(!len) return APP_ERR_NONE; // GDB may issue a 0-length transaction to test if a feature is supported if(DEBUG_HARDWARE == DBG_HW_ADVANCED) { if ((err = adbg_select_module(DC_WISHBONE))) { cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; } err = adbg_wb_burst_write((void *)data, 1, len, adr); // 'len' is in words... } else if(DEBUG_HARDWARE == DBG_HW_LEGACY) { if (APP_ERR_NONE == (err = legacy_dbg_set_chain(DC_WISHBONE))) if (APP_ERR_NONE == (err = legacy_dbg_command(0x0, adr, len))) err = legacy_dbg_go((unsigned char*)data, len, 0); } cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; }
// write a block to wishbone // Never actually called from the GDB interface int dbg_wb_write_block16(unsigned long adr, uint16_t *data, int len) { int err; pthread_mutex_lock(&dbg_access_mutex); if(!len) return APP_ERR_NONE; // GDB may issue a 0-length transaction to test if a feature is supported if(DEBUG_HARDWARE == DBG_HW_ADVANCED) { if ((err = adbg_select_module(DC_WISHBONE))) { cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; } err = adbg_wb_burst_write((void *)data, 2, len, adr); // 'len' is (half)words } else if(DEBUG_HARDWARE == DBG_HW_LEGACY) { int i; int bytelen = len<<1; for (i = 0; i < len; i ++) data[i] = ntohs(data[i]); if (APP_ERR_NONE == (err = legacy_dbg_set_chain(DC_WISHBONE))) if (APP_ERR_NONE == (err = legacy_dbg_command(0x1, adr, bytelen))) err = legacy_dbg_go((unsigned char*)data, bytelen, 0); // 'len' is 16-bit halfwords, call wants bytes } cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; }
int dbg_wb_read_block32(unsigned long adr, unsigned long *data, int len) { int err; pthread_mutex_lock(&dbg_access_mutex); if(!len) return APP_ERR_NONE; // GDB may issue a 0-length transaction to test if a feature is supported if(DEBUG_HARDWARE == DBG_HW_ADVANCED) { if ((err = adbg_select_module(DC_WISHBONE))) { cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; } err = adbg_wb_burst_read(4, len, adr, (void *)data); // 'len' is words. } else if(DEBUG_HARDWARE == DBG_HW_LEGACY) { int i; int bytelen = len<<2; if (APP_ERR_NONE == (err = legacy_dbg_set_chain(DC_WISHBONE))) if (APP_ERR_NONE == (err = legacy_dbg_command(0x6, adr, bytelen))) if (APP_ERR_NONE == (err = legacy_dbg_go((unsigned char*)data, bytelen, 1))) // 'len' is words, call wants bytes for (i = 0; i < len; i ++) data[i] = ntohl(data[i]); } cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; }
/* write a cpu register to cpu0. This is assumed to be an OR32 CPU, with 32-bit regs. */ int dbg_cpu0_write(uint32_t adr, uint32_t data) { int err; pthread_mutex_lock(&dbg_access_mutex); if(DEBUG_HARDWARE == DBG_HW_ADVANCED) { if ((err = adbg_select_module(DC_CPU0))) { cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; } err = adbg_wb_burst_write((void *)&data, 4, 1, adr); } else if(DEBUG_HARDWARE == DBG_HW_LEGACY) { data = ntohl(data); if (APP_ERR_NONE == (err = legacy_dbg_set_chain(DC_CPU0))) if (APP_ERR_NONE == (err = legacy_dbg_command(0x2, adr, 4))) err = legacy_dbg_go((unsigned char*)&data, 4, 0); } debug("cpu0_write, adr 0x%X, data 0x%X, ret %i\n", adr, data, err); cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; }
// Never actually called from the GDB interface int dbg_wb_read_block8(uint32_t adr, uint8_t *data, int len) { int err; if(!len) return APP_ERR_NONE; // GDB may issue a 0-length transaction to test if a feature is supported pthread_mutex_lock(&dbg_access_mutex); if(DEBUG_HARDWARE == DBG_HW_ADVANCED) { if ((err = adbg_select_module(DC_WISHBONE))) { cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; } err = adbg_wb_burst_read(1, len, adr, (void *)data); // *** is 'len' bits or words?? Call wants words... } else if(DEBUG_HARDWARE == DBG_HW_LEGACY) { if (APP_ERR_NONE == (err = legacy_dbg_set_chain(DC_WISHBONE))) if (APP_ERR_NONE == (err = legacy_dbg_command(0x4, adr, len))) err = legacy_dbg_go((unsigned char*)data, len, 1); } cable_flush(); pthread_mutex_unlock(&dbg_access_mutex); return err; }