Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/kern Add rump support for the special handling required ...
details: https://anonhg.NetBSD.org/src/rev/321a367e9d42
branches: trunk
changeset: 749324:321a367e9d42
user: pooka <pooka%NetBSD.org@localhost>
date: Thu Nov 26 17:19:54 2009 +0000
description:
Add rump support for the special handling required by pipe(2).
diffstat:
sys/kern/makesyscalls.sh | 67 +++++++++++++++++++++++++++++++++++++----------
1 files changed, 53 insertions(+), 14 deletions(-)
diffs (112 lines):
diff -r 7acb41de52aa -r 321a367e9d42 sys/kern/makesyscalls.sh
--- a/sys/kern/makesyscalls.sh Thu Nov 26 16:38:01 2009 +0000
+++ b/sys/kern/makesyscalls.sh Thu Nov 26 17:19:54 2009 +0000
@@ -1,5 +1,5 @@
#! /bin/sh -
-# $NetBSD: makesyscalls.sh,v 1.89 2009/11/26 16:34:24 pooka Exp $
+# $NetBSD: makesyscalls.sh,v 1.90 2009/11/26 17:19:54 pooka Exp $
#
# Copyright (c) 1994, 1996, 2000 Christopher G. Demetriou
# All rights reserved.
@@ -425,6 +425,13 @@
f++
fbase=$f
+ # pipe is special in how to returns its values.
+ # So just generate it manually if present.
+ if (rumpable == 1 && fbase == "pipe") {
+ rumpable = 0;
+ rumphaspipe = 1;
+ }
+
funcstdname=fprefix "_" fbase
if (fcompat != "") {
funcname=fprefix "___" fbase "" fcompat
@@ -533,6 +540,25 @@
printf(";\n") > rumpcallshdr
}
+function printrumpsysent(insysent, compatwrap) {
+ if (!insysent) {
+ printf("\t{ 0, 0, 0,\n\t %s },\t\t\t/* %d = unrumped */\n", \
+ "(sy_call_t *)rump_enosys", syscall) > rumpsysent
+ return
+ }
+
+ printf("\t{ ") > rumpsysent
+ if (argc == 0) {
+ printf("0, 0, ") > rumpsysent
+ } else {
+ printf("ns(struct %s%s_args), ", compatwrap_, funcname) > rumpsysent
+ }
+ printf("0,\n\t %s },", wfn) > rumpsysent
+ for (i = 0; i < (41 - length(wfn)) / 8; i++)
+ printf("\t") > rumpsysent
+ printf("/* %d = %s%s */\n", syscall, compatwrap_, funcalias) > rumpsysent
+}
+
function putent(type, compatwrap) {
# output syscall declaration for switch table.
if (compatwrap == "")
@@ -601,10 +627,18 @@
}
}
+ if (!rumpable) {
+ if (funcname == "sys_pipe" && rumphaspipe == 1)
+ insysent = 1
+ else
+ insysent = 0
+ } else {
+ insysent = 1
+ }
+ printrumpsysent(insysent, compatwrap)
+
# output rump marshalling code if necessary
if (!rumpable) {
- printf("\t{ 0, 0, 0,\n\t %s },\t\t\t/* %d = unrumped */\n", \
- "(sy_call_t *)rump_enosys", syscall) > rumpsysent
return
}
@@ -658,17 +692,6 @@
printf("}\n") > rumpcalls
printf("__weak_alias(%s,rump_enosys);\n", funcname) > rumpcalls
- # rumpsysent
- printf("\t{ ") > rumpsysent
- if (argc == 0) {
- printf("0, 0, ") > rumpsysent
- } else {
- printf("ns(struct %s%s_args), ", compatwrap_, funcname) > rumpsysent
- }
- printf("0,\n\t %s },", wfn) > rumpsysent
- for (i = 0; i < (41 - length(wfn)) / 8; i++)
- printf("\t") > rumpsysent
- printf("/* %d = %s%s */\n", syscall, compatwrap_, funcalias) > rumpsysent
}
$2 == "STD" || $2 == "NODEF" || $2 == "NOARGS" || $2 == "INDIR" {
parseline()
@@ -717,6 +740,22 @@
exit 1
}
END {
+ # output pipe() with it's special rval[2] handling
+ if (rumphaspipe) {
+ printf("int rump_sys_pipe(int *);\n") > rumpcallshdr
+ printf("\nint rump_sys_pipe(int *);\n") > rumpcalls
+ printf("int\nrump_sys_pipe(int *fd)\n{\n") > rumpcalls
+ printf("\tregister_t rval[2] = {0, 0};\n") > rumpcalls
+ printf("\tint error = 0;\n") > rumpcalls
+ printf("\n\terror = rump_sysproxy(SYS_pipe, ") > rumpcalls
+ printf("rump_sysproxy_arg, NULL, 0, rval);\n") > rumpcalls
+ printf("\tif (error) {\n") > rumpcalls
+ printf("\t\trumpuser_seterrno(error);\n") > rumpcalls
+ printf("\t} else {\n\t\tfd[0] = rval[0];\n") > rumpcalls
+ printf("\t\tfd[1] = rval[1];\n\t}\n") > rumpcalls
+ printf("\treturn error ? -1 : 0;\n}\n") > rumpcalls
+ }
+
maxsyscall = syscall
if (nsysent) {
if (syscall > nsysent) {
Home |
Main Index |
Thread Index |
Old Index