diff --git a/src/virtual_machine.cpp b/src/virtual_machine.cpp index f1115b1..6af1ed4 100644 --- a/src/virtual_machine.cpp +++ b/src/virtual_machine.cpp @@ -88,7 +88,7 @@ void randomx_vm::initialize() { config.readReg2 = 4 + (addressRegisters & 1); addressRegisters >>= 1; config.readReg3 = 6 + (addressRegisters & 1); - datasetOffset = (program.getEntropy(13) & randomx::DatasetExtraItems) * randomx::CacheLineSize; + datasetOffset = (program.getEntropy(13) % (randomx::DatasetExtraItems + 1)) * randomx::CacheLineSize; store64(&config.eMask[0], randomx::getFloatMask(program.getEntropy(14))); store64(&config.eMask[1], randomx::getFloatMask(program.getEntropy(15))); } diff --git a/src/virtual_machine.hpp b/src/virtual_machine.hpp index eb33e1f..f9fddaf 100644 --- a/src/virtual_machine.hpp +++ b/src/virtual_machine.hpp @@ -60,7 +60,7 @@ protected: randomx_cache* cachePtr = nullptr; randomx_dataset* datasetPtr; }; - uint32_t datasetOffset; + uint64_t datasetOffset; }; namespace randomx { diff --git a/src/vm_interpreted.cpp b/src/vm_interpreted.cpp index f62b536..25dc466 100644 --- a/src/vm_interpreted.cpp +++ b/src/vm_interpreted.cpp @@ -273,7 +273,7 @@ namespace randomx { } template - void InterpretedVm::datasetRead(uint32_t address, int_reg_t(&r)[RegistersCount]) { + void InterpretedVm::datasetRead(uint64_t address, int_reg_t(&r)[RegistersCount]) { uint64_t* datasetLine = (uint64_t*)(mem.memory + address); for (int i = 0; i < RegistersCount; ++i) r[i] ^= datasetLine[i]; diff --git a/src/vm_interpreted.hpp b/src/vm_interpreted.hpp index 246cecd..9fb137c 100644 --- a/src/vm_interpreted.hpp +++ b/src/vm_interpreted.hpp @@ -80,7 +80,7 @@ namespace randomx { void run(void* seed) override; void setDataset(randomx_dataset* dataset) override; protected: - virtual void datasetRead(uint32_t blockNumber, int_reg_t(&r)[RegistersCount]); + virtual void datasetRead(uint64_t blockNumber, int_reg_t(&r)[RegistersCount]); private: void execute(); void precompileProgram(int_reg_t(&r)[RegistersCount], rx_vec_f128(&f)[RegisterCountFlt], rx_vec_f128(&e)[RegisterCountFlt], rx_vec_f128(&a)[RegisterCountFlt]); diff --git a/src/vm_interpreted_light.cpp b/src/vm_interpreted_light.cpp index c4b5651..c54b32f 100644 --- a/src/vm_interpreted_light.cpp +++ b/src/vm_interpreted_light.cpp @@ -38,7 +38,7 @@ namespace randomx { } template - void InterpretedLightVm::datasetRead(uint32_t address, int_reg_t(&r)[8]) { + void InterpretedLightVm::datasetRead(uint64_t address, int_reg_t(&r)[8]) { uint32_t itemNumber = address / CacheLineSize; int_reg_t rl[8]; diff --git a/src/vm_interpreted_light.hpp b/src/vm_interpreted_light.hpp index d581a7f..f3cc2c6 100644 --- a/src/vm_interpreted_light.hpp +++ b/src/vm_interpreted_light.hpp @@ -50,7 +50,7 @@ namespace randomx { void setDataset(randomx_dataset* dataset) override { } void setCache(randomx_cache* cache) override; protected: - void datasetRead(uint32_t address, int_reg_t(&r)[8]) override; + void datasetRead(uint64_t address, int_reg_t(&r)[8]) override; }; using InterpretedLightVmDefault = InterpretedLightVm, true>;