| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /* Test string function in a transactionally executing RTM region.
- Copyright (C) 2021-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
- #include <string.h>
- #include <x86intrin.h>
- #include <sys/platform/x86.h>
- #include <support/check.h>
- #include <support/test-driver.h>
- static int
- do_test_1 (const char *name, unsigned int loop, int (*prepare) (void),
- int (*function) (void))
- {
- if (!CPU_FEATURE_ACTIVE (RTM))
- return EXIT_UNSUPPORTED;
- int status = prepare ();
- if (status != EXIT_SUCCESS)
- return status;
- unsigned int i;
- unsigned int naborts = 0;
- unsigned int failed = 0;
- /* Iterate LOOP number of times, calling the same function over
- and over again in an attempt to detect the following failure
- modes:
- 1. Aborting instruction on the hot path.
- 2. Number of instructions executed exceeds maximum.
- 3. Memory reads or writes exceed maximum.
- The function getting bigger may increase the abort rate due
- to external events, despite not triggering #2 above, and may
- need adjusting the abort rate failure test below. */
- for (i = 0; i < loop; i++)
- {
- failed |= function ();
- if (_xbegin() == _XBEGIN_STARTED)
- {
- failed |= function ();
- _xend();
- }
- else
- {
- failed |= function ();
- ++naborts;
- }
- }
- if (failed)
- FAIL_EXIT1 ("%s() failed", name);
- if (naborts)
- {
- /* Low single digit (<= 5%) noise-level aborts are normal for TSX
- for reasons that are outside of the library's control.
- In pre-commit CI on an E5-2698 v4 we sometimes see ~5% aborts.
- Set the trip point to 6%. */
- double rate = 100 * ((double) naborts) / ((double) loop);
- if (rate > 6)
- FAIL_EXIT1 ("TSX abort rate: %.2f%% (%d out of %d)",
- rate, naborts, loop);
- }
- return EXIT_SUCCESS;
- }
- static int do_test (void);
- #include <support/test-driver.c>
|