(root)/
glibc-2.38/
sysdeps/
x86/
tst-string-rtm.h
       1  /* Test string function in a transactionally executing RTM region.
       2     Copyright (C) 2021-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <string.h>
      20  #include <x86intrin.h>
      21  #include <sys/platform/x86.h>
      22  #include <support/check.h>
      23  #include <support/test-driver.h>
      24  
      25  static int
      26  do_test_1 (const char *name, unsigned int loop, int (*prepare) (void),
      27  	   int (*function) (void))
      28  {
      29    if (!CPU_FEATURE_ACTIVE (RTM))
      30      return EXIT_UNSUPPORTED;
      31  
      32    int status = prepare ();
      33    if (status != EXIT_SUCCESS)
      34      return status;
      35  
      36    unsigned int i;
      37    unsigned int naborts = 0;
      38    unsigned int failed = 0;
      39    for (i = 0; i < loop; i++)
      40      {
      41        failed |= function ();
      42        if (_xbegin() == _XBEGIN_STARTED)
      43  	{
      44  	  failed |= function ();
      45  	  _xend();
      46  	}
      47        else
      48  	{
      49  	  failed |= function ();
      50  	  ++naborts;
      51  	}
      52      }
      53  
      54    if (failed)
      55      FAIL_EXIT1 ("%s() failed", name);
      56  
      57    if (naborts)
      58      {
      59        /* NB: Low single digit (<= 5%) noise-level aborts are normal for
      60  	 TSX.  */
      61        double rate = 100 * ((double) naborts) / ((double) loop);
      62        if (rate > 5)
      63  	FAIL_EXIT1 ("TSX abort rate: %.2f%% (%d out of %d)",
      64  		    rate, naborts, loop);
      65      }
      66  
      67    return EXIT_SUCCESS;
      68  }
      69  
      70  static int do_test (void);
      71  
      72  #include <support/test-driver.c>