From 9d466fb8936ee6e20315bb2925d7f9acf14fb1a5 Mon Sep 17 00:00:00 2001 From: Nicholas Dietz Date: Mon, 15 Jun 2026 17:22:43 -0500 Subject: [PATCH] xilinx: fail write-flash on SPI access errors; improve open-file errors --- src/main.cpp | 4 ++-- src/xilinx.cpp | 29 +++++++++++++++++------------ 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 44de606..4acfec1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -804,14 +804,14 @@ int spi_comm(struct arguments args, const cable_t &cable, bit = new RawParser(args.bit_file, false); printSuccess("DONE"); } catch (std::exception &e) { - printError("FAIL"); + printError("FAIL: unable to open '" + args.bit_file + "': " + std::string(e.what())); delete spi; return EXIT_FAILURE; } printInfo("Parse file ", false); if (bit->parse() == EXIT_FAILURE) { - printError("FAIL"); + printError("FAIL: unable to parse '" + args.bit_file + "'"); delete bit; delete spi; return EXIT_FAILURE; diff --git a/src/xilinx.cpp b/src/xilinx.cpp index efeec19..6060e27 100644 --- a/src/xilinx.cpp +++ b/src/xilinx.cpp @@ -186,20 +186,24 @@ static void open_bitfile( const std::string &filename, const std::string &extension, ConfigBitstreamParser **parser, bool reverse, bool verbose) { - printInfo("Open file ", false); - if (extension == "bit") { - *parser = new BitParser(filename, reverse, verbose); - } else if (extension == "mcs") { - *parser = new McsParser(filename, reverse, verbose); - } else { - *parser = new RawParser(filename, reverse); + printInfo("Open file " + filename + " ", false); + try { + if (extension == "bit") { + *parser = new BitParser(filename, reverse, verbose); + } else if (extension == "mcs") { + *parser = new McsParser(filename, reverse, verbose); + } else { + *parser = new RawParser(filename, reverse); + } + } catch (const std::exception &e) { + throw std::runtime_error("Unable to open '" + filename + "': " + e.what()); } printSuccess("DONE"); printInfo("Parse file ", false); if ((*parser)->parse() == EXIT_FAILURE) { - throw std::runtime_error("Failed to parse bitstream"); + throw std::runtime_error("Failed to parse bitstream '" + filename + "'"); } printSuccess("DONE"); @@ -634,12 +638,11 @@ void Xilinx::program(unsigned int offset, bool unprotect_flash) &secondary_bit, reverse, _verbose); } } catch (std::exception &e) { - printError("FAIL"); if (bit) delete bit; if (secondary_bit) delete secondary_bit; - return; + throw std::runtime_error(e.what()); } if (_verbose) { @@ -842,11 +845,13 @@ void Xilinx::program_spi(ConfigBitstreamParser * bit, std::string extention, throw std::runtime_error("called with null bitstream"); if (extention == "mcs") { McsParser *parser = (McsParser *)bit; - FlashInterface::write(parser->getRecords(), unprotect_flash, true); + if (!FlashInterface::write(parser->getRecords(), unprotect_flash, true)) + throw std::runtime_error("SPI flash write failed"); } else { const uint8_t *data = bit->getData(); int length = bit->getLength() / 8; - FlashInterface::write(offset, data, length, unprotect_flash); + if (!FlashInterface::write(offset, data, length, unprotect_flash)) + throw std::runtime_error("SPI flash write failed"); } }