#include <stdlib.h>
#include <rump/rumpuser.h>
#define seterror(value) do { if (error) *error = value;} while (0)
extern struct rumpuser_hyperup rumpuser__hyp;
static inline void
rumpkern_unsched(int *nlocks, void *interlock)
{
rumpuser__hyp.hyp_backend_unschedule(0, nlocks, interlock);
}
static inline void
rumpkern_sched(int nlocks, void *interlock)
{
rumpuser__hyp.hyp_backend_schedule(nlocks, interlock);
}
#define KLOCK_WRAP(a) \
do { \
int nlocks; \
rumpkern_unsched(&nlocks, NULL); \
a; \
rumpkern_sched(nlocks, NULL); \
} while (0)
#define DOCALL(rvtype, call) \
{ \
rvtype rv; \
rv = call; \
if (rv == -1) \
seterror(errno); \
else \
seterror(0); \
return rv; \
}
#define DOCALL_KLOCK(rvtype, call) \
{ \
rvtype rv; \
int nlocks; \
rumpkern_unsched(&nlocks, NULL); \
rv = call; \
rumpkern_sched(nlocks, NULL); \
if (rv == -1) \
seterror(errno); \
else \
seterror(0); \
return rv; \
}
void rumpuser__thrinit(void);
#define NOFAIL(a) do {if (!(a)) abort();} while (0)
#define NOFAIL_ERRNO(a) \
do { \
int fail_rv = (a); \
if (fail_rv) { \
printf("panic: rumpuser fatal failure %d (%s)\n", \
fail_rv, strerror(fail_rv)); \
abort(); \
} \
} while (0)
int rumpuser__sig_rump2host(int);
int rumpuser__errtrans(int);
#ifdef __NetBSD__
#define ET(_v_) return (_v_);
#else
#define ET(_v_) return (_v_) ? rumpuser__errtrans(_v_) : 0;
#endif
int rumpuser__random_init(void);