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:
Paul Durrant 2023-01-24 09:34:06 +00:00 committed by David Woodhouse
parent 766804b101
commit 831b0db8ab

View File

@ -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)