/* Test string function in a transactionally executing RTM region.
Copyright (C) 2021-2025 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
. */
#include
#include
#include
#include
#include
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