Linux Audio

Check our new training course

Loading...
v3.5.6
  1/******************************************************************************
  2 * Talks to Xen Store to figure out what devices we have.
  3 *
  4 * Copyright (C) 2005 Rusty Russell, IBM Corporation
  5 * Copyright (C) 2005 Mike Wray, Hewlett-Packard
  6 * Copyright (C) 2005, 2006 XenSource Ltd
  7 *
  8 * This program is free software; you can redistribute it and/or
  9 * modify it under the terms of the GNU General Public License version 2
 10 * as published by the Free Software Foundation; or, when distributed
 11 * separately from the Linux kernel or incorporated into other
 12 * software packages, subject to the following license:
 13 *
 14 * Permission is hereby granted, free of charge, to any person obtaining a copy
 15 * of this source file (the "Software"), to deal in the Software without
 16 * restriction, including without limitation the rights to use, copy, modify,
 17 * merge, publish, distribute, sublicense, and/or sell copies of the Software,
 18 * and to permit persons to whom the Software is furnished to do so, subject to
 19 * the following conditions:
 20 *
 21 * The above copyright notice and this permission notice shall be included in
 22 * all copies or substantial portions of the Software.
 23 *
 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 26 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 27 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 28 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 29 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
 30 * IN THE SOFTWARE.
 31 */
 32
 
 
 
 33#define DPRINTK(fmt, args...)				\
 34	pr_debug("xenbus_probe (%s:%d) " fmt ".\n",	\
 35		 __func__, __LINE__, ##args)
 36
 37#include <linux/kernel.h>
 38#include <linux/err.h>
 39#include <linux/string.h>
 40#include <linux/ctype.h>
 41#include <linux/fcntl.h>
 42#include <linux/mm.h>
 43#include <linux/proc_fs.h>
 44#include <linux/notifier.h>
 45#include <linux/kthread.h>
 46#include <linux/mutex.h>
 47#include <linux/io.h>
 48#include <linux/slab.h>
 49#include <linux/module.h>
 50
 51#include <asm/page.h>
 52#include <asm/pgtable.h>
 53#include <asm/xen/hypervisor.h>
 54
 55#include <xen/xen.h>
 56#include <xen/xenbus.h>
 57#include <xen/events.h>
 
 58#include <xen/page.h>
 59
 60#include <xen/hvm.h>
 61
 62#include "xenbus_comms.h"
 63#include "xenbus_probe.h"
 64
 65
 
 66int xen_store_evtchn;
 67EXPORT_SYMBOL_GPL(xen_store_evtchn);
 68
 69struct xenstore_domain_interface *xen_store_interface;
 70EXPORT_SYMBOL_GPL(xen_store_interface);
 71
 72static unsigned long xen_store_mfn;
 
 
 
 73
 74static BLOCKING_NOTIFIER_HEAD(xenstore_chain);
 75
 76/* If something in array of ids matches this device, return it. */
 77static const struct xenbus_device_id *
 78match_device(const struct xenbus_device_id *arr, struct xenbus_device *dev)
 79{
 80	for (; *arr->devicetype != '\0'; arr++) {
 81		if (!strcmp(arr->devicetype, dev->devicetype))
 82			return arr;
 83	}
 84	return NULL;
 85}
 86
 87int xenbus_match(struct device *_dev, struct device_driver *_drv)
 88{
 89	struct xenbus_driver *drv = to_xenbus_driver(_drv);
 90
 91	if (!drv->ids)
 92		return 0;
 93
 94	return match_device(drv->ids, to_xenbus_device(_dev)) != NULL;
 95}
 96EXPORT_SYMBOL_GPL(xenbus_match);
 97
 98
 99static void free_otherend_details(struct xenbus_device *dev)
100{
101	kfree(dev->otherend);
102	dev->otherend = NULL;
103}
104
105
106static void free_otherend_watch(struct xenbus_device *dev)
107{
108	if (dev->otherend_watch.node) {
109		unregister_xenbus_watch(&dev->otherend_watch);
110		kfree(dev->otherend_watch.node);
111		dev->otherend_watch.node = NULL;
112	}
113}
114
115
116static int talk_to_otherend(struct xenbus_device *dev)
117{
118	struct xenbus_driver *drv = to_xenbus_driver(dev->dev.driver);
119
120	free_otherend_watch(dev);
121	free_otherend_details(dev);
122
123	return drv->read_otherend_details(dev);
124}
125
126
127
128static int watch_otherend(struct xenbus_device *dev)
129{
130	struct xen_bus_type *bus =
131		container_of(dev->dev.bus, struct xen_bus_type, bus);
132
133	return xenbus_watch_pathfmt(dev, &dev->otherend_watch,
 
134				    bus->otherend_changed,
135				    "%s/%s", dev->otherend, "state");
136}
137
138
139int xenbus_read_otherend_details(struct xenbus_device *xendev,
140				 char *id_node, char *path_node)
141{
142	int err = xenbus_gather(XBT_NIL, xendev->nodename,
143				id_node, "%i", &xendev->otherend_id,
144				path_node, NULL, &xendev->otherend,
145				NULL);
146	if (err) {
147		xenbus_dev_fatal(xendev, err,
148				 "reading other end details from %s",
149				 xendev->nodename);
150		return err;
151	}
152	if (strlen(xendev->otherend) == 0 ||
153	    !xenbus_exists(XBT_NIL, xendev->otherend, "")) {
154		xenbus_dev_fatal(xendev, -ENOENT,
155				 "unable to read other end from %s.  "
156				 "missing or inaccessible.",
157				 xendev->nodename);
158		free_otherend_details(xendev);
159		return -ENOENT;
160	}
161
162	return 0;
163}
164EXPORT_SYMBOL_GPL(xenbus_read_otherend_details);
165
166void xenbus_otherend_changed(struct xenbus_watch *watch,
167			     const char **vec, unsigned int len,
168			     int ignore_on_shutdown)
169{
170	struct xenbus_device *dev =
171		container_of(watch, struct xenbus_device, otherend_watch);
172	struct xenbus_driver *drv = to_xenbus_driver(dev->dev.driver);
173	enum xenbus_state state;
174
175	/* Protect us against watches firing on old details when the otherend
176	   details change, say immediately after a resume. */
177	if (!dev->otherend ||
178	    strncmp(dev->otherend, vec[XS_WATCH_PATH],
179		    strlen(dev->otherend))) {
180		dev_dbg(&dev->dev, "Ignoring watch at %s\n",
181			vec[XS_WATCH_PATH]);
182		return;
183	}
184
185	state = xenbus_read_driver_state(dev->otherend);
186
187	dev_dbg(&dev->dev, "state is %d, (%s), %s, %s\n",
188		state, xenbus_strstate(state), dev->otherend_watch.node,
189		vec[XS_WATCH_PATH]);
190
191	/*
192	 * Ignore xenbus transitions during shutdown. This prevents us doing
193	 * work that can fail e.g., when the rootfs is gone.
194	 */
195	if (system_state > SYSTEM_RUNNING) {
196		if (ignore_on_shutdown && (state == XenbusStateClosing))
197			xenbus_frontend_closed(dev);
198		return;
199	}
200
201	if (drv->otherend_changed)
202		drv->otherend_changed(dev, state);
203}
204EXPORT_SYMBOL_GPL(xenbus_otherend_changed);
205
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
206int xenbus_dev_probe(struct device *_dev)
207{
208	struct xenbus_device *dev = to_xenbus_device(_dev);
209	struct xenbus_driver *drv = to_xenbus_driver(_dev->driver);
210	const struct xenbus_device_id *id;
211	int err;
212
213	DPRINTK("%s", dev->nodename);
214
215	if (!drv->probe) {
216		err = -ENODEV;
217		goto fail;
218	}
219
220	id = match_device(drv->ids, dev);
221	if (!id) {
222		err = -ENODEV;
223		goto fail;
224	}
225
226	err = talk_to_otherend(dev);
227	if (err) {
228		dev_warn(&dev->dev, "talk_to_otherend on %s failed.\n",
229			 dev->nodename);
230		return err;
231	}
232
 
 
 
 
 
 
 
 
233	err = drv->probe(dev, id);
 
234	if (err)
235		goto fail;
236
237	err = watch_otherend(dev);
238	if (err) {
239		dev_warn(&dev->dev, "watch_otherend on %s failed.\n",
240		       dev->nodename);
241		return err;
242	}
243
 
 
 
 
 
244	return 0;
 
 
245fail:
246	xenbus_dev_error(dev, err, "xenbus_dev_probe on %s", dev->nodename);
247	xenbus_switch_state(dev, XenbusStateClosed);
248	return err;
249}
250EXPORT_SYMBOL_GPL(xenbus_dev_probe);
251
252int xenbus_dev_remove(struct device *_dev)
253{
254	struct xenbus_device *dev = to_xenbus_device(_dev);
255	struct xenbus_driver *drv = to_xenbus_driver(_dev->driver);
256
257	DPRINTK("%s", dev->nodename);
258
 
 
259	free_otherend_watch(dev);
260
261	if (drv->remove)
 
262		drv->remove(dev);
 
 
 
 
263
264	free_otherend_details(dev);
265
266	xenbus_switch_state(dev, XenbusStateClosed);
267	return 0;
 
 
 
 
 
 
 
268}
269EXPORT_SYMBOL_GPL(xenbus_dev_remove);
270
271void xenbus_dev_shutdown(struct device *_dev)
272{
273	struct xenbus_device *dev = to_xenbus_device(_dev);
274	unsigned long timeout = 5*HZ;
275
276	DPRINTK("%s", dev->nodename);
277
278	get_device(&dev->dev);
279	if (dev->state != XenbusStateConnected) {
280		printk(KERN_INFO "%s: %s: %s != Connected, skipping\n", __func__,
281		       dev->nodename, xenbus_strstate(dev->state));
282		goto out;
283	}
284	xenbus_switch_state(dev, XenbusStateClosing);
285	timeout = wait_for_completion_timeout(&dev->down, timeout);
286	if (!timeout)
287		printk(KERN_INFO "%s: %s timeout closing device\n",
288		       __func__, dev->nodename);
289 out:
290	put_device(&dev->dev);
291}
292EXPORT_SYMBOL_GPL(xenbus_dev_shutdown);
293
294int xenbus_register_driver_common(struct xenbus_driver *drv,
295				  struct xen_bus_type *bus)
 
296{
 
297	drv->driver.bus = &bus->bus;
 
 
298
299	return driver_register(&drv->driver);
300}
301EXPORT_SYMBOL_GPL(xenbus_register_driver_common);
302
303void xenbus_unregister_driver(struct xenbus_driver *drv)
304{
305	driver_unregister(&drv->driver);
306}
307EXPORT_SYMBOL_GPL(xenbus_unregister_driver);
308
309struct xb_find_info {
310	struct xenbus_device *dev;
311	const char *nodename;
312};
313
314static int cmp_dev(struct device *dev, void *data)
315{
316	struct xenbus_device *xendev = to_xenbus_device(dev);
317	struct xb_find_info *info = data;
318
319	if (!strcmp(xendev->nodename, info->nodename)) {
320		info->dev = xendev;
321		get_device(dev);
322		return 1;
323	}
324	return 0;
325}
326
327struct xenbus_device *xenbus_device_find(const char *nodename,
328					 struct bus_type *bus)
329{
330	struct xb_find_info info = { .dev = NULL, .nodename = nodename };
331
332	bus_for_each_dev(bus, NULL, &info, cmp_dev);
333	return info.dev;
334}
335
336static int cleanup_dev(struct device *dev, void *data)
337{
338	struct xenbus_device *xendev = to_xenbus_device(dev);
339	struct xb_find_info *info = data;
340	int len = strlen(info->nodename);
341
342	DPRINTK("%s", info->nodename);
343
344	/* Match the info->nodename path, or any subdirectory of that path. */
345	if (strncmp(xendev->nodename, info->nodename, len))
346		return 0;
347
348	/* If the node name is longer, ensure it really is a subdirectory. */
349	if ((strlen(xendev->nodename) > len) && (xendev->nodename[len] != '/'))
350		return 0;
351
352	info->dev = xendev;
353	get_device(dev);
354	return 1;
355}
356
357static void xenbus_cleanup_devices(const char *path, struct bus_type *bus)
358{
359	struct xb_find_info info = { .nodename = path };
360
361	do {
362		info.dev = NULL;
363		bus_for_each_dev(bus, NULL, &info, cleanup_dev);
364		if (info.dev) {
365			device_unregister(&info.dev->dev);
366			put_device(&info.dev->dev);
367		}
368	} while (info.dev);
369}
370
371static void xenbus_dev_release(struct device *dev)
372{
373	if (dev)
374		kfree(to_xenbus_device(dev));
375}
376
377static ssize_t nodename_show(struct device *dev,
378			     struct device_attribute *attr, char *buf)
379{
380	return sprintf(buf, "%s\n", to_xenbus_device(dev)->nodename);
381}
 
382
383static ssize_t devtype_show(struct device *dev,
384			    struct device_attribute *attr, char *buf)
385{
386	return sprintf(buf, "%s\n", to_xenbus_device(dev)->devicetype);
387}
 
388
389static ssize_t modalias_show(struct device *dev,
390			     struct device_attribute *attr, char *buf)
391{
392	return sprintf(buf, "%s:%s\n", dev->bus->name,
393		       to_xenbus_device(dev)->devicetype);
394}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
395
396struct device_attribute xenbus_dev_attrs[] = {
397	__ATTR_RO(nodename),
398	__ATTR_RO(devtype),
399	__ATTR_RO(modalias),
400	__ATTR_NULL
401};
402EXPORT_SYMBOL_GPL(xenbus_dev_attrs);
 
 
 
 
 
403
404int xenbus_probe_node(struct xen_bus_type *bus,
405		      const char *type,
406		      const char *nodename)
407{
408	char devname[XEN_BUS_ID_SIZE];
409	int err;
410	struct xenbus_device *xendev;
411	size_t stringlen;
412	char *tmpstring;
413
414	enum xenbus_state state = xenbus_read_driver_state(nodename);
415
416	if (state != XenbusStateInitialising) {
417		/* Device is not new, so ignore it.  This can happen if a
418		   device is going away after switching to Closed.  */
419		return 0;
420	}
421
422	stringlen = strlen(nodename) + 1 + strlen(type) + 1;
423	xendev = kzalloc(sizeof(*xendev) + stringlen, GFP_KERNEL);
424	if (!xendev)
425		return -ENOMEM;
426
427	xendev->state = XenbusStateInitialising;
428
429	/* Copy the strings into the extra space. */
430
431	tmpstring = (char *)(xendev + 1);
432	strcpy(tmpstring, nodename);
433	xendev->nodename = tmpstring;
434
435	tmpstring += strlen(tmpstring) + 1;
436	strcpy(tmpstring, type);
437	xendev->devicetype = tmpstring;
438	init_completion(&xendev->down);
439
440	xendev->dev.bus = &bus->bus;
441	xendev->dev.release = xenbus_dev_release;
442
443	err = bus->get_bus_id(devname, xendev->nodename);
444	if (err)
445		goto fail;
446
447	dev_set_name(&xendev->dev, devname);
 
448
449	/* Register with generic device framework. */
450	err = device_register(&xendev->dev);
451	if (err)
 
 
452		goto fail;
 
453
454	return 0;
455fail:
456	kfree(xendev);
457	return err;
458}
459EXPORT_SYMBOL_GPL(xenbus_probe_node);
460
461static int xenbus_probe_device_type(struct xen_bus_type *bus, const char *type)
462{
463	int err = 0;
464	char **dir;
465	unsigned int dir_n = 0;
466	int i;
467
468	dir = xenbus_directory(XBT_NIL, bus->root, type, &dir_n);
469	if (IS_ERR(dir))
470		return PTR_ERR(dir);
471
472	for (i = 0; i < dir_n; i++) {
473		err = bus->probe(bus, type, dir[i]);
474		if (err)
475			break;
476	}
477
478	kfree(dir);
479	return err;
480}
481
482int xenbus_probe_devices(struct xen_bus_type *bus)
483{
484	int err = 0;
485	char **dir;
486	unsigned int i, dir_n;
487
488	dir = xenbus_directory(XBT_NIL, bus->root, "", &dir_n);
489	if (IS_ERR(dir))
490		return PTR_ERR(dir);
491
492	for (i = 0; i < dir_n; i++) {
493		err = xenbus_probe_device_type(bus, dir[i]);
494		if (err)
495			break;
496	}
497
498	kfree(dir);
499	return err;
500}
501EXPORT_SYMBOL_GPL(xenbus_probe_devices);
502
503static unsigned int char_count(const char *str, char c)
504{
505	unsigned int i, ret = 0;
506
507	for (i = 0; str[i]; i++)
508		if (str[i] == c)
509			ret++;
510	return ret;
511}
512
513static int strsep_len(const char *str, char c, unsigned int len)
514{
515	unsigned int i;
516
517	for (i = 0; str[i]; i++)
518		if (str[i] == c) {
519			if (len == 0)
520				return i;
521			len--;
522		}
523	return (len == 0) ? i : -ERANGE;
524}
525
526void xenbus_dev_changed(const char *node, struct xen_bus_type *bus)
527{
528	int exists, rootlen;
529	struct xenbus_device *dev;
530	char type[XEN_BUS_ID_SIZE];
531	const char *p, *root;
532
533	if (char_count(node, '/') < 2)
534		return;
535
536	exists = xenbus_exists(XBT_NIL, node, "");
537	if (!exists) {
538		xenbus_cleanup_devices(node, &bus->bus);
539		return;
540	}
541
542	/* backend/<type>/... or device/<type>/... */
543	p = strchr(node, '/') + 1;
544	snprintf(type, XEN_BUS_ID_SIZE, "%.*s", (int)strcspn(p, "/"), p);
545	type[XEN_BUS_ID_SIZE-1] = '\0';
546
547	rootlen = strsep_len(node, '/', bus->levels);
548	if (rootlen < 0)
549		return;
550	root = kasprintf(GFP_KERNEL, "%.*s", rootlen, node);
551	if (!root)
552		return;
553
554	dev = xenbus_device_find(root, &bus->bus);
555	if (!dev)
556		xenbus_probe_node(bus, type, root);
557	else
558		put_device(&dev->dev);
559
560	kfree(root);
561}
562EXPORT_SYMBOL_GPL(xenbus_dev_changed);
563
564int xenbus_dev_suspend(struct device *dev)
565{
566	int err = 0;
567	struct xenbus_driver *drv;
568	struct xenbus_device *xdev
569		= container_of(dev, struct xenbus_device, dev);
570
571	DPRINTK("%s", xdev->nodename);
572
573	if (dev->driver == NULL)
574		return 0;
575	drv = to_xenbus_driver(dev->driver);
576	if (drv->suspend)
577		err = drv->suspend(xdev);
578	if (err)
579		printk(KERN_WARNING
580		       "xenbus: suspend %s failed: %i\n", dev_name(dev), err);
581	return 0;
582}
583EXPORT_SYMBOL_GPL(xenbus_dev_suspend);
584
585int xenbus_dev_resume(struct device *dev)
586{
587	int err;
588	struct xenbus_driver *drv;
589	struct xenbus_device *xdev
590		= container_of(dev, struct xenbus_device, dev);
591
592	DPRINTK("%s", xdev->nodename);
593
594	if (dev->driver == NULL)
595		return 0;
596	drv = to_xenbus_driver(dev->driver);
597	err = talk_to_otherend(xdev);
598	if (err) {
599		printk(KERN_WARNING
600		       "xenbus: resume (talk_to_otherend) %s failed: %i\n",
601		       dev_name(dev), err);
602		return err;
603	}
604
605	xdev->state = XenbusStateInitialising;
606
607	if (drv->resume) {
608		err = drv->resume(xdev);
609		if (err) {
610			printk(KERN_WARNING
611			       "xenbus: resume %s failed: %i\n",
612			       dev_name(dev), err);
613			return err;
614		}
615	}
616
617	err = watch_otherend(xdev);
618	if (err) {
619		printk(KERN_WARNING
620		       "xenbus_probe: resume (watch_otherend) %s failed: "
621		       "%d.\n", dev_name(dev), err);
622		return err;
623	}
624
625	return 0;
626}
627EXPORT_SYMBOL_GPL(xenbus_dev_resume);
628
629int xenbus_dev_cancel(struct device *dev)
630{
631	/* Do nothing */
632	DPRINTK("cancel");
633	return 0;
634}
635EXPORT_SYMBOL_GPL(xenbus_dev_cancel);
636
637/* A flag to determine if xenstored is 'ready' (i.e. has started) */
638int xenstored_ready;
639
640
641int register_xenstore_notifier(struct notifier_block *nb)
642{
643	int ret = 0;
644
645	if (xenstored_ready > 0)
646		ret = nb->notifier_call(nb, 0, NULL);
647	else
648		blocking_notifier_chain_register(&xenstore_chain, nb);
649
650	return ret;
651}
652EXPORT_SYMBOL_GPL(register_xenstore_notifier);
653
654void unregister_xenstore_notifier(struct notifier_block *nb)
655{
656	blocking_notifier_chain_unregister(&xenstore_chain, nb);
657}
658EXPORT_SYMBOL_GPL(unregister_xenstore_notifier);
659
660void xenbus_probe(struct work_struct *unused)
661{
662	xenstored_ready = 1;
663
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
664	/* Notify others that xenstore is up */
665	blocking_notifier_call_chain(&xenstore_chain, 0, NULL);
666}
667EXPORT_SYMBOL_GPL(xenbus_probe);
668
669static int __init xenbus_probe_initcall(void)
 
 
 
 
 
670{
671	if (!xen_domain())
672		return -ENODEV;
 
 
 
 
 
673
674	if (xen_initial_domain() || xen_hvm_domain())
675		return 0;
 
676
677	xenbus_probe(NULL);
 
 
 
 
 
 
 
 
 
678	return 0;
679}
680
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
681device_initcall(xenbus_probe_initcall);
682
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
683/* Set up event channel for xenstored which is run as a local process
684 * (this is normally used only in dom0)
685 */
686static int __init xenstored_local_init(void)
687{
688	int err = 0;
689	unsigned long page = 0;
690	struct evtchn_alloc_unbound alloc_unbound;
691
692	/* Allocate Xenstore page */
693	page = get_zeroed_page(GFP_KERNEL);
694	if (!page)
695		goto out_err;
696
697	xen_store_mfn = xen_start_info->store_mfn =
698		pfn_to_mfn(virt_to_phys((void *)page) >>
699			   PAGE_SHIFT);
700
701	/* Next allocate a local port which xenstored can bind to */
702	alloc_unbound.dom        = DOMID_SELF;
703	alloc_unbound.remote_dom = DOMID_SELF;
704
705	err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
706					  &alloc_unbound);
707	if (err == -ENOSYS)
708		goto out_err;
709
710	BUG_ON(err);
711	xen_store_evtchn = xen_start_info->store_evtchn =
712		alloc_unbound.port;
713
714	return 0;
715
716 out_err:
717	if (page != 0)
718		free_page(page);
719	return err;
720}
721
722static int __init xenbus_init(void)
 
