(root)/
glibc-2.38/
sysdeps/
unix/
sysv/
linux/
aarch64/
vltest.py
       1  #!/usr/bin/python3
       2  # Set Scalable Vector Length test helper
       3  # Copyright (C) 2021-2023 Free Software Foundation, Inc.
       4  # This file is part of the GNU C Library.
       5  #
       6  # The GNU C Library is free software; you can redistribute it and/or
       7  # modify it under the terms of the GNU Lesser General Public
       8  # License as published by the Free Software Foundation; either
       9  # version 2.1 of the License, or (at your option) any later version.
      10  #
      11  # The GNU C Library is distributed in the hope that it will be useful,
      12  # but WITHOUT ANY WARRANTY; without even the implied warranty of
      13  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      14  # Lesser General Public License for more details.
      15  #
      16  # You should have received a copy of the GNU Lesser General Public
      17  # License along with the GNU C Library; if not, see
      18  # <https://www.gnu.org/licenses/>.
      19  """Set Scalable Vector Length test helper.
      20  
      21  Set Scalable Vector Length for child process.
      22  
      23  examples:
      24  
      25  ~/build$ make check subdirs=string \
      26  test-wrapper='~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 16'
      27  
      28  ~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 16 \
      29  make test t=string/test-memcpy
      30  
      31  ~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 32 \
      32  ./debugglibc.sh string/test-memmove
      33  
      34  ~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 64 \
      35  ./testrun.sh string/test-memset
      36  """
      37  import argparse
      38  from ctypes import cdll, CDLL
      39  import os
      40  import sys
      41  
      42  EXIT_SUCCESS = 0
      43  EXIT_FAILURE = 1
      44  EXIT_UNSUPPORTED = 77
      45  
      46  AT_HWCAP = 16
      47  HWCAP_SVE = (1 << 22)
      48  
      49  PR_SVE_GET_VL = 51
      50  PR_SVE_SET_VL = 50
      51  PR_SVE_SET_VL_ONEXEC = (1 << 18)
      52  PR_SVE_VL_INHERIT = (1 << 17)
      53  PR_SVE_VL_LEN_MASK = 0xffff
      54  
      55  def main(args):
      56      libc = CDLL("libc.so.6")
      57      if not libc.getauxval(AT_HWCAP) & HWCAP_SVE:
      58          print("CPU doesn't support SVE")
      59          sys.exit(EXIT_UNSUPPORTED)
      60  
      61      libc.prctl(PR_SVE_SET_VL,
      62                 args.vl[0] | PR_SVE_SET_VL_ONEXEC | PR_SVE_VL_INHERIT)
      63      os.execvp(args.args[0], args.args)
      64      print("exec system call failure")
      65      sys.exit(EXIT_FAILURE)
      66  
      67  if __name__ == '__main__':
      68      parser = argparse.ArgumentParser(description=
      69              "Set Scalable Vector Length test helper",
      70              formatter_class=argparse.ArgumentDefaultsHelpFormatter)
      71  
      72      # positional argument
      73      parser.add_argument("vl", nargs=1, type=int,
      74                          choices=range(16, 257, 16),
      75                          help=('vector length '\
      76                                'which is multiples of 16 from 16 to 256'))
      77      # remainDer arguments
      78      parser.add_argument('args', nargs=argparse.REMAINDER,
      79                          help=('args '\
      80                                'which is passed to child process'))
      81      args = parser.parse_args()
      82      main(args)