diff --git a/src/arch/generic/semihosting.cc b/src/arch/generic/semihosting.cc index 908638fc80..00ac7c1576 100644 --- a/src/arch/generic/semihosting.cc +++ b/src/arch/generic/semihosting.cc @@ -94,7 +94,7 @@ const std::map BaseSemihosting::exitCodes{ {0x20029, "semi:ADP_Stopped_DivisionByZero"}, }; -const std::vector BaseSemihosting::features{ +const std::array BaseSemihosting::features{ 0x53, 0x48, 0x46, 0x42, // Magic 0x3, // EXT_EXIT_EXTENDED, EXT_STDOUT_STDERR }; @@ -655,13 +655,19 @@ FileFeatures(BaseSemihosting &_parent, const char *_name, const char *_mode) : FileBase(_parent, _name, _mode) {} +int64_t +BaseSemihosting::FileFeatures::flen() +{ + return features.size(); +} + int64_t BaseSemihosting::FileFeatures::read(uint8_t *buffer, uint64_t size) { int64_t len = 0; - for (; pos < size && pos < BaseSemihosting::features.size(); pos++) - buffer[len++] = BaseSemihosting::features[pos]; + for (; len < size && pos < features.size(); pos++) + buffer[len++] = features[pos]; return len; } diff --git a/src/arch/generic/semihosting.hh b/src/arch/generic/semihosting.hh index 975cac8b78..8725e25389 100644 --- a/src/arch/generic/semihosting.hh +++ b/src/arch/generic/semihosting.hh @@ -323,9 +323,10 @@ class BaseSemihosting : public SimObject int64_t read(uint8_t *buffer, uint64_t size) override; int64_t seek(uint64_t pos) override; + int64_t flen() override; protected: - size_t pos; + size_t pos = 0; }; class File : public FileBase @@ -540,7 +541,7 @@ class BaseSemihosting : public SimObject static const std::vector fmodes; static const std::map exitCodes; - static const std::vector features; + static const std::array features; static const std::map stdioMap; // used in callTmpNam() to deterministically generate a temp filename