mirror of
https://git.wownero.com/wownero/RandomWOW.git
synced 2024-12-22 15:58:53 +00:00
Optional W^X policy for JIT pages (#112)
This commit is contained in:
parent
971f10c9c2
commit
67010ab554
@ -140,8 +140,10 @@ namespace randomx {
|
|||||||
|
|
||||||
void initCacheCompile(randomx_cache* cache, const void* key, size_t keySize) {
|
void initCacheCompile(randomx_cache* cache, const void* key, size_t keySize) {
|
||||||
initCache(cache, key, keySize);
|
initCache(cache, key, keySize);
|
||||||
|
cache->jit->enableWriting();
|
||||||
cache->jit->generateSuperscalarHash(cache->programs, cache->reciprocalCache);
|
cache->jit->generateSuperscalarHash(cache->programs, cache->reciprocalCache);
|
||||||
cache->jit->generateDatasetInitCode();
|
cache->jit->generateDatasetInitCode();
|
||||||
|
cache->jit->enableExecution();
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr uint64_t superscalarMul0 = 6364136223846793005ULL;
|
constexpr uint64_t superscalarMul0 = 6364136223846793005ULL;
|
||||||
|
@ -218,7 +218,7 @@ namespace randomx {
|
|||||||
}
|
}
|
||||||
|
|
||||||
JitCompilerX86::JitCompilerX86() {
|
JitCompilerX86::JitCompilerX86() {
|
||||||
code = (uint8_t*)allocExecutableMemory(CodeSize);
|
code = (uint8_t*)allocMemoryPages(CodeSize);
|
||||||
memcpy(code, codePrologue, prologueSize);
|
memcpy(code, codePrologue, prologueSize);
|
||||||
memcpy(code + epilogueOffset, codeEpilogue, epilogueSize);
|
memcpy(code + epilogueOffset, codeEpilogue, epilogueSize);
|
||||||
}
|
}
|
||||||
@ -227,6 +227,18 @@ namespace randomx {
|
|||||||
freePagedMemory(code, CodeSize);
|
freePagedMemory(code, CodeSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JitCompilerX86::enableAll() {
|
||||||
|
setPagesRWX(code, CodeSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JitCompilerX86::enableWriting() {
|
||||||
|
setPagesRW(code, CodeSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JitCompilerX86::enableExecution() {
|
||||||
|
setPagesRX(code, CodeSize);
|
||||||
|
}
|
||||||
|
|
||||||
void JitCompilerX86::generateProgram(Program& prog, ProgramConfiguration& pcfg) {
|
void JitCompilerX86::generateProgram(Program& prog, ProgramConfiguration& pcfg) {
|
||||||
generateProgramPrologue(prog, pcfg);
|
generateProgramPrologue(prog, pcfg);
|
||||||
memcpy(code + codePos, codeReadDataset, readDatasetSize);
|
memcpy(code + codePos, codeReadDataset, readDatasetSize);
|
||||||
|
@ -62,6 +62,9 @@ namespace randomx {
|
|||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
size_t getCodeSize();
|
size_t getCodeSize();
|
||||||
|
void enableWriting();
|
||||||
|
void enableExecution();
|
||||||
|
void enableAll();
|
||||||
private:
|
private:
|
||||||
static InstructionGeneratorX86 engine[256];
|
static InstructionGeneratorX86 engine[256];
|
||||||
std::vector<int32_t> instructionOffsets;
|
std::vector<int32_t> instructionOffsets;
|
||||||
|
@ -175,11 +175,21 @@ extern "C" {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case RANDOMX_FLAG_JIT:
|
case RANDOMX_FLAG_JIT:
|
||||||
vm = new randomx::CompiledLightVmDefault();
|
if (flags & RANDOMX_FLAG_SECURE) {
|
||||||
|
vm = new randomx::CompiledLightVmDefaultSecure();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vm = new randomx::CompiledLightVmDefault();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT:
|
case RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT:
|
||||||
vm = new randomx::CompiledVmDefault();
|
if (flags & RANDOMX_FLAG_SECURE) {
|
||||||
|
vm = new randomx::CompiledVmDefaultSecure();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vm = new randomx::CompiledVmDefault();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RANDOMX_FLAG_HARD_AES:
|
case RANDOMX_FLAG_HARD_AES:
|
||||||
@ -191,11 +201,21 @@ extern "C" {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES:
|
case RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES:
|
||||||
vm = new randomx::CompiledLightVmHardAes();
|
if (flags & RANDOMX_FLAG_SECURE) {
|
||||||
|
vm = new randomx::CompiledLightVmHardAesSecure();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vm = new randomx::CompiledLightVmHardAes();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES:
|
case RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES:
|
||||||
vm = new randomx::CompiledVmHardAes();
|
if (flags & RANDOMX_FLAG_SECURE) {
|
||||||
|
vm = new randomx::CompiledVmHardAesSecure();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vm = new randomx::CompiledVmHardAes();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RANDOMX_FLAG_LARGE_PAGES:
|
case RANDOMX_FLAG_LARGE_PAGES:
|
||||||
@ -207,11 +227,21 @@ extern "C" {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case RANDOMX_FLAG_JIT | RANDOMX_FLAG_LARGE_PAGES:
|
case RANDOMX_FLAG_JIT | RANDOMX_FLAG_LARGE_PAGES:
|
||||||
vm = new randomx::CompiledLightVmLargePage();
|
if (flags & RANDOMX_FLAG_SECURE) {
|
||||||
|
vm = new randomx::CompiledLightVmLargePageSecure();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vm = new randomx::CompiledLightVmLargePage();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT | RANDOMX_FLAG_LARGE_PAGES:
|
case RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT | RANDOMX_FLAG_LARGE_PAGES:
|
||||||
vm = new randomx::CompiledVmLargePage();
|
if (flags & RANDOMX_FLAG_SECURE) {
|
||||||
|
vm = new randomx::CompiledVmLargePageSecure();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vm = new randomx::CompiledVmLargePage();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RANDOMX_FLAG_HARD_AES | RANDOMX_FLAG_LARGE_PAGES:
|
case RANDOMX_FLAG_HARD_AES | RANDOMX_FLAG_LARGE_PAGES:
|
||||||
@ -223,11 +253,21 @@ extern "C" {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES | RANDOMX_FLAG_LARGE_PAGES:
|
case RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES | RANDOMX_FLAG_LARGE_PAGES:
|
||||||
vm = new randomx::CompiledLightVmLargePageHardAes();
|
if (flags & RANDOMX_FLAG_SECURE) {
|
||||||
|
vm = new randomx::CompiledLightVmLargePageHardAesSecure();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vm = new randomx::CompiledLightVmLargePageHardAes();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES | RANDOMX_FLAG_LARGE_PAGES:
|
case RANDOMX_FLAG_FULL_MEM | RANDOMX_FLAG_JIT | RANDOMX_FLAG_HARD_AES | RANDOMX_FLAG_LARGE_PAGES:
|
||||||
vm = new randomx::CompiledVmLargePageHardAes();
|
if (flags & RANDOMX_FLAG_SECURE) {
|
||||||
|
vm = new randomx::CompiledVmLargePageHardAesSecure();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
vm = new randomx::CompiledVmLargePageHardAes();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -44,6 +44,7 @@ typedef enum {
|
|||||||
RANDOMX_FLAG_HARD_AES = 2,
|
RANDOMX_FLAG_HARD_AES = 2,
|
||||||
RANDOMX_FLAG_FULL_MEM = 4,
|
RANDOMX_FLAG_FULL_MEM = 4,
|
||||||
RANDOMX_FLAG_JIT = 8,
|
RANDOMX_FLAG_JIT = 8,
|
||||||
|
RANDOMX_FLAG_SECURE = 16
|
||||||
} randomx_flags;
|
} randomx_flags;
|
||||||
|
|
||||||
typedef struct randomx_dataset randomx_dataset;
|
typedef struct randomx_dataset randomx_dataset;
|
||||||
@ -135,12 +136,14 @@ RANDOMX_EXPORT void randomx_release_dataset(randomx_dataset *dataset);
|
|||||||
/**
|
/**
|
||||||
* Creates and initializes a RandomX virtual machine.
|
* Creates and initializes a RandomX virtual machine.
|
||||||
*
|
*
|
||||||
* @param flags is any combination of these 4 flags (each flag can be set or not set):
|
* @param flags is any combination of these 5 flags (each flag can be set or not set):
|
||||||
* RANDOMX_FLAG_LARGE_PAGES - allocate scratchpad memory in large pages
|
* RANDOMX_FLAG_LARGE_PAGES - allocate scratchpad memory in large pages
|
||||||
* RANDOMX_FLAG_HARD_AES - virtual machine will use hardware accelerated AES
|
* RANDOMX_FLAG_HARD_AES - virtual machine will use hardware accelerated AES
|
||||||
* RANDOMX_FLAG_FULL_MEM - virtual machine will use the full dataset
|
* RANDOMX_FLAG_FULL_MEM - virtual machine will use the full dataset
|
||||||
* RANDOMX_FLAG_JIT - virtual machine will use a JIT compiler
|
* RANDOMX_FLAG_JIT - virtual machine will use a JIT compiler
|
||||||
* The numeric values of the flags are ordered so that a higher value will provide
|
* RANDOMX_FLAG_SECURE - when combined with RANDOMX_FLAG_JIT, the JIT pages are never
|
||||||
|
* writable and executable at the same time (W^X policy)
|
||||||
|
* The numeric values of the first 4 flags are ordered so that a higher value will provide
|
||||||
* faster hash calculation and a lower numeric value will provide higher portability.
|
* faster hash calculation and a lower numeric value will provide higher portability.
|
||||||
* Using RANDOMX_FLAG_DEFAULT (all flags not set) works on all platforms, but is the slowest.
|
* Using RANDOMX_FLAG_DEFAULT (all flags not set) works on all platforms, but is the slowest.
|
||||||
* @param cache is a pointer to an initialized randomx_cache structure. Can be
|
* @param cache is a pointer to an initialized randomx_cache structure. Can be
|
||||||
|
@ -82,6 +82,7 @@ void printUsage(const char* executable) {
|
|||||||
std::cout << " --mine mining mode: 2080 MiB" << std::endl;
|
std::cout << " --mine mining mode: 2080 MiB" << std::endl;
|
||||||
std::cout << " --verify verification mode: 256 MiB" << std::endl;
|
std::cout << " --verify verification mode: 256 MiB" << std::endl;
|
||||||
std::cout << " --jit x86-64 JIT compiled mode (default: interpreter)" << std::endl;
|
std::cout << " --jit x86-64 JIT compiled mode (default: interpreter)" << std::endl;
|
||||||
|
std::cout << " --secure W^X policy for JIT pages (default: off)" << std::endl;
|
||||||
std::cout << " --largePages use large pages" << std::endl;
|
std::cout << " --largePages use large pages" << std::endl;
|
||||||
std::cout << " --softAes use software AES (default: x86 AES-NI)" << std::endl;
|
std::cout << " --softAes use software AES (default: x86 AES-NI)" << std::endl;
|
||||||
std::cout << " --threads T use T threads (default: 1)" << std::endl;
|
std::cout << " --threads T use T threads (default: 1)" << std::endl;
|
||||||
@ -126,7 +127,7 @@ void mine(randomx_vm* vm, std::atomic<uint32_t>& atomicNonce, AtomicHash& result
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
bool softAes, miningMode, verificationMode, help, largePages, jit;
|
bool softAes, miningMode, verificationMode, help, largePages, jit, secure;
|
||||||
int noncesCount, threadCount, initThreadCount;
|
int noncesCount, threadCount, initThreadCount;
|
||||||
uint64_t threadAffinity;
|
uint64_t threadAffinity;
|
||||||
int32_t seedValue;
|
int32_t seedValue;
|
||||||
@ -143,6 +144,7 @@ int main(int argc, char** argv) {
|
|||||||
readOption("--largePages", argc, argv, largePages);
|
readOption("--largePages", argc, argv, largePages);
|
||||||
readOption("--jit", argc, argv, jit);
|
readOption("--jit", argc, argv, jit);
|
||||||
readOption("--help", argc, argv, help);
|
readOption("--help", argc, argv, help);
|
||||||
|
readOption("--secure", argc, argv, secure);
|
||||||
|
|
||||||
store32(&seed, seedValue);
|
store32(&seed, seedValue);
|
||||||
|
|
||||||
@ -171,7 +173,12 @@ int main(int argc, char** argv) {
|
|||||||
|
|
||||||
if (jit) {
|
if (jit) {
|
||||||
flags = (randomx_flags)(flags | RANDOMX_FLAG_JIT);
|
flags = (randomx_flags)(flags | RANDOMX_FLAG_JIT);
|
||||||
std::cout << " - JIT compiled mode" << std::endl;
|
std::cout << " - JIT compiled mode ";
|
||||||
|
if (secure) {
|
||||||
|
flags = (randomx_flags)(flags | RANDOMX_FLAG_SECURE);
|
||||||
|
std::cout << "(secure)";
|
||||||
|
}
|
||||||
|
std::cout << std::endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::cout << " - interpreted mode" << std::endl;
|
std::cout << " - interpreted mode" << std::endl;
|
||||||
|
@ -41,6 +41,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#ifndef MAP_ANONYMOUS
|
#ifndef MAP_ANONYMOUS
|
||||||
#define MAP_ANONYMOUS MAP_ANON
|
#define MAP_ANONYMOUS MAP_ANON
|
||||||
#endif
|
#endif
|
||||||
|
#define PAGE_READONLY PROT_READ
|
||||||
|
#define PAGE_READWRITE (PROT_READ | PROT_WRITE)
|
||||||
|
#define PAGE_EXECUTE_READ (PROT_READ | PROT_EXEC)
|
||||||
|
#define PAGE_EXECUTE_READWRITE (PROT_READ | PROT_WRITE | PROT_EXEC)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_WIN32) || defined(__CYGWIN__)
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
@ -83,20 +87,44 @@ void setPrivilege(const char* pszPrivilege, BOOL bEnable) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void* allocExecutableMemory(std::size_t bytes) {
|
void* allocMemoryPages(std::size_t bytes) {
|
||||||
void* mem;
|
void* mem;
|
||||||
#if defined(_WIN32) || defined(__CYGWIN__)
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
mem = VirtualAlloc(nullptr, bytes, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
mem = VirtualAlloc(nullptr, bytes, MEM_COMMIT, PAGE_READWRITE);
|
||||||
if (mem == nullptr)
|
if (mem == nullptr)
|
||||||
throw std::runtime_error(getErrorMessage("allocExecutableMemory - VirtualAlloc"));
|
throw std::runtime_error(getErrorMessage("allocMemoryPages - VirtualAlloc"));
|
||||||
#else
|
#else
|
||||||
mem = mmap(nullptr, bytes, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
mem = mmap(nullptr, bytes, PAGE_READWRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
||||||
if (mem == MAP_FAILED)
|
if (mem == MAP_FAILED)
|
||||||
throw std::runtime_error("allocExecutableMemory - mmap failed");
|
throw std::runtime_error("allocMemoryPages - mmap failed");
|
||||||
#endif
|
#endif
|
||||||
return mem;
|
return mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void pageProtect(void* ptr, std::size_t bytes, int rules) {
|
||||||
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
DWORD oldp;
|
||||||
|
if (!VirtualProtect(ptr, bytes, (DWORD)rules, &oldp)) {
|
||||||
|
throw std::runtime_error(getErrorMessage("VirtualProtect"));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (-1 == mprotect(ptr, bytes, rules))
|
||||||
|
throw std::runtime_error("mprotect failed");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPagesRW(void* ptr, std::size_t bytes) {
|
||||||
|
pageProtect(ptr, bytes, PAGE_READWRITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPagesRX(void* ptr, std::size_t bytes) {
|
||||||
|
pageProtect(ptr, bytes, PAGE_EXECUTE_READ);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPagesRWX(void* ptr, std::size_t bytes) {
|
||||||
|
pageProtect(ptr, bytes, PAGE_EXECUTE_READWRITE);
|
||||||
|
}
|
||||||
|
|
||||||
void* allocLargePagesMemory(std::size_t bytes) {
|
void* allocLargePagesMemory(std::size_t bytes) {
|
||||||
void* mem;
|
void* mem;
|
||||||
#if defined(_WIN32) || defined(__CYGWIN__)
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
||||||
|
@ -34,6 +34,9 @@ constexpr std::size_t alignSize(std::size_t pos, std::size_t align) {
|
|||||||
return ((pos - 1) / align + 1) * align;
|
return ((pos - 1) / align + 1) * align;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* allocExecutableMemory(std::size_t);
|
void* allocMemoryPages(std::size_t);
|
||||||
|
void setPagesRW(void*, std::size_t);
|
||||||
|
void setPagesRX(void*, std::size_t);
|
||||||
|
void setPagesRWX(void*, std::size_t);
|
||||||
void* allocLargePagesMemory(std::size_t);
|
void* allocLargePagesMemory(std::size_t);
|
||||||
void freePagedMemory(void*, std::size_t);
|
void freePagedMemory(void*, std::size_t);
|
||||||
|
@ -34,27 +34,44 @@ namespace randomx {
|
|||||||
static_assert(sizeof(MemoryRegisters) == 2 * sizeof(addr_t) + sizeof(uintptr_t), "Invalid alignment of struct randomx::MemoryRegisters");
|
static_assert(sizeof(MemoryRegisters) == 2 * sizeof(addr_t) + sizeof(uintptr_t), "Invalid alignment of struct randomx::MemoryRegisters");
|
||||||
static_assert(sizeof(RegisterFile) == 256, "Invalid alignment of struct randomx::RegisterFile");
|
static_assert(sizeof(RegisterFile) == 256, "Invalid alignment of struct randomx::RegisterFile");
|
||||||
|
|
||||||
template<class Allocator, bool softAes>
|
template<class Allocator, bool softAes, bool secureJit>
|
||||||
void CompiledVm<Allocator, softAes>::setDataset(randomx_dataset* dataset) {
|
CompiledVm<Allocator, softAes, secureJit>::CompiledVm() {
|
||||||
|
if (!secureJit) {
|
||||||
|
compiler.enableAll(); //make JIT buffer both writable and executable
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Allocator, bool softAes, bool secureJit>
|
||||||
|
void CompiledVm<Allocator, softAes, secureJit>::setDataset(randomx_dataset* dataset) {
|
||||||
datasetPtr = dataset;
|
datasetPtr = dataset;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Allocator, bool softAes>
|
template<class Allocator, bool softAes, bool secureJit>
|
||||||
void CompiledVm<Allocator, softAes>::run(void* seed) {
|
void CompiledVm<Allocator, softAes, secureJit>::run(void* seed) {
|
||||||
VmBase<Allocator, softAes>::generateProgram(seed);
|
VmBase<Allocator, softAes>::generateProgram(seed);
|
||||||
randomx_vm::initialize();
|
randomx_vm::initialize();
|
||||||
|
if (secureJit) {
|
||||||
|
compiler.enableWriting();
|
||||||
|
}
|
||||||
compiler.generateProgram(program, config);
|
compiler.generateProgram(program, config);
|
||||||
|
if (secureJit) {
|
||||||
|
compiler.enableExecution();
|
||||||
|
}
|
||||||
mem.memory = datasetPtr->memory + datasetOffset;
|
mem.memory = datasetPtr->memory + datasetOffset;
|
||||||
execute();
|
execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Allocator, bool softAes>
|
template<class Allocator, bool softAes, bool secureJit>
|
||||||
void CompiledVm<Allocator, softAes>::execute() {
|
void CompiledVm<Allocator, softAes, secureJit>::execute() {
|
||||||
compiler.getProgramFunc()(reg, mem, scratchpad, RANDOMX_PROGRAM_ITERATIONS);
|
compiler.getProgramFunc()(reg, mem, scratchpad, RANDOMX_PROGRAM_ITERATIONS);
|
||||||
}
|
}
|
||||||
|
|
||||||
template class CompiledVm<AlignedAllocator<CacheLineSize>, false>;
|
template class CompiledVm<AlignedAllocator<CacheLineSize>, false, false>;
|
||||||
template class CompiledVm<AlignedAllocator<CacheLineSize>, true>;
|
template class CompiledVm<AlignedAllocator<CacheLineSize>, true, false>;
|
||||||
template class CompiledVm<LargePageAllocator, false>;
|
template class CompiledVm<LargePageAllocator, false, false>;
|
||||||
template class CompiledVm<LargePageAllocator, true>;
|
template class CompiledVm<LargePageAllocator, true, false>;
|
||||||
|
template class CompiledVm<AlignedAllocator<CacheLineSize>, false, true>;
|
||||||
|
template class CompiledVm<AlignedAllocator<CacheLineSize>, true, true>;
|
||||||
|
template class CompiledVm<LargePageAllocator, false, true>;
|
||||||
|
template class CompiledVm<LargePageAllocator, true, true>;
|
||||||
}
|
}
|
@ -37,7 +37,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
namespace randomx {
|
namespace randomx {
|
||||||
|
|
||||||
template<class Allocator, bool softAes>
|
template<class Allocator, bool softAes, bool secureJit>
|
||||||
class CompiledVm : public VmBase<Allocator, softAes> {
|
class CompiledVm : public VmBase<Allocator, softAes> {
|
||||||
public:
|
public:
|
||||||
void* operator new(size_t size) {
|
void* operator new(size_t size) {
|
||||||
@ -49,6 +49,7 @@ namespace randomx {
|
|||||||
void operator delete(void* ptr) {
|
void operator delete(void* ptr) {
|
||||||
AlignedAllocator<CacheLineSize>::freeMemory(ptr, sizeof(CompiledVm));
|
AlignedAllocator<CacheLineSize>::freeMemory(ptr, sizeof(CompiledVm));
|
||||||
}
|
}
|
||||||
|
CompiledVm();
|
||||||
void setDataset(randomx_dataset* dataset) override;
|
void setDataset(randomx_dataset* dataset) override;
|
||||||
void run(void* seed) override;
|
void run(void* seed) override;
|
||||||
|
|
||||||
@ -65,8 +66,12 @@ namespace randomx {
|
|||||||
JitCompiler compiler;
|
JitCompiler compiler;
|
||||||
};
|
};
|
||||||
|
|
||||||
using CompiledVmDefault = CompiledVm<AlignedAllocator<CacheLineSize>, true>;
|
using CompiledVmDefault = CompiledVm<AlignedAllocator<CacheLineSize>, true, false>;
|
||||||
using CompiledVmHardAes = CompiledVm<AlignedAllocator<CacheLineSize>, false>;
|
using CompiledVmHardAes = CompiledVm<AlignedAllocator<CacheLineSize>, false, false>;
|
||||||
using CompiledVmLargePage = CompiledVm<LargePageAllocator, true>;
|
using CompiledVmLargePage = CompiledVm<LargePageAllocator, true, false>;
|
||||||
using CompiledVmLargePageHardAes = CompiledVm<LargePageAllocator, false>;
|
using CompiledVmLargePageHardAes = CompiledVm<LargePageAllocator, false, false>;
|
||||||
|
using CompiledVmDefaultSecure = CompiledVm<AlignedAllocator<CacheLineSize>, true, true>;
|
||||||
|
using CompiledVmHardAesSecure = CompiledVm<AlignedAllocator<CacheLineSize>, false, true>;
|
||||||
|
using CompiledVmLargePageSecure = CompiledVm<LargePageAllocator, true, true>;
|
||||||
|
using CompiledVmLargePageHardAesSecure = CompiledVm<LargePageAllocator, false, true>;
|
||||||
}
|
}
|
||||||
|
@ -32,23 +32,39 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
namespace randomx {
|
namespace randomx {
|
||||||
|
|
||||||
template<class Allocator, bool softAes>
|
template<class Allocator, bool softAes, bool secureJit>
|
||||||
void CompiledLightVm<Allocator, softAes>::setCache(randomx_cache* cache) {
|
void CompiledLightVm<Allocator, softAes, secureJit>::setCache(randomx_cache* cache) {
|
||||||
cachePtr = cache;
|
cachePtr = cache;
|
||||||
mem.memory = cache->memory;
|
mem.memory = cache->memory;
|
||||||
|
if (secureJit) {
|
||||||
|
compiler.enableWriting();
|
||||||
|
}
|
||||||
compiler.generateSuperscalarHash(cache->programs, cache->reciprocalCache);
|
compiler.generateSuperscalarHash(cache->programs, cache->reciprocalCache);
|
||||||
|
if (secureJit) {
|
||||||
|
compiler.enableExecution();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Allocator, bool softAes>
|
template<class Allocator, bool softAes, bool secureJit>
|
||||||
void CompiledLightVm<Allocator, softAes>::run(void* seed) {
|
void CompiledLightVm<Allocator, softAes, secureJit>::run(void* seed) {
|
||||||
VmBase<Allocator, softAes>::generateProgram(seed);
|
VmBase<Allocator, softAes>::generateProgram(seed);
|
||||||
randomx_vm::initialize();
|
randomx_vm::initialize();
|
||||||
|
if (secureJit) {
|
||||||
|
compiler.enableWriting();
|
||||||
|
}
|
||||||
compiler.generateProgramLight(program, config, datasetOffset);
|
compiler.generateProgramLight(program, config, datasetOffset);
|
||||||
CompiledVm<Allocator, softAes>::execute();
|
if (secureJit) {
|
||||||
|
compiler.enableExecution();
|
||||||
|
}
|
||||||
|
CompiledVm<Allocator, softAes, secureJit>::execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
template class CompiledLightVm<AlignedAllocator<CacheLineSize>, false>;
|
template class CompiledLightVm<AlignedAllocator<CacheLineSize>, false, false>;
|
||||||
template class CompiledLightVm<AlignedAllocator<CacheLineSize>, true>;
|
template class CompiledLightVm<AlignedAllocator<CacheLineSize>, true, false>;
|
||||||
template class CompiledLightVm<LargePageAllocator, false>;
|
template class CompiledLightVm<LargePageAllocator, false, false>;
|
||||||
template class CompiledLightVm<LargePageAllocator, true>;
|
template class CompiledLightVm<LargePageAllocator, true, false>;
|
||||||
|
template class CompiledLightVm<AlignedAllocator<CacheLineSize>, false, true>;
|
||||||
|
template class CompiledLightVm<AlignedAllocator<CacheLineSize>, true, true>;
|
||||||
|
template class CompiledLightVm<LargePageAllocator, false, true>;
|
||||||
|
template class CompiledLightVm<LargePageAllocator, true, true>;
|
||||||
}
|
}
|
@ -33,8 +33,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
namespace randomx {
|
namespace randomx {
|
||||||
|
|
||||||
template<class Allocator, bool softAes>
|
template<class Allocator, bool softAes, bool secureJit>
|
||||||
class CompiledLightVm : public CompiledVm<Allocator, softAes> {
|
class CompiledLightVm : public CompiledVm<Allocator, softAes, secureJit> {
|
||||||
public:
|
public:
|
||||||
void* operator new(size_t size) {
|
void* operator new(size_t size) {
|
||||||
void* ptr = AlignedAllocator<CacheLineSize>::allocMemory(size);
|
void* ptr = AlignedAllocator<CacheLineSize>::allocMemory(size);
|
||||||
@ -49,16 +49,20 @@ namespace randomx {
|
|||||||
void setDataset(randomx_dataset* dataset) override { }
|
void setDataset(randomx_dataset* dataset) override { }
|
||||||
void run(void* seed) override;
|
void run(void* seed) override;
|
||||||
|
|
||||||
using CompiledVm<Allocator, softAes>::mem;
|
using CompiledVm<Allocator, softAes, secureJit>::mem;
|
||||||
using CompiledVm<Allocator, softAes>::compiler;
|
using CompiledVm<Allocator, softAes, secureJit>::compiler;
|
||||||
using CompiledVm<Allocator, softAes>::program;
|
using CompiledVm<Allocator, softAes, secureJit>::program;
|
||||||
using CompiledVm<Allocator, softAes>::config;
|
using CompiledVm<Allocator, softAes, secureJit>::config;
|
||||||
using CompiledVm<Allocator, softAes>::cachePtr;
|
using CompiledVm<Allocator, softAes, secureJit>::cachePtr;
|
||||||
using CompiledVm<Allocator, softAes>::datasetOffset;
|
using CompiledVm<Allocator, softAes, secureJit>::datasetOffset;
|
||||||
};
|
};
|
||||||
|
|
||||||
using CompiledLightVmDefault = CompiledLightVm<AlignedAllocator<CacheLineSize>, true>;
|
using CompiledLightVmDefault = CompiledLightVm<AlignedAllocator<CacheLineSize>, true, false>;
|
||||||
using CompiledLightVmHardAes = CompiledLightVm<AlignedAllocator<CacheLineSize>, false>;
|
using CompiledLightVmHardAes = CompiledLightVm<AlignedAllocator<CacheLineSize>, false, false>;
|
||||||
using CompiledLightVmLargePage = CompiledLightVm<LargePageAllocator, true>;
|
using CompiledLightVmLargePage = CompiledLightVm<LargePageAllocator, true, false>;
|
||||||
using CompiledLightVmLargePageHardAes = CompiledLightVm<LargePageAllocator, false>;
|
using CompiledLightVmLargePageHardAes = CompiledLightVm<LargePageAllocator, false, false>;
|
||||||
|
using CompiledLightVmDefaultSecure = CompiledLightVm<AlignedAllocator<CacheLineSize>, true, true>;
|
||||||
|
using CompiledLightVmHardAesSecure = CompiledLightVm<AlignedAllocator<CacheLineSize>, false, true>;
|
||||||
|
using CompiledLightVmLargePageSecure = CompiledLightVm<LargePageAllocator, true, true>;
|
||||||
|
using CompiledLightVmLargePageHardAesSecure = CompiledLightVm<LargePageAllocator, false, true>;
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user