Module Name:    src
Committed By:   pooka
Date:           Wed May 15 14:52:49 UTC 2013

Modified Files:
        src/lib/librumpuser: rumpuser.3 rumpuser.c rumpuser_pth.c
            rumpuser_pth_dummy.c
        src/sys/rump/include/rump: rumpuser.h
        src/sys/rump/librump/rumpkern: locks.c

Log Message:
Pass enums over the hypercall interface as ints to avoid some
pathological scenarios from arising in setups where enums might be
of a different size in the rump kernel and hypervisor.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/lib/librumpuser/rumpuser.3
cvs rdiff -u -r1.50 -r1.51 src/lib/librumpuser/rumpuser.c
cvs rdiff -u -r1.29 -r1.30 src/lib/librumpuser/rumpuser_pth.c
cvs rdiff -u -r1.15 -r1.16 src/lib/librumpuser/rumpuser_pth_dummy.c
cvs rdiff -u -r1.104 -r1.105 src/sys/rump/include/rump/rumpuser.h
cvs rdiff -u -r1.63 -r1.64 src/sys/rump/librump/rumpkern/locks.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/librumpuser/rumpuser.3
diff -u src/lib/librumpuser/rumpuser.3:1.10 src/lib/librumpuser/rumpuser.3:1.11
--- src/lib/librumpuser/rumpuser.3:1.10	Wed May 15 14:07:26 2013
+++ src/lib/librumpuser/rumpuser.3	Wed May 15 14:52:49 2013
@@ -1,4 +1,4 @@
-.\"     $NetBSD: rumpuser.3,v 1.10 2013/05/15 14:07:26 pooka Exp $
+.\"     $NetBSD: rumpuser.3,v 1.11 2013/05/15 14:52:49 pooka Exp $
 .\"
 .\" Copyright (c) 2013 Antti Kantee.  All rights reserved.
 .\"
@@ -44,6 +44,18 @@ The implementation included in
 is for POSIX hosts.
 This document is divided into sections based on the functionality
 group of each hypercall.
+.Pp
+Since the hypercall interface is a C function interface, both the
+rump kernel and the hypervisor must conform to the same ABI.
+The interface itself attempts to assume as little as possible from
+the type systems, and for example
+.Vt off_t
+is passed as
+.Vt int64_t
+and enums are passed as ints.
+It is recommended that the hypervisor converts these to the native
+types before starting to process the hypercall, for example by
+assigning the ints back to enums.
 .Sh UPCALLS AND RUMP KERNEL CONTEXT
 A hypercall is always entered with the calling thread scheduled in
 the rump kernel.
@@ -73,7 +85,7 @@ by calling
 .Fn rumpuser_init "int version" "struct rump_hyperup *hyp"
 .Pp
 Initialize the hypervisor.
-.Bl -tag -width "xalignmentx"
+.Bl -tag -width "xenum_rumpclock"
 .It Fa version
 hypercall interface version number that the kernel expects to be used.
 In case the hypervisor cannot provide an exact match, this routine must
@@ -84,7 +96,7 @@ pointer to a set of upcalls the hypervis
 .Ss Memory allocation
 .Ft int
 .Fn rumpuser_malloc "size_t len" "int alignment" "void **memp"
-.Bl -tag -width "xalignmentx"
+.Bl -tag -width "xenum_rumpclock"
 .It Fa len
 amount of memory to allocate
 .It Fa alignment
@@ -97,7 +109,7 @@ return pointer for allocated memory
 .Pp
 .Ft void
 .Fn rumpuser_free "void *mem" "size_t len"
-.Bl -tag -width "xalignmentx"
+.Bl -tag -width "xenum_rumpclock"
 .It Fa mem
 memory to free
 .It Fa len
@@ -120,7 +132,7 @@ and the host's file system namespace.
 For example, it is possible to associate the file descriptor with
 device I/O registers for special values of
 .Fa name .
-.Bl -tag -width "xalignmentx"
+.Bl -tag -width "xenum_rumpclock"
 .It Fa name
 the identifier of the file to open for I/O
 .It Fa mode
@@ -163,7 +175,7 @@ Close a previously opened file descripto
 .Pp
 .Ft int
 .Fn rumpuser_getfileinfo "const char *name" "uint64_t *size" "int *type"
-.Bl -tag -width "xalignmentx"
+.Bl -tag -width "xenum_rumpclock"
 .It Fa name
 file for which information is returned.
 The namespace is equal to that of
@@ -190,7 +202,7 @@ respectively.
 .Fc
 .Pp
 Initiate block I/O and return immediately.
