| // SPDX-License-Identifier: BSD-2-Clause |
| /* |
| * Copyright (c) 2020 Huawei Technologies Co., Ltd |
| */ |
| |
| extern "C" { |
| |
| #include <dlfcn.h> |
| #include <os_test_lib.h> |
| #include <stdint.h> |
| #include <tee_ta_api.h> |
| |
| #include "cxx_tests.h" |
| #include "os_test.h" |
| |
| }; |
| |
| class CtorTest { |
| public: |
| CtorTest() : val(1) {} |
| |
| int val; |
| }; |
| |
| static CtorTest ctor_test; |
| |
| TEE_Result ta_entry_cxx_ctor_main(void) |
| { |
| if (ctor_test.val != 1) |
| return TEE_ERROR_GENERIC; |
| |
| return TEE_SUCCESS; |
| } |
| |
| TEE_Result ta_entry_cxx_ctor_shlib(void) |
| { |
| return os_test_shlib_cxx_ctor(); |
| } |
| |
| TEE_Result ta_entry_cxx_ctor_shlib_dl(void) |
| { |
| TEE_Result res = TEE_ERROR_GENERIC; |
| TEE_Result (*ctor_test_fn)(void); |
| void *handle = NULL; |
| |
| handle = dlopen("b3091a65-9751-4784-abf7-0298a7cc35ba", |
| RTLD_NOW | RTLD_GLOBAL | RTLD_NODELETE); |
| if (!handle) |
| return TEE_ERROR_GENERIC; |
| |
| ctor_test_fn = (TEE_Result (*)(void))dlsym(handle, |
| "os_test_shlib_dl_cxx_ctor"); |
| if (ctor_test_fn) |
| res = ctor_test_fn(); |
| |
| dlclose(handle); |
| return res; |
| } |
| |
| class MyException { |
| }; |
| |
| TEE_Result ta_entry_cxx_exc_main(void) |
| { |
| try { |
| throw MyException(); |
| } catch (MyException &e) { |
| return TEE_SUCCESS; |
| } |
| |
| return TEE_ERROR_GENERIC; |
| } |
| |
| class MixedFrameException { |
| }; |
| |
| void throw_mfe(void) |
| { |
| throw MixedFrameException(); |
| } |
| |
| class MixedFrameExceptionTest { |
| public: |
| MixedFrameExceptionTest() {} |
| |
| bool test(); |
| }; |
| |
| bool MixedFrameExceptionTest::test() |
| { |
| try { |
| throwing_c_func(); |
| } catch (MixedFrameException e) { |
| return true; |
| } |
| return false; |
| } |
| |
| TEE_Result ta_entry_cxx_exc_mixed(void) |
| { |
| MixedFrameExceptionTest test; |
| |
| if (test.test()) |
| return TEE_SUCCESS; |
| |
| return TEE_ERROR_GENERIC; |
| } |