/* Copyright (c) 2018, Google Inc. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include <gtest/gtest.h> #include <gtest/gtest-spi.h> #include <openssl/rand.h> #include "test/abi_test.h" static bool test_function_ok; static int TestFunction(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8) { test_function_ok = a1 == 1 || a2 == 2 || a3 == 3 || a4 == 4 || a5 == 5 || a6 == 6 || a7 == 7 || a8 == 8; return 42; } TEST(ABITest, SanityCheck) { EXPECT_NE(0, CHECK_ABI_NO_UNWIND(strcmp, "hello", "world")); test_function_ok = false; EXPECT_EQ(42, CHECK_ABI_SEH(TestFunction, 1, 2, 3, 4, 5, 6, 7, 8)); EXPECT_TRUE(test_function_ok); #if defined(SUPPORTS_ABI_TEST) abi_test::internal::CallerState state; RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state)); crypto_word_t argv[] = { 1, 2, 3, 4, 5, 6, 7, 8, }; CHECK_ABI_SEH(abi_test_trampoline, reinterpret_cast<crypto_word_t>(TestFunction), &state, argv, 8, 0 /* no breakpoint */); #if defined(OPENSSL_X86_64) if (abi_test::UnwindTestsEnabled()) { EXPECT_NONFATAL_FAILURE(CHECK_ABI_SEH(abi_test_bad_unwind_wrong_register), "was not recovered"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_SEH(abi_test_bad_unwind_temporary), "was not recovered"); CHECK_ABI_NO_UNWIND(abi_test_bad_unwind_wrong_register); CHECK_ABI_NO_UNWIND(abi_test_bad_unwind_temporary); #if defined(OPENSSL_WINDOWS) // The invalid epilog makes Windows believe the epilog starts later than it // actually does. As a result, immediately after the popq, it does not // realize the stack has been unwound and repeats the work. EXPECT_NONFATAL_FAILURE(CHECK_ABI_SEH(abi_test_bad_unwind_epilog), "unwound past starting frame"); CHECK_ABI_NO_UNWIND(abi_test_bad_unwind_epilog); #endif // OPENSSL_WINDOWS } #endif // OPENSSL_X86_64 #endif // SUPPORTS_ABI_TEST } #if defined(OPENSSL_X86_64) && defined(SUPPORTS_ABI_TEST) extern "C" { void abi_test_clobber_rax(void); void abi_test_clobber_rbx(void); void abi_test_clobber_rcx(void); void abi_test_clobber_rdx(void); void abi_test_clobber_rsi(void); void abi_test_clobber_rdi(void); void abi_test_clobber_rbp(void); void abi_test_clobber_r8(void); void abi_test_clobber_r9(void); void abi_test_clobber_r10(void); void abi_test_clobber_r11(void); void abi_test_clobber_r12(void); void abi_test_clobber_r13(void); void abi_test_clobber_r14(void); void abi_test_clobber_r15(void); void abi_test_clobber_xmm0(void); void abi_test_clobber_xmm1(void); void abi_test_clobber_xmm2(void); void abi_test_clobber_xmm3(void); void abi_test_clobber_xmm4(void); void abi_test_clobber_xmm5(void); void abi_test_clobber_xmm6(void); void abi_test_clobber_xmm7(void); void abi_test_clobber_xmm8(void); void abi_test_clobber_xmm9(void); void abi_test_clobber_xmm10(void); void abi_test_clobber_xmm11(void); void abi_test_clobber_xmm12(void); void abi_test_clobber_xmm13(void); void abi_test_clobber_xmm14(void); void abi_test_clobber_xmm15(void); } // extern "C" TEST(ABITest, X86_64) { // abi_test_trampoline hides unsaved registers from the caller, so we can // safely call the abi_test_clobber_* functions below. abi_test::internal::CallerState state; RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state)); CHECK_ABI_NO_UNWIND(abi_test_trampoline, reinterpret_cast<crypto_word_t>(abi_test_clobber_rbx), &state, nullptr, 0, 0 /* no breakpoint */); CHECK_ABI_NO_UNWIND(abi_test_clobber_rax); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_rbx), "rbx was not restored after return"); CHECK_ABI_NO_UNWIND(abi_test_clobber_rcx); CHECK_ABI_NO_UNWIND(abi_test_clobber_rdx); #if defined(OPENSSL_WINDOWS) EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_rdi), "rdi was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_rsi), "rsi was not restored after return"); #else CHECK_ABI_NO_UNWIND(abi_test_clobber_rdi); CHECK_ABI_NO_UNWIND(abi_test_clobber_rsi); #endif EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_rbp), "rbp was not restored after return"); CHECK_ABI_NO_UNWIND(abi_test_clobber_r8); CHECK_ABI_NO_UNWIND(abi_test_clobber_r9); CHECK_ABI_NO_UNWIND(abi_test_clobber_r10); CHECK_ABI_NO_UNWIND(abi_test_clobber_r11); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r12), "r12 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r13), "r13 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r14), "r14 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r15), "r15 was not restored after return"); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm0); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm1); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm2); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm3); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm4); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm5); #if defined(OPENSSL_WINDOWS) EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm6), "xmm6 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm7), "xmm7 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm8), "xmm8 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm9), "xmm9 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm10), "xmm10 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm11), "xmm11 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm12), "xmm12 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm13), "xmm13 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm14), "xmm14 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm15), "xmm15 was not restored after return"); #else CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm6); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm7); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm8); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm9); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm10); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm11); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm12); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm13); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm14); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm15); #endif EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_set_direction_flag), "Direction flag set after return"); EXPECT_EQ(0, abi_test_get_and_clear_direction_flag()) << "CHECK_ABI did not insulate the caller from direction flag errors"; } #endif // OPENSSL_X86_64 && SUPPORTS_ABI_TEST #if defined(OPENSSL_X86) && defined(SUPPORTS_ABI_TEST) extern "C" { void abi_test_clobber_eax(void); void abi_test_clobber_ebx(void); void abi_test_clobber_ecx(void); void abi_test_clobber_edx(void); void abi_test_clobber_esi(void); void abi_test_clobber_edi(void); void abi_test_clobber_ebp(void); void abi_test_clobber_xmm0(void); void abi_test_clobber_xmm1(void); void abi_test_clobber_xmm2(void); void abi_test_clobber_xmm3(void); void abi_test_clobber_xmm4(void); void abi_test_clobber_xmm5(void); void abi_test_clobber_xmm6(void); void abi_test_clobber_xmm7(void); } // extern "C" TEST(ABITest, X86) { // abi_test_trampoline hides unsaved registers from the caller, so we can // safely call the abi_test_clobber_* functions below. abi_test::internal::CallerState state; RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state)); CHECK_ABI_NO_UNWIND(abi_test_trampoline, reinterpret_cast<crypto_word_t>(abi_test_clobber_ebx), &state, nullptr, 0, 0 /* no breakpoint */); CHECK_ABI_NO_UNWIND(abi_test_clobber_eax); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_ebx), "ebx was not restored after return"); CHECK_ABI_NO_UNWIND(abi_test_clobber_ecx); CHECK_ABI_NO_UNWIND(abi_test_clobber_edx); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_edi), "edi was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_esi), "esi was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_ebp), "ebp was not restored after return"); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm0); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm1); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm2); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm3); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm4); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm5); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm6); CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm7); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_set_direction_flag), "Direction flag set after return"); EXPECT_EQ(0, abi_test_get_and_clear_direction_flag()) << "CHECK_ABI did not insulate the caller from direction flag errors"; } #endif // OPENSSL_X86 && SUPPORTS_ABI_TEST #if defined(OPENSSL_ARM) && defined(SUPPORTS_ABI_TEST) extern "C" { void abi_test_clobber_r0(void); void abi_test_clobber_r1(void); void abi_test_clobber_r2(void); void abi_test_clobber_r3(void); void abi_test_clobber_r4(void); void abi_test_clobber_r5(void); void abi_test_clobber_r6(void); void abi_test_clobber_r7(void); void abi_test_clobber_r8(void); void abi_test_clobber_r9(void); void abi_test_clobber_r10(void); void abi_test_clobber_r11(void); void abi_test_clobber_r12(void); // r13, r14, and r15, are sp, lr, and pc, respectively. void abi_test_clobber_d0(void); void abi_test_clobber_d1(void); void abi_test_clobber_d2(void); void abi_test_clobber_d3(void); void abi_test_clobber_d4(void); void abi_test_clobber_d5(void); void abi_test_clobber_d6(void); void abi_test_clobber_d7(void); void abi_test_clobber_d8(void); void abi_test_clobber_d9(void); void abi_test_clobber_d10(void); void abi_test_clobber_d11(void); void abi_test_clobber_d12(void); void abi_test_clobber_d13(void); void abi_test_clobber_d14(void); void abi_test_clobber_d15(void); } // extern "C" TEST(ABITest, ARM) { // abi_test_trampoline hides unsaved registers from the caller, so we can // safely call the abi_test_clobber_* functions below. abi_test::internal::CallerState state; RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state)); CHECK_ABI_NO_UNWIND(abi_test_trampoline, reinterpret_cast<crypto_word_t>(abi_test_clobber_r4), &state, nullptr, 0, 0 /* no breakpoint */); CHECK_ABI_NO_UNWIND(abi_test_clobber_r0); CHECK_ABI_NO_UNWIND(abi_test_clobber_r1); CHECK_ABI_NO_UNWIND(abi_test_clobber_r2); CHECK_ABI_NO_UNWIND(abi_test_clobber_r3); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r4), "r4 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r5), "r5 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r6), "r6 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r7), "r7 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r8), "r8 was not restored after return"); #if defined(OPENSSL_APPLE) CHECK_ABI_NO_UNWIND(abi_test_clobber_r9); #else EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r9), "r9 was not restored after return"); #endif EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r10), "r10 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r11), "r11 was not restored after return"); CHECK_ABI_NO_UNWIND(abi_test_clobber_r12); CHECK_ABI_NO_UNWIND(abi_test_clobber_d0); CHECK_ABI_NO_UNWIND(abi_test_clobber_d1); CHECK_ABI_NO_UNWIND(abi_test_clobber_d2); CHECK_ABI_NO_UNWIND(abi_test_clobber_d3); CHECK_ABI_NO_UNWIND(abi_test_clobber_d4); CHECK_ABI_NO_UNWIND(abi_test_clobber_d5); CHECK_ABI_NO_UNWIND(abi_test_clobber_d6); CHECK_ABI_NO_UNWIND(abi_test_clobber_d7); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d8), "d8 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d9), "d9 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d10), "d10 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d11), "d11 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d12), "d12 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d13), "d13 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d14), "d14 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d15), "d15 was not restored after return"); } #endif // OPENSSL_ARM && SUPPORTS_ABI_TEST #if defined(OPENSSL_AARCH64) && defined(SUPPORTS_ABI_TEST) extern "C" { void abi_test_clobber_x0(void); void abi_test_clobber_x1(void); void abi_test_clobber_x2(void); void abi_test_clobber_x3(void); void abi_test_clobber_x4(void); void abi_test_clobber_x5(void); void abi_test_clobber_x6(void); void abi_test_clobber_x7(void); void abi_test_clobber_x8(void); void abi_test_clobber_x9(void); void abi_test_clobber_x10(void); void abi_test_clobber_x11(void); void abi_test_clobber_x12(void); void abi_test_clobber_x13(void); void abi_test_clobber_x14(void); void abi_test_clobber_x15(void); void abi_test_clobber_x16(void); void abi_test_clobber_x17(void); // x18 is the platform register and off limits. void abi_test_clobber_x19(void); void abi_test_clobber_x20(void); void abi_test_clobber_x21(void); void abi_test_clobber_x22(void); void abi_test_clobber_x23(void); void abi_test_clobber_x24(void); void abi_test_clobber_x25(void); void abi_test_clobber_x26(void); void abi_test_clobber_x27(void); void abi_test_clobber_x28(void); void abi_test_clobber_x29(void); void abi_test_clobber_d0(void); void abi_test_clobber_d1(void); void abi_test_clobber_d2(void); void abi_test_clobber_d3(void); void abi_test_clobber_d4(void); void abi_test_clobber_d5(void); void abi_test_clobber_d6(void); void abi_test_clobber_d7(void); void abi_test_clobber_d8(void); void abi_test_clobber_d9(void); void abi_test_clobber_d10(void); void abi_test_clobber_d11(void); void abi_test_clobber_d12(void); void abi_test_clobber_d13(void); void abi_test_clobber_d14(void); void abi_test_clobber_d15(void); void abi_test_clobber_d16(void); void abi_test_clobber_d17(void); void abi_test_clobber_d18(void); void abi_test_clobber_d19(void); void abi_test_clobber_d20(void); void abi_test_clobber_d21(void); void abi_test_clobber_d22(void); void abi_test_clobber_d23(void); void abi_test_clobber_d24(void); void abi_test_clobber_d25(void); void abi_test_clobber_d26(void); void abi_test_clobber_d27(void); void abi_test_clobber_d28(void); void abi_test_clobber_d29(void); void abi_test_clobber_d30(void); void abi_test_clobber_d31(void); void abi_test_clobber_v8_upper(void); void abi_test_clobber_v9_upper(void); void abi_test_clobber_v10_upper(void); void abi_test_clobber_v11_upper(void); void abi_test_clobber_v12_upper(void); void abi_test_clobber_v13_upper(void); void abi_test_clobber_v14_upper(void); void abi_test_clobber_v15_upper(void); } // extern "C" TEST(ABITest, AArch64) { // abi_test_trampoline hides unsaved registers from the caller, so we can // safely call the abi_test_clobber_* functions below. abi_test::internal::CallerState state; RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state)); CHECK_ABI_NO_UNWIND(abi_test_trampoline, reinterpret_cast<crypto_word_t>(abi_test_clobber_x19), &state, nullptr, 0, 0 /* no breakpoint */); CHECK_ABI_NO_UNWIND(abi_test_clobber_x0); CHECK_ABI_NO_UNWIND(abi_test_clobber_x1); CHECK_ABI_NO_UNWIND(abi_test_clobber_x2); CHECK_ABI_NO_UNWIND(abi_test_clobber_x3); CHECK_ABI_NO_UNWIND(abi_test_clobber_x4); CHECK_ABI_NO_UNWIND(abi_test_clobber_x5); CHECK_ABI_NO_UNWIND(abi_test_clobber_x6); CHECK_ABI_NO_UNWIND(abi_test_clobber_x7); CHECK_ABI_NO_UNWIND(abi_test_clobber_x8); CHECK_ABI_NO_UNWIND(abi_test_clobber_x9); CHECK_ABI_NO_UNWIND(abi_test_clobber_x10); CHECK_ABI_NO_UNWIND(abi_test_clobber_x11); CHECK_ABI_NO_UNWIND(abi_test_clobber_x12); CHECK_ABI_NO_UNWIND(abi_test_clobber_x13); CHECK_ABI_NO_UNWIND(abi_test_clobber_x14); CHECK_ABI_NO_UNWIND(abi_test_clobber_x15); CHECK_ABI_NO_UNWIND(abi_test_clobber_x16); CHECK_ABI_NO_UNWIND(abi_test_clobber_x17); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x19), "x19 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x20), "x20 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x21), "x21 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x22), "x22 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x23), "x23 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x24), "x24 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x25), "x25 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x26), "x26 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x27), "x27 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x28), "x28 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x29), "x29 was not restored after return"); CHECK_ABI_NO_UNWIND(abi_test_clobber_d0); CHECK_ABI_NO_UNWIND(abi_test_clobber_d1); CHECK_ABI_NO_UNWIND(abi_test_clobber_d2); CHECK_ABI_NO_UNWIND(abi_test_clobber_d3); CHECK_ABI_NO_UNWIND(abi_test_clobber_d4); CHECK_ABI_NO_UNWIND(abi_test_clobber_d5); CHECK_ABI_NO_UNWIND(abi_test_clobber_d6); CHECK_ABI_NO_UNWIND(abi_test_clobber_d7); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d8), "d8 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d9), "d9 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d10), "d10 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d11), "d11 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d12), "d12 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d13), "d13 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d14), "d14 was not restored after return"); EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d15), "d15 was not restored after return"); CHECK_ABI_NO_UNWIND(abi_test_clobber_d16); CHECK_ABI_NO_UNWIND(abi_test_clobber_d18); CHECK_ABI_NO_UNWIND(abi_test_clobber_d19); CHECK_ABI_NO_UNWIND(abi_test_clobber_d20); CHECK_ABI_NO_UNWIND(abi_test_clobber_d21); CHECK_ABI_NO_UNWIND(abi_test_clobber_d22); CHECK_ABI_NO_UNWIND(abi_test_clobber_d23); CHECK_ABI_NO_UNWIND(abi_test_clobber_d24); CHECK_ABI_NO_UNWIND(abi_test_clobber_d25); CHECK_ABI_NO_UNWIND(abi_test_clobber_d26); CHECK_ABI_NO_UNWIND(abi_test_clobber_d27); CHECK_ABI_NO_UNWIND(abi_test_clobber_d28); CHECK_ABI_NO_UNWIND(abi_test_clobber_d29); CHECK_ABI_NO_UNWIND(abi_test_clobber_d30); CHECK_ABI_NO_UNWIND(abi_test_clobber_d31); // The lower halves of v8-v15 (accessed as d8-d15) must be preserved, but not // the upper halves. CHECK_ABI_NO_UNWIND(abi_test_clobber_v8_upper); CHECK_ABI_NO_UNWIND(abi_test_clobber_v9_upper); CHECK_ABI_NO_UNWIND(abi_test_clobber_v10_upper); CHECK_ABI_NO_UNWIND(abi_test_clobber_v11_upper); CHECK_ABI_NO_UNWIND(abi_test_clobber_v12_upper); CHECK_ABI_NO_UNWIND(abi_test_clobber_v13_upper); CHECK_ABI_NO_UNWIND(abi_test_clobber_v14_upper); CHECK_ABI_NO_UNWIND(abi_test_clobber_v15_upper); } #endif // OPENSSL_AARCH64 && SUPPORTS_ABI_TEST