1f2c144d5Spooka#!/bin/sh 2f2c144d5Spooka# 3*bf54b2f7Spooka# $NetBSD: makerumpif.sh,v 1.10 2016/01/26 23:21:18 pooka Exp $ 4f2c144d5Spooka# 530f29c78Spooka# Copyright (c) 2009, 2015 Antti Kantee. All rights reserved. 6f2c144d5Spooka# 7f2c144d5Spooka# Redistribution and use in source and binary forms, with or without 8f2c144d5Spooka# modification, are permitted provided that the following conditions 9f2c144d5Spooka# are met: 10f2c144d5Spooka# 1. Redistributions of source code must retain the above copyright 11f2c144d5Spooka# notice, this list of conditions and the following disclaimer. 12f2c144d5Spooka# 2. Redistributions in binary form must reproduce the above copyright 13f2c144d5Spooka# notice, this list of conditions and the following disclaimer in the 14f2c144d5Spooka# documentation and/or other materials provided with the distribution. 15f2c144d5Spooka# 16f2c144d5Spooka# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17f2c144d5Spooka# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18f2c144d5Spooka# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19f2c144d5Spooka# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20f2c144d5Spooka# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21f2c144d5Spooka# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22f2c144d5Spooka# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23f2c144d5Spooka# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24f2c144d5Spooka# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25f2c144d5Spooka# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f2c144d5Spooka# 27f2c144d5Spooka 28f2c144d5Spooka# 29f2c144d5Spooka# This reads a rump component interface description and creates: 30f2c144d5Spooka# 1: rump private prototypes for internal calls 31f2c144d5Spooka# 2: public prototypes for calls outside of rump 32f2c144d5Spooka# 3: public interface implementations which run the rump scheduler 33f2c144d5Spooka# and call the private interface 34f2c144d5Spooka# 35f2c144d5Spooka 36f2c144d5Spookausage () 37f2c144d5Spooka{ 38f2c144d5Spooka 39f2c144d5Spooka echo "usage: $0 spec" 40f2c144d5Spooka exit 1 41f2c144d5Spooka} 42f2c144d5Spooka 43f2c144d5Spookaboom () 44f2c144d5Spooka{ 45f2c144d5Spooka 46f2c144d5Spooka echo $* 47f2c144d5Spooka exit 1 48f2c144d5Spooka} 49f2c144d5Spooka 50f636df75Spookaunset TOPDIR 51f636df75Spookaif [ $# -eq 3 ]; then 52f636df75Spooka if [ $1 = '-R' ]; then 53f636df75Spooka TOPDIR=$2 54f636df75Spooka else 55f636df75Spooka usage 56f636df75Spooka fi 57f636df75Spooka shift; shift 58f636df75Spookafi 59f636df75Spooka[ $# -ne 1 ] && usage 60f2c144d5Spooka 61f2c144d5SpookaMYDIR=`pwd` 62f636df75Spookaif [ -z "${TOPDIR}" ]; then 63f2c144d5Spooka while [ ! -f Makefile.rump ]; do 64f2c144d5Spooka [ `pwd` = '/' ] && boom Could not find rump topdir. 65f2c144d5Spooka cd .. 66f2c144d5Spooka done 67f636df75Spooka TOPDIR="`pwd`" 68f636df75Spookafi 69f2c144d5Spookacd ${MYDIR} 70f2c144d5Spooka 71f2c144d5Spookased -e ' 72f2c144d5Spooka:again 73f2c144d5Spooka /\\$/{ 74f2c144d5Spooka N 75f2c144d5Spooka s/[ ]*\\\n[ ]*/ / 76f2c144d5Spooka b again 77f2c144d5Spooka } 78f636df75Spooka' ${1} | awk -F\| -v topdir=${TOPDIR} ' 79f2c144d5Spookafunction fileheaders(file, srcstr) 80f2c144d5Spooka{ 81*bf54b2f7Spooka printf("/*\t$NetBSD: makerumpif.sh,v 1.10 2016/01/26 23:21:18 pooka Exp $\t*/\n\n") > file 82f2c144d5Spooka printf("/*\n * Automatically generated. DO NOT EDIT.\n") > file 83*bf54b2f7Spooka genstr = "$NetBSD: makerumpif.sh,v 1.10 2016/01/26 23:21:18 pooka Exp $" 84f2c144d5Spooka gsub("\\$", "", genstr) 85f2c144d5Spooka printf(" * from: %s\n", srcstr) > file 86f2c144d5Spooka printf(" * by: %s\n", genstr) > file 87f2c144d5Spooka printf(" */\n") > file 88f2c144d5Spooka} 89f2c144d5Spooka 90f2c144d5Spookafunction die(str) 91f2c144d5Spooka{ 92f2c144d5Spooka 93f2c144d5Spooka print str 94f2c144d5Spooka exit(1) 95f2c144d5Spooka} 96f2c144d5Spooka 97f2c144d5SpookaNR == 1 { 98f2c144d5Spooka sub(";[^\\$]*\\$", "") 99f2c144d5Spooka sub("\\$", "") 100f2c144d5Spooka fromstr = $0 101f2c144d5Spooka next 102f2c144d5Spooka} 103f2c144d5Spooka 104f2c144d5Spooka$1 == "NAME"{myname = $2;next} 105f636df75Spooka$1 == "PUBHDR"{pubhdr = topdir "/" $2;print pubhdr;next} 106f636df75Spooka$1 == "PRIVHDR"{privhdr = topdir "/" $2;print privhdr;next} 107f636df75Spooka$1 == "WRAPPERS"{gencalls = topdir "/" $2;print gencalls;next} 108f2c144d5Spooka 109f2c144d5Spooka/^;/{next} 110f2c144d5Spooka/\\$/{sub("\\\n", "");getline nextline;$0 = $0 nextline} 111f2c144d5Spooka/^[ \t]*$/{next} 112f2c144d5Spooka{ 113f2c144d5Spooka if (NF != 3 && NF != 4) { 114f2c144d5Spooka die("error: unexpected number of fields\n") 115f2c144d5Spooka } 116f2c144d5Spooka isweak = 0 11730f29c78Spooka iscompat = 0 11830f29c78Spooka if (NF == 4) { 11930f29c78Spooka if ($4 == "WEAK") { 12030f29c78Spooka isweak = 1 12130f29c78Spooka } else if (match($4, "COMPAT_")) { 12230f29c78Spooka iscompat = 1 12330f29c78Spooka compat = $4 12430f29c78Spooka } else { 12530f29c78Spooka die("error: unexpected fourth field"); 12630f29c78Spooka } 127f2c144d5Spooka } 128f2c144d5Spooka if (!myname) 129f2c144d5Spooka die("name not specified"); 130f2c144d5Spooka if (!pubhdr) 131f2c144d5Spooka die("public header not specified"); 132f2c144d5Spooka if (!privhdr) 133f2c144d5Spooka die("private header not specified"); 134f2c144d5Spooka if (!gencalls) 135f2c144d5Spooka die("wrapper file not specified"); 136f2c144d5Spooka 137f2c144d5Spooka if (!once) { 138f2c144d5Spooka fileheaders(pubhdr, fromstr) 139f2c144d5Spooka fileheaders(privhdr, fromstr) 140f2c144d5Spooka fileheaders(gencalls, fromstr) 141f2c144d5Spooka once = 1 142f2c144d5Spooka 143f2c144d5Spooka pubfile = pubhdr 144f2c144d5Spooka sub(".*/", "", pubfile) 145f2c144d5Spooka 146f2c144d5Spooka privfile = privhdr 147f2c144d5Spooka sub(".*/", "", privfile) 148f2c144d5Spooka 149f2c144d5Spooka printf("\n") > pubhdr 150f2c144d5Spooka printf("\n") > privhdr 151f2c144d5Spooka 152645fbfa0Spooka printf("#ifndef _RUMP_PRIF_%s_H_\n", toupper(myname)) > privhdr 153645fbfa0Spooka printf("#define _RUMP_PRIF_%s_H_\n", toupper(myname)) > privhdr 154645fbfa0Spooka printf("\n") > privhdr 155645fbfa0Spooka 156f2c144d5Spooka printf("\n#include <sys/cdefs.h>\n") > gencalls 157*bf54b2f7Spooka printf("#include <sys/systm.h>\n\n") > gencalls 158*bf54b2f7Spooka printf("#include <rump-sys/kern.h>\n", privfile) > gencalls 159*bf54b2f7Spooka printf("#include <rump-sys/%s>\n\n", privfile) > gencalls 160*bf54b2f7Spooka printf("#include <rump/rump.h>\n") > gencalls 161f2c144d5Spooka printf("#include <rump/%s>\n\n", pubfile) > gencalls 162c1bfb896Spooka printf("void __dead rump_%s_unavailable(void);\n", \ 163f2c144d5Spooka myname) > gencalls 164f2c144d5Spooka printf("void __dead\nrump_%s_unavailable(void)\n{\n", \ 165f2c144d5Spooka myname) > gencalls 166f2c144d5Spooka printf("\n\tpanic(\"%s interface unavailable\");\n}\n", \ 167f2c144d5Spooka myname) > gencalls 168f2c144d5Spooka } 169f2c144d5Spooka 170f2c144d5Spooka funtype = $1 171f2c144d5Spooka sub("[ \t]*$", "", funtype) 172f2c144d5Spooka funname = $2 173f2c144d5Spooka sub("[ \t]*$", "", funname) 174f2c144d5Spooka funargs = $3 175c1bfb896Spooka sub("[ \t]*$", "", funargs) 176c1bfb896Spooka 177abf16485Spooka printf("%s rump_pub_%s(%s);\n", funtype, funname, funargs) > pubhdr 178abf16485Spooka printf("%s rump_%s(%s);\n", funtype, funname, funargs) > privhdr 179ddc2c52aSpooka printf("typedef %s (*rump_%s_fn)(%s);\n", \ 180ddc2c52aSpooka funtype, funname, funargs) > privhdr 181f2c144d5Spooka 182f2c144d5Spooka if (funtype == "void") 183f2c144d5Spooka voidret = 1 184f2c144d5Spooka else 185f2c144d5Spooka voidret = 0 186f2c144d5Spooka if (funargs == "void") 187f2c144d5Spooka voidarg = 1 188f2c144d5Spooka else 189f2c144d5Spooka voidarg = 0 190f2c144d5Spooka 19130f29c78Spooka printf("\n") > gencalls 19230f29c78Spooka if (iscompat) { 19330f29c78Spooka printf("#ifdef %s\n", compat) > gencalls 19430f29c78Spooka } 19530f29c78Spooka 19630f29c78Spooka printf("%s\nrump_pub_%s(", funtype, funname) > gencalls 197f2c144d5Spooka if (!voidarg) { 198f2c144d5Spooka narg = split(funargs, argv, ",") 199f2c144d5Spooka for (i = 1; i <= narg; i++) { 200f2c144d5Spooka sub(" *", "", argv[i]) 201f2c144d5Spooka if (match(argv[i], "\\*$") != 0) 202f2c144d5Spooka printf("%sarg%d", argv[i], i) > gencalls 203f2c144d5Spooka else 204f2c144d5Spooka printf("%s arg%d", argv[i], i) > gencalls 205f2c144d5Spooka if (i != narg) 206f2c144d5Spooka printf(", ") > gencalls 207f2c144d5Spooka } 208f2c144d5Spooka } else { 209f2c144d5Spooka narg = 0 210f2c144d5Spooka printf("void") > gencalls 211f2c144d5Spooka } 212f2c144d5Spooka printf(")\n{\n") > gencalls 213f2c144d5Spooka 214f2c144d5Spooka if (!voidret) { 215c1bfb896Spooka printf("\t%s rv;\n", funtype) > gencalls 216f2c144d5Spooka } 217cd231d06Spooka printf("\n\trump_schedule();\n\t") > gencalls 218f2c144d5Spooka if (!voidret) 219f2c144d5Spooka printf("rv = ") > gencalls 220abf16485Spooka printf("rump_%s(", funname) > gencalls 221f2c144d5Spooka for (i = 1; i <= narg; i++) { 222f2c144d5Spooka printf("arg%i", i) > gencalls 223f2c144d5Spooka if (i < narg) 224f2c144d5Spooka printf(", ") > gencalls 225f2c144d5Spooka } 226cd231d06Spooka printf(");\n\trump_unschedule();\n") > gencalls 227f2c144d5Spooka if (!voidret) 228f2c144d5Spooka printf("\n\treturn rv;\n") > gencalls 229f2c144d5Spooka printf("}\n") > gencalls 23030f29c78Spooka if (iscompat) { 23130f29c78Spooka printf("#else\n") > gencalls 23230f29c78Spooka printf("__strong_alias(rump_pub_%s,rump_%s_unavailable);\n", \ 23330f29c78Spooka funname, myname) > gencalls 23430f29c78Spooka printf("#endif /* %s */\n", compat) > gencalls 23530f29c78Spooka } 236f2c144d5Spooka if (isweak) 237abf16485Spooka printf("__weak_alias(rump_%s,rump_%s_unavailable);\n", \ 238f2c144d5Spooka funname, myname) > gencalls 239645fbfa0Spooka} 240645fbfa0Spooka 241645fbfa0SpookaEND { printf("\n#endif /* _RUMP_PRIF_%s_H_ */\n", toupper(myname)) > privhdr }' 242