• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/sh
2
3output="linux_syscall_numbers.h"
4
5if [ $# -gt 0 ]; then
6    output=$1
7fi
8echo "ltp testcases kernel include regen: output = "$output
9
10rm -f "${output}".[1-9]*
11output_pid="${output}.$$"
12
13max_jobs=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
14: ${max_jobs:=1}
15
16srcdir=${0%/*}
17
18err() {
19	echo "$*" 1>&2
20	exit 1
21}
22
23cat << EOF > "${output_pid}"
24/************************************************
25 * GENERATED FILE: DO NOT EDIT/PATCH THIS FILE  *
26 *  change your arch specific .in file instead  *
27 ************************************************/
28
29/*
30 * Here we stick all the ugly *fallback* logic for linux
31 * system call numbers (those __NR_ thingies).
32 *
33 * Licensed under the GPLv2 or later, see the COPYING file.
34 */
35
36#ifndef __LINUX_SYSCALL_NUMBERS_H__
37#define __LINUX_SYSCALL_NUMBERS_H__
38
39#include <errno.h>
40#include <sys/syscall.h>
41#include <asm/unistd.h>
42#include "cleanup.c"
43
44#define ltp_syscall(NR, ...) ({ \\
45	int __ret; \\
46	if (NR == __LTP__NR_INVALID_SYSCALL) { \\
47		errno = ENOSYS; \\
48		__ret = -1; \\
49	} else { \\
50		__ret = syscall(NR, ##__VA_ARGS__); \\
51	} \\
52	if (__ret == -1 && errno == ENOSYS) { \\
53		tst_brkm(TCONF, CLEANUP, \\
54			"syscall(%d) " #NR " not supported on your arch", \\
55			NR); \\
56	} \\
57	__ret; \\
58})
59
60#define tst_syscall(NR, ...) ({ \\
61	int tst_ret; \\
62	if (NR == __LTP__NR_INVALID_SYSCALL) { \\
63		errno = ENOSYS; \\
64		tst_ret = -1; \\
65	} else { \\
66		tst_ret = syscall(NR, ##__VA_ARGS__); \\
67	} \\
68	if (tst_ret == -1 && errno == ENOSYS) { \\
69		tst_brk(TCONF, "syscall(%d) " #NR "not supported", NR); \\
70	} \\
71	tst_ret; \\
72})
73
74EOF
75
76jobs=0
77for arch in $(cat "${srcdir}/order") ; do
78	(
79	echo "Generating data for arch $arch ... "
80
81	(
82	echo
83	case ${arch} in
84		sparc64) echo "#if defined(__sparc__) && defined(__arch64__)" ;;
85		sparc) echo "#if defined(__sparc__) && !defined(__arch64__)" ;;
86		*) echo "#ifdef __${arch}__" ;;
87	esac
88	while read line ; do
89		set -- ${line}
90		nr="__NR_$1"
91		shift
92		if [ $# -eq 0 ] ; then
93			err "invalid line found: $line"
94		fi
95		echo "# ifndef ${nr}"
96		echo "#  define ${nr} $*"
97		echo "# endif"
98	done < "${srcdir}/${arch}.in"
99	echo "#endif"
100	echo
101	) >> "${output_pid}.${arch}"
102
103	) &
104
105	: $(( jobs += 1 ))
106	if [ ${jobs} -ge ${max_jobs} ] ; then
107		wait || exit 1
108		jobs=0
109	fi
110done
111
112echo "Generating stub list ... "
113(
114echo
115echo "/* Common stubs */"
116echo "#define __LTP__NR_INVALID_SYSCALL -1" >> "${output_pid}"
117for nr in $(awk '{print $1}' "${srcdir}/"*.in | sort -u) ; do
118	nr="__NR_${nr}"
119	echo "# ifndef ${nr}"
120	echo "#  define ${nr} __LTP__NR_INVALID_SYSCALL"
121	echo "# endif"
122done
123echo "#endif"
124) >> "${output_pid}._footer"
125
126wait || exit 1
127
128printf "Combining them all ... "
129for arch in $(cat "${srcdir}/order") _footer ; do
130	cat "${output_pid}.${arch}"
131done >> "${output_pid}"
132mv "${output_pid}" "${output}"
133rm -f "${output_pid}"*
134echo "OK!"
135