0001
0002
0003
0004
0005
0006
0007
0008
0009 gcc="$1"
0010 toolsdir="$2"
0011 include_path="-I$toolsdir/include/uapi"
0012
0013 arch_string()
0014 {
0015 echo "$1" |sed -e 'y/- /__/' |tr '[[:upper:]]' '[[:lower:]]'
0016 }
0017
0018 asm_errno_file()
0019 {
0020 local arch="$1"
0021 local header
0022
0023 header="$toolsdir/arch/$arch/include/uapi/asm/errno.h"
0024 if test -r "$header"; then
0025 echo "$header"
0026 else
0027 echo "$toolsdir/include/uapi/asm-generic/errno.h"
0028 fi
0029 }
0030
0031 create_errno_lookup_func()
0032 {
0033 local arch=$(arch_string "$1")
0034 local nr name
0035
0036 printf "static const char *errno_to_name__%s(int err)\n{\n\tswitch (err) {\n" $arch
0037
0038 while read name nr; do
0039 printf '\tcase %d: return "%s";\n' $nr $name
0040 done
0041
0042 printf '\tdefault: return "(unknown)";\n\t}\n}\n'
0043 }
0044
0045 process_arch()
0046 {
0047 local arch="$1"
0048 local asm_errno=$(asm_errno_file "$arch")
0049
0050 $gcc $CFLAGS $include_path -E -dM -x c $asm_errno \
0051 |grep -hE '^#define[[:blank:]]+(E[^[:blank:]]+)[[:blank:]]+([[:digit:]]+).*' \
0052 |awk '{ print $2","$3; }' \
0053 |sort -t, -k2 -nu \
0054 |IFS=, create_errno_lookup_func "$arch"
0055 }
0056
0057 create_arch_errno_table_func()
0058 {
0059 local archlist="$1"
0060 local default="$2"
0061 local arch
0062
0063 printf 'const char *arch_syscalls__strerrno(const char *arch, int err)\n'
0064 printf '{\n'
0065 for arch in $archlist; do
0066 printf '\tif (!strcmp(arch, "%s"))\n' $(arch_string "$arch")
0067 printf '\t\treturn errno_to_name__%s(err);\n' $(arch_string "$arch")
0068 done
0069 printf '\treturn errno_to_name__%s(err);\n' $(arch_string "$default")
0070 printf '}\n'
0071 }
0072
0073 cat <<EoHEADER
0074 /* SPDX-License-Identifier: GPL-2.0 */
0075
0076
0077
0078 EoHEADER
0079
0080
0081 archlist=""
0082 for arch in $(find $toolsdir/arch -maxdepth 1 -mindepth 1 -type d -printf "%f\n" | sort -r); do
0083 test -f $toolsdir/arch/$arch/include/uapi/asm/errno.h && archlist="$archlist $arch"
0084 done
0085
0086 for arch in generic $archlist; do
0087 process_arch "$arch"
0088 done
0089 create_arch_errno_table_func "$archlist" "generic"