diff --git a/BUILD.gn b/BUILD.gn index a965de9b7c4762aabfc06f0ee6076f322d38e185..3e47f7b634a4c3bf63e2340fc60f22941815aaed 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -15,6 +15,13 @@ import("//build/config/clang/clang.gni") import("//build/ohos.gni") import("jsvm.gni") +ohos_prebuilt_etc("app_jit_enable_list") { + relative_install_dir = "jsvm" + source = "./app_jit_enable_list.conf" + part_name = "jsvm" + subsystem_name = "arkcompiler" +} + action("copy_v8") { external_deps = [] deps = [] @@ -200,7 +207,10 @@ ohos_shared_library("libjsvm") { ":libjsvm_config", ] - deps = [ ":libv8" ] + deps = [ + ":app_jit_enable_list", + ":libv8", + ] if (enable_inspector) { deps += [ ":jsvm_inspector" ] } diff --git a/app_jit_enable_list.conf b/app_jit_enable_list.conf new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/interface/kits/jsvm_types.h b/interface/kits/jsvm_types.h index a1a327e14215cf3e50f666636f25ea6993abe21e..49c879d82fffeea93463ae547dfa279e913c1016 100644 --- a/interface/kits/jsvm_types.h +++ b/interface/kits/jsvm_types.h @@ -326,7 +326,11 @@ typedef enum { /** invalid input type status. * @since 16 */ - JSVM_INVALID_TYPE + JSVM_INVALID_TYPE, + /** jit mode expected status. + * @since 15 + */ + JSVM_JIT_MODE_EXPECTED, } JSVM_Status; /** diff --git a/src/js_native_api_v8.cpp b/src/js_native_api_v8.cpp index 1efcc748512e677c0a0000792e5f917a9a23739d..cf37939fe50aa9803a867f324e088d4343cfece6 100644 --- a/src/js_native_api_v8.cpp +++ b/src/js_native_api_v8.cpp @@ -1009,11 +1009,11 @@ JSVM_Status OH_JSVM_Init(const JSVM_InitOptions* options) OHOS_API_CALL(platform::ohos::ReportKeyThread(platform::ohos::ThreadRole::IMPORTANT_DISPLAY)); v8::V8::InitializePlatform(v8impl::g_platform.get()); - OHOS_API_CALL(platform::ohos::SetSecurityMode()); - if (options && options->argc && options->argv) { v8::V8::SetFlagsFromCommandLine(options->argc, options->argv, options->removeFlags); } + OHOS_API_CALL(platform::ohos::SetSecurityMode()); + v8::V8::Initialize(); const auto cb = v8impl::FunctionCallbackWrapper::Invoke; @@ -1714,6 +1714,7 @@ static const char* errorMessages[] = { "External buffers are not allowed", "Cannot run JavaScript", "Invalid type", + "Cannot run in Jitless Mode", }; JSVM_Status OH_JSVM_GetLastErrorInfo(JSVM_Env env, const JSVM_ExtendedErrorInfo** result) @@ -1725,7 +1726,7 @@ JSVM_Status OH_JSVM_GetLastErrorInfo(JSVM_Env env, const JSVM_ExtendedErrorInfo* // message in the `JSVM_Status` enum each time a new error message is added. // We don't have a jsvm_status_last as this would result in an ABI // change each time a message was added. - const int lastStatus = JSVM_INVALID_TYPE; + const int lastStatus = JSVM_JIT_MODE_EXPECTED; static_assert(jsvm::ArraySize(errorMessages) == lastStatus + 1, "Count of error messages must match count of error values"); @@ -4585,6 +4586,8 @@ JSVM_Status OH_JSVM_CompileWasmModule(JSVM_Env env, JSVM_Value* wasmModule) { JSVM_PREAMBLE(env); + // add jit mode check + RETURN_STATUS_IF_FALSE(env, platform::ohos::InJitMode(), JSVM_JIT_MODE_EXPECTED); CHECK_ARG(env, wasmBytecode); RETURN_STATUS_IF_FALSE(env, wasmBytecodeLength > 0, JSVM_INVALID_ARG); v8::MaybeLocal maybeModule; @@ -4612,6 +4615,8 @@ JSVM_Status OH_JSVM_CompileWasmFunction(JSVM_Env env, JSVM_WasmOptLevel optLevel) { JSVM_PREAMBLE(env); + // add jit mode check + RETURN_STATUS_IF_FALSE(env, platform::ohos::InJitMode(), JSVM_JIT_MODE_EXPECTED); CHECK_ARG(env, wasmModule); v8::Local val = v8impl::V8LocalValueFromJsValue(wasmModule); RETURN_STATUS_IF_FALSE(env, val->IsWasmModuleObject(), JSVM_INVALID_ARG); @@ -4651,6 +4656,8 @@ JSVM_Status OH_JSVM_IsWasmModuleObject(JSVM_Env env, JSVM_Value value, bool* res JSVM_Status OH_JSVM_CreateWasmCache(JSVM_Env env, JSVM_Value wasmModule, const uint8_t** data, size_t* length) { JSVM_PREAMBLE(env); + // add jit mode check + RETURN_STATUS_IF_FALSE(env, platform::ohos::InJitMode(), JSVM_JIT_MODE_EXPECTED); CHECK_ARG(env, wasmModule); CHECK_ARG(env, data); CHECK_ARG(env, length); diff --git a/src/platform/platform_ohos.cpp b/src/platform/platform_ohos.cpp index dd2d387782de3afbdb8c84e931f8fc71b0856834..6ebc1306cd20e501b9ea410dd69d55b073ca5af3 100644 --- a/src/platform/platform_ohos.cpp +++ b/src/platform/platform_ohos.cpp @@ -27,6 +27,9 @@ #ifdef ENABLE_HISYSEVENT #include "hisysevent.h" #endif +#include +#include +#include namespace platform { void OS::Abort() @@ -110,7 +113,45 @@ RunJsTrace::~RunJsTrace() } } +static bool g_isJitMode = true; namespace ohos { +#define JITFORT_QUERY_ENCAPS 'E' +#define HM_PR_SET_JITFORT 0x6a6974 + +const std::string ENABLE_JIT_CONF_PATH = "/etc/jsvm/app_jit_enable_list.conf"; +bool ProcessBundleName(std::string& bundleName); + +void ReadEnableList(const std::string& jitConfigPath, std::unordered_set& enableSet) +{ + std::ifstream file(jitConfigPath); + if (file.is_open()) { + std::string line; + while (std::getline(file, line)) { + if (!line.empty()) { + enableSet.insert(line); + } + } + file.close(); + } else { + LOG(Error) << "Failed to open file: " << jitConfigPath << std::endl; + } +} + +bool InJitMode() +{ + return g_isJitMode; +} + +inline bool InAppEnableList(const std::string& bundleName, std::unordered_set& enableSet) +{ + return (enableSet.count(bundleName) != 0); +} + +inline bool HasJitfortACL() +{ + return (prctl(HM_PR_SET_JITFORT, JITFORT_QUERY_ENCAPS, 0) == 0); +} + void ReportKeyThread(ThreadRole role) { static_assert(static_cast(ThreadRole::IMPORTANT_DISPLAY) == @@ -145,7 +186,15 @@ inline bool ReadSystemXpmState() void SetSecurityMode() { constexpr size_t secArgCnt = 2; - if (ReadSystemXpmState()) { + std::string bundleName; + if (!ProcessBundleName(bundleName)) { + LOG(Error) << "Failed to get bundleName" << std::endl; + bundleName = "INVALID_BUNDLE_NAME"; + } + std::unordered_set enableList {}; + ReadEnableList(ENABLE_JIT_CONF_PATH, enableList); + + if (ReadSystemXpmState() || (!InAppEnableList(bundleName, enableList) && !HasJitfortACL())) { int secArgc = secArgCnt; constexpr bool removeFlag = false; const char* secArgv[secArgCnt] = { "jsvm", "--jitless" }; diff --git a/src/platform/platform_ohos.h b/src/platform/platform_ohos.h index 46628592b38704ad046c59979e6c73264665d548..12f06e2ec8189a9f16226b9ee5e109ff97d2d408 100644 --- a/src/platform/platform_ohos.h +++ b/src/platform/platform_ohos.h @@ -35,6 +35,8 @@ void ReportKeyThread(ThreadRole role); void SetSecurityMode(); void WriteHisysevent(); + +bool InJitMode(); } // namespace ohos } // namespace platform #endif \ No newline at end of file