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