summaryrefslogtreecommitdiff
path: root/hurd/ioctl.awk
diff options
context:
space:
mode:
Diffstat (limited to 'hurd/ioctl.awk')
-rw-r--r--hurd/ioctl.awk127
1 files changed, 127 insertions, 0 deletions
diff --git a/hurd/ioctl.awk b/hurd/ioctl.awk
new file mode 100644
index 00000000..289a9ab9
--- /dev/null
+++ b/hurd/ioctl.awk
@@ -0,0 +1,127 @@
+#
+# This awk script is used by the Makefile rules for generating
+# Xioctl-proto.defs, see Makefile for details.
+#
+
+$1 == "SUBSYSTEM" { subsystem = $2 + 0; next }
+$1 == "GROUP" { groupchar = $2; next }
+
+$2 == "CMD" { cmd[tolower($1)] = $3;
+ c = $3 + 0;
+ if (c > highcmd) highcmd = c;
+ icmd[c] = tolower($1);
+ next }
+$2 == "SUBID" { subid[tolower($1)] = $3;
+ c = $3 + 0;
+ if (c > highid) highid = c;
+ id2cmdname[c] = tolower($1);
+ next }
+$2 == "TYPE" { type[tolower($1)] = $3; next }
+$2 == "INOUT" { inout[tolower($1)] = $3; next }
+$2 == "TYPE0" { type0[tolower($1)] = $3; next }
+$2 == "TYPE1" { type1[tolower($1)] = $3; next }
+$2 == "TYPE2" { type2[tolower($1)] = $3; next }
+$2 == "COUNT0" { count0[tolower($1)] = $3; next }
+$2 == "COUNT1" { count1[tolower($1)] = $3; next }
+$2 == "COUNT2" { count2[tolower($1)] = $3; next }
+
+END {
+ group = sprintf("%cioctl", groupchar);
+
+ printf "subsystem %s %d; /* see ioctls.defs for calculation */\n\n", \
+ group, subsystem;
+
+ typemap[0] = "char";
+ typemap[1] = "char";
+ typemap[2] = "short";
+ typemap[3] = "int";
+ typemap[4] = "???64 bits???";
+ inoutmap[1] = "out";
+ inoutmap[2] = "in";
+ inoutmap[3] = "inout";
+
+ print "";
+ for (cmdname in type0) {
+ if (count0[cmdname] > 1) {
+ typecount = type0[cmdname] "," count0[cmdname];
+ if (!tc[typecount]) {
+ tc[typecount] = typemap[type0[cmdname]] "array_" count0[cmdname] "_t";
+ print "type", tc[typecount], "=", ("array[" count0[cmdname] "]"), \
+ "of", (typemap[type0[cmdname]] ";"), "/* XXX rename this! */";
+ }
+ argtype["0," cmdname] = tc[typecount];
+ }
+ else if (count0[cmdname] == 1) {
+ argtype["0," cmdname] = typemap[type0[cmdname]]
+ }
+ }
+
+ for (cmdname in type1) {
+ if (count1[cmdname] > 1) {
+ typecount = type1[cmdname] "," count1[cmdname];
+ if (!tc[typecount]) {
+ tc[typecount] = typemap[type1[cmdname]] "array_" count1[cmdname] "_t";
+ print "type", tc[typecount], "=", ("array[" count1[cmdname] "]"), \
+ "of", (typemap[type1[cmdname]] ";"), "/* XXX rename this! */";
+ }
+ argtype["1," cmdname] = tc[typecount];
+ }
+ else if (count1[cmdname] == 1) {
+ argtype["1," cmdname] = typemap[type1[cmdname]]
+ }
+ }
+
+ for (cmdname in type2) {
+ if (count2[cmdname] > 1) {
+ typecount = type2[cmdname] "," count2[cmdname];
+ if (!tc[typecount]) {
+ tc[typecount] = typemap[type2[cmdname]] "array_" count2[cmdname] "_t";
+ print "type", tc[typecount], "=", ("array[" count2[cmdname] "]"), \
+ "of", (typemap[type2[cmdname]] ";"), "/* XXX rename this! */";
+ }
+ argtype["2," cmdname] = tc[typecount];
+ }
+ else if (count2[cmdname] == 1) {
+ argtype["2," cmdname] = typemap[type2[cmdname]]
+ }
+ }
+ print "";
+
+ lastid = -1;
+ for (i = 0; i <= highid; ++i)
+ if (id2cmdname[i]) {
+ cmdname = id2cmdname[i];
+
+ if (lastid < 100 && i > 100) {
+ if (lastid == 98)
+ print "\nskip; /* 99 unused */"
+ else
+ printf "\nskip %d; /* %d-99 unused */\n", 100 - lastid, lastid + 1;
+ print "\n\
+/* Because MiG defines reply ports as 100 more than request ports, we\n\
+ have to leave one hundred empty RPC's here. */\n\
+skip 100;";
+ lastid = 199;
+ }
+
+ if (i == lastid + 2)
+ print "\nskip; /*", lastid + 1, "unused */";
+ else if (i != lastid + 1)
+ printf "\nskip %d; /* %d-%d unused */\n", \
+ i - lastid - 1, lastid + 1, i - 1;
+ lastid = i;
+ print "\n/*", i, toupper(cmdname), "*/";
+ printf "routine %s_%s (\n\treqport: io_t", group, cmdname;
+ if (inout[cmdname]) {
+ io = inoutmap[inout[cmdname]];
+ for (argidx = 0; argidx <= 2; ++argidx)
+ if (argtype[argidx "," cmdname])
+ printf ";\n\t%s\targ%d: %s", \
+ io, argidx, argtype[argidx "," cmdname];
+ }
+ else {
+ printf ";\n\tin\trequest: int";
+ }
+ print ");"
+ }
+}