723{
724	int err = 0;
725
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
726	if (!xen_domain())
727		return -ENODEV;
728
729	xenbus_ring_ops_init();
730
731	if (xen_hvm_domain()) {
732		uint64_t v = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
733		err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
734		if (err)
735			goto out_error;
736		xen_store_evtchn = (int)v;
737		err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v);
738		if (err)
739			goto out_error;
740		xen_store_mfn = (unsigned long)v;
741		xen_store_interface = ioremap(xen_store_mfn << PAGE_SHIFT, PAGE_SIZE);
742	} else {
743		xen_store_evtchn = xen_start_info->store_evtchn;
744		xen_store_mfn = xen_start_info->store_mfn;
745		if (xen_store_evtchn)
746			xenstored_ready = 1;
747		else {
748			err = xenstored_local_init();
749			if (err)
 
 
 
 
 
 
 
 
 
 
 
 
 
750				goto out_error;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
751		}
752		xen_store_interface = mfn_to_virt(xen_store_mfn);
 
 
 
753	}
754
755	/* Initialize the interface to xenstore. */
756	err = xs_init();
757	if (err) {
758		printk(KERN_WARNING
759		       "XENBUS: Error initializing xenstore comms: %i\n", err);
760		goto out_error;
 
 
 
 
 
761	}
762
 
 
 
 
763#ifdef CONFIG_XEN_COMPAT_XENFS
764	/*
765	 * Create xenfs mountpoint in /proc for compatibility with
766	 * utilities that expect to find "xenbus" under "/proc/xen".
767	 */
768	proc_mkdir("xen", NULL);
769#endif
 
