--- nono/vm/sram.cpp 2026/04/29 17:04:28 1.1 +++ nono/vm/sram.cpp 2026/04/29 17:04:30 1.1.1.2 @@ -7,6 +7,7 @@ #include "sram.h" #include #include +#include // // SRAM @@ -43,19 +44,40 @@ SRAMDevice::~SRAMDevice() bool SRAMDevice::Init() { + struct stat st; + filename = gConfig->GetConfigDir() + "SRAM030.DAT"; + memlen = 16 * 1024; fd = open(filename.c_str(), O_RDWR); if (fd == -1) { - warn("%s: cannot open %s", devname, filename.c_str()); + warn("SRAM \"%s\" open failed", filename.c_str()); return false; } - memlen = 16 * 1024; + // ファイルサイズをチェック。 + // ファイルが短くても mmap はしれっと成功してしまうようだ。 + if (fstat(fd, &st) == -1) { + warn("SRAM \"%s\" fstat failed", filename.c_str()); + close(fd); + return false; + } + if (st.st_size < memlen) { + warnx("SRAM \"%s\" is too short (filesize is expected %d but %d)", + filename.c_str(), memlen, (int)st.st_size); + close(fd); + return false; + } + if (st.st_size > memlen) { + // 大きすぎるほうはワーニングだけでいいか + warnx("SRAM \"%s\" is too large (ignore %d bytes)", + filename.c_str(), (int)st.st_size - memlen); + } + mem = (uint8 *)mmap(NULL, memlen, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (mem == MAP_FAILED) { - warn("%s: cannot mmap %s", devname, filename.c_str()); + warn("SRAM \"%s\" mmap failed", filename.c_str()); close(fd); return false; }