1*4882a593Smuzhiyun#!/bin/sh 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun# Generate C file mapping errno codes to errno names. 5*4882a593Smuzhiyun# 6*4882a593Smuzhiyun# Copyright IBM Corp. 2018 7*4882a593Smuzhiyun# Author(s): Hendrik Brueckner <brueckner@linux.vnet.ibm.com> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyungcc="$1" 10*4882a593Smuzhiyuntoolsdir="$2" 11*4882a593Smuzhiyuninclude_path="-I$toolsdir/include/uapi" 12*4882a593Smuzhiyun 13*4882a593Smuzhiyunarch_string() 14*4882a593Smuzhiyun{ 15*4882a593Smuzhiyun echo "$1" |sed -e 'y/- /__/' |tr '[[:upper:]]' '[[:lower:]]' 16*4882a593Smuzhiyun} 17*4882a593Smuzhiyun 18*4882a593Smuzhiyunasm_errno_file() 19*4882a593Smuzhiyun{ 20*4882a593Smuzhiyun local arch="$1" 21*4882a593Smuzhiyun local header 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun header="$toolsdir/arch/$arch/include/uapi/asm/errno.h" 24*4882a593Smuzhiyun if test -r "$header"; then 25*4882a593Smuzhiyun echo "$header" 26*4882a593Smuzhiyun else 27*4882a593Smuzhiyun echo "$toolsdir/include/uapi/asm-generic/errno.h" 28*4882a593Smuzhiyun fi 29*4882a593Smuzhiyun} 30*4882a593Smuzhiyun 31*4882a593Smuzhiyuncreate_errno_lookup_func() 32*4882a593Smuzhiyun{ 33*4882a593Smuzhiyun local arch=$(arch_string "$1") 34*4882a593Smuzhiyun local nr name 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun cat <<EoFuncBegin 37*4882a593Smuzhiyunstatic const char *errno_to_name__$arch(int err) 38*4882a593Smuzhiyun{ 39*4882a593Smuzhiyun switch (err) { 40*4882a593SmuzhiyunEoFuncBegin 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun while read name nr; do 43*4882a593Smuzhiyun printf '\tcase %d: return "%s";\n' $nr $name 44*4882a593Smuzhiyun done 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun cat <<EoFuncEnd 47*4882a593Smuzhiyun default: 48*4882a593Smuzhiyun return "(unknown)"; 49*4882a593Smuzhiyun } 50*4882a593Smuzhiyun} 51*4882a593Smuzhiyun 52*4882a593SmuzhiyunEoFuncEnd 53*4882a593Smuzhiyun} 54*4882a593Smuzhiyun 55*4882a593Smuzhiyunprocess_arch() 56*4882a593Smuzhiyun{ 57*4882a593Smuzhiyun local arch="$1" 58*4882a593Smuzhiyun local asm_errno=$(asm_errno_file "$arch") 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun $gcc $CFLAGS $include_path -E -dM -x c $asm_errno \ 61*4882a593Smuzhiyun |grep -hE '^#define[[:blank:]]+(E[^[:blank:]]+)[[:blank:]]+([[:digit:]]+).*' \ 62*4882a593Smuzhiyun |awk '{ print $2","$3; }' \ 63*4882a593Smuzhiyun |sort -t, -k2 -nu \ 64*4882a593Smuzhiyun |IFS=, create_errno_lookup_func "$arch" 65*4882a593Smuzhiyun} 66*4882a593Smuzhiyun 67*4882a593Smuzhiyuncreate_arch_errno_table_func() 68*4882a593Smuzhiyun{ 69*4882a593Smuzhiyun local archlist="$1" 70*4882a593Smuzhiyun local default="$2" 71*4882a593Smuzhiyun local arch 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun printf 'const char *arch_syscalls__strerrno(const char *arch, int err)\n' 74*4882a593Smuzhiyun printf '{\n' 75*4882a593Smuzhiyun for arch in $archlist; do 76*4882a593Smuzhiyun printf '\tif (!strcmp(arch, "%s"))\n' $(arch_string "$arch") 77*4882a593Smuzhiyun printf '\t\treturn errno_to_name__%s(err);\n' $(arch_string "$arch") 78*4882a593Smuzhiyun done 79*4882a593Smuzhiyun printf '\treturn errno_to_name__%s(err);\n' $(arch_string "$default") 80*4882a593Smuzhiyun printf '}\n' 81*4882a593Smuzhiyun} 82*4882a593Smuzhiyun 83*4882a593Smuzhiyuncat <<EoHEADER 84*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */ 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun#include <string.h> 87*4882a593Smuzhiyun 88*4882a593SmuzhiyunEoHEADER 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun# Create list of architectures and ignore those that do not appear 91*4882a593Smuzhiyun# in tools/perf/arch 92*4882a593Smuzhiyunarchlist="" 93*4882a593Smuzhiyunfor arch in $(find $toolsdir/arch -maxdepth 1 -mindepth 1 -type d -printf "%f\n" | grep -v x86 | sort); do 94*4882a593Smuzhiyun test -d $toolsdir/perf/arch/$arch && archlist="$archlist $arch" 95*4882a593Smuzhiyundone 96*4882a593Smuzhiyun 97*4882a593Smuzhiyunfor arch in x86 $archlist generic; do 98*4882a593Smuzhiyun process_arch "$arch" 99*4882a593Smuzhiyundone 100*4882a593Smuzhiyuncreate_arch_errno_table_func "x86 $archlist" "generic" 101