155 lines
5.6 KiB
C++
155 lines
5.6 KiB
C++
|
/* 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_was_called = false;
|
||
|
static void TestFunction(int a1, int a2, int a3, int a4, int a5, int a6, int a7,
|
||
|
int a8, int a9, int a10) {
|
||
|
test_function_was_called = true;
|
||
|
EXPECT_EQ(1, a1);
|
||
|
EXPECT_EQ(2, a2);
|
||
|
EXPECT_EQ(3, a3);
|
||
|
EXPECT_EQ(4, a4);
|
||
|
EXPECT_EQ(5, a5);
|
||
|
EXPECT_EQ(6, a6);
|
||
|
EXPECT_EQ(7, a7);
|
||
|
EXPECT_EQ(8, a8);
|
||
|
EXPECT_EQ(9, a9);
|
||
|
EXPECT_EQ(10, a10);
|
||
|
}
|
||
|
|
||
|
TEST(ABITest, SanityCheck) {
|
||
|
EXPECT_NE(0, CHECK_ABI(strcmp, "hello", "world"));
|
||
|
|
||
|
test_function_was_called = false;
|
||
|
CHECK_ABI(TestFunction, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
|
||
|
EXPECT_TRUE(test_function_was_called);
|
||
|
|
||
|
#if defined(SUPPORTS_ABI_TEST)
|
||
|
abi_test::internal::CallerState state;
|
||
|
RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
|
||
|
const char *arg1 = "hello", *arg2 = "world";
|
||
|
crypto_word_t argv[2] = {
|
||
|
reinterpret_cast<crypto_word_t>(arg1),
|
||
|
reinterpret_cast<crypto_word_t>(arg2),
|
||
|
};
|
||
|
CHECK_ABI(abi_test_trampoline, reinterpret_cast<crypto_word_t>(strcmp),
|
||
|
&state, argv, 2);
|
||
|
#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(abi_test_trampoline,
|
||
|
reinterpret_cast<crypto_word_t>(abi_test_clobber_rbx), &state,
|
||
|
nullptr, 0);
|
||
|
|
||
|
CHECK_ABI(abi_test_clobber_rax);
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_rbx), "");
|
||
|
CHECK_ABI(abi_test_clobber_rcx);
|
||
|
CHECK_ABI(abi_test_clobber_rdx);
|
||
|
#if defined(OPENSSL_WINDOWS)
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_rdi), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_rsi), "");
|
||
|
#else
|
||
|
CHECK_ABI(abi_test_clobber_rdi);
|
||
|
CHECK_ABI(abi_test_clobber_rsi);
|
||
|
#endif
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_rbp), "");
|
||
|
CHECK_ABI(abi_test_clobber_r8);
|
||
|
CHECK_ABI(abi_test_clobber_r9);
|
||
|
CHECK_ABI(abi_test_clobber_r10);
|
||
|
CHECK_ABI(abi_test_clobber_r11);
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_r12), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_r13), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_r14), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_r15), "");
|
||
|
|
||
|
CHECK_ABI(abi_test_clobber_xmm0);
|
||
|
CHECK_ABI(abi_test_clobber_xmm1);
|
||
|
CHECK_ABI(abi_test_clobber_xmm2);
|
||
|
CHECK_ABI(abi_test_clobber_xmm3);
|
||
|
CHECK_ABI(abi_test_clobber_xmm4);
|
||
|
CHECK_ABI(abi_test_clobber_xmm5);
|
||
|
#if defined(OPENSSL_WINDOWS)
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_xmm6), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_xmm7), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_xmm8), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_xmm9), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_xmm10), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_xmm11), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_xmm12), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_xmm13), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_xmm14), "");
|
||
|
EXPECT_NONFATAL_FAILURE(CHECK_ABI(abi_test_clobber_xmm15), "");
|
||
|
#else
|
||
|
CHECK_ABI(abi_test_clobber_xmm6);
|
||
|
CHECK_ABI(abi_test_clobber_xmm7);
|
||
|
CHECK_ABI(abi_test_clobber_xmm8);
|
||
|
CHECK_ABI(abi_test_clobber_xmm9);
|
||
|
CHECK_ABI(abi_test_clobber_xmm10);
|
||
|
CHECK_ABI(abi_test_clobber_xmm11);
|
||
|
CHECK_ABI(abi_test_clobber_xmm12);
|
||
|
CHECK_ABI(abi_test_clobber_xmm13);
|
||
|
CHECK_ABI(abi_test_clobber_xmm14);
|
||
|
CHECK_ABI(abi_test_clobber_xmm15);
|
||
|
#endif
|
||
|
}
|
||
|
#endif // OPENSSL_X86_64 && SUPPORTS_ABI_TEST
|