abi_self_test.cc
Go to the documentation of this file.
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 
15 #include <gtest/gtest.h>
16 #include <gtest/gtest-spi.h>
17 
18 #include <openssl/rand.h>
19 
20 #include "test/abi_test.h"
21 
22 
23 static bool test_function_ok;
24 static int TestFunction(int a1, int a2, int a3, int a4, int a5, int a6, int a7,
25  int a8) {
26  test_function_ok = a1 == 1 || a2 == 2 || a3 == 3 || a4 == 4 || a5 == 5 ||
27  a6 == 6 || a7 == 7 || a8 == 8;
28  return 42;
29 }
30 
31 TEST(ABITest, SanityCheck) {
32  EXPECT_NE(0, CHECK_ABI_NO_UNWIND(strcmp, "hello", "world"));
33 
34  test_function_ok = false;
35  EXPECT_EQ(42, CHECK_ABI_SEH(TestFunction, 1, 2, 3, 4, 5, 6, 7, 8));
37 
38 #if defined(SUPPORTS_ABI_TEST)
39  abi_test::internal::CallerState state;
40  RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
41  crypto_word_t argv[] = {
42  1, 2, 3, 4, 5, 6, 7, 8,
43  };
45  reinterpret_cast<crypto_word_t>(TestFunction), &state, argv, 8,
46  0 /* no breakpoint */);
47 
48 #if defined(OPENSSL_X86_64)
51  "was not recovered");
53  "was not recovered");
54 
57 
58 #if defined(OPENSSL_WINDOWS)
59  // The invalid epilog makes Windows believe the epilog starts later than it
60  // actually does. As a result, immediately after the popq, it does not
61  // realize the stack has been unwound and repeats the work.
62  EXPECT_NONFATAL_FAILURE(CHECK_ABI_SEH(abi_test_bad_unwind_epilog),
63  "unwound past starting frame");
64  CHECK_ABI_NO_UNWIND(abi_test_bad_unwind_epilog);
65 #endif // OPENSSL_WINDOWS
66  }
67 #endif // OPENSSL_X86_64
68 #endif // SUPPORTS_ABI_TEST
69 }
70 
71 #if defined(OPENSSL_X86_64) && defined(SUPPORTS_ABI_TEST)
72 extern "C" {
73 void abi_test_clobber_rax(void);
74 void abi_test_clobber_rbx(void);
75 void abi_test_clobber_rcx(void);
76 void abi_test_clobber_rdx(void);
77 void abi_test_clobber_rsi(void);
78 void abi_test_clobber_rdi(void);
79 void abi_test_clobber_rbp(void);
80 void abi_test_clobber_r8(void);
81 void abi_test_clobber_r9(void);
82 void abi_test_clobber_r10(void);
83 void abi_test_clobber_r11(void);
84 void abi_test_clobber_r12(void);
85 void abi_test_clobber_r13(void);
86 void abi_test_clobber_r14(void);
87 void abi_test_clobber_r15(void);
88 void abi_test_clobber_xmm0(void);
89 void abi_test_clobber_xmm1(void);
90 void abi_test_clobber_xmm2(void);
91 void abi_test_clobber_xmm3(void);
92 void abi_test_clobber_xmm4(void);
93 void abi_test_clobber_xmm5(void);
94 void abi_test_clobber_xmm6(void);
95 void abi_test_clobber_xmm7(void);
96 void abi_test_clobber_xmm8(void);
97 void abi_test_clobber_xmm9(void);
98 void abi_test_clobber_xmm10(void);
99 void abi_test_clobber_xmm11(void);
100 void abi_test_clobber_xmm12(void);
101 void abi_test_clobber_xmm13(void);
102 void abi_test_clobber_xmm14(void);
103 void abi_test_clobber_xmm15(void);
104 } // extern "C"
105 
106 TEST(ABITest, X86_64) {
107  // abi_test_trampoline hides unsaved registers from the caller, so we can
108  // safely call the abi_test_clobber_* functions below.
109  abi_test::internal::CallerState state;
110  RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
112  reinterpret_cast<crypto_word_t>(abi_test_clobber_rbx),
113  &state, nullptr, 0, 0 /* no breakpoint */);
114 
117  "rbx was not restored after return");
120 #if defined(OPENSSL_WINDOWS)
122  "rdi was not restored after return");
124  "rsi was not restored after return");
125 #else
128 #endif
130  "rbp was not restored after return");
136  "r12 was not restored after return");
138  "r13 was not restored after return");
140  "r14 was not restored after return");
142  "r15 was not restored after return");
143 
150 #if defined(OPENSSL_WINDOWS)
152  "xmm6 was not restored after return");
154  "xmm7 was not restored after return");
156  "xmm8 was not restored after return");
158  "xmm9 was not restored after return");
160  "xmm10 was not restored after return");
162  "xmm11 was not restored after return");
164  "xmm12 was not restored after return");
166  "xmm13 was not restored after return");
168  "xmm14 was not restored after return");
170  "xmm15 was not restored after return");
171 #else
182 #endif
183 
185  "Direction flag set after return");
187  << "CHECK_ABI did not insulate the caller from direction flag errors";
188 }
189 #endif // OPENSSL_X86_64 && SUPPORTS_ABI_TEST
190 
191 #if defined(OPENSSL_X86) && defined(SUPPORTS_ABI_TEST)
192 extern "C" {
193 void abi_test_clobber_eax(void);
194 void abi_test_clobber_ebx(void);
195 void abi_test_clobber_ecx(void);
196 void abi_test_clobber_edx(void);
197 void abi_test_clobber_esi(void);
198 void abi_test_clobber_edi(void);
199 void abi_test_clobber_ebp(void);
200 void abi_test_clobber_xmm0(void);
201 void abi_test_clobber_xmm1(void);
202 void abi_test_clobber_xmm2(void);
203 void abi_test_clobber_xmm3(void);
204 void abi_test_clobber_xmm4(void);
205 void abi_test_clobber_xmm5(void);
206 void abi_test_clobber_xmm6(void);
207 void abi_test_clobber_xmm7(void);
208 } // extern "C"
209 
210 TEST(ABITest, X86) {
211  // abi_test_trampoline hides unsaved registers from the caller, so we can
212  // safely call the abi_test_clobber_* functions below.
213  abi_test::internal::CallerState state;
214  RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
216  reinterpret_cast<crypto_word_t>(abi_test_clobber_ebx),
217  &state, nullptr, 0, 0 /* no breakpoint */);
218 
219  CHECK_ABI_NO_UNWIND(abi_test_clobber_eax);
220  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_ebx),
221  "ebx was not restored after return");
222  CHECK_ABI_NO_UNWIND(abi_test_clobber_ecx);
223  CHECK_ABI_NO_UNWIND(abi_test_clobber_edx);
224  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_edi),
225  "edi was not restored after return");
226  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_esi),
227  "esi was not restored after return");
228  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_ebp),
229  "ebp was not restored after return");
230 
239 
241  "Direction flag set after return");
243  << "CHECK_ABI did not insulate the caller from direction flag errors";
244 }
245 #endif // OPENSSL_X86 && SUPPORTS_ABI_TEST
246 
247 #if defined(OPENSSL_ARM) && defined(SUPPORTS_ABI_TEST)
248 extern "C" {
249 void abi_test_clobber_r0(void);
250 void abi_test_clobber_r1(void);
251 void abi_test_clobber_r2(void);
252 void abi_test_clobber_r3(void);
253 void abi_test_clobber_r4(void);
254 void abi_test_clobber_r5(void);
255 void abi_test_clobber_r6(void);
256 void abi_test_clobber_r7(void);
257 void abi_test_clobber_r8(void);
258 void abi_test_clobber_r9(void);
259 void abi_test_clobber_r10(void);
260 void abi_test_clobber_r11(void);
261 void abi_test_clobber_r12(void);
262 // r13, r14, and r15, are sp, lr, and pc, respectively.
263 
264 void abi_test_clobber_d0(void);
265 void abi_test_clobber_d1(void);
266 void abi_test_clobber_d2(void);
267 void abi_test_clobber_d3(void);
268 void abi_test_clobber_d4(void);
269 void abi_test_clobber_d5(void);
270 void abi_test_clobber_d6(void);
271 void abi_test_clobber_d7(void);
272 void abi_test_clobber_d8(void);
273 void abi_test_clobber_d9(void);
274 void abi_test_clobber_d10(void);
275 void abi_test_clobber_d11(void);
276 void abi_test_clobber_d12(void);
277 void abi_test_clobber_d13(void);
278 void abi_test_clobber_d14(void);
279 void abi_test_clobber_d15(void);
280 } // extern "C"
281 
282 TEST(ABITest, ARM) {
283  // abi_test_trampoline hides unsaved registers from the caller, so we can
284  // safely call the abi_test_clobber_* functions below.
285  abi_test::internal::CallerState state;
286  RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
288  reinterpret_cast<crypto_word_t>(abi_test_clobber_r4),
289  &state, nullptr, 0, 0 /* no breakpoint */);
290 
291  CHECK_ABI_NO_UNWIND(abi_test_clobber_r0);
292  CHECK_ABI_NO_UNWIND(abi_test_clobber_r1);
293  CHECK_ABI_NO_UNWIND(abi_test_clobber_r2);
294  CHECK_ABI_NO_UNWIND(abi_test_clobber_r3);
295  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r4),
296  "r4 was not restored after return");
297  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r5),
298  "r5 was not restored after return");
299  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r6),
300  "r6 was not restored after return");
301  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r7),
302  "r7 was not restored after return");
304  "r8 was not restored after return");
305 #if defined(OPENSSL_APPLE)
307 #else
309  "r9 was not restored after return");
310 #endif
312  "r10 was not restored after return");
314  "r11 was not restored after return");
316 
317  CHECK_ABI_NO_UNWIND(abi_test_clobber_d0);
318  CHECK_ABI_NO_UNWIND(abi_test_clobber_d1);
319  CHECK_ABI_NO_UNWIND(abi_test_clobber_d2);
320  CHECK_ABI_NO_UNWIND(abi_test_clobber_d3);
321  CHECK_ABI_NO_UNWIND(abi_test_clobber_d4);
322  CHECK_ABI_NO_UNWIND(abi_test_clobber_d5);
323  CHECK_ABI_NO_UNWIND(abi_test_clobber_d6);
324  CHECK_ABI_NO_UNWIND(abi_test_clobber_d7);
325  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d8),
326  "d8 was not restored after return");
327  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d9),
328  "d9 was not restored after return");
329  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d10),
330  "d10 was not restored after return");
331  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d11),
332  "d11 was not restored after return");
333  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d12),
334  "d12 was not restored after return");
335  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d13),
336  "d13 was not restored after return");
337  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d14),
338  "d14 was not restored after return");
339  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d15),
340  "d15 was not restored after return");
341 }
342 #endif // OPENSSL_ARM && SUPPORTS_ABI_TEST
343 
344 #if defined(OPENSSL_AARCH64) && defined(SUPPORTS_ABI_TEST)
345 extern "C" {
346 void abi_test_clobber_x0(void);
347 void abi_test_clobber_x1(void);
348 void abi_test_clobber_x2(void);
349 void abi_test_clobber_x3(void);
350 void abi_test_clobber_x4(void);
351 void abi_test_clobber_x5(void);
352 void abi_test_clobber_x6(void);
353 void abi_test_clobber_x7(void);
354 void abi_test_clobber_x8(void);
355 void abi_test_clobber_x9(void);
356 void abi_test_clobber_x10(void);
357 void abi_test_clobber_x11(void);
358 void abi_test_clobber_x12(void);
359 void abi_test_clobber_x13(void);
360 void abi_test_clobber_x14(void);
361 void abi_test_clobber_x15(void);
362 void abi_test_clobber_x16(void);
363 void abi_test_clobber_x17(void);
364 // x18 is the platform register and off limits.
365 void abi_test_clobber_x19(void);
366 void abi_test_clobber_x20(void);
367 void abi_test_clobber_x21(void);
368 void abi_test_clobber_x22(void);
369 void abi_test_clobber_x23(void);
370 void abi_test_clobber_x24(void);
371 void abi_test_clobber_x25(void);
372 void abi_test_clobber_x26(void);
373 void abi_test_clobber_x27(void);
374 void abi_test_clobber_x28(void);
375 void abi_test_clobber_x29(void);
376 
377 void abi_test_clobber_d0(void);
378 void abi_test_clobber_d1(void);
379 void abi_test_clobber_d2(void);
380 void abi_test_clobber_d3(void);
381 void abi_test_clobber_d4(void);
382 void abi_test_clobber_d5(void);
383 void abi_test_clobber_d6(void);
384 void abi_test_clobber_d7(void);
385 void abi_test_clobber_d8(void);
386 void abi_test_clobber_d9(void);
387 void abi_test_clobber_d10(void);
388 void abi_test_clobber_d11(void);
389 void abi_test_clobber_d12(void);
390 void abi_test_clobber_d13(void);
391 void abi_test_clobber_d14(void);
392 void abi_test_clobber_d15(void);
393 void abi_test_clobber_d16(void);
394 void abi_test_clobber_d17(void);
395 void abi_test_clobber_d18(void);
396 void abi_test_clobber_d19(void);
397 void abi_test_clobber_d20(void);
398 void abi_test_clobber_d21(void);
399 void abi_test_clobber_d22(void);
400 void abi_test_clobber_d23(void);
401 void abi_test_clobber_d24(void);
402 void abi_test_clobber_d25(void);
403 void abi_test_clobber_d26(void);
404 void abi_test_clobber_d27(void);
405 void abi_test_clobber_d28(void);
406 void abi_test_clobber_d29(void);
407 void abi_test_clobber_d30(void);
408 void abi_test_clobber_d31(void);
409 
410 void abi_test_clobber_v8_upper(void);
411 void abi_test_clobber_v9_upper(void);
412 void abi_test_clobber_v10_upper(void);
413 void abi_test_clobber_v11_upper(void);
414 void abi_test_clobber_v12_upper(void);
415 void abi_test_clobber_v13_upper(void);
416 void abi_test_clobber_v14_upper(void);
417 void abi_test_clobber_v15_upper(void);
418 } // extern "C"
419 
420 TEST(ABITest, AArch64) {
421  // abi_test_trampoline hides unsaved registers from the caller, so we can
422  // safely call the abi_test_clobber_* functions below.
423  abi_test::internal::CallerState state;
424  RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
426  reinterpret_cast<crypto_word_t>(abi_test_clobber_x19),
427  &state, nullptr, 0, 0 /* no breakpoint */);
428 
429  CHECK_ABI_NO_UNWIND(abi_test_clobber_x0);
430  CHECK_ABI_NO_UNWIND(abi_test_clobber_x1);
431  CHECK_ABI_NO_UNWIND(abi_test_clobber_x2);
432  CHECK_ABI_NO_UNWIND(abi_test_clobber_x3);
433  CHECK_ABI_NO_UNWIND(abi_test_clobber_x4);
434  CHECK_ABI_NO_UNWIND(abi_test_clobber_x5);
435  CHECK_ABI_NO_UNWIND(abi_test_clobber_x6);
436  CHECK_ABI_NO_UNWIND(abi_test_clobber_x7);
437  CHECK_ABI_NO_UNWIND(abi_test_clobber_x8);
438  CHECK_ABI_NO_UNWIND(abi_test_clobber_x9);
439  CHECK_ABI_NO_UNWIND(abi_test_clobber_x10);
440  CHECK_ABI_NO_UNWIND(abi_test_clobber_x11);
441  CHECK_ABI_NO_UNWIND(abi_test_clobber_x12);
442  CHECK_ABI_NO_UNWIND(abi_test_clobber_x13);
443  CHECK_ABI_NO_UNWIND(abi_test_clobber_x14);
444  CHECK_ABI_NO_UNWIND(abi_test_clobber_x15);
445  CHECK_ABI_NO_UNWIND(abi_test_clobber_x16);
446  CHECK_ABI_NO_UNWIND(abi_test_clobber_x17);
447 
448  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x19),
449  "x19 was not restored after return");
450  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x20),
451  "x20 was not restored after return");
452  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x21),
453  "x21 was not restored after return");
454  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x22),
455  "x22 was not restored after return");
456  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x23),
457  "x23 was not restored after return");
458  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x24),
459  "x24 was not restored after return");
460  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x25),
461  "x25 was not restored after return");
462  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x26),
463  "x26 was not restored after return");
464  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x27),
465  "x27 was not restored after return");
466  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x28),
467  "x28 was not restored after return");
468  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_x29),
469  "x29 was not restored after return");
470 
471  CHECK_ABI_NO_UNWIND(abi_test_clobber_d0);
472  CHECK_ABI_NO_UNWIND(abi_test_clobber_d1);
473  CHECK_ABI_NO_UNWIND(abi_test_clobber_d2);
474  CHECK_ABI_NO_UNWIND(abi_test_clobber_d3);
475  CHECK_ABI_NO_UNWIND(abi_test_clobber_d4);
476  CHECK_ABI_NO_UNWIND(abi_test_clobber_d5);
477  CHECK_ABI_NO_UNWIND(abi_test_clobber_d6);
478  CHECK_ABI_NO_UNWIND(abi_test_clobber_d7);
479  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d8),
480  "d8 was not restored after return");
481  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d9),
482  "d9 was not restored after return");
483  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d10),
484  "d10 was not restored after return");
485  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d11),
486  "d11 was not restored after return");
487  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d12),
488  "d12 was not restored after return");
489  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d13),
490  "d13 was not restored after return");
491  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d14),
492  "d14 was not restored after return");
493  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_d15),
494  "d15 was not restored after return");
495  CHECK_ABI_NO_UNWIND(abi_test_clobber_d16);
496  CHECK_ABI_NO_UNWIND(abi_test_clobber_d18);
497  CHECK_ABI_NO_UNWIND(abi_test_clobber_d19);
498  CHECK_ABI_NO_UNWIND(abi_test_clobber_d20);
499  CHECK_ABI_NO_UNWIND(abi_test_clobber_d21);
500  CHECK_ABI_NO_UNWIND(abi_test_clobber_d22);
501  CHECK_ABI_NO_UNWIND(abi_test_clobber_d23);
502  CHECK_ABI_NO_UNWIND(abi_test_clobber_d24);
503  CHECK_ABI_NO_UNWIND(abi_test_clobber_d25);
504  CHECK_ABI_NO_UNWIND(abi_test_clobber_d26);
505  CHECK_ABI_NO_UNWIND(abi_test_clobber_d27);
506  CHECK_ABI_NO_UNWIND(abi_test_clobber_d28);
507  CHECK_ABI_NO_UNWIND(abi_test_clobber_d29);
508  CHECK_ABI_NO_UNWIND(abi_test_clobber_d30);
509  CHECK_ABI_NO_UNWIND(abi_test_clobber_d31);
510 
511  // The lower halves of v8-v15 (accessed as d8-d15) must be preserved, but not
512  // the upper halves.
513  CHECK_ABI_NO_UNWIND(abi_test_clobber_v8_upper);
514  CHECK_ABI_NO_UNWIND(abi_test_clobber_v9_upper);
515  CHECK_ABI_NO_UNWIND(abi_test_clobber_v10_upper);
516  CHECK_ABI_NO_UNWIND(abi_test_clobber_v11_upper);
517  CHECK_ABI_NO_UNWIND(abi_test_clobber_v12_upper);
518  CHECK_ABI_NO_UNWIND(abi_test_clobber_v13_upper);
519  CHECK_ABI_NO_UNWIND(abi_test_clobber_v14_upper);
520  CHECK_ABI_NO_UNWIND(abi_test_clobber_v15_upper);
521 }
522 #endif // OPENSSL_AARCH64 && SUPPORTS_ABI_TEST
523 
524 #if defined(OPENSSL_PPC64LE) && defined(SUPPORTS_ABI_TEST)
525 extern "C" {
526 void abi_test_clobber_r0(void);
527 // r1 is the stack pointer.
528 void abi_test_clobber_r2(void);
529 void abi_test_clobber_r3(void);
530 void abi_test_clobber_r4(void);
531 void abi_test_clobber_r5(void);
532 void abi_test_clobber_r6(void);
533 void abi_test_clobber_r7(void);
534 void abi_test_clobber_r8(void);
535 void abi_test_clobber_r9(void);
536 void abi_test_clobber_r10(void);
537 void abi_test_clobber_r11(void);
538 void abi_test_clobber_r12(void);
539 // r13 is the thread pointer.
540 void abi_test_clobber_r14(void);
541 void abi_test_clobber_r15(void);
542 void abi_test_clobber_r16(void);
543 void abi_test_clobber_r17(void);
544 void abi_test_clobber_r18(void);
545 void abi_test_clobber_r19(void);
546 void abi_test_clobber_r20(void);
547 void abi_test_clobber_r21(void);
548 void abi_test_clobber_r22(void);
549 void abi_test_clobber_r23(void);
550 void abi_test_clobber_r24(void);
551 void abi_test_clobber_r25(void);
552 void abi_test_clobber_r26(void);
553 void abi_test_clobber_r27(void);
554 void abi_test_clobber_r28(void);
555 void abi_test_clobber_r29(void);
556 void abi_test_clobber_r30(void);
557 void abi_test_clobber_r31(void);
558 
559 void abi_test_clobber_f0(void);
560 void abi_test_clobber_f1(void);
561 void abi_test_clobber_f2(void);
562 void abi_test_clobber_f3(void);
563 void abi_test_clobber_f4(void);
564 void abi_test_clobber_f5(void);
565 void abi_test_clobber_f6(void);
566 void abi_test_clobber_f7(void);
567 void abi_test_clobber_f8(void);
568 void abi_test_clobber_f9(void);
569 void abi_test_clobber_f10(void);
570 void abi_test_clobber_f11(void);
571 void abi_test_clobber_f12(void);
572 void abi_test_clobber_f13(void);
573 void abi_test_clobber_f14(void);
574 void abi_test_clobber_f15(void);
575 void abi_test_clobber_f16(void);
576 void abi_test_clobber_f17(void);
577 void abi_test_clobber_f18(void);
578 void abi_test_clobber_f19(void);
579 void abi_test_clobber_f20(void);
580 void abi_test_clobber_f21(void);
581 void abi_test_clobber_f22(void);
582 void abi_test_clobber_f23(void);
583 void abi_test_clobber_f24(void);
584 void abi_test_clobber_f25(void);
585 void abi_test_clobber_f26(void);
586 void abi_test_clobber_f27(void);
587 void abi_test_clobber_f28(void);
588 void abi_test_clobber_f29(void);
589 void abi_test_clobber_f30(void);
590 void abi_test_clobber_f31(void);
591 
592 void abi_test_clobber_v0(void);
593 void abi_test_clobber_v1(void);
594 void abi_test_clobber_v2(void);
595 void abi_test_clobber_v3(void);
596 void abi_test_clobber_v4(void);
597 void abi_test_clobber_v5(void);
598 void abi_test_clobber_v6(void);
599 void abi_test_clobber_v7(void);
600 void abi_test_clobber_v8(void);
601 void abi_test_clobber_v9(void);
602 void abi_test_clobber_v10(void);
603 void abi_test_clobber_v11(void);
604 void abi_test_clobber_v12(void);
605 void abi_test_clobber_v13(void);
606 void abi_test_clobber_v14(void);
607 void abi_test_clobber_v15(void);
608 void abi_test_clobber_v16(void);
609 void abi_test_clobber_v17(void);
610 void abi_test_clobber_v18(void);
611 void abi_test_clobber_v19(void);
612 void abi_test_clobber_v20(void);
613 void abi_test_clobber_v21(void);
614 void abi_test_clobber_v22(void);
615 void abi_test_clobber_v23(void);
616 void abi_test_clobber_v24(void);
617 void abi_test_clobber_v25(void);
618 void abi_test_clobber_v26(void);
619 void abi_test_clobber_v27(void);
620 void abi_test_clobber_v28(void);
621 void abi_test_clobber_v29(void);
622 void abi_test_clobber_v30(void);
623 void abi_test_clobber_v31(void);
624 
625 void abi_test_clobber_cr0(void);
626 void abi_test_clobber_cr1(void);
627 void abi_test_clobber_cr2(void);
628 void abi_test_clobber_cr3(void);
629 void abi_test_clobber_cr4(void);
630 void abi_test_clobber_cr5(void);
631 void abi_test_clobber_cr6(void);
632 void abi_test_clobber_cr7(void);
633 
634 void abi_test_clobber_ctr(void);
635 void abi_test_clobber_lr(void);
636 
637 } // extern "C"
638 
639 TEST(ABITest, PPC64LE) {
640  // abi_test_trampoline hides unsaved registers from the caller, so we can
641  // safely call the abi_test_clobber_* functions below.
642  abi_test::internal::CallerState state;
643  RAND_bytes(reinterpret_cast<uint8_t *>(&state), sizeof(state));
645  reinterpret_cast<crypto_word_t>(abi_test_clobber_r14),
646  &state, nullptr, 0, 0 /* no breakpoint */);
647 
648  CHECK_ABI_NO_UNWIND(abi_test_clobber_r0);
649  CHECK_ABI_NO_UNWIND(abi_test_clobber_r2);
650  CHECK_ABI_NO_UNWIND(abi_test_clobber_r3);
651  CHECK_ABI_NO_UNWIND(abi_test_clobber_r4);
652  CHECK_ABI_NO_UNWIND(abi_test_clobber_r5);
653  CHECK_ABI_NO_UNWIND(abi_test_clobber_r6);
654  CHECK_ABI_NO_UNWIND(abi_test_clobber_r7);
661  "r14 was not restored after return");
663  "r15 was not restored after return");
664  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r16),
665  "r16 was not restored after return");
666  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r17),
667  "r17 was not restored after return");
668  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r18),
669  "r18 was not restored after return");
670  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r19),
671  "r19 was not restored after return");
672  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r20),
673  "r20 was not restored after return");
674  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r21),
675  "r21 was not restored after return");
676  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r22),
677  "r22 was not restored after return");
678  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r23),
679  "r23 was not restored after return");
680  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r24),
681  "r24 was not restored after return");
682  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r25),
683  "r25 was not restored after return");
684  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r26),
685  "r26 was not restored after return");
686  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r27),
687  "r27 was not restored after return");
688  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r28),
689  "r28 was not restored after return");
690  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r29),
691  "r29 was not restored after return");
692  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r30),
693  "r30 was not restored after return");
694  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_r31),
695  "r31 was not restored after return");
696 
697  CHECK_ABI_NO_UNWIND(abi_test_clobber_f0);
698  CHECK_ABI_NO_UNWIND(abi_test_clobber_f1);
699  CHECK_ABI_NO_UNWIND(abi_test_clobber_f2);
700  CHECK_ABI_NO_UNWIND(abi_test_clobber_f3);
701  CHECK_ABI_NO_UNWIND(abi_test_clobber_f4);
702  CHECK_ABI_NO_UNWIND(abi_test_clobber_f5);
703  CHECK_ABI_NO_UNWIND(abi_test_clobber_f6);
704  CHECK_ABI_NO_UNWIND(abi_test_clobber_f7);
705  CHECK_ABI_NO_UNWIND(abi_test_clobber_f8);
706  CHECK_ABI_NO_UNWIND(abi_test_clobber_f9);
707  CHECK_ABI_NO_UNWIND(abi_test_clobber_f10);
708  CHECK_ABI_NO_UNWIND(abi_test_clobber_f11);
709  CHECK_ABI_NO_UNWIND(abi_test_clobber_f12);
710  CHECK_ABI_NO_UNWIND(abi_test_clobber_f13);
711  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f14),
712  "f14 was not restored after return");
713  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f15),
714  "f15 was not restored after return");
715  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f16),
716  "f16 was not restored after return");
717  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f17),
718  "f17 was not restored after return");
719  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f18),
720  "f18 was not restored after return");
721  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f19),
722  "f19 was not restored after return");
723  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f20),
724  "f20 was not restored after return");
725  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f21),
726  "f21 was not restored after return");
727  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f22),
728  "f22 was not restored after return");
729  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f23),
730  "f23 was not restored after return");
731  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f24),
732  "f24 was not restored after return");
733  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f25),
734  "f25 was not restored after return");
735  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f26),
736  "f26 was not restored after return");
737  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f27),
738  "f27 was not restored after return");
739  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f28),
740  "f28 was not restored after return");
741  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f29),
742  "f29 was not restored after return");
743  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f30),
744  "f30 was not restored after return");
745  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_f31),
746  "f31 was not restored after return");
747 
748  CHECK_ABI_NO_UNWIND(abi_test_clobber_v0);
749  CHECK_ABI_NO_UNWIND(abi_test_clobber_v1);
750  CHECK_ABI_NO_UNWIND(abi_test_clobber_v2);
751  CHECK_ABI_NO_UNWIND(abi_test_clobber_v3);
752  CHECK_ABI_NO_UNWIND(abi_test_clobber_v4);
753  CHECK_ABI_NO_UNWIND(abi_test_clobber_v5);
754  CHECK_ABI_NO_UNWIND(abi_test_clobber_v6);
755  CHECK_ABI_NO_UNWIND(abi_test_clobber_v7);
756  CHECK_ABI_NO_UNWIND(abi_test_clobber_v8);
757  CHECK_ABI_NO_UNWIND(abi_test_clobber_v9);
758  CHECK_ABI_NO_UNWIND(abi_test_clobber_v10);
759  CHECK_ABI_NO_UNWIND(abi_test_clobber_v11);
760  CHECK_ABI_NO_UNWIND(abi_test_clobber_v12);
761  CHECK_ABI_NO_UNWIND(abi_test_clobber_v13);
762  CHECK_ABI_NO_UNWIND(abi_test_clobber_v14);
763  CHECK_ABI_NO_UNWIND(abi_test_clobber_v15);
764  CHECK_ABI_NO_UNWIND(abi_test_clobber_v16);
765  CHECK_ABI_NO_UNWIND(abi_test_clobber_v17);
766  CHECK_ABI_NO_UNWIND(abi_test_clobber_v18);
767  CHECK_ABI_NO_UNWIND(abi_test_clobber_v19);
768  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v20),
769  "v20 was not restored after return");
770  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v21),
771  "v21 was not restored after return");
772  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v22),
773  "v22 was not restored after return");
774  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v23),
775  "v23 was not restored after return");
776  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v24),
777  "v24 was not restored after return");
778  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v25),
779  "v25 was not restored after return");
780  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v26),
781  "v26 was not restored after return");
782  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v27),
783  "v27 was not restored after return");
784  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v28),
785  "v28 was not restored after return");
786  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v29),
787  "v29 was not restored after return");
788  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v30),
789  "v30 was not restored after return");
790  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_v31),
791  "v31 was not restored after return");
792 
793  CHECK_ABI_NO_UNWIND(abi_test_clobber_cr0);
794  CHECK_ABI_NO_UNWIND(abi_test_clobber_cr1);
795  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_cr2),
796  "cr was not restored after return");
797  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_cr3),
798  "cr was not restored after return");
799  EXPECT_NONFATAL_FAILURE(CHECK_ABI_NO_UNWIND(abi_test_clobber_cr4),
800  "cr was not restored after return");
801  CHECK_ABI_NO_UNWIND(abi_test_clobber_cr5);
802  CHECK_ABI_NO_UNWIND(abi_test_clobber_cr6);
803  CHECK_ABI_NO_UNWIND(abi_test_clobber_cr7);
804 
805  CHECK_ABI_NO_UNWIND(abi_test_clobber_ctr);
806  CHECK_ABI_NO_UNWIND(abi_test_clobber_lr);
807 }
808 #endif // OPENSSL_PPC64LE && SUPPORTS_ABI_TEST
abi_test_clobber_xmm7
#define abi_test_clobber_xmm7
Definition: boringssl_prefix_symbols.h:2784
RAND_bytes
#define RAND_bytes
Definition: boringssl_prefix_symbols.h:2060
abi_test_clobber_r15
#define abi_test_clobber_r15
Definition: boringssl_prefix_symbols.h:2761
abi_test_clobber_rax
#define abi_test_clobber_rax
Definition: boringssl_prefix_symbols.h:2764
abi_test_clobber_xmm15
#define abi_test_clobber_xmm15
Definition: boringssl_prefix_symbols.h:2778
test_function_ok
static bool test_function_ok
Definition: abi_self_test.cc:23
abi_test_clobber_xmm14
#define abi_test_clobber_xmm14
Definition: boringssl_prefix_symbols.h:2777
abi_test_clobber_r8
#define abi_test_clobber_r8
Definition: boringssl_prefix_symbols.h:2762
abi_test_trampoline
#define abi_test_trampoline
Definition: boringssl_prefix_symbols.h:2789
abi_test_get_and_clear_direction_flag
#define abi_test_get_and_clear_direction_flag
Definition: boringssl_prefix_symbols.h:2787
TEST
TEST(ABITest, SanityCheck)
Definition: abi_self_test.cc:31
abi_test_clobber_xmm5
#define abi_test_clobber_xmm5
Definition: boringssl_prefix_symbols.h:2782
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
abi_test_clobber_xmm4
#define abi_test_clobber_xmm4
Definition: boringssl_prefix_symbols.h:2781
abi_test_clobber_xmm1
#define abi_test_clobber_xmm1
Definition: boringssl_prefix_symbols.h:2772
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
abi_test_clobber_rbp
#define abi_test_clobber_rbp
Definition: boringssl_prefix_symbols.h:2765
abi_test_clobber_rdx
#define abi_test_clobber_rdx
Definition: boringssl_prefix_symbols.h:2769
a2
T::first_type a2
Definition: abseil-cpp/absl/container/internal/hash_function_defaults_test.cc:307
EXPECT_NE
#define EXPECT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2028
CHECK_ABI_NO_UNWIND
#define CHECK_ABI_NO_UNWIND(...)
Definition: abi_test.h:481
abi_test_clobber_r13
#define abi_test_clobber_r13
Definition: boringssl_prefix_symbols.h:2759
X86_64
#define X86_64
Definition: third_party/bloaty/third_party/capstone/suite/cstest/include/helper.h:18
abi_test_clobber_xmm2
#define abi_test_clobber_xmm2
Definition: boringssl_prefix_symbols.h:2779
abi_test_clobber_xmm0
#define abi_test_clobber_xmm0
Definition: boringssl_prefix_symbols.h:2771
abi_test_clobber_rbx
#define abi_test_clobber_rbx
Definition: boringssl_prefix_symbols.h:2766
abi_test_clobber_r14
#define abi_test_clobber_r14
Definition: boringssl_prefix_symbols.h:2760
abi_test_clobber_rdi
#define abi_test_clobber_rdi
Definition: boringssl_prefix_symbols.h:2768
abi_test_clobber_xmm10
#define abi_test_clobber_xmm10
Definition: boringssl_prefix_symbols.h:2773
abi_test_clobber_r9
#define abi_test_clobber_r9
Definition: boringssl_prefix_symbols.h:2763
abi_test_clobber_r10
#define abi_test_clobber_r10
Definition: boringssl_prefix_symbols.h:2756
a1
T::first_type a1
Definition: abseil-cpp/absl/container/internal/hash_function_defaults_test.cc:305
TestFunction
static int TestFunction(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8)
Definition: abi_self_test.cc:24
abi_test_clobber_xmm11
#define abi_test_clobber_xmm11
Definition: boringssl_prefix_symbols.h:2774
abi_test_clobber_xmm3
#define abi_test_clobber_xmm3
Definition: boringssl_prefix_symbols.h:2780
abi_test_clobber_r11
#define abi_test_clobber_r11
Definition: boringssl_prefix_symbols.h:2757
CHECK_ABI_SEH
#define CHECK_ABI_SEH(...)
Definition: abi_test.h:476
rand.h
abi_test_clobber_rsi
#define abi_test_clobber_rsi
Definition: boringssl_prefix_symbols.h:2770
abi_test_clobber_xmm13
#define abi_test_clobber_xmm13
Definition: boringssl_prefix_symbols.h:2776
abi_test_bad_unwind_temporary
#define abi_test_bad_unwind_temporary
Definition: boringssl_prefix_symbols.h:2754
abi_test_bad_unwind_wrong_register
#define abi_test_bad_unwind_wrong_register
Definition: boringssl_prefix_symbols.h:2755
abi_test::UnwindTestsEnabled
bool UnwindTestsEnabled()
Definition: abi_test.cc:788
state
Definition: bloaty/third_party/zlib/contrib/blast/blast.c:41
abi_test_clobber_xmm6
#define abi_test_clobber_xmm6
Definition: boringssl_prefix_symbols.h:2783
EXPECT_TRUE
#define EXPECT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1967
abi_test.h
EXPECT_NONFATAL_FAILURE
#define EXPECT_NONFATAL_FAILURE(statement, substr)
abi_test_clobber_r12
#define abi_test_clobber_r12
Definition: boringssl_prefix_symbols.h:2758
abi_test_clobber_xmm12
#define abi_test_clobber_xmm12
Definition: boringssl_prefix_symbols.h:2775
abi_test_set_direction_flag
#define abi_test_set_direction_flag
Definition: boringssl_prefix_symbols.h:2788
abi_test_clobber_rcx
#define abi_test_clobber_rcx
Definition: boringssl_prefix_symbols.h:2767
abi_test_clobber_xmm8
#define abi_test_clobber_xmm8
Definition: boringssl_prefix_symbols.h:2785
abi_test_clobber_xmm9
#define abi_test_clobber_xmm9
Definition: boringssl_prefix_symbols.h:2786
state
static struct rpc_state state
Definition: bad_server_response_test.cc:87


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:39