static int xencomm_privcmd_xen_version(privcmd_hypercall_t *hypercall) { int cmd = hypercall->arg[0]; void __user *arg = (void __user *)hypercall->arg[1]; struct xencomm_handle *desc; size_t argsize; int rc; switch (cmd) { case XENVER_version: /* do not actually pass an argument */ return xencomm_arch_hypercall_xen_version(cmd, 0); case XENVER_extraversion: argsize = sizeof(xen_extraversion_t); break; case XENVER_compile_info: argsize = sizeof(xen_compile_info_t); break; case XENVER_capabilities: argsize = sizeof(xen_capabilities_info_t); break; case XENVER_changeset: argsize = sizeof(xen_changeset_info_t); break; case XENVER_platform_parameters: argsize = sizeof(xen_platform_parameters_t); break; case XENVER_pagesize: argsize = (arg == NULL) ? 0 : sizeof(void *); break; case XENVER_get_features: argsize = (arg == NULL) ? 0 : sizeof(xen_feature_info_t); break; default: printk("%s: unknown version op %d\n", __func__, cmd); return -ENOSYS; } rc = xencomm_create(arg, argsize, &desc, GFP_KERNEL); if (rc) return rc; rc = xencomm_arch_hypercall_xen_version(cmd, desc); xencomm_free(desc); return rc; }
int xencomm_hypercall_xen_version(int cmd, void *arg) { struct xencomm_handle *desc; unsigned int argsize; switch (cmd) { case XENVER_version: /* do not actually pass an argument */ return xencomm_arch_hypercall_xen_version(cmd, 0); case XENVER_extraversion: argsize = sizeof(struct xen_extraversion); break; case XENVER_compile_info: argsize = sizeof(struct xen_compile_info); break; case XENVER_capabilities: argsize = sizeof(struct xen_capabilities_info); break; case XENVER_changeset: argsize = sizeof(struct xen_changeset_info); break; case XENVER_platform_parameters: argsize = sizeof(struct xen_platform_parameters); break; case XENVER_get_features: argsize = (arg == NULL) ? 0 : sizeof(struct xen_feature_info); break; default: printk(KERN_DEBUG "%s: unknown version op %d\n", __func__, cmd); return -ENOSYS; } desc = xencomm_map_no_alloc(arg, argsize); if (desc == NULL) return -EINVAL; return xencomm_arch_hypercall_xen_version(cmd, desc); }