Reduce JIT memory for ARM.

This commit is contained in:
XMRig 2020-12-15 02:52:38 +07:00
parent 4c7d20c8e6
commit 6b331b6945
No known key found for this signature in database
GPG key ID: 446A53638BE94409
4 changed files with 46 additions and 13 deletions

View file

@ -110,6 +110,7 @@ namespace randomx {
cache->jit->generateSuperscalarHash(cache->programs);
cache->jit->generateDatasetInitCode();
cache->datasetInit = cache->jit->getDatasetInitFunc();
# ifdef XMRIG_SECURE_JIT
cache->jit->enableExecution();

View file

@ -98,14 +98,10 @@ static size_t CalcDatasetItemSize()
constexpr uint32_t IntRegMap[8] = { 4, 5, 6, 7, 12, 13, 14, 15 };
JitCompilerA64::JitCompilerA64(bool hugePagesEnable)
: literalPos(ImulRcpLiteralsEnd)
JitCompilerA64::JitCompilerA64(bool hugePagesEnable) :
hugePages(hugePagesJIT && hugePagesEnable),
literalPos(ImulRcpLiteralsEnd)
{
allocatedSize = CodeSize + CalcDatasetItemSize();
code = static_cast<uint8_t*>(allocExecutableMemory(allocatedSize, hugePagesJIT && hugePagesEnable));
memset(reg_changed_offset, 0, sizeof(reg_changed_offset));
memcpy(code, (void*) randomx_program_aarch64, CodeSize);
}
JitCompilerA64::~JitCompilerA64()
@ -115,9 +111,14 @@ JitCompilerA64::~JitCompilerA64()
void JitCompilerA64::generateProgram(Program& program, ProgramConfiguration& config, uint32_t)
{
# ifdef XMRIG_SECURE_JIT
enableWriting();
# endif
if (!allocatedSize) {
allocate(CodeSize);
}
#ifdef XMRIG_SECURE_JIT
else {
enableWriting();
}
#endif
uint32_t codePos = MainLoopBegin + 4;
@ -170,6 +171,15 @@ void JitCompilerA64::generateProgram(Program& program, ProgramConfiguration& con
void JitCompilerA64::generateProgramLight(Program& program, ProgramConfiguration& config, uint32_t datasetOffset)
{
if (!allocatedSize) {
allocate(CodeSize);
}
#ifdef XMRIG_SECURE_JIT
else {
enableWriting();
}
#endif
uint32_t codePos = MainLoopBegin + 4;
// and w16, w10, ScratchpadL3Mask64
@ -228,6 +238,15 @@ void JitCompilerA64::generateProgramLight(Program& program, ProgramConfiguration
template<size_t N>
void JitCompilerA64::generateSuperscalarHash(SuperscalarProgram(&programs)[N])
{
if (!allocatedSize) {
allocate(CodeSize + CalcDatasetItemSize());
}
#ifdef XMRIG_SECURE_JIT
else {
enableWriting();
}
#endif
uint32_t codePos = CodeSize;
uint8_t* p1 = (uint8_t*)randomx_calc_dataset_item_aarch64;
@ -369,6 +388,16 @@ void JitCompilerA64::enableExecution() const
xmrig::VirtualMemory::protectRX(code, allocatedSize);
}
void JitCompilerA64::allocate(size_t size)
{
allocatedSize = size;
code = static_cast<uint8_t*>(allocExecutableMemory(allocatedSize, hugePages));
memcpy(code, reinterpret_cast<const void *>(randomx_program_aarch64), CodeSize);
}
void JitCompilerA64::emitMovImmediate(uint32_t dst, uint32_t imm, uint8_t* code, uint32_t& codePos)
{
uint32_t k = codePos;

View file

@ -77,12 +77,15 @@ namespace randomx {
static InstructionGeneratorA64 engine[256];
private:
uint32_t reg_changed_offset[8];
uint8_t* code;
const bool hugePages;
uint32_t reg_changed_offset[8]{};
uint8_t* code = nullptr;
uint32_t literalPos;
uint32_t num32bitLiterals = 0;
size_t allocatedSize = 0;
void allocate(size_t size);
static void emit32(uint32_t val, uint8_t* code, uint32_t& codePos)
{
*(uint32_t*)(code + codePos) = val;

View file

@ -383,7 +383,7 @@ extern "C" {
case RANDOMX_FLAG_JIT:
cache->jit = new randomx::JitCompiler(false);
cache->initialize = &randomx::initCacheCompile;
cache->datasetInit = cache->jit->getDatasetInitFunc();
cache->datasetInit = nullptr;
cache->memory = memory;
break;