xref: /netbsd-src/sys/rump/librump/makerumpif.sh (revision bf54b2f752b531cb18f2429b2cf1677eff7d923a)
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