|
|
|
@ -76,9 +76,39 @@ struct XenXenstoreState *xen_xenstore_singleton; |
|
|
|
static void xen_xenstore_event(void *opaque); |
|
|
|
static void fire_watch_cb(void *opaque, const char *path, const char *token); |
|
|
|
|
|
|
|
static void G_GNUC_PRINTF (4, 5) relpath_printf(XenXenstoreState *s, |
|
|
|
GList *perms, |
|
|
|
const char *relpath, |
|
|
|
const char *fmt, ...) |
|
|
|
{ |
|
|
|
gchar *abspath; |
|
|
|
gchar *value; |
|
|
|
va_list args; |
|
|
|
GByteArray *data; |
|
|
|
int err; |
|
|
|
|
|
|
|
abspath = g_strdup_printf("/local/domain/%u/%s", xen_domid, relpath); |
|
|
|
va_start(args, fmt); |
|
|
|
value = g_strdup_vprintf(fmt, args); |
|
|
|
va_end(args); |
|
|
|
|
|
|
|
data = g_byte_array_new_take((void *)value, strlen(value)); |
|
|
|
|
|
|
|
err = xs_impl_write(s->impl, DOMID_QEMU, XBT_NULL, abspath, data); |
|
|
|
assert(!err); |
|
|
|
|
|
|
|
g_byte_array_unref(data); |
|
|
|
|
|
|
|
err = xs_impl_set_perms(s->impl, DOMID_QEMU, XBT_NULL, abspath, perms); |
|
|
|
assert(!err); |
|
|
|
|
|
|
|
g_free(abspath); |
|
|
|
} |
|
|
|
|
|
|
|
static void xen_xenstore_realize(DeviceState *dev, Error **errp) |
|
|
|
{ |
|
|
|
XenXenstoreState *s = XEN_XENSTORE(dev); |
|
|
|
GList *perms; |
|
|
|
|
|
|
|
if (xen_mode != XEN_EMULATE) { |
|
|
|
error_setg(errp, "Xen xenstore support is for Xen emulation"); |
|
|
|
@ -102,6 +132,46 @@ static void xen_xenstore_realize(DeviceState *dev, Error **errp) |
|
|
|
xen_xenstore_event, NULL, NULL, NULL, s); |
|
|
|
|
|
|
|
s->impl = xs_impl_create(xen_domid); |
|
|
|
|
|
|
|
/* Populate the default nodes */ |
|
|
|
|
|
|
|
/* Nodes owned by 'dom0' but readable by the guest */ |
|
|
|
perms = g_list_append(NULL, xs_perm_as_string(XS_PERM_NONE, DOMID_QEMU)); |
|
|
|
perms = g_list_append(perms, xs_perm_as_string(XS_PERM_READ, xen_domid)); |
|
|
|
|
|
|
|
relpath_printf(s, perms, "", "%s", ""); |
|
|
|
|
|
|
|
relpath_printf(s, perms, "domid", "%u", xen_domid); |
|
|
|
|
|
|
|
relpath_printf(s, perms, "control/platform-feature-xs_reset_watches", "%u", 1); |
|
|
|
relpath_printf(s, perms, "control/platform-feature-multiprocessor-suspend", "%u", 1); |
|
|
|
|
|
|
|
relpath_printf(s, perms, "platform/acpi", "%u", 1); |
|
|
|
relpath_printf(s, perms, "platform/acpi_s3", "%u", 1); |
|
|
|
relpath_printf(s, perms, "platform/acpi_s4", "%u", 1); |
|
|
|
relpath_printf(s, perms, "platform/acpi_laptop_slate", "%u", 0); |
|
|
|
|
|
|
|
g_list_free_full(perms, g_free); |
|
|
|
|
|
|
|
/* Nodes owned by the guest */ |
|
|
|
perms = g_list_append(NULL, xs_perm_as_string(XS_PERM_NONE, xen_domid)); |
|
|
|
|
|
|
|
relpath_printf(s, perms, "attr", "%s", ""); |
|
|
|
|
|
|
|
relpath_printf(s, perms, "control/shutdown", "%s", ""); |
|
|
|
relpath_printf(s, perms, "control/feature-poweroff", "%u", 1); |
|
|
|
relpath_printf(s, perms, "control/feature-reboot", "%u", 1); |
|
|
|
relpath_printf(s, perms, "control/feature-suspend", "%u", 1); |
|
|
|
relpath_printf(s, perms, "control/feature-s3", "%u", 1); |
|
|
|
relpath_printf(s, perms, "control/feature-s4", "%u", 1); |
|
|
|
|
|
|
|
relpath_printf(s, perms, "data", "%s", ""); |
|
|
|
relpath_printf(s, perms, "device", "%s", ""); |
|
|
|
relpath_printf(s, perms, "drivers", "%s", ""); |
|
|
|
relpath_printf(s, perms, "error", "%s", ""); |
|
|
|
relpath_printf(s, perms, "feature", "%s", ""); |
|
|
|
|
|
|
|
g_list_free_full(perms, g_free); |
|
|
|
} |
|
|
|
|
|
|
|
static bool xen_xenstore_is_needed(void *opaque) |
|
|
|
|