xref: /netbsd-src/sys/rump/makerumpsyscalls.sh (revision b7b7574d3bf8eeb51a1fa3977b59142ec6434a55)
1#!/bin/sh
2#
3#	$NetBSD: makerumpsyscalls.sh,v 1.2 2014/04/27 16:28:21 pooka Exp $
4#
5
6#
7# This utility generates component-specific initializers for the
8# rump kernel syscall vector.
9#
10# Procedure is:
11#   1) edit syscalls.master
12#   2) run makesyscalls.sh
13#   3) do a build in sys/rump
14#   4) run this script
15#   5) commit results
16#
17
18# default, override by giving argument
19LIBDIR=/usr/lib
20
21SYSCOMPONENT_librump=librump/rumpkern/rumpkern_syscalls.c
22SYSCOMPONENT_librumpnet=librump/rumpnet/rumpnet_syscalls.c
23SYSCOMPONENT_librumpvfs=librump/rumpvfs/rumpvfs_syscalls.c
24
25die ()
26{
27
28	echo '>> ERROR:' $*
29	exit 1
30}
31
32[ -f "./rump.sysmap" ] || die rump.sysmap not found
33[ -f "./Makefile.rump" ] || die run script in src/sys/rump
34[ -z "${1}" ] || LIBDIR=$1
35
36#
37# BEGIN
38#
39
40IFS=' '
41AWKPROG='BEGIN {
42	while ((getline < "rump.sysmap") == 1) {
43		if ($2 != "sys_nomodule")
44			syscalls[$2] = $1
45	}
46}
47
48$5 == "GLOBAL" && $7 != "UND" {
49	sub("rumpns_", "", $8)
50	if (syscalls[$8] != 0)
51		results[$8] = 1
52}
53
54END {
55	for (res in results) {
56		printf "%d %s\n", syscalls[res], res | "sort -n"
57	}
58}
59'
60
61SYSCOMP_HDR='/*	$NetBSD: makerumpsyscalls.sh,v 1.2 2014/04/27 16:28:21 pooka Exp $	*/
62
63/* AUTOMATICALLY GENERATED BY makerumpsyscalls.sh */
64
65#include <sys/cdefs.h>
66__KERNEL_RCSID(0, "$NetBSD: makerumpsyscalls.sh,v 1.2 2014/04/27 16:28:21 pooka Exp $");
67
68#include <sys/param.h>
69
70#include "rump_private.h"
71'
72
73SYSCOMP_BODY='
74RUMP_COMPONENT(RUMP_COMPONENT_SYSCALL)
75{
76
77	rump_syscall_boot_establish(mysys, __arraycount(mysys));
78}'
79
80makesyscomponent ()
81{
82
83	echo Generating $1
84	exec 3>&1 >${1}
85
86	echo "${SYSCOMP_HDR}"
87
88	echo ${2} | awk '{printf "extern sy_call_t %s;\n", $2}'
89	printf '\nstatic const struct rump_onesyscall mysys[] = {\n'
90	echo ${2} | awk '{printf "\t{ %d,\t%s },\n", $1, $2}'
91	printf '};\n'
92
93	echo "${SYSCOMP_BODY}"
94
95	exec 1>&3
96}
97
98sawlibrump=false
99for file in ${LIBDIR}/librump*.so ; do
100	b=$(basename ${file})
101	b=${b%%.*}
102	res=$(readelf -W --syms ${file} | awk "${AWKPROG}")
103	if [ ! -z "${res}" ]; then
104		eval outname=\${SYSCOMPONENT_${b}}
105		[ -z "${outname}" ] && die Unknown syscall provider $b
106		makesyscomponent $outname "$res"
107
108		[ $b = "librump" ] && sawlibrump=true
109	fi
110done
111
112${sawlibrump} || die Did not see librump.  Wrong directory?
113