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