xref: /netbsd-src/sys/arch/xen/include/xenbus.h (revision 8ac07aec990b9d2e483062509d0a9fa5b4f57cf2)
1 /* $NetBSD: xenbus.h,v 1.9 2008/04/16 18:41:48 cegger Exp $ */
2 /******************************************************************************
3  * xenbus.h
4  *
5  * Talks to Xen Store to figure out what devices we have.
6  *
7  * Copyright (C) 2005 Rusty Russell, IBM Corporation
8  * Copyright (C) 2005 XenSource Ltd.
9  *
10  * This file may be distributed separately from the Linux kernel, or
11  * incorporated into other software packages, subject to the following license:
12  *
13  * Permission is hereby granted, free of charge, to any person obtaining a copy
14  * of this source file (the "Software"), to deal in the Software without
15  * restriction, including without limitation the rights to use, copy, modify,
16  * merge, publish, distribute, sublicense, and/or sell copies of the Software,
17  * and to permit persons to whom the Software is furnished to do so, subject to
18  * the following conditions:
19  *
20  * The above copyright notice and this permission notice shall be included in
21  * all copies or substantial portions of the Software.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
26  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
28  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
29  * IN THE SOFTWARE.
30  */
31 
32 #ifndef _ASM_XEN_XENBUS_H
33 #define _ASM_XEN_XENBUS_H
34 
35 #include <sys/device.h>
36 #include <sys/queue.h>
37 #include <xen/xen3-public/io/xenbus.h>
38 #include <xen/xen3-public/io/xs_wire.h>
39 
40 /* xenbus to hypervisor attach */
41 struct xenbus_attach_args {
42 	const char 		*xa_device;
43 	int			xa_handle;
44 };
45 
46 /* devices to xenbus attach */
47 struct xenbusdev_attach_args {
48 	const char		*xa_type;
49 	int 			xa_id;
50 	struct xenbus_device	*xa_xbusd;
51 };
52 
53 /* Register callback to watch this node. */
54 struct xenbus_watch {
55 	SLIST_ENTRY(xenbus_watch) watch_next;
56 
57 	/* Path being watched. */
58 	char *node;
59 
60 	/* Callback (executed in a process context with no locks held). */
61 	void (*xbw_callback)(struct xenbus_watch *,
62 			 const char **vec, unsigned int len);
63 	struct xenbus_device *xbw_dev;
64 };
65 
66 
67 /*
68  * A xenbus device. Note that the malloced memory will be larger than
69  * sizeof(xenbus_device) to have the storage for xbusd_path, so xbusd_path
70  * has to be the last entry.
71  */
72 typedef enum {
73 	XENBUS_FRONTEND_DEVICE,
74 	XENBUS_BACKEND_DEVICE
75 } xenbusdev_type_t;
76 
77 struct xenbus_device {
78 	SLIST_ENTRY(xenbus_device) xbusd_entries;
79 	char *xbusd_otherend; /* the otherend path */
80 	int xbusd_otherend_id; /* the otherend's id */
81 	/* callback for otherend change */
82 	void (*xbusd_otherend_changed)(void *, XenbusState);
83 	xenbusdev_type_t xbusd_type;
84 	union {
85 		struct {
86 			device_t f_dev;
87 		} f;
88 		struct {
89 			void *b_cookie; /* private to backend driver */
90 			int (*b_detach)(void *);
91 		} b;
92 	} xbusd_u;
93 	int xbusd_has_error;
94 	/* for xenbus internal use */
95 	struct xenbus_watch xbusd_otherend_watch;
96 	const char xbusd_path[1]; /* our path */
97 };
98 
99 /*
100  * frontend devices use the normal autoconf(9) framework to attach.
101  * backend drivers need something more clever because we want the
102  * domain's name or uid in the device's name. Each backend driver registers
103  * to xenbus.
104  */
105 
106 struct xenbus_backend_driver {
107 	SLIST_ENTRY(xenbus_backend_driver) xbakd_entries;
108 	int (*xbakd_create) (struct xenbus_device *); /* called for new devs */
109 	const char *xbakd_type; /* device type we register for */
110 };
111 
112 void xenbus_backend_register(struct xenbus_backend_driver *);
113 
114 struct xenbus_transaction;
115 
116 int xenbus_directory(struct xenbus_transaction *t,
117 			const char *dir, const char *node, unsigned int *num,
118 			char ***);
119 int xenbus_read(struct xenbus_transaction *t,
120 		  const char *dir, const char *node, unsigned int *len,
121 		  char **);
122 int xenbus_read_ul(struct xenbus_transaction *,
123 		  const char *, const char *, unsigned long *, int);
124 int xenbus_read_ull(struct xenbus_transaction *,
125 		  const char *, const char *, unsigned long long *, int);
126 int xenbus_write(struct xenbus_transaction *t,
127 		 const char *dir, const char *node, const char *string);
128 int xenbus_mkdir(struct xenbus_transaction *t,
129 		 const char *dir, const char *node);
130 int xenbus_exists(struct xenbus_transaction *t,
131 		  const char *dir, const char *node);
132 int xenbus_rm(struct xenbus_transaction *t, const char *dir, const char *node);
133 struct xenbus_transaction *xenbus_transaction_start(void);
134 int xenbus_transaction_end(struct xenbus_transaction *t, int abort);
135 
136 /* Single read and scanf: returns -errno or num scanned if > 0. */
137 int xenbus_scanf(struct xenbus_transaction *t,
138 		 const char *dir, const char *node, const char *fmt, ...)
139 	__attribute__((format(scanf, 4, 5)));
140 
141 /* Single printf and write: returns -errno or 0. */
142 int xenbus_printf(struct xenbus_transaction *t,
143 		  const char *dir, const char *node, const char *fmt, ...)
144 	__attribute__((format(printf, 4, 5)));
145 
146 /* Generic read function: NULL-terminated triples of name,
147  * sprintf-style type string, and pointer. Returns 0 or errno.*/
148 int xenbus_gather(struct xenbus_transaction *t, const char *dir, ...);
149 
150 /* notifer routines for when the xenstore comes up */
151 // XXX int register_xenstore_notifier(struct notifier_block *nb);
152 // XXX void unregister_xenstore_notifier(struct notifier_block *nb);
153 
154 int register_xenbus_watch(struct xenbus_watch *watch);
155 void unregister_xenbus_watch(struct xenbus_watch *watch);
156 void xs_suspend(void);
157 void xs_resume(void);
158 
159 /* Used by xenbus_dev to borrow kernel's store connection. */
160 int xenbus_dev_request_and_reply(struct xsd_sockmsg *msg, void **);
161 
162 /* Called from xen core code. */
163 void xenbus_suspend(void);
164 void xenbus_resume(void);
165 
166 void xenbus_probe(void *);
167 
168 int xenbus_free_device(struct xenbus_device *);
169 
170 #define XENBUS_IS_ERR_READ(str) ({			\
171 	if (!IS_ERR(str) && strlen(str) == 0) {		\
172 		kfree(str);				\
173 		str = ERR_PTR(-ERANGE);			\
174 	}						\
175 	IS_ERR(str);					\
176 })
177 
178 #define XENBUS_EXIST_ERR(err) ((err) == -ENOENT || (err) == -ERANGE)
179 
180 
181 /**
182  * Register a watch on the given path, using the given xenbus_watch structure
183  * for storage, and the given callback function as the callback.  Return 0 on
184  * success, or -errno on error.  On success, the given path will be saved as
185  * watch->node, and remains the caller's to free.  On error, watch->node will
186  * be NULL, the device will switch to XenbusStateClosing, and the error will
187  * be saved in the store.
188  */
189 int xenbus_watch_path(struct xenbus_device *dev, char *path,
190 		      struct xenbus_watch *watch,
191 		      void (*callback)(struct xenbus_watch *,
192 				       const char **, unsigned int));
193 
194 
195 /**
196  * Register a watch on the given path/path2, using the given xenbus_watch
197  * structure for storage, and the given callback function as the callback.
198  * Return 0 on success, or -errno on error.  On success, the watched path
199  * (path/path2) will be saved as watch->node, and becomes the caller's to
200  * kfree().  On error, watch->node will be NULL, so the caller has nothing to
201  * free, the device will switch to XenbusStateClosing, and the error will be
202  * saved in the store.
203  */
204 int xenbus_watch_path2(struct xenbus_device *dev, const char *path,
205 		       const char *path2, struct xenbus_watch *watch,
206 		       void (*callback)(struct xenbus_watch *,
207 					const char **, unsigned int));
208 
209 
210 /**
211  * Advertise in the store a change of the given driver to the given new_state.
212  * Perform the change inside the given transaction xbt.  xbt may be NULL, in
213  * which case this is performed inside its own transaction.  Return 0 on
214  * success, or -errno on error.  On error, the device will switch to
215  * XenbusStateClosing, and the error will be saved in the store.
216  */
217 int xenbus_switch_state(struct xenbus_device *dev,
218 			struct xenbus_transaction *xbt,
219 			XenbusState new_state);
220 
221 
222 /**
223  * Grant access to the given ring_mfn to the peer of the given device.  Return
224  * 0 on success, or -errno on error.  On error, the device will switch to
225  * XenbusStateClosing, and the error will be saved in the store.
226  */
227 int xenbus_grant_ring(struct xenbus_device *, paddr_t, grant_ref_t *);
228 
229 
230 /**
231  * Allocate an event channel for the given xenbus_device, assigning the newly
232  * created local port to *port.  Return 0 on success, or -errno on error.  On
233  * error, the device will switch to XenbusStateClosing, and the error will be
234  * saved in the store.
235  */
236 int xenbus_alloc_evtchn(struct xenbus_device *dev, int *port);
237 
238 
239 /**
240  * Return the state of the driver rooted at the given store path, or
241  * XenbusStateClosed if no state can be read.
242  */
243 XenbusState xenbus_read_driver_state(const char *path);
244 
245 
246 /***
247  * Report the given negative errno into the store, along with the given
248  * formatted message.
249  */
250 void xenbus_dev_error(struct xenbus_device *dev, int err, const char *fmt,
251 		      ...);
252 
253 
254 /***
255  * Equivalent to xenbus_dev_error(dev, err, fmt, args), followed by
256  * xenbus_switch_state(dev, NULL, XenbusStateClosing) to schedule an orderly
257  * closedown of this driver and its peer.
258  */
259 void xenbus_dev_fatal(struct xenbus_device *dev, int err, const char *fmt,
260 		      ...);
261 
262 
263 #endif /* _ASM_XEN_XENBUS_H */
264 
265 /*
266  * Local variables:
267  *  c-file-style: "linux"
268  *  indent-tabs-mode: t
269  *  c-indent-level: 8
270  *  c-basic-offset: 8
271  *  tab-width: 8
272  * End:
273  */
274