From 780dffb9ab9fb0ba0444ed5b54140ba84b497381 Mon Sep 17 00:00:00 2001 From: Niklas Eiling Date: Fri, 15 Nov 2024 13:21:17 +0100 Subject: [PATCH] fpga: fix configCrossBar crashing if src or dest are nullptr Signed-off-by: Niklas Eiling --- fpga/include/villas/fpga/utils.hpp | 2 +- fpga/lib/dma.cpp | 5 ++++- fpga/lib/utils.cpp | 20 ++++++++++++++++---- fpga/src/villas-fpga-ctrl.cpp | 5 ++++- lib/nodes/fpga.cpp | 5 ++++- 5 files changed, 29 insertions(+), 8 deletions(-) diff --git a/fpga/include/villas/fpga/utils.hpp b/fpga/include/villas/fpga/utils.hpp index b078936fb..ce1b29759 100644 --- a/fpga/include/villas/fpga/utils.hpp +++ b/fpga/include/villas/fpga/utils.hpp @@ -42,7 +42,7 @@ public: ConnectString(std::string &connectString, int maxPortNum = 7); void parseString(std::string &connectString); int portStringToInt(std::string &str) const; - void configCrossBar(std::shared_ptr card) const; + bool configCrossBar(std::shared_ptr card) const; bool isBidirectional() const { return bidirectional; }; bool isDmaLoopback() const { return srcType == ConnectType::LOOPBACK; }; bool isSrcStdin() const { return srcType == ConnectType::DMA; }; diff --git a/fpga/lib/dma.cpp b/fpga/lib/dma.cpp index 7ce10b2b5..44178a0d0 100644 --- a/fpga/lib/dma.cpp +++ b/fpga/lib/dma.cpp @@ -65,7 +65,10 @@ villasfpga_handle villasfpga_init(const char *configFile) { // Configure Crossbar switch const fpga::ConnectString parsedConnectString(connectStr); - parsedConnectString.configCrossBar(handle->card); + if (!parsedConnectString.configCrossBar(handle->card)) { + logger->error("Failed to configure crossbar"); + return nullptr; + } return handle; } catch (const RuntimeError &e) { diff --git a/fpga/lib/utils.cpp b/fpga/lib/utils.cpp index be0f20b8a..4971b11f4 100644 --- a/fpga/lib/utils.cpp +++ b/fpga/lib/utils.cpp @@ -130,20 +130,20 @@ int fpga::ConnectString::portStringToInt(std::string &str) const { } // parses a string like "1->2" or "1<->stdout" and configures the crossbar accordingly -void fpga::ConnectString::configCrossBar( +bool fpga::ConnectString::configCrossBar( std::shared_ptr card) const { auto dma = std::dynamic_pointer_cast( card->lookupIp(fpga::Vlnv("xilinx.com:ip:axi_dma:"))); if (dma == nullptr) { logger->error("No DMA found on FPGA "); - throw std::runtime_error("No DMA found on FPGA"); + return false; } if (isDmaLoopback()) { log->info("Configuring DMA loopback"); dma->connectLoopback(); - return; + return true; } auto aurora_channels = getAuroraChannels(card); @@ -176,7 +176,12 @@ void fpga::ConnectString::configCrossBar( } else if (aurora_channels->size() > 0) { src = (*aurora_channels)[srcAsInt]; } else { - throw std::runtime_error("No Aurora channels found on FPGA"); + logger->error("No Aurora channels found on FPGA"); + return false; + } + if (!src) { + logger->error("Source does not exist"); + return false; } if (dinoDac && dstType == ConnectType::DINO) { @@ -185,6 +190,13 @@ void fpga::ConnectString::configCrossBar( dest = dma; } else if (aurora_channels->size() > 0) { dest = (*aurora_channels)[dstAsInt]; + } else { + logger->error("No Aurora channels found on FPGA"); + return false; + } + if (!dest) { + logger->error("Destination does not exist"); + return false; } src->connect(src->getDefaultMasterPort(), dest->getDefaultSlavePort()); diff --git a/fpga/src/villas-fpga-ctrl.cpp b/fpga/src/villas-fpga-ctrl.cpp index ccf034199..d475bcc30 100644 --- a/fpga/src/villas-fpga-ctrl.cpp +++ b/fpga/src/villas-fpga-ctrl.cpp @@ -186,7 +186,10 @@ int main(int argc, char *argv[]) { // Configure Crossbar switch for (std::string str : connectStr) { const fpga::ConnectString parsedConnectString(str); - parsedConnectString.configCrossBar(card); + if (!parsedConnectString.configCrossBar(card)) { + logger->error("Failed to configure crossbar"); + return -1; + } if (parsedConnectString.isSrcStdin()) { readFromStdin = true; if (parsedConnectString.isBidirectional()) { diff --git a/lib/nodes/fpga.cpp b/lib/nodes/fpga.cpp index 3e12653c2..8309341b1 100644 --- a/lib/nodes/fpga.cpp +++ b/lib/nodes/fpga.cpp @@ -69,7 +69,10 @@ int FpgaNode::prepare() { // Configure Crossbar switch for (std::string str : connectStrings) { const fpga::ConnectString parsedConnectString(str); - parsedConnectString.configCrossBar(card); + if (!parsedConnectString.configCrossBar(card)) { + logger->error("Failed to configure crossbar"); + return -1; + } } auto reg = std::dynamic_pointer_cast(