switch (xen_domain_type) { case XEN_NATIVE: /* ARM only. */
type = "Xen"; break; case XEN_PV_DOMAIN:
type = "PV"; break; case XEN_HVM_DOMAIN:
type = xen_pvh_domain() ? "PVH" : "HVM"; break; default: return -EINVAL;
}
/* xen version attributes */ static ssize_t major_show(struct hyp_sysfs_attr *attr, char *buffer)
{ int version = HYPERVISOR_xen_version(XENVER_version, NULL); if (version) return sprintf(buffer, "%d\n", version >> 16); return -ENODEV;
}
HYPERVISOR_ATTR_RO(major);
static ssize_t minor_show(struct hyp_sysfs_attr *attr, char *buffer)
{ int version = HYPERVISOR_xen_version(XENVER_version, NULL); if (version) return sprintf(buffer, "%d\n", version & 0xff); return -ENODEV;
}
HYPERVISOR_ATTR_RO(minor);
static ssize_t extra_show(struct hyp_sysfs_attr *attr, char *buffer)
{ int ret = -ENOMEM; char *extra;
extra = kmalloc(XEN_EXTRAVERSION_LEN, GFP_KERNEL); if (extra) {
ret = HYPERVISOR_xen_version(XENVER_extraversion, extra); if (!ret)
ret = sprintf(buffer, "%s\n", extra);
kfree(extra);
}
static ssize_t compiler_show(struct hyp_sysfs_attr *attr, char *buffer)
{ int ret = -ENOMEM; struct xen_compile_info *info;
info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL); if (info) {
ret = HYPERVISOR_xen_version(XENVER_compile_info, info); if (!ret)
ret = sprintf(buffer, "%s\n", info->compiler);
kfree(info);
}
return ret;
}
HYPERVISOR_ATTR_RO(compiler);
static ssize_t compiled_by_show(struct hyp_sysfs_attr *attr, char *buffer)
{ int ret = -ENOMEM; struct xen_compile_info *info;
info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL); if (info) {
ret = HYPERVISOR_xen_version(XENVER_compile_info, info); if (!ret)
ret = sprintf(buffer, "%s\n", info->compile_by);
kfree(info);
}
return ret;
}
HYPERVISOR_ATTR_RO(compiled_by);
static ssize_t compile_date_show(struct hyp_sysfs_attr *attr, char *buffer)
{ int ret = -ENOMEM; struct xen_compile_info *info;
info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL); if (info) {
ret = HYPERVISOR_xen_version(XENVER_compile_info, info); if (!ret)
ret = sprintf(buffer, "%s\n", info->compile_date);
kfree(info);
}
static ssize_t capabilities_show(struct hyp_sysfs_attr *attr, char *buffer)
{ int ret = -ENOMEM; char *caps;
caps = kmalloc(XEN_CAPABILITIES_INFO_LEN, GFP_KERNEL); if (caps) {
ret = HYPERVISOR_xen_version(XENVER_capabilities, caps); if (!ret)
ret = sprintf(buffer, "%s\n", caps);
kfree(caps);
}
return ret;
}
HYPERVISOR_ATTR_RO(capabilities);
static ssize_t changeset_show(struct hyp_sysfs_attr *attr, char *buffer)
{ int ret = -ENOMEM; char *cset;
cset = kmalloc(XEN_CHANGESET_INFO_LEN, GFP_KERNEL); if (cset) {
ret = HYPERVISOR_xen_version(XENVER_changeset, cset); if (!ret)
ret = sprintf(buffer, "%s\n", cset);
kfree(cset);
}
return ret;
}
HYPERVISOR_ATTR_RO(changeset);
static ssize_t virtual_start_show(struct hyp_sysfs_attr *attr, char *buffer)
{ int ret = -ENOMEM; struct xen_platform_parameters *parms;
parms = kmalloc(sizeof(struct xen_platform_parameters), GFP_KERNEL); if (parms) {
ret = HYPERVISOR_xen_version(XENVER_platform_parameters,
parms); if (!ret)
ret = sprintf(buffer, "%"PRI_xen_ulong"\n",
parms->virt_start);
kfree(parms);
}
return ret;
}
HYPERVISOR_ATTR_RO(virtual_start);
static ssize_t pagesize_show(struct hyp_sysfs_attr *attr, char *buffer)
{ int ret;
ret = HYPERVISOR_xen_version(XENVER_pagesize, NULL); if (ret > 0)
ret = sprintf(buffer, "%x\n", ret);
len = 0; for (i = XENFEAT_NR_SUBMAPS-1; i >= 0; i--) { int ret = xen_feature_show(i, buffer + len); if (ret < 0) { if (len == 0)
len = ret; break;
}
len += ret;
} if (len > 0)
buffer[len++] = '\n';
/* * Add new, known flags here. No other changes are required, but * note that each known flag wastes one entry in flag_unames[]. * The code/complexity machinations to avoid this isn't worth it * for a few entries, but keep it in mind.
*/ staticstruct hyp_sysfs_attr flag_attrs[FLAG_COUNT] = {
FLAG_NODE(SIF_PRIVILEGED, privileged),
FLAG_NODE(SIF_INITDOMAIN, initdomain)
}; staticstruct attribute_group xen_flags_group = {
.name = "start_flags",
.attrs = (struct attribute *[FLAG_COUNT + 1]){}
}; staticchar flag_unames[FLAG_COUNT][FLAG_UNAME_MAX];
staticint __init hyper_sysfs_init(void)
{ int ret;
if (!xen_domain()) return -ENODEV;
ret = xen_sysfs_type_init(); if (ret) goto out;
ret = xen_sysfs_guest_type_init(); if (ret) goto guest_type_out;
ret = xen_sysfs_version_init(); if (ret) goto version_out;
ret = xen_sysfs_compilation_init(); if (ret) goto comp_out;
ret = xen_sysfs_uuid_init(); if (ret) goto uuid_out;
ret = xen_sysfs_properties_init(); if (ret) goto prop_out;
ret = xen_sysfs_flags_init(); if (ret) goto flags_out; #ifdef CONFIG_XEN_HAVE_VPMU if (xen_initial_domain()) {
ret = xen_sysfs_pmu_init(); if (ret) {
sysfs_remove_group(hypervisor_kobj, &xen_flags_group); goto flags_out;
}
} #endif goto out;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.