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