diff options
author | MITSUNARI Shigeo <herumi@nifty.com> | 2017-01-18 21:41:06 +0800 |
---|---|---|
committer | MITSUNARI Shigeo <herumi@nifty.com> | 2017-01-18 21:41:06 +0800 |
commit | b4bc2e815ad527d38a7939b060f2e4c86aa0a101 (patch) | |
tree | 8e577089a953473e0ae4b0191d388880fb67bcf5 | |
parent | e17acf40123eb5627c5147aea3fa270be297a77a (diff) | |
download | dexon-mcl-b4bc2e815ad527d38a7939b060f2e4c86aa0a101.tar.gz dexon-mcl-b4bc2e815ad527d38a7939b060f2e4c86aa0a101.tar.zst dexon-mcl-b4bc2e815ad527d38a7939b060f2e4c86aa0a101.zip |
disable Xbyak if SELinux
-rw-r--r-- | include/mcl/fp.hpp | 2 | ||||
-rw-r--r-- | include/mcl/op.hpp | 2 | ||||
-rw-r--r-- | src/fp.cpp | 26 | ||||
-rw-r--r-- | test/fp_generator_test.cpp | 1 |
4 files changed, 28 insertions, 3 deletions
diff --git a/include/mcl/fp.hpp b/include/mcl/fp.hpp index 04faa17..e98832d 100644 --- a/include/mcl/fp.hpp +++ b/include/mcl/fp.hpp @@ -87,6 +87,8 @@ Mode StrToMode(const std::string& s); void dumpUnit(Unit x); void UnitToHex(char *buf, size_t maxBufSize, Unit x); +bool isEnableJIT(); // 1st call is not threadsafe + } // mcl::fp template<class tag = FpTag, size_t maxBitSize = MCL_MAX_BIT_SIZE> diff --git a/include/mcl/op.hpp b/include/mcl/op.hpp index 159047a..f920c2e 100644 --- a/include/mcl/op.hpp +++ b/include/mcl/op.hpp @@ -137,7 +137,7 @@ struct Op { Op() { clear(); - fg = createFpGenerator(); + fg = 0; } ~Op() { @@ -125,6 +125,25 @@ void UnitToHex(char *buf, size_t maxBufSize, Unit x) #endif } +bool isEnableJIT() +{ +#if defined(MCL_USE_XBYAK) + /* -1:not init, 0:disable, 1:enable */ + static int status = -1; + if (status == -1) { + const size_t size = 4096; + uint8_t *p = (uint8_t*)malloc(size * 2); + uint8_t *aligned = Xbyak::CodeArray::getAlignedAddress(p, size); + bool ret = Xbyak::CodeArray::protect(aligned, size, true); + status = ret ? 1 : 0; + free(p); + } + return status != 0; +#else + return false; +#endif +} + static inline void set_mpz_t(mpz_t& z, const Unit* p, int n) { int s = n; @@ -292,7 +311,7 @@ static void initForMont(Op& op, const Unit *p, Mode mode) if (mode != FP_XBYAK) return; #ifdef MCL_USE_XBYAK FpGenerator *fg = op.fg; - if (fg == 0) return; + if (fg == 0) fg = Op::createFpGenerator(); fg->init(op); if (op.isMont && N <= 4) { @@ -323,6 +342,9 @@ void Op::init(const std::string& mstr, size_t maxBitSize, Mode mode) if (mode == fp::FP_XBYAK && bitSize > 521) { mode = fp::FP_AUTO; } + if (!fp::isEnableJIT()) { + mode = fp::FP_AUTO; + } #else if (mode == fp::FP_XBYAK) mode = fp::FP_AUTO; #endif @@ -332,7 +354,7 @@ void Op::init(const std::string& mstr, size_t maxBitSize, Mode mode) if (mode == fp::FP_LLVM || mode == fp::FP_LLVM_MONT) mode = fp::FP_AUTO; #endif isMont = mode == fp::FP_GMP_MONT || mode == fp::FP_LLVM_MONT || mode == fp::FP_XBYAK; -#if 0 +#ifndef NDEBUG fprintf(stderr, "mode=%s, isMont=%d, maxBitSize=%d" #ifdef MCL_USE_XBYAK " MCL_USE_XBYAK" diff --git a/test/fp_generator_test.cpp b/test/fp_generator_test.cpp index 9cc1fcf..a5ab762 100644 --- a/test/fp_generator_test.cpp +++ b/test/fp_generator_test.cpp @@ -197,6 +197,7 @@ void test(const char *pStr) CYBOZU_TEST_AUTO(all) { + if (!mcl::fp::isEnableJIT()) return; for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(primeTable); i++) { test(primeTable[i]); } |