abi_self_test.cc 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. /* Copyright (c) 2018, Google Inc.
  2. *
  3. * Permission to use, copy, modify, and/or distribute this software for any
  4. * purpose with or without fee is hereby granted, provided that the above
  5. * copyright notice and this permission notice appear in all copies.
  6. *
  7. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
  10. * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
  12. * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  13. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
  14. #include <gtest/gtest.h>
  15. #include <gtest/gtest-spi.h>
  16. #include <openssl/rand.h>
  17. #include "test/abi_test.h"
  18. static bool test_function_ok;
  19. static int TestFunction(int a1, int a2, int a3, int a4, int a5, int a6, int a7,
  20. int a8) {
  21. test_function_ok = a1 == 1 || a2 == 2 || a3 == 3 || a4 == 4 || a5 == 5 ||
  22. a6 == 6 || a7 == 7 || a8 == 8;
  23. return 42;
  24. }
  25. TEST(ABITest, SanityCheck) {
  26. EXPECT_NE(0, CHECK_ABI_NO_UNWIND(strcmp, "hello", "world"));
  27. test_function_ok = false;
  28. EXPECT_EQ(42, CHECK_ABI_SEH(TestFunction, 1, 2, 3, 4, 5, 6, 7, 8));
  29. EXPECT_TRUE(test_function_ok);
  30. #if defined(SUPPORTS_ABI_TEST)
  31. abi_test::internal::CallerState state;
  32. RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
  33. crypto_word_t argv[] = {
  34. 1, 2, 3, 4, 5, 6, 7, 8,
  35. };
  36. CHECK_ABI_SEH(abi_test_trampoline,
  37. reinterpret_cast<crypto_word_t>(TestFunction), &state, argv, 8,
  38. 0 /* no breakpoint */);
  39. #if defined(OPENSSL_X86_64)
  40. if (abi_test::UnwindTestsEnabled()) {
  41. EXPECT_NONFATAL_FAILURE(CHECK_ABI_SEH(abi_test_bad_unwind_wrong_register),
  42. "was not recovered");
  43. EXPECT_NONFATAL_FAILURE(CHECK_ABI_SEH(abi_test_bad_unwind_temporary),
  44. "was not recovered");
  45. CHECK_ABI_NO_UNWIND(abi_test_bad_unwind_wrong_register);
  46. CHECK_ABI_NO_UNWIND(abi_test_bad_unwind_temporary);
  47. #if defined(OPENSSL_WINDOWS)
  48. // The invalid epilog makes Windows believe the epilog starts later than it
  49. // actually does. As a result, immediately after the popq, it does not
  50. // realize the stack has been unwound and repeats the work.
  51. EXPECT_NONFATAL_FAILURE(CHECK_ABI_SEH(abi_test_bad_unwind_epilog),
  52. "unwound past starting frame");
  53. CHECK_ABI_NO_UNWIND(abi_test_bad_unwind_epilog);
  54. #endif // OPENSSL_WINDOWS
  55. }
  56. #endif // OPENSSL_X86_64
  57. #endif // SUPPORTS_ABI_TEST
  58. }
  59. #if defined(OPENSSL_X86_64) && defined(SUPPORTS_ABI_TEST)
  60. extern "C" {
  61. void abi_test_clobber_rax(void);
  62. void abi_test_clobber_rbx(void);
  63. void abi_test_clobber_rcx(void);
  64. void abi_test_clobber_rdx(void);
  65. void abi_test_clobber_rsi(void);
  66. void abi_test_clobber_rdi(void);
  67. void abi_test_clobber_rbp(void);
  68. void abi_test_clobber_r8(void);
  69. void abi_test_clobber_r9(void);
  70. void abi_test_clobber_r10(void);
  71. void abi_test_clobber_r11(void);
  72. void abi_test_clobber_r12(void);
  73. void abi_test_clobber_r13(void);
  74. void abi_test_clobber_r14(void);
  75. void abi_test_clobber_r15(void);
  76. void abi_test_clobber_xmm0(void);
  77. void abi_test_clobber_xmm1(void);
  78. void abi_test_clobber_xmm2(void);
  79. void abi_test_clobber_xmm3(void);
  80. void abi_test_clobber_xmm4(void);
  81. void abi_test_clobber_xmm5(void);
  82. void abi_test_clobber_xmm6(void);
  83. void abi_test_clobber_xmm7(void);
  84. void abi_test_clobber_xmm8(void);
  85. void abi_test_clobber_xmm9(void);
  86. void abi_test_clobber_xmm10(void);
  87. void abi_test_clobber_xmm11(void);
  88. void abi_test_clobber_xmm12(void);
  89. void abi_test_clobber_xmm13(void);
  90. void abi_test_clobber_xmm14(void);
  91. void abi_test_clobber_xmm15(void);
  92. } // extern "C"
  93. TEST(ABITest, X86_64) {
  94. // abi_test_trampoline hides unsaved registers from the caller, so we can
  95. // safely call the abi_test_clobber_* functions below.
  96. abi_test::internal::CallerState state;
  97. RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
  98. CHECK_ABI_NO_UNWIND(abi_test_trampoline,
  99. reinterpret_cast<crypto_word_t>(abi_test_clobber_rbx),
  100. &state, nullptr, 0, 0 /* no breakpoint */);
  101. CHECK_ABI_NO_UNWIND(abi_test_clobber_rax);
  102. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_rbx),
  103. "rbx was not restored after return");
  104. CHECK_ABI_NO_UNWIND(abi_test_clobber_rcx);
  105. CHECK_ABI_NO_UNWIND(abi_test_clobber_rdx);
  106. #if defined(OPENSSL_WINDOWS)
  107. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_rdi),
  108. "rdi was not restored after return");
  109. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_rsi),
  110. "rsi was not restored after return");
  111. #else
  112. CHECK_ABI_NO_UNWIND(abi_test_clobber_rdi);
  113. CHECK_ABI_NO_UNWIND(abi_test_clobber_rsi);
  114. #endif
  115. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_rbp),
  116. "rbp was not restored after return");
  117. CHECK_ABI_NO_UNWIND(abi_test_clobber_r8);
  118. CHECK_ABI_NO_UNWIND(abi_test_clobber_r9);
  119. CHECK_ABI_NO_UNWIND(abi_test_clobber_r10);
  120. CHECK_ABI_NO_UNWIND(abi_test_clobber_r11);
  121. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r12),
  122. "r12 was not restored after return");
  123. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r13),
  124. "r13 was not restored after return");
  125. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r14),
  126. "r14 was not restored after return");
  127. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r15),
  128. "r15 was not restored after return");
  129. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm0);
  130. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm1);
  131. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm2);
  132. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm3);
  133. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm4);
  134. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm5);
  135. #if defined(OPENSSL_WINDOWS)
  136. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm6),
  137. "xmm6 was not restored after return");
  138. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm7),
  139. "xmm7 was not restored after return");
  140. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm8),
  141. "xmm8 was not restored after return");
  142. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm9),
  143. "xmm9 was not restored after return");
  144. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm10),
  145. "xmm10 was not restored after return");
  146. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm11),
  147. "xmm11 was not restored after return");
  148. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm12),
  149. "xmm12 was not restored after return");
  150. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm13),
  151. "xmm13 was not restored after return");
  152. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm14),
  153. "xmm14 was not restored after return");
  154. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm15),
  155. "xmm15 was not restored after return");
  156. #else
  157. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm6);
  158. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm7);
  159. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm8);
  160. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm9);
  161. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm10);
  162. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm11);
  163. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm12);
  164. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm13);
  165. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm14);
  166. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm15);
  167. #endif
  168. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_set_direction_flag),
  169. "Direction flag set after return");
  170. EXPECT_EQ(0, abi_test_get_and_clear_direction_flag())
  171. << "CHECK_ABI did not insulate the caller from direction flag errors";
  172. }
  173. #endif // OPENSSL_X86_64 && SUPPORTS_ABI_TEST
  174. #if defined(OPENSSL_X86) && defined(SUPPORTS_ABI_TEST)
  175. extern "C" {
  176. void abi_test_clobber_eax(void);
  177. void abi_test_clobber_ebx(void);
  178. void abi_test_clobber_ecx(void);
  179. void abi_test_clobber_edx(void);
  180. void abi_test_clobber_esi(void);
  181. void abi_test_clobber_edi(void);
  182. void abi_test_clobber_ebp(void);
  183. void abi_test_clobber_xmm0(void);
  184. void abi_test_clobber_xmm1(void);
  185. void abi_test_clobber_xmm2(void);
  186. void abi_test_clobber_xmm3(void);
  187. void abi_test_clobber_xmm4(void);
  188. void abi_test_clobber_xmm5(void);
  189. void abi_test_clobber_xmm6(void);
  190. void abi_test_clobber_xmm7(void);
  191. } // extern "C"
  192. TEST(ABITest, X86) {
  193. // abi_test_trampoline hides unsaved registers from the caller, so we can
  194. // safely call the abi_test_clobber_* functions below.
  195. abi_test::internal::CallerState state;
  196. RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
  197. CHECK_ABI_NO_UNWIND(abi_test_trampoline,
  198. reinterpret_cast<crypto_word_t>(abi_test_clobber_ebx),
  199. &state, nullptr, 0, 0 /* no breakpoint */);
  200. CHECK_ABI_NO_UNWIND(abi_test_clobber_eax);
  201. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_ebx),
  202. "ebx was not restored after return");
  203. CHECK_ABI_NO_UNWIND(abi_test_clobber_ecx);
  204. CHECK_ABI_NO_UNWIND(abi_test_clobber_edx);
  205. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_edi),
  206. "edi was not restored after return");
  207. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_esi),
  208. "esi was not restored after return");
  209. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_ebp),
  210. "ebp was not restored after return");
  211. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm0);
  212. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm1);
  213. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm2);
  214. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm3);
  215. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm4);
  216. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm5);
  217. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm6);
  218. CHECK_ABI_NO_UNWIND(abi_test_clobber_xmm7);
  219. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_set_direction_flag),
  220. "Direction flag set after return");
  221. EXPECT_EQ(0, abi_test_get_and_clear_direction_flag())
  222. << "CHECK_ABI did not insulate the caller from direction flag errors";
  223. }
  224. #endif // OPENSSL_X86 && SUPPORTS_ABI_TEST
  225. #if defined(OPENSSL_ARM) && defined(SUPPORTS_ABI_TEST)
  226. extern "C" {
  227. void abi_test_clobber_r0(void);
  228. void abi_test_clobber_r1(void);
  229. void abi_test_clobber_r2(void);
  230. void abi_test_clobber_r3(void);
  231. void abi_test_clobber_r4(void);
  232. void abi_test_clobber_r5(void);
  233. void abi_test_clobber_r6(void);
  234. void abi_test_clobber_r7(void);
  235. void abi_test_clobber_r8(void);
  236. void abi_test_clobber_r9(void);
  237. void abi_test_clobber_r10(void);
  238. void abi_test_clobber_r11(void);
  239. void abi_test_clobber_r12(void);
  240. // r13, r14, and r15, are sp, lr, and pc, respectively.
  241. void abi_test_clobber_d0(void);
  242. void abi_test_clobber_d1(void);
  243. void abi_test_clobber_d2(void);
  244. void abi_test_clobber_d3(void);
  245. void abi_test_clobber_d4(void);
  246. void abi_test_clobber_d5(void);
  247. void abi_test_clobber_d6(void);
  248. void abi_test_clobber_d7(void);
  249. void abi_test_clobber_d8(void);
  250. void abi_test_clobber_d9(void);
  251. void abi_test_clobber_d10(void);
  252. void abi_test_clobber_d11(void);
  253. void abi_test_clobber_d12(void);
  254. void abi_test_clobber_d13(void);
  255. void abi_test_clobber_d14(void);
  256. void abi_test_clobber_d15(void);
  257. } // extern "C"
  258. TEST(ABITest, ARM) {
  259. // abi_test_trampoline hides unsaved registers from the caller, so we can
  260. // safely call the abi_test_clobber_* functions below.
  261. abi_test::internal::CallerState state;
  262. RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
  263. CHECK_ABI_NO_UNWIND(abi_test_trampoline,
  264. reinterpret_cast<crypto_word_t>(abi_test_clobber_r4),
  265. &state, nullptr, 0, 0 /* no breakpoint */);
  266. CHECK_ABI_NO_UNWIND(abi_test_clobber_r0);
  267. CHECK_ABI_NO_UNWIND(abi_test_clobber_r1);
  268. CHECK_ABI_NO_UNWIND(abi_test_clobber_r2);
  269. CHECK_ABI_NO_UNWIND(abi_test_clobber_r3);
  270. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r4),
  271. "r4 was not restored after return");
  272. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r5),
  273. "r5 was not restored after return");
  274. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r6),
  275. "r6 was not restored after return");
  276. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r7),
  277. "r7 was not restored after return");
  278. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r8),
  279. "r8 was not restored after return");
  280. #if defined(OPENSSL_APPLE)
  281. CHECK_ABI_NO_UNWIND(abi_test_clobber_r9);
  282. #else
  283. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r9),
  284. "r9 was not restored after return");
  285. #endif
  286. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r10),
  287. "r10 was not restored after return");
  288. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r11),
  289. "r11 was not restored after return");
  290. CHECK_ABI_NO_UNWIND(abi_test_clobber_r12);
  291. CHECK_ABI_NO_UNWIND(abi_test_clobber_d0);
  292. CHECK_ABI_NO_UNWIND(abi_test_clobber_d1);
  293. CHECK_ABI_NO_UNWIND(abi_test_clobber_d2);
  294. CHECK_ABI_NO_UNWIND(abi_test_clobber_d3);
  295. CHECK_ABI_NO_UNWIND(abi_test_clobber_d4);
  296. CHECK_ABI_NO_UNWIND(abi_test_clobber_d5);
  297. CHECK_ABI_NO_UNWIND(abi_test_clobber_d6);
  298. CHECK_ABI_NO_UNWIND(abi_test_clobber_d7);
  299. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d8),
  300. "d8 was not restored after return");
  301. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d9),
  302. "d9 was not restored after return");
  303. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d10),
  304. "d10 was not restored after return");
  305. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d11),
  306. "d11 was not restored after return");
  307. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d12),
  308. "d12 was not restored after return");
  309. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d13),
  310. "d13 was not restored after return");
  311. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d14),
  312. "d14 was not restored after return");
  313. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d15),
  314. "d15 was not restored after return");
  315. }
  316. #endif // OPENSSL_ARM && SUPPORTS_ABI_TEST
  317. #if defined(OPENSSL_AARCH64) && defined(SUPPORTS_ABI_TEST)
  318. extern "C" {
  319. void abi_test_clobber_x0(void);
  320. void abi_test_clobber_x1(void);
  321. void abi_test_clobber_x2(void);
  322. void abi_test_clobber_x3(void);
  323. void abi_test_clobber_x4(void);
  324. void abi_test_clobber_x5(void);
  325. void abi_test_clobber_x6(void);
  326. void abi_test_clobber_x7(void);
  327. void abi_test_clobber_x8(void);
  328. void abi_test_clobber_x9(void);
  329. void abi_test_clobber_x10(void);
  330. void abi_test_clobber_x11(void);
  331. void abi_test_clobber_x12(void);
  332. void abi_test_clobber_x13(void);
  333. void abi_test_clobber_x14(void);
  334. void abi_test_clobber_x15(void);
  335. void abi_test_clobber_x16(void);
  336. void abi_test_clobber_x17(void);
  337. // x18 is the platform register and off limits.
  338. void abi_test_clobber_x19(void);
  339. void abi_test_clobber_x20(void);
  340. void abi_test_clobber_x21(void);
  341. void abi_test_clobber_x22(void);
  342. void abi_test_clobber_x23(void);
  343. void abi_test_clobber_x24(void);
  344. void abi_test_clobber_x25(void);
  345. void abi_test_clobber_x26(void);
  346. void abi_test_clobber_x27(void);
  347. void abi_test_clobber_x28(void);
  348. void abi_test_clobber_x29(void);
  349. void abi_test_clobber_d0(void);
  350. void abi_test_clobber_d1(void);
  351. void abi_test_clobber_d2(void);
  352. void abi_test_clobber_d3(void);
  353. void abi_test_clobber_d4(void);
  354. void abi_test_clobber_d5(void);
  355. void abi_test_clobber_d6(void);
  356. void abi_test_clobber_d7(void);
  357. void abi_test_clobber_d8(void);
  358. void abi_test_clobber_d9(void);
  359. void abi_test_clobber_d10(void);
  360. void abi_test_clobber_d11(void);
  361. void abi_test_clobber_d12(void);
  362. void abi_test_clobber_d13(void);
  363. void abi_test_clobber_d14(void);
  364. void abi_test_clobber_d15(void);
  365. void abi_test_clobber_d16(void);
  366. void abi_test_clobber_d17(void);
  367. void abi_test_clobber_d18(void);
  368. void abi_test_clobber_d19(void);
  369. void abi_test_clobber_d20(void);
  370. void abi_test_clobber_d21(void);
  371. void abi_test_clobber_d22(void);
  372. void abi_test_clobber_d23(void);
  373. void abi_test_clobber_d24(void);
  374. void abi_test_clobber_d25(void);
  375. void abi_test_clobber_d26(void);
  376. void abi_test_clobber_d27(void);
  377. void abi_test_clobber_d28(void);
  378. void abi_test_clobber_d29(void);
  379. void abi_test_clobber_d30(void);
  380. void abi_test_clobber_d31(void);
  381. void abi_test_clobber_v8_upper(void);
  382. void abi_test_clobber_v9_upper(void);
  383. void abi_test_clobber_v10_upper(void);
  384. void abi_test_clobber_v11_upper(void);
  385. void abi_test_clobber_v12_upper(void);
  386. void abi_test_clobber_v13_upper(void);
  387. void abi_test_clobber_v14_upper(void);
  388. void abi_test_clobber_v15_upper(void);
  389. } // extern "C"
  390. TEST(ABITest, AArch64) {
  391. // abi_test_trampoline hides unsaved registers from the caller, so we can
  392. // safely call the abi_test_clobber_* functions below.
  393. abi_test::internal::CallerState state;
  394. RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
  395. CHECK_ABI_NO_UNWIND(abi_test_trampoline,
  396. reinterpret_cast<crypto_word_t>(abi_test_clobber_x19),
  397. &state, nullptr, 0, 0 /* no breakpoint */);
  398. CHECK_ABI_NO_UNWIND(abi_test_clobber_x0);
  399. CHECK_ABI_NO_UNWIND(abi_test_clobber_x1);
  400. CHECK_ABI_NO_UNWIND(abi_test_clobber_x2);
  401. CHECK_ABI_NO_UNWIND(abi_test_clobber_x3);
  402. CHECK_ABI_NO_UNWIND(abi_test_clobber_x4);
  403. CHECK_ABI_NO_UNWIND(abi_test_clobber_x5);
  404. CHECK_ABI_NO_UNWIND(abi_test_clobber_x6);
  405. CHECK_ABI_NO_UNWIND(abi_test_clobber_x7);
  406. CHECK_ABI_NO_UNWIND(abi_test_clobber_x8);
  407. CHECK_ABI_NO_UNWIND(abi_test_clobber_x9);
  408. CHECK_ABI_NO_UNWIND(abi_test_clobber_x10);
  409. CHECK_ABI_NO_UNWIND(abi_test_clobber_x11);
  410. CHECK_ABI_NO_UNWIND(abi_test_clobber_x12);
  411. CHECK_ABI_NO_UNWIND(abi_test_clobber_x13);
  412. CHECK_ABI_NO_UNWIND(abi_test_clobber_x14);
  413. CHECK_ABI_NO_UNWIND(abi_test_clobber_x15);
  414. CHECK_ABI_NO_UNWIND(abi_test_clobber_x16);
  415. CHECK_ABI_NO_UNWIND(abi_test_clobber_x17);
  416. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x19),
  417. "x19 was not restored after return");
  418. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x20),
  419. "x20 was not restored after return");
  420. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x21),
  421. "x21 was not restored after return");
  422. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x22),
  423. "x22 was not restored after return");
  424. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x23),
  425. "x23 was not restored after return");
  426. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x24),
  427. "x24 was not restored after return");
  428. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x25),
  429. "x25 was not restored after return");
  430. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x26),
  431. "x26 was not restored after return");
  432. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x27),
  433. "x27 was not restored after return");
  434. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x28),
  435. "x28 was not restored after return");
  436. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x29),
  437. "x29 was not restored after return");
  438. CHECK_ABI_NO_UNWIND(abi_test_clobber_d0);
  439. CHECK_ABI_NO_UNWIND(abi_test_clobber_d1);
  440. CHECK_ABI_NO_UNWIND(abi_test_clobber_d2);
  441. CHECK_ABI_NO_UNWIND(abi_test_clobber_d3);
  442. CHECK_ABI_NO_UNWIND(abi_test_clobber_d4);
  443. CHECK_ABI_NO_UNWIND(abi_test_clobber_d5);
  444. CHECK_ABI_NO_UNWIND(abi_test_clobber_d6);
  445. CHECK_ABI_NO_UNWIND(abi_test_clobber_d7);
  446. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d8),
  447. "d8 was not restored after return");
  448. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d9),
  449. "d9 was not restored after return");
  450. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d10),
  451. "d10 was not restored after return");
  452. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d11),
  453. "d11 was not restored after return");
  454. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d12),
  455. "d12 was not restored after return");
  456. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d13),
  457. "d13 was not restored after return");
  458. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d14),
  459. "d14 was not restored after return");
  460. EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d15),
  461. "d15 was not restored after return");
  462. CHECK_ABI_NO_UNWIND(abi_test_clobber_d16);
  463. CHECK_ABI_NO_UNWIND(abi_test_clobber_d18);
  464. CHECK_ABI_NO_UNWIND(abi_test_clobber_d19);
  465. CHECK_ABI_NO_UNWIND(abi_test_clobber_d20);
  466. CHECK_ABI_NO_UNWIND(abi_test_clobber_d21);
  467. CHECK_ABI_NO_UNWIND(abi_test_clobber_d22);
  468. CHECK_ABI_NO_UNWIND(abi_test_clobber_d23);
  469. CHECK_ABI_NO_UNWIND(abi_test_clobber_d24);
  470. CHECK_ABI_NO_UNWIND(abi_test_clobber_d25);
  471. CHECK_ABI_NO_UNWIND(abi_test_clobber_d26);
  472. CHECK_ABI_NO_UNWIND(abi_test_clobber_d27);
  473. CHECK_ABI_NO_UNWIND(abi_test_clobber_d28);
  474. CHECK_ABI_NO_UNWIND(abi_test_clobber_d29);
  475. CHECK_ABI_NO_UNWIND(abi_test_clobber_d30);
  476. CHECK_ABI_NO_UNWIND(abi_test_clobber_d31);
  477. // The lower halves of v8-v15 (accessed as d8-d15) must be preserved, but not
  478. // the upper halves.
  479. CHECK_ABI_NO_UNWIND(abi_test_clobber_v8_upper);
  480. CHECK_ABI_NO_UNWIND(abi_test_clobber_v9_upper);
  481. CHECK_ABI_NO_UNWIND(abi_test_clobber_v10_upper);
  482. CHECK_ABI_NO_UNWIND(abi_test_clobber_v11_upper);
  483. CHECK_ABI_NO_UNWIND(abi_test_clobber_v12_upper);
  484. CHECK_ABI_NO_UNWIND(abi_test_clobber_v13_upper);
  485. CHECK_ABI_NO_UNWIND(abi_test_clobber_v14_upper);
  486. CHECK_ABI_NO_UNWIND(abi_test_clobber_v15_upper);
  487. }
  488. #endif // OPENSSL_AARCH64 && SUPPORTS_ABI_TEST