aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMITSUNARI Shigeo <herumi@nifty.com>2017-01-18 21:41:06 +0800
committerMITSUNARI Shigeo <herumi@nifty.com>2017-01-18 21:41:06 +0800
commitb4bc2e815ad527d38a7939b060f2e4c86aa0a101 (patch)
tree8e577089a953473e0ae4b0191d388880fb67bcf5
parente17acf40123eb5627c5147aea3fa270be297a77a (diff)
downloaddexon-mcl-b4bc2e815ad527d38a7939b060f2e4c86aa0a101.tar.gz
dexon-mcl-b4bc2e815ad527d38a7939b060f2e4c86aa0a101.tar.zst
dexon-mcl-b4bc2e815ad527d38a7939b060f2e4c86aa0a101.zip
disable Xbyak if SELinux
-rw-r--r--include/mcl/fp.hpp2
-rw-r--r--include/mcl/op.hpp2
-rw-r--r--src/fp.cpp26
-rw-r--r--test/fp_generator_test.cpp1
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()
{
diff --git a/src/fp.cpp b/src/fp.cpp
index 107b99d..86e8738 100644
--- a/src/fp.cpp
+++ b/src/fp.cpp
@@ -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]);
}