--- nono/vm/zram.cpp 2026/04/29 17:04:28 1.1 +++ nono/vm/zram.cpp 2026/04/29 17:04:56 1.1.1.4 @@ -1,6 +1,7 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #include "zram.h" @@ -12,31 +13,36 @@ // バイトアクセス、ワードアクセス時は HLB(), HLW() マクロ使用のこと。 // -ZRAMDevice *gZRAM; +std::unique_ptr gZRAM; ZRAMDevice::ZRAMDevice() + : inherited("ZRAM") { - logname = "zram"; - devname = "ZRAM"; devaddr = 0x71000000; devlen = 128 * 1024; - ram = new uint8[devlen]; + ram.reset(new uint8[devlen]); } ZRAMDevice::~ZRAMDevice() { } -// たぶん 128KB で折り返しイメージが見えるはず。要確認。 +// アドレスデコーダ +inline uint64 +ZRAMDevice::Decoder(uint32 addr) const +{ + // たぶん 128KB で折り返しイメージが見えるはず。要確認。 + return addr % devlen; +} uint64 ZRAMDevice::Read8(uint32 addr) { std::unique_lock lock(mtx); - uint32 an = addr % devlen; - uint32 data = ram[HLB(an)]; + uint32 offset = Decoder(addr); + uint32 data = ram[HLB(offset)]; return data; } @@ -45,8 +51,8 @@ ZRAMDevice::Read16(uint32 addr) { std::unique_lock lock(mtx); - uint32 an = addr % devlen; - uint32 data = *(uint16 *)&ram[HLW(an)]; + uint32 offset = Decoder(addr); + uint32 data = *(uint16 *)&ram[HLW(offset)]; return data; } @@ -55,8 +61,8 @@ ZRAMDevice::Read32(uint32 addr) { std::unique_lock lock(mtx); - uint32 an = addr % devlen; - uint32 data = *(uint32 *)&ram[an]; + uint32 offset = Decoder(addr); + uint32 data = *(uint32 *)&ram[offset]; return data; } @@ -65,8 +71,8 @@ ZRAMDevice::Write8(uint32 addr, uint32 d { std::unique_lock lock(mtx); - uint32 an = addr % devlen; - ram[HLB(an)] = data; + uint32 offset = Decoder(addr); + ram[HLB(offset)] = data; return 0; } @@ -75,8 +81,8 @@ ZRAMDevice::Write16(uint32 addr, uint32 { std::unique_lock lock(mtx); - uint32 an = addr % devlen; - *(uint16 *)&ram[HLW(an)] = data; + uint32 offset = Decoder(addr); + *(uint16 *)&ram[HLW(offset)] = data; return 0; } @@ -85,8 +91,8 @@ ZRAMDevice::Write32(uint32 addr, uint32 { std::unique_lock lock(mtx); - uint32 an = addr % devlen; - *(uint32 *)&ram[an] = data; + uint32 offset = Decoder(addr); + *(uint32 *)&ram[offset] = data; return 0; } @@ -95,6 +101,6 @@ ZRAMDevice::Peek8(uint32 addr) { std::unique_lock lock(mtx); - uint32 an = addr % devlen; - return ram[HLB(an)]; + uint32 offset = Decoder(addr); + return ram[HLB(offset)]; }