int UdpService::sendData(const uint8_t *msg, int len) { int tx_bytes = sendto(hsock_, reinterpret_cast<const char *>(msg), len, 0, reinterpret_cast<struct sockaddr *>(&remote_sockaddr_ipv4_), static_cast<int>(sizeof(remote_sockaddr_ipv4_))); if (tx_bytes < 0) { #if defined(_WIN32) || defined(__CYGWIN__) RISCV_error("sendto() failed with error: %d\n", WSAGetLastError()); #else RISCV_error("sendto() failed\n", NULL); #endif return 1; } else if (logLevel_.to_int() >= LOG_DEBUG) { char dbg[1024]; int pos = RISCV_sprintf(dbg, sizeof(dbg), "send %d bytes to %s:%d: ", tx_bytes, inet_ntoa(remote_sockaddr_ipv4_.sin_addr), ntohs(remote_sockaddr_ipv4_.sin_port)); if (tx_bytes < 64) { for (int i = 0; i < len; i++) { pos += RISCV_sprintf(&dbg[pos], sizeof(dbg) - pos, "%02x", msg[i] & 0xFF); } } RISCV_debug("%s", dbg); } return tx_bytes; }
int UdpService::readData(const uint8_t *buf, int maxlen) { int sockerr; addr_size_t sockerr_len = sizeof(sockerr); addr_size_t addr_sz = sizeof(sockaddr_ipv4_); int res = recvfrom(hsock_, rcvbuf, sizeof(rcvbuf), 0, (struct sockaddr *)&sockaddr_ipv4_, &addr_sz); getsockopt(hsock_, SOL_SOCKET, SO_ERROR, (char *)&sockerr, &sockerr_len); if (res < 0 && sockerr < 0) { RISCV_error("Socket error %x", sockerr); res = -1; } else if (res < 0 && sockerr == 0) { // Timeout: res = 0; } else if (res > 0) { if (maxlen < res) { res = maxlen; RISCV_error("Receiver's buffer overflow maxlen = %d", maxlen); } memcpy(const_cast<uint8_t *>(buf), rcvbuf, res); if (logLevel_.to_int() >= LOG_DEBUG) { char dbg[1024]; int pos = RISCV_sprintf(dbg, sizeof(dbg), "received %d Bytes: ", res); if (res < 64) { for (int i = 0; i < res; i++) { pos += RISCV_sprintf(&dbg[pos], sizeof(dbg) - pos, "%02x", rcvbuf[i] & 0xFF); } } RISCV_debug("%s", dbg); } } return res; }
void CpuRiscV_Functional::executeInstruction(IInstruction *instr, uint32_t *rpayload) { CpuContextType *pContext = getpContext(); if (pContext->reg_trace_file) { /** Save previous reg values to find modification after exec() */ for (int i = 0; i < Reg_Total; i++) { iregs_prev[i] = pContext->regs[i]; } } instr->exec(cacheline_, pContext); #if 0 //if (pContext->pc >= 0x10000000) { //if ((pContext->pc >= 0x100000b4 && pContext->pc <= 0x10000130) //|| (pContext->pc >= 0x10001ef4) //) { //if (pContext->pc >= 0x10001928 && pContext->pc <= 0x10001960) { RISCV_debug("[%" RV_PRI64 "d] %08x: %08x \t %4s <prv=%d; mstatus=%016" RV_PRI64 "x; mcause=%016" RV_PRI64 "x; ra=%016" RV_PRI64 "x; sp=%016" RV_PRI64 "x; tp=%016" RV_PRI64 "x>", getStepCounter(), static_cast<uint32_t>(pContext->pc), rpayload[0], instr->name(), pContext->cur_prv_level, pContext->csr[CSR_mstatus], pContext->csr[CSR_mcause], pContext->regs[Reg_ra], pContext->regs[Reg_sp], pContext->regs[Reg_tp] ); } #endif if (pContext->reg_trace_file) { int sz; sz = RISCV_sprintf(tstr, sizeof(tstr),"%8I64d [%08x] %08x: ", pContext->step_cnt, static_cast<uint32_t>(pContext->pc), rpayload[0]); bool reg_changed = false; for (int i = 0; i < 32; i++) { if (iregs_prev[i] != pContext->regs[i]) { reg_changed = true; sz += RISCV_sprintf(&tstr[sz], sizeof(tstr) - sz, "%3s <= %016I64x\n", IREGS_NAMES[i], pContext->regs[i]); } } if (!reg_changed) { sz += RISCV_sprintf(&tstr[sz], sizeof(tstr) - sz, "%s", "-\n"); } (*pContext->reg_trace_file) << tstr; pContext->reg_trace_file->flush(); } if (generateRegTraceFile_.to_bool()) { char msg[16]; int msg_len = 0; IService *uart = NULL; switch (pContext->step_cnt) { case 6000: uart = static_cast<IService *>(RISCV_get_service("uart0")); msg[0] = 'h'; msg[1] = 'i'; msg_len = 2; break; case 6500: uart = static_cast<IService *>(RISCV_get_service("uart0")); msg[0] = 'g'; msg[1] = 'h'; msg[2] = 't'; msg_len = 3; break; case 8200: uart = static_cast<IService *>(RISCV_get_service("uart0")); msg[0] = 'i'; msg[1] = 'c'; msg_len = 2; break; case 8300: uart = static_cast<IService *>(RISCV_get_service("uart0")); msg[0] = 'k'; msg[1] = 's'; msg[2] = '\r'; msg[3] = '\n'; msg_len = 4; break; default:; } if (uart) { ISerial *iserial = static_cast<ISerial *>( uart->getInterface(IFACE_SERIAL)); //iserial->writeData("pnp\r\n", 6); //iserial->writeData("highticks\r\n", 11); iserial->writeData(msg, msg_len); } } if (pContext->regs[0] != 0) { RISCV_error("Register x0 was modificated (not equal to zero)", NULL); } }
void UART::transaction(Axi4TransactionType *payload) { uint64_t mask = (length_.to_uint64() - 1); uint64_t off = ((payload->addr - getBaseAddress()) & mask) / 4; char wrdata; if (payload->rw) { for (uint64_t i = 0; i < payload->xsize/4; i++) { if ((payload->wstrb & (0xf << 4*i)) == 0) { continue; } switch (off + i) { case 0: wrdata = static_cast<char>(payload->wpayload[i]); RISCV_info("Set data = %s", ®s_.data); for (unsigned n = 0; n < listeners_.size(); n++) { IRawListener *lstn = static_cast<IRawListener *>( listeners_[n].to_iface()); lstn->updateData(&wrdata, 1); } break; case 1: regs_.status = payload->wpayload[i]; RISCV_info("Set status = %08x", regs_.status); break; case 2: regs_.scaler = payload->wpayload[i]; RISCV_info("Set scaler = %d", regs_.scaler); break; default:; } } } else { for (uint64_t i = 0; i < payload->xsize/4; i++) { switch (off + i) { case 0: if (rx_total_ == 0) { payload->rpayload[i] = 0; } else { payload->rpayload[i] = *p_rx_rd_; rx_total_--; if ((++p_rx_rd_) >= (rxfifo_ + RX_FIFO_SIZE)) { p_rx_rd_ = rxfifo_; } } RISCV_debug("Get data = %02x", (payload->rpayload[i] & 0xFF)); break; case 1: regs_.status = UART_STATUS_TX_EMPTY; if (rx_total_ == 0) { regs_.status |= UART_STATUS_RX_EMPTY; } payload->rpayload[i] = regs_.status; RISCV_info("Get status = %08x", regs_.status); break; case 2: payload->rpayload[i] = regs_.scaler; RISCV_info("Get scaler = %d", regs_.scaler); break; default: payload->rpayload[i] = ~0; } } } }