diff options
author | MITSUNARI Shigeo <herumi@nifty.com> | 2018-07-30 15:32:04 +0800 |
---|---|---|
committer | MITSUNARI Shigeo <herumi@nifty.com> | 2018-07-30 15:32:04 +0800 |
commit | e29218ac58705621a56680edc300fec9969a71ac (patch) | |
tree | 539b8db80eb6674c49a099abae08da58c73fb1af | |
parent | 8d6fec7d0d0dbaeb4a200c91488de39d82cf659c (diff) | |
download | dexon-mcl-e29218ac58705621a56680edc300fec9969a71ac.tar.gz dexon-mcl-e29218ac58705621a56680edc300fec9969a71ac.tar.zst dexon-mcl-e29218ac58705621a56680edc300fec9969a71ac.zip |
use read/exec for jit region
-rw-r--r-- | src/fp_generator.hpp | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/src/fp_generator.hpp b/src/fp_generator.hpp index ab744a6..250b08e 100644 --- a/src/fp_generator.hpp +++ b/src/fp_generator.hpp @@ -14,6 +14,7 @@ #include <stdio.h> #include <assert.h> #include <cybozu/exception.hpp> +#include <cybozu/array.hpp> #ifdef _MSC_VER #pragma warning(push) @@ -125,7 +126,7 @@ if (rm.isReg()) { \ namespace fp { -struct FpGenerator : Xbyak::CodeGenerator { +struct Code : Xbyak::CodeGenerator { typedef Xbyak::RegExp RegExp; typedef Xbyak::Reg64 Reg64; typedef Xbyak::Xmm Xmm; @@ -216,8 +217,8 @@ struct FpGenerator : Xbyak::CodeGenerator { Label mulPreL_; Label fpDbl_modL_; - FpGenerator() - : CodeGenerator(4096 * 8) + Code(uint8_t *mem, size_t codeSize) + : CodeGenerator(codeSize, mem) #ifdef XBYAK64_WIN , gp0(rcx) , gp1(r11) @@ -725,7 +726,7 @@ struct FpGenerator : Xbyak::CodeGenerator { } else if (pn_ <= 9) { gen_montMulN(p_, rp_, pn_); } else { - throw cybozu::Exception("mcl:FpGenerator:gen_mul:not implemented for") << pn_; + throw cybozu::Exception("mcl:Code:gen_mul:not implemented for") << pn_; } } /* @@ -1978,7 +1979,7 @@ struct FpGenerator : Xbyak::CodeGenerator { assert(pn_ >= 1); const int freeRegNum = 13; if (pn_ > 9) { - throw cybozu::Exception("mcl:FpGenerator:gen_preInv:large pn_") << pn_; + throw cybozu::Exception("mcl:Code:gen_preInv:large pn_") << pn_; } StackFrame sf(this, 2, 10 | UseRDX | UseRCX, (std::max<int>(0, pn_ * 5 - freeRegNum) + 1 + (isFullBit_ ? 1 : 0)) * 8); const Reg64& pr = sf.p[0]; @@ -2252,8 +2253,8 @@ struct FpGenerator : Xbyak::CodeGenerator { L("@@"); } private: - FpGenerator(const FpGenerator&); - void operator=(const FpGenerator&); + Code(const Code&); + void operator=(const Code&); void make_op_rm(void (Xbyak::CodeGenerator::*op)(const Xbyak::Operand&, const Xbyak::Operand&), const Reg64& op1, const MemReg& op2) { if (op2.isReg()) { @@ -2899,6 +2900,30 @@ private: } }; +struct FpGenerator { + static const size_t codeSize = 4096 * 8; + static const size_t pageSize = 4096; + uint8_t *mem_; + Code code_; + FpGenerator() + : mem_((uint8_t*)cybozu::AlignedMalloc(codeSize, pageSize)) + , code_(mem_, codeSize) + { + } + void init(Op& op) + { + code_.init(op); + if (!Xbyak::CodeArray::protect(mem_, codeSize, Xbyak::CodeArray::PROTECT_RE)) { + throw cybozu::Exception("err protect read/exec"); + } + } + ~FpGenerator() + { + Xbyak::CodeArray::protect(mem_, codeSize, Xbyak::CodeArray::PROTECT_RW); + cybozu::AlignedFree(mem_); + } +}; + } } // mcl::fp #ifdef _MSC_VER |