--- nono/vm/mk48t02.cpp 2026/04/29 17:04:28 1.1 +++ nono/vm/mk48t02.cpp 2026/04/29 17:04:29 1.1.1.2 @@ -7,6 +7,7 @@ #include "configfile.h" #include #include +#include // // MK48T02 @@ -42,21 +43,42 @@ MK48T02Device::~MK48T02Device() bool MK48T02Device::Init() { + struct stat st; + // ファイルのロード filename = gConfig->GetConfigDir() + "NVRAM.DAT"; + memlen = 2040; fd = open(filename.c_str(), O_RDWR); if (fd == -1) { - warn("%s: cannot open %s", devname, filename.c_str()); + warn("NVRAM \"%s\" open failed", filename.c_str()); return false; } - memlen = 2040; + // ファイルサイズをチェック。 + // ファイルが短くても mmap はしれっと成功してしまうようだ。 + if (fstat(fd, &st) == -1) { + warn("NVRAM \"%s\" fstat failed", filename.c_str()); + close(fd); + return false; + } + if (st.st_size < memlen) { + warnx("NVRAM \"%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("NVRAM \"%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("NVRAM \"%s\" mmap failed", filename.c_str()); close(fd); - warn("%s: cannot mmap %s", devname, filename.c_str()); return false; }