mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-27 12:15:39 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/python3
 | |
| # Set Scalable Vector Length test helper
 | |
| # 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
 | |
| # <https://www.gnu.org/licenses/>.
 | |
| """Set Scalable Vector Length test helper.
 | |
| 
 | |
| Set Scalable Vector Length for child process.
 | |
| 
 | |
| examples:
 | |
| 
 | |
| ~/build$ make check subdirs=string \
 | |
| test-wrapper='~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 16'
 | |
| 
 | |
| ~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 16 \
 | |
| make test t=string/test-memcpy
 | |
| 
 | |
| ~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 32 \
 | |
| ./debugglibc.sh string/test-memmove
 | |
| 
 | |
| ~/build$ ~/glibc/sysdeps/unix/sysv/linux/aarch64/vltest.py 64 \
 | |
| ./testrun.sh string/test-memset
 | |
| """
 | |
| import argparse
 | |
| from ctypes import cdll, CDLL
 | |
| import os
 | |
| import sys
 | |
| 
 | |
| EXIT_SUCCESS = 0
 | |
| EXIT_FAILURE = 1
 | |
| EXIT_UNSUPPORTED = 77
 | |
| 
 | |
| AT_HWCAP = 16
 | |
| HWCAP_SVE = (1 << 22)
 | |
| 
 | |
| PR_SVE_GET_VL = 51
 | |
| PR_SVE_SET_VL = 50
 | |
| PR_SVE_SET_VL_ONEXEC = (1 << 18)
 | |
| PR_SVE_VL_INHERIT = (1 << 17)
 | |
| PR_SVE_VL_LEN_MASK = 0xffff
 | |
| 
 | |
| def main(args):
 | |
|     libc = CDLL("libc.so.6")
 | |
|     if not libc.getauxval(AT_HWCAP) & HWCAP_SVE:
 | |
|         print("CPU doesn't support SVE")
 | |
|         sys.exit(EXIT_UNSUPPORTED)
 | |
| 
 | |
|     libc.prctl(PR_SVE_SET_VL,
 | |
|                args.vl[0] | PR_SVE_SET_VL_ONEXEC | PR_SVE_VL_INHERIT)
 | |
|     os.execvp(args.args[0], args.args)
 | |
|     print("exec system call failure")
 | |
|     sys.exit(EXIT_FAILURE)
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     parser = argparse.ArgumentParser(description=
 | |
|             "Set Scalable Vector Length test helper",
 | |
|             formatter_class=argparse.ArgumentDefaultsHelpFormatter)
 | |
| 
 | |
|     # positional argument
 | |
|     parser.add_argument("vl", nargs=1, type=int,
 | |
|                         choices=range(16, 257, 16),
 | |
|                         help=('vector length '\
 | |
|                               'which is multiples of 16 from 16 to 256'))
 | |
|     # remainDer arguments
 | |
|     parser.add_argument('args', nargs=argparse.REMAINDER,
 | |
|                         help=('args '\
 | |
|                               'which is passed to child process'))
 | |
|     args = parser.parse_args()
 | |
|     main(args)
 |