770
771out_error:
 
772	return err;
773}
774
775postcore_initcall(xenbus_init);
776
777MODULE_LICENSE("GPL");
v6.2
   1/******************************************************************************
   2 * Talks to Xen Store to figure out what devices we have.
   3 *
   4 * Copyright (C) 2005 Rusty Russell, IBM Corporation
   5 * Copyright (C) 2005 Mike Wray, Hewlett-Packard
   6 * Copyright (C) 2005, 2006 XenSource Ltd
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License version 2
  10 * as published by the Free Software Foundation; or, when distributed
  11 * separately from the Linux kernel or incorporated into other
  12 * software packages, subject to the following license:
  13 *
  14 * Permission is hereby granted, free of charge, to any person obtaining a copy
  15 * of this source file (the "Software"), to deal in the Software without
  16 * restriction, including without limitation the rights to use, copy, modify,
  17 * merge, publish, distribute, sublicense, and/or sell copies of the Software,
  18 * and to permit persons to whom the Software is furnished to do so, subject to
  19 * the following conditions:
  20 *
  21 * The above copyright notice and this permission notice shall be included in
  22 * all copies or substantial portions of the Software.
  23 *
  24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  26 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  27 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  28 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  29 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  30 * IN THE SOFTWARE.
  31 */
  32
  33#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  34#define dev_fmt pr_fmt
  35
  36#define DPRINTK(fmt, args...)				\
  37	pr_debug("xenbus_probe (%s:%d) " fmt ".\n",	\
  38		 __func__, __LINE__, ##args)
  39
  40#include <linux/kernel.h>
  41#include <linux/err.h>
  42#include <linux/string.h>
  43#include <linux/ctype.h>
  44#include <linux/fcntl.h>
  45#include <linux/mm.h>
  46#include <linux/proc_fs.h>
  47#include <linux/notifier.h>
  48#include <linux/kthread.h>
  49#include <linux/mutex.h>
  50#include <linux/io.h>
  51#include <linux/slab.h>
  52#include <linux/module.h>
  53
  54#include <asm/page.h>
 
  55#include <asm/xen/hypervisor.h>
  56
  57#include <xen/xen.h>
  58#include <xen/xenbus.h>
  59#include <xen/events.h>
  60#include <xen/xen-ops.h>
  61#include <xen/page.h>
  62
  63#include <xen/hvm.h>
  64
  65#include "xenbus.h"
 
  66
  67
  68static int xs_init_irq;
  69int xen_store_evtchn;
  70EXPORT_SYMBOL_GPL(xen_store_evtchn);
  71
  72struct xenstore_domain_interface *xen_store_interface;
  73EXPORT_SYMBOL_GPL(xen_store_interface);
  74
  75enum xenstore_init xen_store_domain_type;
  76EXPORT_SYMBOL_GPL(xen_store_domain_type);
  77
  78static unsigned long xen_store_gfn;
  79
  80static BLOCKING_NOTIFIER_HEAD(xenstore_chain);
  81
  82/* If something in array of ids matches this device, return it. */
  83static const struct xenbus_device_id *
  84match_device(const struct xenbus_device_id *arr, struct xenbus_device *dev)
  85{
  86	for (; *arr->devicetype != '\0'; arr++) {
  87		if (!strcmp(arr->devicetype, dev->devicetype))
  88			return arr;
  89	}
  90	return NULL;
  91}
  92
  93int xenbus_match(struct device *_dev, struct device_driver *_drv)
  94{
  95	struct xenbus_driver *drv = to_xenbus_driver(_drv);
  96
  97	if (!drv->ids)
  98		return 0;
  99
 100	return match_device(drv->ids, to_xenbus_device(_dev)) != NULL;
 101}
 102EXPORT_SYMBOL_GPL(xenbus_match);
 103
 104
 105static void free_otherend_details(struct xenbus_device *dev)
 106{
 107	kfree(dev->otherend);
 108	dev->otherend = NULL;
 109}
 110
 111
 112static void free_otherend_watch(struct xenbus_device *dev)
 113{
 114	if (dev->otherend_watch.node) {
 115		unregister_xenbus_watch(&dev->otherend_watch);
 116		kfree(dev->otherend_watch.node);
 117		dev->otherend_watch.node = NULL;
 118	}
 119}
 120
 121
 122static int talk_to_otherend(struct xenbus_device *dev)
 123{
 124	struct xenbus_driver *drv = to_xenbus_driver(dev->dev.driver);
 125
 126	free_otherend_watch(dev);
 127	free_otherend_details(dev);
 128
 129	return drv->read_otherend_details(dev);
 130}
 131
 132
 133
 134static int watch_otherend(struct xenbus_device *dev)
 135{
 136	struct xen_bus_type *bus =
 137		container_of(dev->dev.bus, struct xen_bus_type, bus);
 138
 139	return xenbus_watch_pathfmt(dev, &dev->otherend_watch,
 140				    bus->otherend_will_handle,
 141				    bus->otherend_changed,
 142				    "%s/%s", dev->otherend, "state");
 143}
 144
 145
 146int xenbus_read_otherend_details(struct xenbus_device *xendev,
 147				 char *id_node, char *path_node)
 148{
 149	int err = xenbus_gather(XBT_NIL, xendev->nodename,
 150				id_node, "%i", &xendev->otherend_id,
 151				path_node, NULL, &xendev->otherend,
 152				NULL);
 153	if (err) {
 154		xenbus_dev_fatal(xendev, err,
 155				 "reading other end details from %s",
 156				 xendev->nodename);
 157		return err;
 158	}
 159	if (strlen(xendev->otherend) == 0 ||
 160	    !xenbus_exists(XBT_NIL, xendev->otherend, "")) {
 161		xenbus_dev_fatal(xendev, -ENOENT,
 162				 "unable to read other end from %s.  "
 163				 "missing or inaccessible.",
 164				 xendev->nodename);
 165		free_otherend_details(xendev);
 166		return -ENOENT;
 167	}
 168
 169	return 0;
 170}
 171EXPORT_SYMBOL_GPL(xenbus_read_otherend_details);
 172
 173void xenbus_otherend_changed(struct xenbus_watch *watch,
 174			     const char *path, const char *token,
 175			     int ignore_on_shutdown)
 176{
 177	struct xenbus_device *dev =
 178		container_of(watch, struct xenbus_device, otherend_watch);
 179	struct xenbus_driver *drv = to_xenbus_driver(dev->dev.driver);
 180	enum xenbus_state state;
 181
 182	/* Protect us against watches firing on old details when the otherend
 183	   details change, say immediately after a resume. */
 184	if (!dev->otherend ||
 185	    strncmp(dev->otherend, path, strlen(dev->otherend))) {
 186		dev_dbg(&dev->dev, "Ignoring watch at %s\n", path);
 
 
 187		return;
 188	}
 189
 190	state = xenbus_read_driver_state(dev->otherend);
 191
 192	dev_dbg(&dev->dev, "state is %d, (%s), %s, %s\n",
 193		state, xenbus_strstate(state), dev->otherend_watch.node, path);
 
 194
 195	/*
 196	 * Ignore xenbus transitions during shutdown. This prevents us doing
 197	 * work that can fail e.g., when the rootfs is gone.
 198	 */
 199	if (system_state > SYSTEM_RUNNING) {
 200		if (ignore_on_shutdown && (state == XenbusStateClosing))
 201			xenbus_frontend_closed(dev);
 202		return;
 203	}
 204
 205	if (drv->otherend_changed)
 206		drv->otherend_changed(dev, state);
 207}
 208EXPORT_SYMBOL_GPL(xenbus_otherend_changed);
 209
 210#define XENBUS_SHOW_STAT(name)						\
 211static ssize_t name##_show(struct device *_dev,				\
 212			   struct device_attribute *attr,		\
 213			   char *buf)					\
 214{									\
 215	struct xenbus_device *dev = to_xenbus_device(_dev);		\
 216									\
 217	return sprintf(buf, "%d\n", atomic_read(&dev->name));		\
 218}									\
 219static DEVICE_ATTR_RO(name)
 220
 221XENBUS_SHOW_STAT(event_channels);
 222XENBUS_SHOW_STAT(events);
 223XENBUS_SHOW_STAT(spurious_events);
 224XENBUS_SHOW_STAT(jiffies_eoi_delayed);
 225
 226static ssize_t spurious_threshold_show(struct device *_dev,
 227				       struct device_attribute *attr,
 228				       char *buf)
 229{
 230	struct xenbus_device *dev = to_xenbus_device(_dev);
 231
 232	return sprintf(buf, "%d\n", dev->spurious_threshold);
 233}
 234
 235static ssize_t spurious_threshold_store(struct device *_dev,
 236					struct device_attribute *attr,
 237					const char *buf, size_t count)
 238{
 239	struct xenbus_device *dev = to_xenbus_device(_dev);
 240	unsigned int val;
 241	ssize_t ret;
 242
 243	ret = kstrtouint(buf, 0, &val);
 244	if (ret)
 245		return ret;
 246
 247	dev->spurious_threshold = val;
 248
 249	return count;
 250}
 251
 252static DEVICE_ATTR_RW(spurious_threshold);
 253
 254static struct attribute *xenbus_attrs[] = {
 255	&dev_attr_event_channels.attr,
 256	&dev_attr_events.attr,
 257	&dev_attr_spurious_events.attr,
 258	&dev_attr_jiffies_eoi_delayed.attr,
 259	&dev_attr_spurious_threshold.attr,
 260	NULL
 261};
 262
 263static const struct attribute_group xenbus_group = {
 264	.name = "xenbus",
 265	.attrs = xenbus_attrs,
 266};
 267
 268int xenbus_dev_probe(struct device *_dev)
 269{
 270	struct xenbus_device *dev = to_xenbus_device(_dev);
 271	struct xenbus_driver *drv = to_xenbus_driver(_dev->driver);
 272	const struct xenbus_device_id *id;
 273	int err;
 274
 275	DPRINTK("%s", dev->nodename);
 276
 277	if (!drv->probe) {
 278		err = -ENODEV;
 279		goto fail;
 280	}
 281
 282	id = match_device(drv->ids, dev);
 283	if (!id) {
 284		err = -ENODEV;
 285		goto fail;
 286	}
 287
 288	err = talk_to_otherend(dev);
 289	if (err) {
 290		dev_warn(&dev->dev, "talk_to_otherend on %s failed.\n",
 291			 dev->nodename);
 292		return err;
 293	}
 294
 295	if (!try_module_get(drv->driver.owner)) {
 296		dev_warn(&dev->dev, "failed to acquire module reference on '%s'\n",
 297			 drv->driver.name);
 298		err = -ESRCH;
 299		goto fail;
 300	}
 301
 302	down(&dev->reclaim_sem);
 303	err = drv->probe(dev, id);
 304	up(&dev->reclaim_sem);
 305	if (err)
 306		goto fail_put;
 307
 308	err = watch_otherend(dev);
 309	if (err) {
 310		dev_warn(&dev->dev, "watch_otherend on %s failed.\n",
 311		       dev->nodename);
 312		return err;
 313	}
 314
 315	dev->spurious_threshold = 1;
 316	if (sysfs_create_group(&dev->dev.kobj, &xenbus_group))
 317		dev_warn(&dev->dev, "sysfs_create_group on %s failed.\n",
 318			 dev->nodename);
 319
 320	return 0;
 321fail_put:
 322	module_put(drv->driver.owner);
 323fail:
 324	xenbus_dev_error(dev, err, "xenbus_dev_probe on %s", dev->nodename);
 
 325	return err;
 326}
 327EXPORT_SYMBOL_GPL(xenbus_dev_probe);
 328
 329void xenbus_dev_remove(struct device *_dev)
 330{
 331	struct xenbus_device *dev = to_xenbus_device(_dev);
 332	struct xenbus_driver *drv = to_xenbus_driver(_dev->driver);
 333
 334	DPRINTK("%s", dev->nodename);
 335
 336	sysfs_remove_group(&dev->dev.kobj, &xenbus_group);
 337
 338	free_otherend_watch(dev);
 339
 340	if (drv->remove) {
 341		down(&dev->reclaim_sem);
 342		drv->remove(dev);
 343		up(&dev->reclaim_sem);
 344	}
 345
 346	module_put(drv->driver.owner);
 347
 348	free_otherend_details(dev);
 349
 350	/*
 351	 * If the toolstack has forced the device state to closing then set
 352	 * the state to closed now to allow it to be cleaned up.
 353	 * Similarly, if the driver does not support re-bind, set the
 354	 * closed.
 355	 */
 356	if (!drv->allow_rebind ||
 357	    xenbus_read_driver_state(dev->nodename) == XenbusStateClosing)
 358		xenbus_switch_state(dev, XenbusStateClosed);
 359}
 360EXPORT_SYMBOL_GPL(xenbus_dev_remove);
 361
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 362int xenbus_register_driver_common(struct xenbus_driver *drv,
 363				  struct xen_bus_type *bus,
 364				  struct module *owner, const char *mod_name)
 365{
 366	drv->driver.name = drv->name ? drv->name : drv->ids[0].devicetype;
 367	drv->driver.bus = &bus->bus;
 368	drv->driver.owner = owner;
 369	drv->driver.mod_name = mod_name;
 370
 371	return driver_register(&drv->driver);
 372}
 373EXPORT_SYMBOL_GPL(xenbus_register_driver_common);
 374
 375void xenbus_unregister_driver(struct xenbus_driver *drv)
 376{
 377	driver_unregister(&drv->driver);
 378}
 379EXPORT_SYMBOL_GPL(xenbus_unregister_driver);
 380
 381struct xb_find_info {
 382	struct xenbus_device *dev;
 383	const char *nodename;
 384};
 385
 386static int cmp_dev(struct device *dev, void *data)
 387{
 388	struct xenbus_device *xendev = to_xenbus_device(dev);
 389	struct xb_find_info *info = data;
 390
 391	if (!strcmp(xendev->nodename, info->nodename)) {
 392		info->dev = xendev;
 393		get_device(dev);
 394		return 1;
 395	}
 396	return 0;
 397}
 398
 399static struct xenbus_device *xenbus_device_find(const char *nodename,
 400						struct bus_type *bus)
 401{
 402	struct xb_find_info info = { .dev = NULL, .nodename = nodename };
 403
 404	bus_for_each_dev(bus, NULL, &info, cmp_dev);
 405	return info.dev;
 406}
 407
 408static int cleanup_dev(struct device *dev, void *data)
 409{
 410	struct xenbus_device *xendev = to_xenbus_device(dev);
 411	struct xb_find_info *info = data;
 412	int len = strlen(info->nodename);
 413
 414	DPRINTK("%s", info->nodename);
 415
 416	/* Match the info->nodename path, or any subdirectory of that path. */
 417	if (strncmp(xendev->nodename, info->nodename, len))
 418		return 0;
 419
 420	/* If the node name is longer, ensure it really is a subdirectory. */
 421	if ((strlen(xendev->nodename) > len) && (xendev->nodename[len] != '/'))
 422		return 0;
 423
 424	info->dev = xendev;
 425	get_device(dev);
 426	return 1;
 427}
 428
 429static void xenbus_cleanup_devices(const char *path, struct bus_type *bus)
 430{
 431	struct xb_find_info info = { .nodename = path };
 432
 433	do {
 434		info.dev = NULL;
 435		bus_for_each_dev(bus, NULL, &info, cleanup_dev);
 436		if (info.dev) {
 437			device_unregister(&info.dev->dev);
 438			put_device(&info.dev->dev);
 439		}
 440	} while (info.dev);
 441}
 442
 443static void xenbus_dev_release(struct device *dev)
 444{
 445	if (dev)
 446		kfree(to_xenbus_device(dev));
 447}
 448
 449static ssize_t nodename_show(struct device *dev,
 450			     struct device_attribute *attr, char *buf)
 451{
 452	return sprintf(buf, "%s\n", to_xenbus_device(dev)->nodename);
 453}
 454static DEVICE_ATTR_RO(nodename);
 455
 456static ssize_t devtype_show(struct device *dev,
 457			    struct device_attribute *attr, char *buf)
 458{
 459	return sprintf(buf, "%s\n", to_xenbus_device(dev)->devicetype);
 460}
 461static DEVICE_ATTR_RO(devtype);
 462
 463static ssize_t modalias_show(struct device *dev,
 464			     struct device_attribute *attr, char *buf)
 465{
 466	return sprintf(buf, "%s:%s\n", dev->bus->name,
 467		       to_xenbus_device(dev)->devicetype);
 468}
 469static DEVICE_ATTR_RO(modalias);
 470
 471static ssize_t state_show(struct device *dev,
 472			    struct device_attribute *attr, char *buf)
 473{
 474	return sprintf(buf, "%s\n",
 475			xenbus_strstate(to_xenbus_device(dev)->state));
 476}
 477static DEVICE_ATTR_RO(state);
 478
 479static struct attribute *xenbus_dev_attrs[] = {
 480	&dev_attr_nodename.attr,
 481	&dev_attr_devtype.attr,
 482	&dev_attr_modalias.attr,
 483	&dev_attr_state.attr,
 484	NULL,
 485};
 486
 487static const struct attribute_group xenbus_dev_group = {
 488	.attrs = xenbus_dev_attrs,
 
 
 
 489};
 490
 491const struct attribute_group *xenbus_dev_groups[] = {
 492	&xenbus_dev_group,
 493	NULL,
 494};
 495EXPORT_SYMBOL_GPL(xenbus_dev_groups);
 496
 497int xenbus_probe_node(struct xen_bus_type *bus,
 498		      const char *type,
 499		      const char *nodename)
 500{
 501	char devname[XEN_BUS_ID_SIZE];
 502	int err;
 503	struct xenbus_device *xendev;
 504	size_t stringlen;
 505	char *tmpstring;
 506
 507	enum xenbus_state state = xenbus_read_driver_state(nodename);
 508
 509	if (state != XenbusStateInitialising) {
 510		/* Device is not new, so ignore it.  This can happen if a
 511		   device is going away after switching to Closed.  */
 512		return 0;
 513	}
 514
 515	stringlen = strlen(nodename) + 1 + strlen(type) + 1;
 516	xendev = kzalloc(sizeof(*xendev) + stringlen, GFP_KERNEL);
 517	if (!xendev)
 518		return -ENOMEM;
 519
 520	xendev->state = XenbusStateInitialising;
 521
 522	/* Copy the strings into the extra space. */
 523
 524	tmpstring = (char *)(xendev + 1);
 525	strcpy(tmpstring, nodename);
 526	xendev->nodename = tmpstring;
 527
 528	tmpstring += strlen(tmpstring) + 1;
 529	strcpy(tmpstring, type);
 530	xendev->devicetype = tmpstring;
 531	init_completion(&xendev->down);
 532
 533	xendev->dev.bus = &bus->bus;
 534	xendev->dev.release = xenbus_dev_release;
 535
 536	err = bus->get_bus_id(devname, xendev->nodename);
 537	if (err)
 538		goto fail;
 539
 540	dev_set_name(&xendev->dev, "%s", devname);
 541	sema_init(&xendev->reclaim_sem, 1);
 542
 543	/* Register with generic device framework. */
 544	err = device_register(&xendev->dev);
 545	if (err) {
 546		put_device(&xendev->dev);
 547		xendev = NULL;
 548		goto fail;
 549	}
 550
 551	return 0;
 552fail:
 553	kfree(xendev);
 554	return err;
 555}
 556EXPORT_SYMBOL_GPL(xenbus_probe_node);
 557
 558static int xenbus_probe_device_type(struct xen_bus_type *bus, const char *type)
 559{
 560	int err = 0;
 561	char **dir;
 562	unsigned int dir_n = 0;
 563	int i;
 564
 565	dir = xenbus_directory(XBT_NIL, bus->root, type, &dir_n);
 566	if (IS_ERR(dir))
 567		return PTR_ERR(dir);
 568
 569	for (i = 0; i < dir_n; i++) {
 570		err = bus->probe(bus, type, dir[i]);
 571		if (err)
 572			break;
 573	}
 574
 575	kfree(dir);
 576	return err;
 577}
 578
 579int xenbus_probe_devices(struct xen_bus_type *bus)
 580{
 581	int err = 0;
 582	char **dir;
 583	unsigned int i, dir_n;
 584
 585	dir = xenbus_directory(XBT_NIL, bus->root, "", &dir_n);
 586	if (IS_ERR(dir))
 587		return PTR_ERR(dir);
 588
 589	for (i = 0; i < dir_n; i++) {
 590		err = xenbus_probe_device_type(bus, dir[i]);
 591		if (err)
 592			break;
 593	}
 594
 595	kfree(dir);
 596	return err;
 597}
 598EXPORT_SYMBOL_GPL(xenbus_probe_devices);
 599
 600static unsigned int char_count(const char *str, char c)
 601{
 602	unsigned int i, ret = 0;
 603
 604	for (i = 0; str[i]; i++)
 605		if (str[i] == c)
 606			ret++;
 607	return ret;
 608}
 609
 610static int strsep_len(const char *str, char c, unsigned int len)
 611{
 612	unsigned int i;
 613
 614	for (i = 0; str[i]; i++)
 615		if (str[i] == c) {
 616			if (len == 0)
 617				return i;
 618			len--;
 619		}
 620	return (len == 0) ? i : -ERANGE;
 621}
 622
 623void xenbus_dev_changed(const char *node, struct xen_bus_type *bus)
 624{
 625	int exists, rootlen;
 626	struct xenbus_device *dev;
 627	char type[XEN_BUS_ID_SIZE];
 628	const char *p, *root;
 629
 630	if (char_count(node, '/') < 2)
 631		return;
 632
 633	exists = xenbus_exists(XBT_NIL, node, "");
 634	if (!exists) {
 635		xenbus_cleanup_devices(node, &bus->bus);
 636		return;
 637	}
 638
 639	/* backend/<type>/... or device/<type>/... */
 640	p = strchr(node, '/') + 1;
 641	snprintf(type, XEN_BUS_ID_SIZE, "%.*s", (int)strcspn(p, "/"), p);
 642	type[XEN_BUS_ID_SIZE-1] = '\0';
 643
 644	rootlen = strsep_len(node, '/', bus->levels);
 645	if (rootlen < 0)
 646		return;
 647	root = kasprintf(GFP_KERNEL, "%.*s", rootlen, node);
 648	if (!root)
 649		return;
 650
 651	dev = xenbus_device_find(root, &bus->bus);
 652	if (!dev)
 653		xenbus_probe_node(bus, type, root);
 654	else
 655		put_device(&dev->dev);
 656
 657	kfree(root);
 658}
 659EXPORT_SYMBOL_GPL(xenbus_dev_changed);
 660
 661int xenbus_dev_suspend(struct device *dev)
 662{
 663	int err = 0;
 664	struct xenbus_driver *drv;
 665	struct xenbus_device *xdev
 666		= container_of(dev, struct xenbus_device, dev);
 667
 668	DPRINTK("%s", xdev->nodename);
 669
 670	if (dev->driver == NULL)
 671		return 0;
 672	drv = to_xenbus_driver(dev->driver);
 673	if (drv->suspend)
 674		err = drv->suspend(xdev);
 675	if (err)
 676		dev_warn(dev, "suspend failed: %i\n", err);
 
 677	return 0;
 678}
 679EXPORT_SYMBOL_GPL(xenbus_dev_suspend);
 680
 681int xenbus_dev_resume(struct device *dev)
 682{
 683	int err;
 684	struct xenbus_driver *drv;
 685	struct xenbus_device *xdev
 686		= container_of(dev, struct xenbus_device, dev);
 687
 688	DPRINTK("%s", xdev->nodename);
 689
 690	if (dev->driver == NULL)
 691		return 0;
 692	drv = to_xenbus_driver(dev->driver);
 693	err = talk_to_otherend(xdev);
 694	if (err) {
 695		dev_warn(dev, "resume (talk_to_otherend) failed: %i\n", err);
 
 
 696		return err;
 697	}
 698
 699	xdev->state = XenbusStateInitialising;
 700
 701	if (drv->resume) {
 702		err = drv->resume(xdev);
 703		if (err) {
 704			dev_warn(dev, "resume failed: %i\n", err);
 
 
 705			return err;
 706		}
 707	}
 708
 709	err = watch_otherend(xdev);
 710	if (err) {
 711		dev_warn(dev, "resume (watch_otherend) failed: %d\n", err);
 
 
 712		return err;
 713	}
 714
 715	return 0;
 716}
 717EXPORT_SYMBOL_GPL(xenbus_dev_resume);
 718
 719int xenbus_dev_cancel(struct device *dev)
 720{
 721	/* Do nothing */
 722	DPRINTK("cancel");
 723	return 0;
 724}
 725EXPORT_SYMBOL_GPL(xenbus_dev_cancel);
 726
 727/* A flag to determine if xenstored is 'ready' (i.e. has started) */
 728int xenstored_ready;
 729
 730
 731int register_xenstore_notifier(struct notifier_block *nb)
 732{
 733	int ret = 0;
 734
 735	if (xenstored_ready > 0)
 736		ret = nb->notifier_call(nb, 0, NULL);
 737	else
 738		blocking_notifier_chain_register(&xenstore_chain, nb);
 739
 740	return ret;
 741}
 742EXPORT_SYMBOL_GPL(register_xenstore_notifier);
 743
 744void unregister_xenstore_notifier(struct notifier_block *nb)
 745{
 746	blocking_notifier_chain_unregister(&xenstore_chain, nb);
 747}
 748EXPORT_SYMBOL_GPL(unregister_xenstore_notifier);
 749
 750static void xenbus_probe(void)
 751{
 752	xenstored_ready = 1;
 753
 754	if (!xen_store_interface) {
 755		xen_store_interface = memremap(xen_store_gfn << XEN_PAGE_SHIFT,
 756					       XEN_PAGE_SIZE, MEMREMAP_WB);
 757		/*
 758		 * Now it is safe to free the IRQ used for xenstore late
 759		 * initialization. No need to unbind: it is about to be
 760		 * bound again from xb_init_comms. Note that calling
 761		 * unbind_from_irqhandler now would result in xen_evtchn_close()
 762		 * being called and the event channel not being enabled again
 763		 * afterwards, resulting in missed event notifications.
 764		 */
 765		free_irq(xs_init_irq, &xb_waitq);
 766	}
 767
 768	/*
 769	 * In the HVM case, xenbus_init() deferred its call to
 770	 * xs_init() in case callbacks were not operational yet.
 771	 * So do it now.
 772	 */
 773	if (xen_store_domain_type == XS_HVM)
 774		xs_init();
 775
 776	/* Notify others that xenstore is up */
 777	blocking_notifier_call_chain(&xenstore_chain, 0, NULL);
 778}
 
 779
 780/*
 781 * Returns true when XenStore init must be deferred in order to
 782 * allow the PCI platform device to be initialised, before we
 783 * can actually have event channel interrupts working.
 784 */
 785static bool xs_hvm_defer_init_for_callback(void)
 786{
 787#ifdef CONFIG_XEN_PVHVM
 788	return xen_store_domain_type == XS_HVM &&
 789		!xen_have_vector_callback;
 790#else
 791	return false;
 792#endif
 793}
 794
 795static int xenbus_probe_thread(void *unused)
 796{
 797	DEFINE_WAIT(w);
 798
 799	/*
 800	 * We actually just want to wait for *any* trigger of xb_waitq,
 801	 * and run xenbus_probe() the moment it occurs.
 802	 */
 803	prepare_to_wait(&xb_waitq, &w, TASK_INTERRUPTIBLE);
 804	schedule();
 805	finish_wait(&xb_waitq, &w);
 806
 807	DPRINTK("probing");
 808	xenbus_probe();
 809	return 0;
 810}
 811
 812static int __init xenbus_probe_initcall(void)
 813{
 814	/*
 815	 * Probe XenBus here in the XS_PV case, and also XS_HVM unless we
 816	 * need to wait for the platform PCI device to come up or
 817	 * xen_store_interface is not ready.
 818	 */
 819	if (xen_store_domain_type == XS_PV ||
 820	    (xen_store_domain_type == XS_HVM &&
 821	     !xs_hvm_defer_init_for_callback() &&
 822	     xen_store_interface != NULL))
 823		xenbus_probe();
 824
 825	/*
 826	 * For XS_LOCAL or when xen_store_interface is not ready, spawn a
 827	 * thread which will wait for xenstored or a xenstore-stubdom to be
 828	 * started, then probe.  It will be triggered when communication
 829	 * starts happening, by waiting on xb_waitq.
 830	 */
 831	if (xen_store_domain_type == XS_LOCAL || xen_store_interface == NULL) {
 832		struct task_struct *probe_task;
 833
 834		probe_task = kthread_run(xenbus_probe_thread, NULL,
 835					 "xenbus_probe");
 836		if (IS_ERR(probe_task))
 837			return PTR_ERR(probe_task);
 838	}
 839	return 0;
 840}
 841device_initcall(xenbus_probe_initcall);
 842
 843int xen_set_callback_via(uint64_t via)
 844{
 845	struct xen_hvm_param a;
 846	int ret;
 847
 848	a.domid = DOMID_SELF;
 849	a.index = HVM_PARAM_CALLBACK_IRQ;
 850	a.value = via;
 851
 852	ret = HYPERVISOR_hvm_op(HVMOP_set_param, &a);
 853	if (ret)
 854		return ret;
 855
 856	/*
 857	 * If xenbus_probe_initcall() deferred the xenbus_probe()
 858	 * due to the callback not functioning yet, we can do it now.
 859	 */
 860	if (!xenstored_ready && xs_hvm_defer_init_for_callback())
 861		xenbus_probe();
 862
 863	return ret;
 864}
 865EXPORT_SYMBOL_GPL(xen_set_callback_via);
 866
 867/* Set up event channel for xenstored which is run as a local process
 868 * (this is normally used only in dom0)
 869 */
 870static int __init xenstored_local_init(void)
 871{
 872	int err = -ENOMEM;
 873	unsigned long page = 0;
 874	struct evtchn_alloc_unbound alloc_unbound;
 875
 876	/* Allocate Xenstore page */
 877	page = get_zeroed_page(GFP_KERNEL);
 878	if (!page)
 879		goto out_err;
 880
 881	xen_store_gfn = virt_to_gfn((void *)page);
 
 
 882
 883	/* Next allocate a local port which xenstored can bind to */
 884	alloc_unbound.dom        = DOMID_SELF;
 885	alloc_unbound.remote_dom = DOMID_SELF;
 886
 887	err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
 888					  &alloc_unbound);
 889	if (err == -ENOSYS)
 890		goto out_err;
 891
 892	BUG_ON(err);
 893	xen_store_evtchn = alloc_unbound.port;
 
 894
 895	return 0;
 896
 897 out_err:
 898	if (page != 0)
 899		free_page(page);
 900	return err;
 901}
 902
 903static int xenbus_resume_cb(struct notifier_block *nb,
 904			    unsigned long action, void *data)
 905{
 906	int err = 0;
 907
 908	if (xen_hvm_domain()) {
 909		uint64_t v = 0;
 910
 911		err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
 912		if (!err && v)
 913			xen_store_evtchn = v;
 914		else
 915			pr_warn("Cannot update xenstore event channel: %d\n",
 916				err);
 917	} else
 918		xen_store_evtchn = xen_start_info->store_evtchn;
 919
 920	return err;
 921}
 922
 923static struct notifier_block xenbus_resume_nb = {
 924	.notifier_call = xenbus_resume_cb,
 925};
 926
 927static irqreturn_t xenbus_late_init(int irq, void *unused)
 928{
 929	int err;
 930	uint64_t v = 0;
 931
 932	err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v);
 933	if (err || !v || !~v)
 934		return IRQ_HANDLED;
 935	xen_store_gfn = (unsigned long)v;
 936
 937	wake_up(&xb_waitq);
 938	return IRQ_HANDLED;
 939}
 940
 941static int __init xenbus_init(void)
 942{
 943	int err;
 944	uint64_t v = 0;
 945	bool wait = false;
 946	xen_store_domain_type = XS_UNKNOWN;
 947
 948	if (!xen_domain())
 949		return -ENODEV;
 950
 951	xenbus_ring_ops_init();
 952
 953	if (xen_pv_domain())
 954		xen_store_domain_type = XS_PV;
 955	if (xen_hvm_domain())
 956		xen_store_domain_type = XS_HVM;
 957	if (xen_hvm_domain() && xen_initial_domain())
 958		xen_store_domain_type = XS_LOCAL;
 959	if (xen_pv_domain() && !xen_start_info->store_evtchn)
 960		xen_store_domain_type = XS_LOCAL;
 961	if (xen_pv_domain() && xen_start_info->store_evtchn)
 962		xenstored_ready = 1;
 963
 964	switch (xen_store_domain_type) {
 965	case XS_LOCAL:
 966		err = xenstored_local_init();
 967		if (err)
 968			goto out_error;
 969		xen_store_interface = gfn_to_virt(xen_store_gfn);
 970		break;
 971	case XS_PV:
 972		xen_store_evtchn = xen_start_info->store_evtchn;
 973		xen_store_gfn = xen_start_info->store_mfn;
 974		xen_store_interface = gfn_to_virt(xen_store_gfn);
 975		break;
 976	case XS_HVM:
 977		err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
 978		if (err)
 979			goto out_error;
 980		xen_store_evtchn = (int)v;
 981		err = hvm_get_parameter(HVM_PARAM_STORE_PFN, &v);
 982		if (err)
 983			goto out_error;
 984		/*
 985		 * Uninitialized hvm_params are zero and return no error.
 986		 * Although it is theoretically possible to have
 987		 * HVM_PARAM_STORE_PFN set to zero on purpose, in reality it is
 988		 * not zero when valid. If zero, it means that Xenstore hasn't
 989		 * been properly initialized. Instead of attempting to map a
 990		 * wrong guest physical address return error.
 991		 *
 992		 * Also recognize all bits set as an invalid/uninitialized value.
 993		 */
 994		if (!v) {
 995			err = -ENOENT;
 996			goto out_error;
 997		}
 998		if (v == ~0ULL) {
 999			wait = true;
1000		} else {
1001			/* Avoid truncation on 32-bit. */
1002#if BITS_PER_LONG == 32
1003			if (v > ULONG_MAX) {
1004				pr_err("%s: cannot handle HVM_PARAM_STORE_PFN=%llx > ULONG_MAX\n",
1005				       __func__, v);
1006				err = -EINVAL;
1007				goto out_error;
1008			}
1009#endif
1010			xen_store_gfn = (unsigned long)v;
1011			xen_store_interface =
1012				memremap(xen_store_gfn << XEN_PAGE_SHIFT,
1013					 XEN_PAGE_SIZE, MEMREMAP_WB);
1014			if (xen_store_interface->connection != XENSTORE_CONNECTED)
1015				wait = true;
1016		}
1017		if (wait) {
1018			err = bind_evtchn_to_irqhandler(xen_store_evtchn,
1019							xenbus_late_init,
1020							0, "xenstore_late_init",
1021							&xb_waitq);
1022			if (err < 0) {
1023				pr_err("xenstore_late_init couldn't bind irq err=%d\n",
1024				       err);
1025				return err;
1026			}
1027
1028			xs_init_irq = err;
1029		}
1030		break;
1031	default:
1032		pr_warn("Xenstore state unknown\n");
1033		break;
1034	}
1035
1036	/*
1037	 * HVM domains may not have a functional callback yet. In that
1038	 * case let xs_init() be called from xenbus_probe(), which will
1039	 * get invoked at an appropriate time.
1040	 */
1041	if (xen_store_domain_type != XS_HVM) {
1042		err = xs_init();
1043		if (err) {
1044			pr_warn("Error initializing xenstore comms: %i\n", err);
1045			goto out_error;
1046		}
1047	}
1048
1049	if ((xen_store_domain_type != XS_LOCAL) &&
1050	    (xen_store_domain_type != XS_UNKNOWN))
1051		xen_resume_notifier_register(&xenbus_resume_nb);
1052
1053#ifdef CONFIG_XEN_COMPAT_XENFS
1054	/*
1055	 * Create xenfs mountpoint in /proc for compatibility with
1056	 * utilities that expect to find "xenbus" under "/proc/xen".
1057	 */
1058	proc_create_mount_point("xen");
1059#endif
1060	return 0;
1061
1062out_error:
1063	xen_store_domain_type = XS_UNKNOWN;
1064	return err;
1065}
1066
1067postcore_initcall(xenbus_init);
1068
1069MODULE_LICENSE("GPL");