mirror of
https://github.com/xemu-project/xemu.git
synced 2025-02-25 15:14:31 +00:00
hw/xen: Create initial XenStore nodes
Signed-off-by: Paul Durrant <pdurrant@amazon.com> Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> Reviewed-by: Paul Durrant <paul@xen.org>
This commit is contained in:
parent
766804b101
commit
831b0db8ab
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user