-.Bl -tag -width "xalignmentx"
+.Bl -tag -width "xenum_rumpclock"
 .It Fa fd
 perform I/O on this file descriptor.
 The file descriptor must have been opened with
@@ -239,7 +251,7 @@ These routines perform scatter-gather I/
 block I/O by nature and therefore cannot be handled by
 .Fn rumpuser_bio .
 .Pp
-.Bl -tag -width "xalignmentx"
+.Bl -tag -width "xenum_rumpclock"
 .It Fa fd
 file descriptor to perform I/O on
 .It Fa ruiov
@@ -276,10 +288,10 @@ If this is not possible, the hypervisor 
 retain semantics.
 .Pp
 .Ft int
-.Fn rumpuser_clock_gettime "enum rumpclock clk" "int64_t *sec" "long *nsec"
+.Fn rumpuser_clock_gettime "int enum_rumpclock" "int64_t *sec" "long *nsec"
 .Pp
-.Bl -tag -width "xalignmentx"
-.It Fa clk
+.Bl -tag -width "xenum_rumpclock"
+.It Fa enum_rumpclock
 specifies the clock type.
 In case of
 .Dv RUMPUSER_CLOCK_RELWALL
@@ -294,9 +306,9 @@ return value for nanoseconds
 .El
 .Pp
 .Ft int
-.Fn rumpuser_clock_sleep "enum rumpclock clk" "int64_t sec" "long nsec"
-.Bl -tag -width "xalignmentx"
-.It Fa clk
+.Fn rumpuser_clock_sleep "int enum_rumpclock" "int64_t sec" "long nsec"
+.Bl -tag -width "xenum_rumpclock"
+.It Fa enum_rumpclock
 In case of
 .Dv RUMPUSER_CLOCK_RELWALL ,
 the sleep should last at least as long as specified.
@@ -319,7 +331,7 @@ exact semantics depend on
 .Pp
 Retrieve a configuration parameter from the hypervisor.
 It is up to the hypervisor to decide how the parameters can be set.
-.Bl -tag -width "xalignmentx"
+.Bl -tag -width "xenum_rumpclock"
 .It Fa name
 name of the parameter.
 If the name starts with an underscore, it means a mandatory parameter.
@@ -371,7 +383,7 @@ Do output based on printf-like parameter
 .Ft int
 .Fn rumpuser_getrandom "void *buf" "size_t buflen" "int flags" "size_t *retp"
 .Pp
-.Bl -tag -width "xalignmentx"
+.Bl -tag -width "xenum_rumpclock"
 .It Fa buf
 buffer that the randomness is written to
 .It Fa buflen
@@ -402,7 +414,7 @@ threads, it can perform heuristics on th
 and
 .Fa cpuidx
 parameters.
-.Bl -tag -width "xalignmentx"
+.Bl -tag -width "xenum_rumpclock"
 .It Fa fun
 function that the new thread must call
 .It Fa arg
@@ -448,11 +460,11 @@ The cookie matches the value from
 .Fn rumpuser_thread_create .
 .Pp
 .Ft void
-.Fn rumpuser_curlwpop "enum rumplwpop op" "struct lwp *l"
+.Fn rumpuser_curlwpop "int enum_rumplwpop" "struct lwp *l"
 .Pp
 Manipulate the hypervisor's thread context database.
 The possible operations are create, destroy, and set as specified by
-.Fa op :
+.Fa enum_rumplwpop :
 .Bl -tag -width "XRUMPUSER_LWP_DESTROY"
 .It Dv RUMPUSER_LWP_CREATE
 Inform the hypervisor that
@@ -563,10 +575,10 @@ will never be called for that particular
 .Fn rumpuser_rw_init "struct rumpuser_rw **rwp"
 .Pp
 .Ft void
-.Fn rumpuser_rw_enter "struct rumpuser_rw *rw" "const enum rumprwlock lk"
+.Fn rumpuser_rw_enter "int enum_rumprwlock" "struct rumpuser_rw *rw"
 .Pp
 .Ft int
-.Fn rumpuser_rw_tryenter "struct rumpuser_rw *rw" "const enum rumprwlock lk"
+.Fn rumpuser_rw_tryenter "int enum_rumprwlock" "struct rumpuser_rw *rw"
 .Pp
 .Ft int
 .Fn rumpuser_rw_tryupgrade "struct rumpuser_rw *rw"
@@ -582,7 +594,7 @@ will never be called for that particular
 .Pp
 .Ft void
 .Fo rumpuser_rw_held
