cregit-Linux how code gets into the kernel

Release 4.7 drivers/xen/sys-hypervisor.c

Directory: drivers/xen
/*
 *  copyright (c) 2006 IBM Corporation
 *  Authored by: Mike D. Day <ncmike@us.ibm.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 */

#include <linux/slab.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/kobject.h>
#include <linux/err.h>

#include <asm/xen/hypervisor.h>
#include <asm/xen/hypercall.h>

#include <xen/xen.h>
#include <xen/xenbus.h>
#include <xen/interface/xen.h>
#include <xen/interface/version.h>
#ifdef CONFIG_XEN_HAVE_VPMU
#include <xen/interface/xenpmu.h>
#endif


#define HYPERVISOR_ATTR_RO(_name) \
static struct hyp_sysfs_attr  _name##_attr = __ATTR_RO(_name)


#define HYPERVISOR_ATTR_RW(_name) \
static struct hyp_sysfs_attr _name##_attr = \
        __ATTR(_name, 0644, _name##_show, _name##_store)


struct hyp_sysfs_attr {
	
struct attribute attr;
	
ssize_t (*show)(struct hyp_sysfs_attr *, char *);
	
ssize_t (*store)(struct hyp_sysfs_attr *, const char *, size_t);
	
void *hyp_attr_data;
};


static ssize_t type_show(struct hyp_sysfs_attr *attr, char *buffer) { return sprintf(buffer, "xen\n"); }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge23100.00%1100.00%
Total23100.00%1100.00%

HYPERVISOR_ATTR_RO(type);
static int __init xen_sysfs_type_init(void) { return sysfs_create_file(hypervisor_kobj, &type_attr.attr); }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge20100.00%1100.00%
Total20100.00%1100.00%

/* 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; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge45100.00%1100.00%
Total45100.00%1100.00%

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; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge45100.00%1100.00%
Total45100.00%1100.00%

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); } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge73100.00%1100.00%
Total73100.00%1100.00%

HYPERVISOR_ATTR_RO(extra); static struct attribute *version_attrs[] = { &major_attr.attr, &minor_attr.attr, &extra_attr.attr, NULL }; static const struct attribute_group version_group = { .name = "version", .attrs = version_attrs, };
static int __init xen_sysfs_version_init(void) { return sysfs_create_group(hypervisor_kobj, &version_group); }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge18100.00%1100.00%
Total18100.00%1100.00%

/* UUID */
static ssize_t uuid_show_fallback(struct hyp_sysfs_attr *attr, char *buffer) { char *vm, *val; int ret; extern int xenstored_ready; if (!xenstored_ready) return -EBUSY; vm = xenbus_read(XBT_NIL, "vm", "", NULL); if (IS_ERR(vm)) return PTR_ERR(vm); val = xenbus_read(XBT_NIL, vm, "uuid", NULL); kfree(vm); if (IS_ERR(val)) return PTR_ERR(val); ret = sprintf(buffer, "%s\n", val); kfree(val); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge11399.12%150.00%
daniel de graafdaniel de graaf10.88%150.00%
Total114100.00%2100.00%


static ssize_t uuid_show(struct hyp_sysfs_attr *attr, char *buffer) { xen_domain_handle_t uuid; int ret; ret = HYPERVISOR_xen_version(XENVER_guest_handle, uuid); if (ret) return uuid_show_fallback(attr, buffer); ret = sprintf(buffer, "%pU\n", uuid); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
daniel de graafdaniel de graaf56100.00%1100.00%
Total56100.00%1100.00%

HYPERVISOR_ATTR_RO(uuid);
static int __init xen_sysfs_uuid_init(void) { return sysfs_create_file(hypervisor_kobj, &uuid_attr.attr); }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge20100.00%1100.00%
Total20100.00%1100.00%

/* xen compilation attributes */
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; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge80100.00%1100.00%
Total80100.00%1100.00%

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; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge80100.00%1100.00%
Total80100.00%1100.00%

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); } return ret; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge80100.00%1100.00%
Total80100.00%1100.00%

HYPERVISOR_ATTR_RO(compile_date); static struct attribute *xen_compile_attrs[] = { &compiler_attr.attr, &compiled_by_attr.attr, &compile_date_attr.attr, NULL }; static const struct attribute_group xen_compilation_group = { .name = "compilation", .attrs = xen_compile_attrs, };
static int __init xen_compilation_init(void) { return sysfs_create_group(hypervisor_kobj, &xen_compilation_group); }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge1794.44%150.00%
daniel kiperdaniel kiper15.56%150.00%
Total18100.00%2100.00%

/* xen properties 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; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge73100.00%1100.00%
Total73100.00%1100.00%

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; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge73100.00%1100.00%
Total73100.00%1100.00%

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; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge7996.34%150.00%
ian campbellian campbell33.66%150.00%
Total82100.00%2100.00%

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); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge47100.00%1100.00%
Total47100.00%1100.00%

HYPERVISOR_ATTR_RO(pagesize);
static ssize_t xen_feature_show(int index, char *buffer) { ssize_t ret; struct xen_feature_info info; info.submap_idx = index; ret = HYPERVISOR_xen_version(XENVER_get_features, &info); if (!ret) ret = sprintf(buffer, "%08x", info.submap); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge57100.00%2100.00%
Total57100.00%2100.00%


static ssize_t features_show(struct hyp_sysfs_attr *attr, char *buffer) { ssize_t len; int i; 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'; return len; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge94100.00%2100.00%
Total94100.00%2100.00%

HYPERVISOR_ATTR_RO(features); static struct attribute *xen_properties_attrs[] = { &capabilities_attr.attr, &changeset_attr.attr, &virtual_start_attr.attr, &pagesize_attr.attr, &features_attr.attr, NULL }; static const struct attribute_group xen_properties_group = { .name = "properties", .attrs = xen_properties_attrs, };
static int __init xen_properties_init(void) { return sysfs_create_group(hypervisor_kobj, &xen_properties_group); }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge18100.00%1100.00%
Total18100.00%1100.00%

#ifdef CONFIG_XEN_HAVE_VPMU struct pmu_mode { const char *name; uint32_t mode; }; static struct pmu_mode pmu_modes[] = { {"off", XENPMU_MODE_OFF}, {"self", XENPMU_MODE_SELF}, {"hv", XENPMU_MODE_HV}, {"all", XENPMU_MODE_ALL} };
static ssize_t pmu_mode_store(struct hyp_sysfs_attr *attr, const char *buffer, size_t len) { int ret; struct xen_pmu_params xp; int i; for (i = 0; i < ARRAY_SIZE(pmu_modes); i++) { if (strncmp(buffer, pmu_modes[i].name, len - 1) == 0) { xp.val = pmu_modes[i].mode; break; } } if (i == ARRAY_SIZE(pmu_modes)) return -EINVAL; xp.version.maj = XENPMU_VER_MAJ; xp.version.min = XENPMU_VER_MIN; ret = HYPERVISOR_xenpmu_op(XENPMU_mode_set, &xp); if (ret) return ret; return len; }

Contributors

PersonTokensPropCommitsCommitProp
boris ostrovskyboris ostrovsky130100.00%1100.00%
Total130100.00%1100.00%


static ssize_t pmu_mode_show(struct hyp_sysfs_attr *attr, char *buffer) { int ret; struct xen_pmu_params xp; int i; uint32_t mode; xp.version.maj = XENPMU_VER_MAJ; xp.version.min = XENPMU_VER_MIN; ret = HYPERVISOR_xenpmu_op(XENPMU_mode_get, &xp); if (ret) return ret; mode = (uint32_t)xp.val; for (i = 0; i < ARRAY_SIZE(pmu_modes); i++) { if (mode == pmu_modes[i].mode) return sprintf(buffer, "%s\n", pmu_modes[i].name); } return -EINVAL; }

Contributors

PersonTokensPropCommitsCommitProp
boris ostrovskyboris ostrovsky118100.00%1100.00%
Total118100.00%1100.00%

HYPERVISOR_ATTR_RW(pmu_mode);
static ssize_t pmu_features_store(struct hyp_sysfs_attr *attr, const char *buffer, size_t len) { int ret; uint32_t features; struct xen_pmu_params xp; ret = kstrtou32(buffer, 0, &features); if (ret) return ret; xp.val = features; xp.version.maj = XENPMU_VER_MAJ; xp.version.min = XENPMU_VER_MIN; ret = HYPERVISOR_xenpmu_op(XENPMU_feature_set, &xp); if (ret) return ret; return len; }

Contributors

PersonTokensPropCommitsCommitProp
boris ostrovskyboris ostrovsky90100.00%1100.00%
Total90100.00%1100.00%


static ssize_t pmu_features_show(struct hyp_sysfs_attr *attr, char *buffer) { int ret; struct xen_pmu_params xp; xp.version.maj = XENPMU_VER_MAJ; xp.version.min = XENPMU_VER_MIN; ret = HYPERVISOR_xenpmu_op(XENPMU_feature_get, &xp); if (ret) return ret; return sprintf(buffer, "0x%x\n", (uint32_t)xp.val); }

Contributors

PersonTokensPropCommitsCommitProp
boris ostrovskyboris ostrovsky70100.00%1100.00%
Total70100.00%1100.00%

HYPERVISOR_ATTR_RW(pmu_features); static struct attribute *xen_pmu_attrs[] = { &pmu_mode_attr.attr, &pmu_features_attr.attr, NULL }; static const struct attribute_group xen_pmu_group = { .name = "pmu", .attrs = xen_pmu_attrs, };
static int __init xen_pmu_init(void) { return sysfs_create_group(hypervisor_kobj, &xen_pmu_group); }

Contributors

PersonTokensPropCommitsCommitProp
boris ostrovskyboris ostrovsky18100.00%1100.00%
Total18100.00%1100.00%

#endif
static int __init hyper_sysfs_init(void) { int ret; if (!xen_domain()) return -ENODEV; ret = xen_sysfs_type_init(); if (ret) goto out; ret = xen_sysfs_version_init(); if (ret) goto version_out; ret = xen_compilation_init(); if (ret) goto comp_out; ret = xen_sysfs_uuid_init(); if (ret) goto uuid_out; ret = xen_properties_init(); if (ret) goto prop_out; #ifdef CONFIG_XEN_HAVE_VPMU if (xen_initial_domain()) { ret = xen_pmu_init(); if (ret) { sysfs_remove_group(hypervisor_kobj, &xen_properties_group); goto prop_out; } } #endif goto out; prop_out: sysfs_remove_file(hypervisor_kobj, &uuid_attr.attr); uuid_out: sysfs_remove_group(hypervisor_kobj, &xen_compilation_group); comp_out: sysfs_remove_group(hypervisor_kobj, &version_group); version_out: sysfs_remove_file(hypervisor_kobj, &type_attr.attr); out: return ret; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge10260.71%133.33%
paul gortmakerpaul gortmaker3923.21%133.33%
boris ostrovskyboris ostrovsky2716.07%133.33%
Total168100.00%3100.00%

device_initcall(hyper_sysfs_init);
static ssize_t hyp_sysfs_show(struct kobject *kobj, struct attribute *attr, char *buffer) { struct hyp_sysfs_attr *hyp_attr; hyp_attr = container_of(attr, struct hyp_sysfs_attr, attr); if (hyp_attr->show) return hyp_attr->show(hyp_attr, buffer); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge56100.00%1100.00%
Total56100.00%1100.00%


static ssize_t hyp_sysfs_store(struct kobject *kobj, struct attribute *attr, const char *buffer, size_t len) { struct hyp_sysfs_attr *hyp_attr; hyp_attr = container_of(attr, struct hyp_sysfs_attr, attr); if (hyp_attr->store) return hyp_attr->store(hyp_attr, buffer, len); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge62100.00%1100.00%
Total62100.00%1100.00%

static const struct sysfs_ops hyp_sysfs_ops = { .show = hyp_sysfs_show, .store = hyp_sysfs_store, }; static struct kobj_type hyp_sysfs_kobj_type = { .sysfs_ops = &hyp_sysfs_ops, };
static int __init hypervisor_subsys_init(void) { if (!xen_domain()) return -ENODEV; hypervisor_kobj->ktype = &hyp_sysfs_kobj_type; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge29100.00%1100.00%
Total29100.00%1100.00%

device_initcall(hypervisor_subsys_init);

Overall Contributors

PersonTokensPropCommitsCommitProp
jeremy fitzhardingejeremy fitzhardinge163870.91%325.00%
boris ostrovskyboris ostrovsky56024.24%18.33%
daniel de graafdaniel de graaf572.47%18.33%
paul gortmakerpaul gortmaker411.77%18.33%
ian campbellian campbell60.26%216.67%
jan beulichjan beulich30.13%18.33%
tejun heotejun heo30.13%18.33%
daniel kiperdaniel kiper10.04%18.33%
emese revfyemese revfy10.04%18.33%
Total2310100.00%12100.00%
Directory: drivers/xen
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}