diff options
author | Raoni Fassina Firmino <raoni@linux.ibm.com> | 2022-02-25 10:45:14 -0300 |
---|---|---|
committer | Raoni Fassina Firmino <raoni@linux.ibm.com> | 2022-02-25 10:45:14 -0300 |
commit | 821f0a9cb24486842f16f9b0d81d9c28e876c6ae (patch) | |
tree | 690876c3a706cb222b159e2ebff02d218d2fd1fb /sysdeps/x86/tst-string-rtm.h | |
parent | 889122cbfacedab8fdb62a9d3fd6244d528ea99c (diff) | |
parent | 178292fe011d5745aa0dd7ea99b388c30512fbdb (diff) | |
download | glibc-821f0a9cb24486842f16f9b0d81d9c28e876c6ae.zip glibc-821f0a9cb24486842f16f9b0d81d9c28e876c6ae.tar.gz glibc-821f0a9cb24486842f16f9b0d81d9c28e876c6ae.tar.bz2 |
Merge branch release/2.30/master into ibm/2.30/master
Diffstat (limited to 'sysdeps/x86/tst-string-rtm.h')
-rw-r--r-- | sysdeps/x86/tst-string-rtm.h | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/sysdeps/x86/tst-string-rtm.h b/sysdeps/x86/tst-string-rtm.h new file mode 100644 index 0000000..6ed9eca --- /dev/null +++ b/sysdeps/x86/tst-string-rtm.h @@ -0,0 +1,72 @@ +/* Test string function in a transactionally executing RTM region. + Copyright (C) 2021 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 <cpu-features.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_USABLE (RTM)) + return EXIT_UNSUPPORTED; + + int status = prepare (); + if (status != EXIT_SUCCESS) + return status; + + unsigned int i; + unsigned int naborts = 0; + unsigned int failed = 0; + 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) + { + /* NB: Low single digit (<= 5%) noise-level aborts are normal for + TSX. */ + double rate = 100 * ((double) naborts) / ((double) loop); + if (rate > 5) + 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> |