36#define DPRINTK(fmt, args...) \
37 printk("xenbus_client (%s:%d) " fmt ".\n", __FUNCTION__, __LINE__, ##args)
39#define DPRINTK(fmt, args...) ((void)0)
47#include <sys/kernel.h>
49#include <sys/malloc.h>
50#include <sys/libkern.h>
53#include <xen/xen-os.h>
54#include <xen/hypervisor.h>
55#include <xen/evtchn.h>
56#include <xen/gnttab.h>
59#include <machine/stdarg.h>
61MALLOC_DEFINE(M_XENBUS,
"xenbus",
"XenBus Support");
78 char *path_buffer = malloc(strlen(
"error/")
79 + strlen(xenbus_get_node(dev)) + 1,M_XENBUS, M_WAITOK);
81 strcpy(path_buffer,
"error/");
82 strcpy(path_buffer + strlen(
"error/"), xenbus_get_node(dev));
92 static const char *
const name[] = {
93 [ XenbusStateUnknown ] =
"Unknown",
94 [ XenbusStateInitialising ] =
"Initialising",
95 [ XenbusStateInitWait ] =
"InitWait",
96 [ XenbusStateInitialised ] =
"Initialised",
97 [ XenbusStateConnected ] =
"Connected",
98 [ XenbusStateClosing ] =
"Closing",
99 [ XenbusStateClosed ] =
"Closed",
102 return ((state < (XenbusStateClosed + 1)) ? name[state] :
"INVALID");
110 char *printf_buffer = NULL, *path_buffer = NULL;
112#define PRINTF_BUFFER_SIZE 4096
113 printf_buffer = malloc(PRINTF_BUFFER_SIZE,M_XENBUS, M_WAITOK);
115 len = sprintf(printf_buffer,
"%i ", err);
116 ret = vsnprintf(printf_buffer+len, PRINTF_BUFFER_SIZE-len, fmt, ap);
118 KASSERT(len + ret <= PRINTF_BUFFER_SIZE-1, (
"xenbus error message too big"));
119 device_printf(dev,
"Error %s\n", printf_buffer);
122 if (path_buffer == NULL) {
123 printf(
"xenbus: failed to write error node for %s (%s)\n",
124 xenbus_get_node(dev), printf_buffer);
128 if (xs_write(XST_NIL, path_buffer,
"error", printf_buffer) != 0) {
129 printf(
"xenbus: failed to write error node for %s (%s)\n",
130 xenbus_get_node(dev), printf_buffer);
136 free(printf_buffer,M_XENBUS);
138 free(path_buffer,M_XENBUS);
155 device_printf(dev,
"Fatal error. Transitioning to Closing State\n");
156 xenbus_set_state(dev, XenbusStateClosing);
174 error = gnttab_grant_foreign_access(
175 xenbus_get_otherend_id(dev), ring_mfn, 0, refp);
190 error = xs_gather(XST_NIL, path,
"state",
"%d", &result, NULL);
192 result = XenbusStateClosed;
204 path = xenbus_get_node(dev);
205 error = xs_gather(XST_NIL, path,
"online",
"%d", &value, NULL);
int xenbus_dev_is_online(device_t dev)
static char * error_path(device_t dev)
Construct the error path corresponding to the given XenBus device.
XenbusState xenbus_read_driver_state(const char *path)
int xenbus_grant_ring(device_t dev, unsigned long ring_mfn, grant_ref_t *refp)
void xenbus_localend_changed(device_t dev, const char *path)
Datastructures and function declarations for usedby device drivers operating on the XenBus.
void xenbus_dev_error(device_t dev, int err, const char *fmt,...) __attribute__((format(printf
void void void void xenbus_dev_vfatal(device_t dev, int err, const char *fmt, va_list) __attribute__((format(printf
void void void xenbus_dev_fatal(device_t dev, int err, const char *fmt,...) __attribute__((format(printf
void void void void const char * xenbus_strstate(enum xenbus_state state)
void void xenbus_dev_verror(device_t dev, int err, const char *fmt, va_list ap) __attribute__((format(printf