-.Fa "struct rumpuser_rw *rw" "const enum rumprwlock lk" "int *heldp"
+.Fa "int enum_rumprwlock" "struct rumpuser_rw *rw" "int *heldp"
 .Fc
 .Pp
 Read/write locks provide either shared or exclusive locking.

Index: src/lib/librumpuser/rumpuser.c
diff -u src/lib/librumpuser/rumpuser.c:1.50 src/lib/librumpuser/rumpuser.c:1.51
--- src/lib/librumpuser/rumpuser.c:1.50	Thu May  2 21:45:29 2013
+++ src/lib/librumpuser/rumpuser.c	Wed May 15 14:52:49 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser.c,v 1.50 2013/05/02 21:45:29 pooka Exp $	*/
+/*	$NetBSD: rumpuser.c,v 1.51 2013/05/15 14:52:49 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007-2010 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
 #include "rumpuser_port.h"
 
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser.c,v 1.50 2013/05/02 21:45:29 pooka Exp $");
+__RCSID("$NetBSD: rumpuser.c,v 1.51 2013/05/15 14:52:49 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/ioctl.h>
@@ -395,8 +395,9 @@ rumpuser_iovwrite(int fd, const struct r
 }
 
 int
-rumpuser_clock_gettime(enum rumpclock rclk, int64_t *sec, long *nsec)
+rumpuser_clock_gettime(int enum_rumpclock, int64_t *sec, long *nsec)
 {
+	enum rumpclock rclk = enum_rumpclock;
 	struct timespec ts;
 	clockid_t clk;
 	int rv;
@@ -428,8 +429,9 @@ rumpuser_clock_gettime(enum rumpclock rc
 }
 
 int
-rumpuser_clock_sleep(enum rumpclock clk, int64_t sec, long nsec)
+rumpuser_clock_sleep(int enum_rumpclock, int64_t sec, long nsec)
 {
+	enum rumpclock rclk = enum_rumpclock;
 	struct timespec rqt, rmt;
 	int nlocks;
 	int rv;
@@ -441,7 +443,7 @@ rumpuser_clock_sleep(enum rumpclock clk,
 	/*LINTED*/
 	rqt.tv_nsec = nsec;
 
