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;
}