#ifndef _DEV_PV_XENVAR_H_
#define _DEV_PV_XENVAR_H_
static inline void
clear_bit(u_int b, volatile void *p)
{
atomic_clearbits_int(((volatile u_int *)p) + (b >> 5), 1 << (b & 0x1f));
}
static inline void
set_bit(u_int b, volatile void *p)
{
atomic_setbits_int(((volatile u_int *)p) + (b >> 5), 1 << (b & 0x1f));
}
static inline int
test_bit(u_int b, volatile void *p)
{
return !!(((volatile u_int *)p)[b >> 5] & (1 << (b & 0x1f)));
}
#define XEN_MAX_NODE_LEN 64
#define XEN_MAX_BACKEND_LEN 128
struct xen_intsrc {
SLIST_ENTRY(xen_intsrc) xi_entry;
struct evcount xi_evcnt;
evtchn_port_t xi_port;
short xi_noclose;
short xi_masked;
struct refcnt xi_refcnt;
struct task xi_task;
struct taskq *xi_taskq;
void (*xi_handler)(void *);
void *xi_ctx;
};
struct xen_gntent {
grant_entry_t *ge_table;
grant_ref_t ge_start;
short ge_reserved;
short ge_next;
short ge_free;
struct mutex ge_lock;
};
struct xen_gntmap {
grant_ref_t gm_ref;
paddr_t gm_paddr;
};
struct xen_device {
struct device *dv_dev;
char dv_unit[16];
LIST_ENTRY(xen_device) dv_entry;
};
LIST_HEAD(xen_devices, xen_device);
struct xen_devlist {
struct xen_softc *dl_xen;
char dl_node[XEN_MAX_NODE_LEN];
struct task dl_task;
struct xen_devices dl_devs;
SLIST_ENTRY(xen_devlist) dl_entry;
};
SLIST_HEAD(xen_devlists, xen_devlist);
struct xen_softc {
struct device sc_dev;
uint32_t sc_base;
void *sc_hc;
uint32_t sc_features;
#define XENFEAT_CBVEC (1<<8)
bus_dma_tag_t sc_dmat;
struct shared_info *sc_ipg;
uint32_t sc_flags;
#define XSF_CBVEC 0x0001
uint32_t sc_unplug;
uint64_t sc_irq;
SLIST_HEAD(, xen_intsrc) sc_intrs;
struct mutex sc_islck;
struct xen_gntent *sc_gnt;
struct mutex sc_gntlck;
int sc_gntcnt;
int sc_gntmax;
struct xs_softc *sc_xs;
struct task sc_ctltsk;
struct xen_devlists sc_devlists;
};
extern struct xen_softc *xen_sc;
struct xen_attach_args {
char xa_name[16];
char xa_node[XEN_MAX_NODE_LEN];
char xa_backend[XEN_MAX_BACKEND_LEN];
int xa_domid;
bus_dma_tag_t xa_dmat;
};
#define XC_MEMORY 12
#define XC_OEVTCHN 16
#define XC_VERSION 17
#define XC_GNTTAB 20
#define XC_EVTCHN 32
#define XC_HVM 34
int xen_hypercall(struct xen_softc *, int, int, ...);
int xen_hypercallv(struct xen_softc *, int, int, ulong *);
typedef uint32_t xen_intr_handle_t;
void xen_intr(void);
void xen_intr_ack(void);
void xen_intr_signal(xen_intr_handle_t);
void xen_intr_schedule(xen_intr_handle_t);
void xen_intr_barrier(xen_intr_handle_t);
int xen_intr_establish(evtchn_port_t, xen_intr_handle_t *, int,
void (*)(void *), void *, char *);
int xen_intr_disestablish(xen_intr_handle_t);
void xen_intr_enable(void);
void xen_intr_mask(xen_intr_handle_t);
int xen_intr_unmask(xen_intr_handle_t);
#define XEN_UNPLUG_NIC 0x0001
#define XEN_UNPLUG_IDE 0x0002
#define XEN_UNPLUG_IDESEC 0x0004
void xen_unplug_emulated(void *, int);
#define XS_LIST 0x01
#define XS_READ 0x02
#define XS_WATCH 0x04
#define XS_TOPEN 0x06
#define XS_TCLOSE 0x07
#define XS_WRITE 0x0b
#define XS_RM 0x0d
#define XS_EVENT 0x0f
#define XS_ERROR 0x10
#define XS_MAX 0x16
struct xs_transaction {
uint32_t xst_id;
void *xst_cookie;
};
int xs_cmd(struct xs_transaction *, int, const char *, struct iovec **,
int *);
void xs_resfree(struct xs_transaction *, struct iovec *, int);
int xs_watch(void *, const char *, const char *, struct task *,
void (*)(void *), void *);
int xs_getnum(void *, const char *, const char *, unsigned long long *);
int xs_setnum(void *, const char *, const char *, unsigned long long);
int xs_getprop(void *, const char *, const char *, char *, int);
int xs_setprop(void *, const char *, const char *, char *, int);
int xs_kvop(void *, int, char *, char *, size_t);
#define XEN_STATE_UNKNOWN "0"
#define XEN_STATE_INITIALIZING "1"
#define XEN_STATE_INITWAIT "2"
#define XEN_STATE_INITIALIZED "3"
#define XEN_STATE_CONNECTED "4"
#define XEN_STATE_CLOSING "5"
#define XEN_STATE_CLOSED "6"
#define XEN_STATE_RECONFIGURING "7"
#define XEN_STATE_RECONFIGURED "8"
int xs_await_transition(void *, const char *, const char *,
const char *, int);
#endif