843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER START
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The contents of this file are subject to the terms of the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Common Development and Distribution License (the "License").
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You may not use this file except in compliance with the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
843e19887f64dde75055cf8842fc4db2171eff45johnlev * or http://www.opensolaris.org/os/licensing.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * See the License for the specific language governing permissions
843e19887f64dde75055cf8842fc4db2171eff45johnlev * and limitations under the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * When distributing Covered Code, include this CDDL HEADER in each
843e19887f64dde75055cf8842fc4db2171eff45johnlev * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * If applicable, add the following below this CDDL HEADER, with the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * fields enclosed by brackets "[]" replaced with your own identifying
843e19887f64dde75055cf8842fc4db2171eff45johnlev * information: Portions Copyright [yyyy] [name of copyright owner]
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER END
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Use is subject to license terms.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * xenbus.h (renamed to xenbus_impl.h)
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Talks to Xen Store to figure out what devices we have.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Copyright (C) 2005 Rusty Russell, IBM Corporation
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * This file may be distributed separately from the Linux kernel, or
843e19887f64dde75055cf8842fc4db2171eff45johnlev * incorporated into other software packages, subject to the following license:
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Permission is hereby granted, free of charge, to any person obtaining a copy
843e19887f64dde75055cf8842fc4db2171eff45johnlev * of this source file (the "Software"), to deal in the Software without
843e19887f64dde75055cf8842fc4db2171eff45johnlev * restriction, including without limitation the rights to use, copy, modify,
843e19887f64dde75055cf8842fc4db2171eff45johnlev * merge, publish, distribute, sublicense, and/or sell copies of the Software,
843e19887f64dde75055cf8842fc4db2171eff45johnlev * and to permit persons to whom the Software is furnished to do so, subject to
843e19887f64dde75055cf8842fc4db2171eff45johnlev * the following conditions:
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The above copyright notice and this permission notice shall be included in
843e19887f64dde75055cf8842fc4db2171eff45johnlev * all copies or substantial portions of the Software.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
843e19887f64dde75055cf8842fc4db2171eff45johnlev * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
843e19887f64dde75055cf8842fc4db2171eff45johnlev * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
843e19887f64dde75055cf8842fc4db2171eff45johnlev * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
843e19887f64dde75055cf8842fc4db2171eff45johnlev * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
843e19887f64dde75055cf8842fc4db2171eff45johnlev * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
843e19887f64dde75055cf8842fc4db2171eff45johnlev * IN THE SOFTWARE.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifndef _SYS_XENBUS_H
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define _SYS_XENBUS_H
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/mutex.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/list.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef __cplusplus
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern "C" {
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XBT_NULL 0
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevtypedef uint32_t xenbus_transaction_t;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Register callback to watch this node. */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowiczstruct xenbus_watch;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicztypedef void (*xenbus_watch_cb_t)(struct xenbus_watch *,
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz const char **vec, unsigned int len);
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowiczstruct xenbus_watch {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee list_node_t list;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz const char *node; /* path being watched */
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz xenbus_watch_cb_t callback;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz struct xenbus_device *dev;
843e19887f64dde75055cf8842fc4db2171eff45johnlev};
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Call this function when xenstore is available, i.e. the daemon is
843e19887f64dde75055cf8842fc4db2171eff45johnlev * connected to the xenbus device.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevstruct xenbus_notify {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee list_node_t list;
843e19887f64dde75055cf8842fc4db2171eff45johnlev void (*notify_func) (int);
843e19887f64dde75055cf8842fc4db2171eff45johnlev};
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* A xenbus device. */
843e19887f64dde75055cf8842fc4db2171eff45johnlevstruct xenbus_device {
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char *devicetype;
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char *nodename;
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char *otherend;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int otherend_id;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int otherend_state;
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xenbus_watch otherend_watch;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int has_error;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int frontend;
843e19887f64dde75055cf8842fc4db2171eff45johnlev void (*otherend_changed)(struct xenbus_device *, XenbusState);
843e19887f64dde75055cf8842fc4db2171eff45johnlev void *data;
843e19887f64dde75055cf8842fc4db2171eff45johnlev};
843e19887f64dde75055cf8842fc4db2171eff45johnlev
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicztypedef void (*xvdi_xb_watch_cb_t)(dev_info_t *dip, const char *path,
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz void *arg);
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicztypedef struct xd_xb_watches {
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz list_node_t xxw_list;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz int xxw_ref;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz struct xenbus_watch xxw_watch;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz struct xendev_ppd *xxw_xppd;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz xvdi_xb_watch_cb_t xxw_cb;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz void *xxw_arg;
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowicz} xd_xb_watches_t;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern char **xenbus_directory(xenbus_transaction_t t, const char *dir,
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char *node, unsigned int *num);
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_read(xenbus_transaction_t t, const char *dir,
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char *node, void **rstr, unsigned int *len);
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowiczextern int xenbus_read_str(const char *dir, const char *node, char **rstr);
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_write(xenbus_transaction_t t, const char *dir,
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char *node, const char *string);
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_mkdir(xenbus_transaction_t t, const char *dir,
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char *node);
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowiczextern boolean_t xenbus_exists(const char *dir, const char *node);
7f0b8309074a5d8e9f9d8ffe7aad7bb0b1ee6b1fEdward Pilatowiczextern boolean_t xenbus_exists_dir(const char *dir, const char *node);
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_rm(xenbus_transaction_t t, const char *dir,
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char *node);
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_transaction_start(xenbus_transaction_t *t);
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_transaction_end(xenbus_transaction_t t, int abort);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Single read and scanf: returns errno or num scanned if > 0. */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_scanf(xenbus_transaction_t t, const char *dir,
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char *node, const char *fmt, ...);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Single printf and write: returns errno or 0. */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_printf(xenbus_transaction_t t, const char *dir,
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char *node, const char *fmt, ...);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Generic read function: NULL-terminated triples of name,
843e19887f64dde75055cf8842fc4db2171eff45johnlev * sprintf-style type string, and pointer. Returns 0 or errno.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_gather(xenbus_transaction_t t, const char *dir, ...);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int register_xenbus_watch(struct xenbus_watch *watch);
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern void unregister_xenbus_watch(struct xenbus_watch *watch);
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern void reregister_xenbus_watches(void);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Called from xen core code. */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern void xenbus_suspend(void);
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern void xenbus_resume(void);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XENBUS_EXIST_ERR(err) ((err) == ENOENT || (err) == ERANGE)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Register a watch on the given path, using the given xenbus_watch structure
843e19887f64dde75055cf8842fc4db2171eff45johnlev * for storage, and the given callback function as the callback. Return 0 on
843e19887f64dde75055cf8842fc4db2171eff45johnlev * success, or errno on error. On success, the given path will be saved as
843e19887f64dde75055cf8842fc4db2171eff45johnlev * watch->node, and remains the caller's to free. On error, watch->node will
843e19887f64dde75055cf8842fc4db2171eff45johnlev * be NULL, the device will switch to XenbusStateClosing, and the error will
843e19887f64dde75055cf8842fc4db2171eff45johnlev * be saved in the store.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_watch_path(struct xenbus_device *dev, const char *path,
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xenbus_watch *watch,
843e19887f64dde75055cf8842fc4db2171eff45johnlev void (*callback)(struct xenbus_watch *,
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char **, unsigned int));
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Register a watch on the given path/path2, using the given xenbus_watch
843e19887f64dde75055cf8842fc4db2171eff45johnlev * structure for storage, and the given callback function as the callback.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Return 0 on success, or errno on error. On success, the watched path
843e19887f64dde75055cf8842fc4db2171eff45johnlev * (path/path2) will be saved as watch->node, and becomes the caller's to
843e19887f64dde75055cf8842fc4db2171eff45johnlev * kfree(). On error, watch->node will be NULL, so the caller has nothing to
843e19887f64dde75055cf8842fc4db2171eff45johnlev * free, the device will switch to XenbusStateClosing, and the error will be
843e19887f64dde75055cf8842fc4db2171eff45johnlev * saved in the store.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_watch_path2(struct xenbus_device *dev, const char *path,
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char *path2, struct xenbus_watch *watch,
843e19887f64dde75055cf8842fc4db2171eff45johnlev void (*callback)(struct xenbus_watch *,
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char **, unsigned int));
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Advertise in the store a change of the given driver to the given new_state.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Perform the change inside the given transaction xbt. xbt may be NULL, in
843e19887f64dde75055cf8842fc4db2171eff45johnlev * which case this is performed inside its own transaction. Return 0 on
843e19887f64dde75055cf8842fc4db2171eff45johnlev * success, or errno on error. On error, the device will switch to
843e19887f64dde75055cf8842fc4db2171eff45johnlev * XenbusStateClosing, and the error will be saved in the store.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_switch_state(struct xenbus_device *dev,
843e19887f64dde75055cf8842fc4db2171eff45johnlev xenbus_transaction_t xbt,
843e19887f64dde75055cf8842fc4db2171eff45johnlev XenbusState new_state);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Grant access to the given ring_mfn to the peer of the given device. Return
843e19887f64dde75055cf8842fc4db2171eff45johnlev * 0 on success, or errno on error. On error, the device will switch to
843e19887f64dde75055cf8842fc4db2171eff45johnlev * XenbusStateClosing, and the error will be saved in the store.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_grant_ring(struct xenbus_device *dev, unsigned long ring_mfn);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Allocate an event channel for the given xenbus_device, assigning the newly
843e19887f64dde75055cf8842fc4db2171eff45johnlev * created local port to *port. Return 0 on success, or errno on error. On
843e19887f64dde75055cf8842fc4db2171eff45johnlev * error, the device will switch to XenbusStateClosing, and the error will be
843e19887f64dde75055cf8842fc4db2171eff45johnlev * saved in the store.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_alloc_evtchn(struct xenbus_device *dev, int *port);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Return the state of the driver rooted at the given store path, or
843e19887f64dde75055cf8842fc4db2171eff45johnlev * XenbusStateClosed if no state can be read.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern XenbusState xenbus_read_driver_state(const char *path);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Report the given negative errno into the store, along with the given
843e19887f64dde75055cf8842fc4db2171eff45johnlev * formatted message.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern void xenbus_dev_error(struct xenbus_device *dev, int err,
843e19887f64dde75055cf8842fc4db2171eff45johnlev const char *fmt, ...);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Equivalent to xenbus_dev_error(dev, err, fmt, args), followed by
843e19887f64dde75055cf8842fc4db2171eff45johnlev * xenbus_switch_state(dev, NULL, XenbusStateClosing) to schedule an orderly
843e19887f64dde75055cf8842fc4db2171eff45johnlev * closedown of this driver and its peer.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern void xenbus_dev_fatal(struct xenbus_device *dev,
843e19887f64dde75055cf8842fc4db2171eff45johnlev int err, const char *fmt, ...);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/* Clear any error. */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern void xenbus_dev_ok(struct xenbus_device *dev);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Set up watches on other end of split device.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int talk_to_otherend(struct xenbus_device *dev);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XENSTORE_DOWN 0 /* xenstore is down */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define XENSTORE_UP 1 /* xenstore is up */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Register a notify callback function.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xs_register_xenbus_callback(void (*callback)(int));
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Notify clients that xenstore is up
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern void xs_notify_xenstore_up(void);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Notify clients that xenstore is down
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern void xs_notify_xenstore_down(void);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstruct xsd_sockmsg;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevextern int xenbus_dev_request_and_reply(struct xsd_sockmsg *, void **);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef __cplusplus
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif /* _SYS_XENBUS_H */