int xc_version(int xc_handle, int cmd, void *arg) { int rc, argsize = 0; switch ( cmd ) { 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; } if ( (argsize != 0) && (lock_pages(arg, argsize) != 0) ) { PERROR("Could not lock memory for version hypercall"); return -ENOMEM; } #ifdef VALGRIND if (argsize != 0) memset(arg, 0, argsize); #endif rc = do_xen_version(xc_handle, cmd, arg); if ( argsize != 0 ) unlock_pages(arg, argsize); return rc; }
int xc_version(xc_interface *xch, int cmd, void *arg) { DECLARE_HYPERCALL_BOUNCE(arg, 0, XC_HYPERCALL_BUFFER_BOUNCE_OUT); /* Size unknown until cmd decoded */ size_t sz; int rc; switch ( cmd ) { case XENVER_version: sz = 0; break; case XENVER_extraversion: sz = sizeof(xen_extraversion_t); break; case XENVER_compile_info: sz = sizeof(xen_compile_info_t); break; case XENVER_capabilities: sz = sizeof(xen_capabilities_info_t); break; case XENVER_changeset: sz = sizeof(xen_changeset_info_t); break; case XENVER_platform_parameters: sz = sizeof(xen_platform_parameters_t); break; case XENVER_get_features: sz = sizeof(xen_feature_info_t); break; case XENVER_pagesize: sz = 0; break; case XENVER_guest_handle: sz = sizeof(xen_domain_handle_t); break; case XENVER_commandline: sz = sizeof(xen_commandline_t); break; case XENVER_build_id: { xen_build_id_t *build_id = (xen_build_id_t *)arg; sz = sizeof(*build_id) + build_id->len; HYPERCALL_BOUNCE_SET_DIR(arg, XC_HYPERCALL_BUFFER_BOUNCE_BOTH); break; } default: ERROR("xc_version: unknown command %d\n", cmd); return -EINVAL; } HYPERCALL_BOUNCE_SET_SIZE(arg, sz); if ( (sz != 0) && xc_hypercall_bounce_pre(xch, arg) ) { PERROR("Could not bounce buffer for version hypercall"); return -ENOMEM; } rc = do_xen_version(xch, cmd, HYPERCALL_BUFFER(arg)); if ( sz != 0 ) xc_hypercall_bounce_post(xch, arg); return rc; }