-	switch (clk) {
+	switch (rclk) {
 	case RUMPUSER_CLOCK_RELWALL:
 		do {
 			rv = nanosleep(&rqt, &rmt);

Index: src/lib/librumpuser/rumpuser_pth.c
diff -u src/lib/librumpuser/rumpuser_pth.c:1.29 src/lib/librumpuser/rumpuser_pth.c:1.30
--- src/lib/librumpuser/rumpuser_pth.c:1.29	Wed May 15 14:07:26 2013
+++ src/lib/librumpuser/rumpuser_pth.c	Wed May 15 14:52:49 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser_pth.c,v 1.29 2013/05/15 14:07:26 pooka Exp $	*/
+/*	$NetBSD: rumpuser_pth.c,v 1.30 2013/05/15 14:52:49 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007-2010 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
 #include "rumpuser_port.h"
 
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser_pth.c,v 1.29 2013/05/15 14:07:26 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_pth.c,v 1.30 2013/05/15 14:52:49 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/queue.h>
@@ -321,8 +321,9 @@ rumpuser_rw_init(struct rumpuser_rw **rw
 }
 
 void
-rumpuser_rw_enter(struct rumpuser_rw *rw, const enum rumprwlock lk)
+rumpuser_rw_enter(int enum_rumprwlock, struct rumpuser_rw *rw)
 {
+	enum rumprwlock lk = enum_rumprwlock;
 
 	switch (lk) {
 	case RUMPUSER_RW_WRITER:
@@ -342,8 +343,9 @@ rumpuser_rw_enter(struct rumpuser_rw *rw
 }
 
 int
-rumpuser_rw_tryenter(struct rumpuser_rw *rw, const enum rumprwlock lk)
+rumpuser_rw_tryenter(int enum_rumprwlock, struct rumpuser_rw *rw)
 {
+	enum rumprwlock lk = enum_rumprwlock;
 	int rv;
 
 	switch (lk) {
@@ -421,8 +423,9 @@ rumpuser_rw_destroy(struct rumpuser_rw *
 }
 
 void
-rumpuser_rw_held(struct rumpuser_rw *rw, const enum rumprwlock lk, int *rv)
+rumpuser_rw_held(int enum_rumprwlock, struct rumpuser_rw *rw, int *rv)
 {
+	enum rumprwlock lk = enum_rumprwlock;
 
 	switch (lk) {
 	case RUMPUSER_RW_WRITER:
@@ -663,8 +666,9 @@ rumpuser_curlwp(void)
 #else
 
 void
-rumpuser_curlwpop(enum rumplwpop op, struct lwp *l)
+rumpuser_curlwpop(int enum_rumplwpop, struct lwp *l)
 {
+	enum rumplwpop op = enum_rumplwpop;
 
 	switch (op) {
 	case RUMPUSER_LWP_CREATE:

Index: src/lib/librumpuser/rumpuser_pth_dummy.c
diff -u src/lib/librumpuser/rumpuser_pth_dummy.c:1.15 src/lib/librumpuser/rumpuser_pth_dummy.c:1.16
--- src/lib/librumpuser/rumpuser_pth_dummy.c:1.15	Tue May  7 16:40:31 2013
+++ src/lib/librumpuser/rumpuser_pth_dummy.c	Wed May 15 14:52:49 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser_pth_dummy.c,v 1.15 2013/05/07 16:40:31 pooka Exp $	*/
+/*	$NetBSD: rumpuser_pth_dummy.c,v 1.16 2013/05/15 14:52:49 pooka Exp $	*/
 
 /*
  * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
@@ -29,7 +29,7 @@
 
 #include <sys/cdefs.h>
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser_pth_dummy.c,v 1.15 2013/05/07 16:40:31 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_pth_dummy.c,v 1.16 2013/05/15 14:52:49 pooka Exp $");
 #endif /* !lint */
 
 #include <sys/time.h>
@@ -153,8 +153,9 @@ rumpuser_rw_init(struct rumpuser_rw **rw
 }
 
 void
-rumpuser_rw_enter(struct rumpuser_rw *rw, enum rumprwlock lk)
+rumpuser_rw_enter(int enum_rumprwlock, struct rumpuser_rw *rw)
 {
+	enum rumprwlock lk = enum_rumprwlock;
 
 	switch (lk) {
 	case RUMPUSER_RW_WRITER:
@@ -169,10 +170,10 @@ rumpuser_rw_enter(struct rumpuser_rw *rw
 }
 
 int
-rumpuser_rw_tryenter(struct rumpuser_rw *rw, enum rumprwlock lk)
+rumpuser_rw_tryenter(int enum_rumprwlock, struct rumpuser_rw *rw)
 {
 
-	rumpuser_rw_enter(rw, lk);
+	rumpuser_rw_enter(enum_rumprwlock, rw);
 	return 0;
 }
 
@@ -196,8 +197,9 @@ rumpuser_rw_destroy(struct rumpuser_rw *
 }
 
 void
-rumpuser_rw_held(struct rumpuser_rw *rw, enum rumprwlock lk, int *rvp)
+rumpuser_rw_held(int enum_rumprwlock, struct rumpuser_rw *rw, int *rvp)
 {
+	enum rumprwlock lk = enum_rumprwlock;
 
 	switch (lk) {
 	case RUMPUSER_RW_WRITER:
@@ -300,8 +302,9 @@ rumpuser_cv_has_waiters(struct rumpuser_
  */
 
 void
-rumpuser_curlwpop(enum rumplwpop op, struct lwp *l)
+rumpuser_curlwpop(int enum_rumplwpop, struct lwp *l)
 {
+	enum rumplwpop op = enum_rumplwpop;
 
 	switch (op) {
 	case RUMPUSER_LWP_CREATE:
@@ -310,6 +313,10 @@ rumpuser_curlwpop(enum rumplwpop op, str
 	case RUMPUSER_LWP_SET:
 		curlwp = l;
 		break;
+	case RUMPUSER_LWP_CLEAR:
+		assert(curlwp == l);
+		curlwp = NULL;
+		break;
 	}
 }
 

Index: src/sys/rump/include/rump/rumpuser.h
diff -u src/sys/rump/include/rump/rumpuser.h:1.104 src/sys/rump/include/rump/rumpuser.h:1.105
--- src/sys/rump/include/rump/rumpuser.h:1.104	Wed May 15 14:07:26 2013
+++ src/sys/rump/include/rump/rumpuser.h	Wed May 15 14:52:49 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser.h,v 1.104 2013/05/15 14:07:26 pooka Exp $	*/
+/*	$NetBSD: rumpuser.h,v 1.105 2013/05/15 14:52:49 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007-2013 Antti Kantee.  All Rights Reserved.
@@ -114,8 +114,8 @@ int rumpuser_iovwrite(int, const struct 
  */
 
 enum rumpclock { RUMPUSER_CLOCK_RELWALL, RUMPUSER_CLOCK_ABSMONO };
-int rumpuser_clock_gettime(enum rumpclock, int64_t *, long *);
-int rumpuser_clock_sleep(enum rumpclock, int64_t, long);
+int rumpuser_clock_gettime(int, int64_t *, long *);
+int rumpuser_clock_sleep(int, int64_t, long);
 
 /*
  * host information retrieval
@@ -168,7 +168,7 @@ enum rumplwpop {
 	RUMPUSER_LWP_CREATE, RUMPUSER_LWP_DESTROY,
 	RUMPUSER_LWP_SET, RUMPUSER_LWP_CLEAR
 };
-void rumpuser_curlwpop(enum rumplwpop, struct lwp *);
+void rumpuser_curlwpop(int, struct lwp *);
 struct lwp *rumpuser_curlwp(void);
 
 struct rumpuser_mtx;
@@ -185,13 +185,13 @@ void rumpuser_mutex_owner(struct rumpuse
 struct rumpuser_rw;
 enum rumprwlock { RUMPUSER_RW_READER, RUMPUSER_RW_WRITER };
 void rumpuser_rw_init(struct rumpuser_rw **);
-void rumpuser_rw_enter(struct rumpuser_rw *, const enum rumprwlock);
-int  rumpuser_rw_tryenter(struct rumpuser_rw *, const enum rumprwlock);
+void rumpuser_rw_enter(int, struct rumpuser_rw *);
+int  rumpuser_rw_tryenter(int, struct rumpuser_rw *);
 int  rumpuser_rw_tryupgrade(struct rumpuser_rw *);
 void rumpuser_rw_downgrade(struct rumpuser_rw *);
 void rumpuser_rw_exit(struct rumpuser_rw *);
 void rumpuser_rw_destroy(struct rumpuser_rw *);
-void rumpuser_rw_held(struct rumpuser_rw *, const enum rumprwlock, int *);
+void rumpuser_rw_held(int, struct rumpuser_rw *, int *);
 
 struct rumpuser_cv;
 void rumpuser_cv_init(struct rumpuser_cv **);

Index: src/sys/rump/librump/rumpkern/locks.c
diff -u src/sys/rump/librump/rumpkern/locks.c:1.63 src/sys/rump/librump/rumpkern/locks.c:1.64
--- src/sys/rump/librump/rumpkern/locks.c:1.63	Thu May  2 21:35:19 2013
+++ src/sys/rump/librump/rumpkern/locks.c	Wed May 15 14:52:49 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: locks.c,v 1.63 2013/05/02 21:35:19 pooka Exp $	*/
+/*	$NetBSD: locks.c,v 1.64 2013/05/15 14:52:49 pooka Exp $	*/
 
 /*
  * Copyright (c) 2007-2011 Antti Kantee.  All Rights Reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: locks.c,v 1.63 2013/05/02 21:35:19 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locks.c,v 1.64 2013/05/15 14:52:49 pooka Exp $");
 
 #include <sys/param.h>
 #include <sys/kmem.h>
@@ -225,7 +225,7 @@ rw_enter(krwlock_t *rw, const krw_t op)
 
 
 	WANTLOCK(rw, op == RW_READER, false);
-	rumpuser_rw_enter(RUMPRW(rw), krw2rumprw(op));
+	rumpuser_rw_enter(krw2rumprw(op), RUMPRW(rw));
 	LOCKED(rw, op == RW_READER);
 }
 
@@ -234,7 +234,7 @@ rw_tryenter(krwlock_t *rw, const krw_t o
 {
 	int error;
 
-	error = rumpuser_rw_tryenter(RUMPRW(rw), krw2rumprw(op));
+	error = rumpuser_rw_tryenter(krw2rumprw(op), RUMPRW(rw));
 	if (error == 0) {
 		WANTLOCK(rw, op == RW_READER, true);
 		LOCKED(rw, op == RW_READER);
@@ -285,7 +285,7 @@ rw_read_held(krwlock_t *rw)
 {
 	int rv;
 
-	rumpuser_rw_held(RUMPRW(rw), RUMPUSER_RW_READER, &rv);
+	rumpuser_rw_held(RUMPUSER_RW_READER, RUMPRW(rw), &rv);
 	return rv;
 }
 
@@ -294,7 +294,7 @@ rw_write_held(krwlock_t *rw)
 {
 	int rv;
 
-	rumpuser_rw_held(RUMPRW(rw), RUMPUSER_RW_WRITER, &rv);
+	rumpuser_rw_held(RUMPUSER_RW_WRITER, RUMPRW(rw), &rv);
 	return rv;
 }
 

Reply via email to