Home | History | Annotate | Line # | Download | only in librumpuser
      1  1.11  rillig /*	$NetBSD: rumpuser_int.h,v 1.11 2022/04/19 20:32:17 rillig Exp $	*/
      2   1.1   pooka 
      3   1.1   pooka /*
      4   1.1   pooka  * Copyright (c) 2008 Antti Kantee.  All Rights Reserved.
      5   1.1   pooka  *
      6   1.1   pooka  * Redistribution and use in source and binary forms, with or without
      7   1.1   pooka  * modification, are permitted provided that the following conditions
      8   1.1   pooka  * are met:
      9   1.1   pooka  * 1. Redistributions of source code must retain the above copyright
     10   1.1   pooka  *    notice, this list of conditions and the following disclaimer.
     11   1.1   pooka  * 2. Redistributions in binary form must reproduce the above copyright
     12   1.1   pooka  *    notice, this list of conditions and the following disclaimer in the
     13   1.1   pooka  *    documentation and/or other materials provided with the distribution.
     14   1.1   pooka  *
     15   1.1   pooka  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
     16   1.1   pooka  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     17   1.1   pooka  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     18   1.1   pooka  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     19   1.1   pooka  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     20   1.1   pooka  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     21   1.1   pooka  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     22   1.1   pooka  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     23   1.1   pooka  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     24   1.1   pooka  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     25   1.1   pooka  * SUCH DAMAGE.
     26   1.1   pooka  */
     27   1.1   pooka 
     28   1.3   pooka #include <stdlib.h>
     29   1.3   pooka 
     30   1.1   pooka #include <rump/rumpuser.h>
     31   1.1   pooka 
     32  1.11  rillig #define seterror(value) do { if (error) *error = value;} while (0)
     33   1.7   pooka 
     34   1.7   pooka extern struct rumpuser_hyperup rumpuser__hyp;
     35   1.7   pooka 
     36   1.7   pooka static inline void
     37   1.7   pooka rumpkern_unsched(int *nlocks, void *interlock)
     38   1.7   pooka {
     39   1.7   pooka 
     40   1.7   pooka 	rumpuser__hyp.hyp_backend_unschedule(0, nlocks, interlock);
     41   1.7   pooka }
     42   1.7   pooka 
     43   1.7   pooka static inline void
     44   1.7   pooka rumpkern_sched(int nlocks, void *interlock)
     45   1.7   pooka {
     46   1.1   pooka 
     47   1.7   pooka 	rumpuser__hyp.hyp_backend_schedule(nlocks, interlock);
     48   1.7   pooka }
     49   1.4   pooka 
     50   1.1   pooka #define KLOCK_WRAP(a)							\
     51   1.1   pooka do {									\
     52   1.1   pooka 	int nlocks;							\
     53   1.7   pooka 	rumpkern_unsched(&nlocks, NULL);				\
     54   1.1   pooka 	a;								\
     55   1.7   pooka 	rumpkern_sched(nlocks, NULL);					\
     56  1.11  rillig } while (0)
     57   1.1   pooka 
     58   1.1   pooka #define DOCALL(rvtype, call)						\
     59   1.2   pooka {									\
     60   1.1   pooka 	rvtype rv;							\
     61   1.1   pooka 	rv = call;							\
     62   1.1   pooka 	if (rv == -1)							\
     63   1.4   pooka 		seterror(errno);					\
     64   1.1   pooka 	else								\
     65   1.4   pooka 		seterror(0);						\
     66   1.2   pooka 	return rv;							\
     67   1.2   pooka }
     68   1.1   pooka 
     69   1.1   pooka #define DOCALL_KLOCK(rvtype, call)					\
     70   1.2   pooka {									\
     71   1.1   pooka 	rvtype rv;							\
     72   1.1   pooka 	int nlocks;							\
     73   1.7   pooka 	rumpkern_unsched(&nlocks, NULL);				\
     74   1.1   pooka 	rv = call;							\
     75   1.7   pooka 	rumpkern_sched(nlocks, NULL);					\
     76   1.1   pooka 	if (rv == -1)							\
     77   1.4   pooka 		seterror(errno);					\
     78   1.1   pooka 	else								\
     79   1.4   pooka 		seterror(0);						\
     80   1.2   pooka 	return rv;							\
     81   1.2   pooka }
     82   1.5   pooka 
     83   1.5   pooka void rumpuser__thrinit(void);
     84   1.6   pooka 
     85  1.11  rillig #define NOFAIL(a) do {if (!(a)) abort();} while (0)
     86   1.6   pooka 
     87   1.6   pooka #define NOFAIL_ERRNO(a)							\
     88   1.6   pooka do {									\
     89   1.6   pooka 	int fail_rv = (a);						\
     90   1.6   pooka 	if (fail_rv) {							\
     91   1.6   pooka 		printf("panic: rumpuser fatal failure %d (%s)\n",	\
     92   1.6   pooka 		    fail_rv, strerror(fail_rv));			\
     93   1.6   pooka 		abort();						\
     94   1.6   pooka 	}								\
     95  1.11  rillig } while (0)
     96   1.8   pooka 
     97   1.9   pooka int  rumpuser__sig_rump2host(int);
     98   1.8   pooka int  rumpuser__errtrans(int);
     99   1.8   pooka #ifdef __NetBSD__
    100   1.8   pooka #define ET(_v_) return (_v_);
    101   1.8   pooka #else
    102   1.8   pooka #define ET(_v_) return (_v_) ? rumpuser__errtrans(_v_) : 0;
    103   1.8   pooka #endif
    104  1.10  justin 
    105  1.10  justin int rumpuser__random_init(void);
    106