// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "crashdumpwriter_vfs.hpp" #include #include #include "purefs/vfs_subsystem.hpp" #include #include namespace crashdump { constexpr inline auto crashDumpFileName = "crashdump.hex"; void CrashDumpWriterVFS::openDump() { vfs = purefs::subsystem::vfs_core(); const auto crashDumpFilePath = purefs::dir::getCrashDumpsPath() / crashDumpFileName; if (!rotator.rotateFile(crashDumpFilePath)) { LOG_FATAL("Failed to rotate crash dumps."); } dumpFd = vfs->open(crashDumpFilePath.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0666); if (dumpFd < 0) { LOG_FATAL("Failed to open crash dump file. Won't be able to save crash info."); } } void CrashDumpWriterVFS::saveDump() { vfs->close(dumpFd); } void CrashDumpWriterVFS::writeBytes(const uint8_t *buff, std::size_t size) { vfs->write(dumpFd, reinterpret_cast(buff), size); } void CrashDumpWriterVFS::writeHalfWords(const uint16_t *buff, std::size_t size) { for (std::size_t n = 0; n < size; ++n) { writeBytes(reinterpret_cast(buff + n), sizeof(uint16_t)); } } void CrashDumpWriterVFS::writeWords(const uint32_t *buff, std::size_t size) { for (std::size_t n = 0; n < size; ++n) { writeBytes(reinterpret_cast(buff + n), sizeof(uint32_t)); } } CrashDumpWriter &CrashDumpWriter::instance() { static CrashDumpWriterVFS writer; return writer; } } // namespace crashdump