843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER START
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * The contents of this file are subject to the terms of the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Common Development and Distribution License (the "License").
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You may not use this file except in compliance with the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
843e19887f64dde75055cf8842fc4db2171eff45johnlev * or http://www.opensolaris.org/os/licensing.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * See the License for the specific language governing permissions
843e19887f64dde75055cf8842fc4db2171eff45johnlev * and limitations under the License.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * When distributing Covered Code, include this CDDL HEADER in each
843e19887f64dde75055cf8842fc4db2171eff45johnlev * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * If applicable, add the following below this CDDL HEADER, with the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * fields enclosed by brackets "[]" replaced with your own identifying
843e19887f64dde75055cf8842fc4db2171eff45johnlev * information: Portions Copyright [yyyy] [name of copyright owner]
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * CDDL HEADER END
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
525b892b4871655735786931d81ffcced2641b0dMark Johnson * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Use is subject to license terms.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee#include <sys/xpv_user.h>
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/types.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/file.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/errno.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/open.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/cred.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/conf.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/stat.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/modctl.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/ddi.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/sunddi.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/vmsystm.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/hypervisor.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/xen_errno.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/sysmacros.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/sdt.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <xen/sys/privcmd.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev#include <sys/privcmd_impl.h>
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevtypedef struct import_export {
843e19887f64dde75055cf8842fc4db2171eff45johnlev void * ie_uaddr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev void * ie_kaddr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev size_t ie_size;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint32_t ie_flags;
843e19887f64dde75055cf8842fc4db2171eff45johnlev} import_export_t;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic import_export_t null_ie = {NULL, NULL, 0, 0};
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define IE_IMPORT 0x0001 /* Data needs to be copied in */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define IE_EXPORT 0x0002 /* Data needs to be copied out */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define IE_FREE 0x0004
843e19887f64dde75055cf8842fc4db2171eff45johnlev#define IE_IMPEXP (IE_IMPORT | IE_EXPORT)
843e19887f64dde75055cf8842fc4db2171eff45johnlev
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybeestatic void *
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybeeuaddr_from_handle(void *field)
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee{
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee struct { void *p; } *hdl = field;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee void *ptr;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee /*LINTED: constant in conditional context*/
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee get_xen_guest_handle(ptr, (*hdl));
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee return (ptr);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee}
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Import a buffer from user-space. If the caller provides a kernel
843e19887f64dde75055cf8842fc4db2171eff45johnlev * address, we import to that address. If not, we kmem_alloc() the space
843e19887f64dde75055cf8842fc4db2171eff45johnlev * ourselves.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevimport_buffer(import_export_t *iep, void *uaddr, void *kaddr, size_t size,
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint32_t flags)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev iep->ie_uaddr = uaddr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev iep->ie_size = size;
843e19887f64dde75055cf8842fc4db2171eff45johnlev iep->ie_flags = flags & IE_EXPORT;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (size == 0 || uaddr == NULL) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev *iep = null_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (0);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (kaddr == NULL) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev iep->ie_kaddr = kmem_alloc(size, KM_SLEEP);
843e19887f64dde75055cf8842fc4db2171eff45johnlev iep->ie_flags |= IE_FREE;
843e19887f64dde75055cf8842fc4db2171eff45johnlev } else {
843e19887f64dde75055cf8842fc4db2171eff45johnlev iep->ie_kaddr = kaddr;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab iep->ie_flags &= ~IE_FREE;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ((flags & IE_IMPORT) &&
843e19887f64dde75055cf8842fc4db2171eff45johnlev (ddi_copyin(uaddr, iep->ie_kaddr, size, 0) != 0)) {
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (iep->ie_flags & IE_FREE) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev kmem_free(iep->ie_kaddr, iep->ie_size);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab iep->ie_kaddr = NULL;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab iep->ie_flags = 0;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab }
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EFAULT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (0);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic void
843e19887f64dde75055cf8842fc4db2171eff45johnlevexport_buffer(import_export_t *iep, int *error)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev int copy_err = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (iep->ie_size == 0 || iep->ie_uaddr == NULL)
843e19887f64dde75055cf8842fc4db2171eff45johnlev return;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * If the buffer was marked for export initially, and if the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * hypercall completed successfully, resync the user-space buffer
843e19887f64dde75055cf8842fc4db2171eff45johnlev * with our in-kernel buffer.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ((iep->ie_flags & IE_EXPORT) && (*error >= 0) &&
843e19887f64dde75055cf8842fc4db2171eff45johnlev (ddi_copyout(iep->ie_kaddr, iep->ie_uaddr, iep->ie_size, 0) != 0))
843e19887f64dde75055cf8842fc4db2171eff45johnlev copy_err = -X_EFAULT;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (iep->ie_flags & IE_FREE) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev kmem_free(iep->ie_kaddr, iep->ie_size);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab iep->ie_kaddr = NULL;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab iep->ie_flags = 0;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (copy_err != 0 && *error >= 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev *error = copy_err;
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Xen 'op' structures often include pointers disguised as 'handles', which
843e19887f64dde75055cf8842fc4db2171eff45johnlev * refer to addresses in user space. This routine copies a buffer
843e19887f64dde75055cf8842fc4db2171eff45johnlev * associated with an embedded pointer into kernel space, and replaces the
843e19887f64dde75055cf8842fc4db2171eff45johnlev * pointer to userspace with a pointer to the new kernel buffer.
843e19887f64dde75055cf8842fc4db2171eff45johnlev *
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Note: if Xen ever redefines the structure of a 'handle', this routine
843e19887f64dde75055cf8842fc4db2171eff45johnlev * (specifically the definition of 'hdl') will need to be updated.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevimport_handle(import_export_t *iep, void *field, size_t size, int flags)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct { void *p; } *hdl = field;
843e19887f64dde75055cf8842fc4db2171eff45johnlev void *ptr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int err;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee ptr = uaddr_from_handle(field);
843e19887f64dde75055cf8842fc4db2171eff45johnlev err = import_buffer(iep, ptr, NULL, size, (flags));
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (err == 0) {
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab /*LINTED: constant in conditional context*/
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab set_xen_guest_handle((*hdl), (void *)((iep)->ie_kaddr));
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab }
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (err);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevprivcmd_HYPERVISOR_mmu_update(mmu_update_t *ureq, int count, int *scount,
843e19887f64dde75055cf8842fc4db2171eff45johnlev domid_t domid)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev mmu_update_t *kreq, single_kreq;
843e19887f64dde75055cf8842fc4db2171eff45johnlev import_export_t cnt_ie, req_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int error, kscount, bytes;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev bytes = count * sizeof (*kreq);
843e19887f64dde75055cf8842fc4db2171eff45johnlev kreq = (count == 1) ? &single_kreq : kmem_alloc(bytes, KM_SLEEP);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_buffer(&cnt_ie, scount, &kscount, sizeof (kscount),
843e19887f64dde75055cf8842fc4db2171eff45johnlev IE_IMPEXP);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error != 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev req_ie = null_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev else
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_buffer(&req_ie, ureq, kreq, bytes, IE_IMPEXP);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV3(mmu__update__start, int, domid, int, count, mmu_update_t *,
843e19887f64dde75055cf8842fc4db2171eff45johnlev ((error == -X_EFAULT) ? ureq : kreq));
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = HYPERVISOR_mmu_update(kreq, count, &kscount, domid);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&cnt_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&req_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (count != 1)
843e19887f64dde75055cf8842fc4db2171eff45johnlev kmem_free(kreq, bytes);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(mmu__update__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevprivcmd_HYPERVISOR_domctl(xen_domctl_t *opp)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev xen_domctl_t op;
843e19887f64dde75055cf8842fc4db2171eff45johnlev import_export_t op_ie, sub_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int error = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if ((error = import_buffer(&op_ie, opp, &op, sizeof (op),
843e19887f64dde75055cf8842fc4db2171eff45johnlev IE_IMPEXP)) != 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev sub_ie = null_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Check this first because our wrapper will forcibly overwrite it.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (op.interface_version != XEN_DOMCTL_INTERFACE_VERSION) {
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#ifdef DEBUG
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab printf("domctl vers mismatch (cmd %d, found 0x%x, need 0x%x\n",
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab op.cmd, op.interface_version, XEN_DOMCTL_INTERFACE_VERSION);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = -X_EACCES;
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&op_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Now handle any domctl ops with embedded pointers elsewhere
843e19887f64dde75055cf8842fc4db2171eff45johnlev * in the user address space that also need to be tacked down
843e19887f64dde75055cf8842fc4db2171eff45johnlev * while the hypervisor futzes with them.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (op.cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_createdomain:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(dom__create__start, xen_domctl_t *,
843e19887f64dde75055cf8842fc4db2171eff45johnlev &op.u.createdomain);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_destroydomain:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(dom__destroy__start, domid_t, op.domain);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_pausedomain:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(dom__pause__start, domid_t, op.domain);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_unpausedomain:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(dom__unpause__start, domid_t, op.domain);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_getmemlist: {
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_handle(&sub_ie, &op.u.getmemlist.buffer,
843e19887f64dde75055cf8842fc4db2171eff45johnlev op.u.getmemlist.max_pfns * sizeof (xen_pfn_t), IE_EXPORT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_getpageframeinfo2: {
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_handle(&sub_ie, &op.u.getpageframeinfo2.array,
843e19887f64dde75055cf8842fc4db2171eff45johnlev op.u.getpageframeinfo2.num * sizeof (ulong_t), IE_IMPEXP);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_shadow_op: {
843e19887f64dde75055cf8842fc4db2171eff45johnlev size_t size;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = roundup(howmany(op.u.shadow_op.pages, NBBY),
843e19887f64dde75055cf8842fc4db2171eff45johnlev sizeof (ulong_t));
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab error = import_handle(&sub_ie,
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab &op.u.shadow_op.dirty_bitmap, size, IE_IMPEXP);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_setvcpucontext: {
843e19887f64dde75055cf8842fc4db2171eff45johnlev vcpu_guest_context_t *taddr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_handle(&sub_ie, &op.u.vcpucontext.ctxt,
843e19887f64dde75055cf8842fc4db2171eff45johnlev sizeof (vcpu_guest_context_t), IE_IMPORT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == -X_EFAULT)
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*LINTED: constant in conditional context*/
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab get_xen_guest_handle_u(taddr, op.u.vcpucontext.ctxt);
843e19887f64dde75055cf8842fc4db2171eff45johnlev else
843e19887f64dde75055cf8842fc4db2171eff45johnlev taddr = sub_ie.ie_kaddr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV2(setvcpucontext__start, domid_t, op.domain,
843e19887f64dde75055cf8842fc4db2171eff45johnlev vcpu_guest_context_t *, taddr);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_getvcpucontext: {
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_handle(&sub_ie, &op.u.vcpucontext.ctxt,
843e19887f64dde75055cf8842fc4db2171eff45johnlev sizeof (vcpu_guest_context_t), IE_EXPORT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab case XEN_DOMCTL_sethvmcontext: {
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab error = import_handle(&sub_ie, &op.u.hvmcontext.buffer,
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab op.u.hvmcontext.size, IE_IMPORT);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab break;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab }
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab case XEN_DOMCTL_gethvmcontext: {
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#if !defined(__GNUC__) && defined(__i386__)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (op.u.hvmcontext.buffer.u.p != NULL)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#else
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (op.u.hvmcontext.buffer.p != NULL)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#endif
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab error = import_handle(&sub_ie, &op.u.hvmcontext.buffer,
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab op.u.hvmcontext.size, IE_EXPORT);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab break;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab }
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_getdomaininfo:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_getpageframeinfo:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_max_mem:
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab case XEN_DOMCTL_resumedomain:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_getvcpuinfo:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_setvcpuaffinity:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_getvcpuaffinity:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_max_vcpus:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_scheduler_op:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_setdomainhandle:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_setdebugging:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_irq_permission:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_iomem_permission:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_ioport_permission:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_hypercall_init:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_arch_setup:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_settimeoffset:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_real_mode_area:
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab case XEN_DOMCTL_sendtrigger:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_assign_device:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_bind_pt_irq:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_get_address_size:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_set_address_size:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_get_ext_vcpucontext:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_set_ext_vcpucontext:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_set_opt_feature:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_memory_mapping:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_ioport_mapping:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_pin_mem_cacheattr:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_test_assign_device:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_set_target:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_deassign_device:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_set_cpuid:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_get_device_group:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_get_machine_address_size:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_set_machine_address_size:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_DOMCTL_suppress_spurious_page_faults:
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlev printf("unrecognized HYPERVISOR_domctl %d\n", op.cmd);
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = -X_EINVAL;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = HYPERVISOR_domctl(&op);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&op_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&sub_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (op.cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_createdomain:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(dom__create__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_destroydomain:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(dom__destroy__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_pausedomain:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(dom__pause__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_unpausedomain:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(dom__unpause__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_DOMCTL_setvcpucontext:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(setvcpucontext__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
843e19887f64dde75055cf8842fc4db2171eff45johnlev ;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevprivcmd_HYPERVISOR_sysctl(xen_sysctl_t *opp)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee xen_sysctl_t op, dop;
33649781048a478eaa5fa15460fc764530f86c8cmrj import_export_t op_ie, sub_ie, sub2_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int error = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (import_buffer(&op_ie, opp, &op, sizeof (op), IE_IMPEXP) != 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EFAULT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev sub_ie = null_ie;
33649781048a478eaa5fa15460fc764530f86c8cmrj sub2_ie = null_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Check this first because our wrapper will forcibly overwrite it.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (op.interface_version != XEN_SYSCTL_INTERFACE_VERSION) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = -X_EACCES;
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&op_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (op.cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_SYSCTL_readconsole: {
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_handle(&sub_ie, &op.u.readconsole.buffer,
843e19887f64dde75055cf8842fc4db2171eff45johnlev op.u.readconsole.count, IE_EXPORT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab case XEN_SYSCTL_debug_keys: {
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab error = import_handle(&sub_ie, &op.u.debug_keys.keys,
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab op.u.debug_keys.nr_keys, IE_IMPORT);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab break;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab }
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_SYSCTL_tbuf_op:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_SYSCTL_physinfo: {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee if (uaddr_from_handle(&op.u.physinfo.cpu_to_node) != NULL &&
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee op.u.physinfo.max_cpu_id != 0) {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = import_handle(&sub_ie,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee &op.u.physinfo.cpu_to_node,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee op.u.physinfo.max_cpu_id * sizeof (uint32_t),
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee IE_EXPORT);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee }
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee }
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_SYSCTL_sched_id:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_SYSCTL_availheap:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_SYSCTL_cpu_hotplug:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_SYSCTL_get_pmstat: {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee unsigned int maxs;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee switch (op.u.get_pmstat.type) {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case PMSTAT_get_pxstat:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee /*
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee * This interface is broken. Xen always copies out
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee * all the state information, and the interface
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee * does not specify how much space the caller has
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee * reserved. So, the only thing to do is just mirror
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee * the hypervisor and libxc behavior, and use the
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee * maximum amount of data.
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee */
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee dop.cmd = XEN_SYSCTL_get_pmstat;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee dop.interface_version = XEN_SYSCTL_INTERFACE_VERSION;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee dop.u.get_pmstat.cpuid = op.u.get_pmstat.cpuid;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee dop.u.get_pmstat.type = PMSTAT_get_max_px;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = HYPERVISOR_sysctl(&dop);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee if (error != 0)
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee maxs = dop.u.get_pmstat.u.getpx.total;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee if (maxs == 0) {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = -X_EINVAL;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee }
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = import_handle(&sub_ie,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee &op.u.get_pmstat.u.getpx.trans_pt,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee maxs * maxs * sizeof (uint64_t), IE_EXPORT);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee if (error != 0)
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = import_handle(&sub2_ie,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee &op.u.get_pmstat.u.getpx.pt,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee maxs * sizeof (pm_px_val_t), IE_EXPORT);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case PMSTAT_get_cxstat:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee /* See above */
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee dop.cmd = XEN_SYSCTL_get_pmstat;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee dop.interface_version = XEN_SYSCTL_INTERFACE_VERSION;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee dop.u.get_pmstat.cpuid = op.u.get_pmstat.cpuid;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee dop.u.get_pmstat.type = PMSTAT_get_max_cx;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = HYPERVISOR_sysctl(&dop);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee if (error != 0)
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee maxs = dop.u.get_pmstat.u.getcx.nr;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee if (maxs == 0) {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = -X_EINVAL;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee }
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = import_handle(&sub_ie,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee &op.u.get_pmstat.u.getcx.triggers,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee maxs * sizeof (uint64_t), IE_EXPORT);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee if (error != 0)
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = import_handle(&sub2_ie,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee &op.u.get_pmstat.u.getcx.residencies,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee maxs * sizeof (uint64_t), IE_EXPORT);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case PMSTAT_get_max_px:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case PMSTAT_reset_pxstat:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case PMSTAT_get_max_cx:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case PMSTAT_reset_cxstat:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee default:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = -X_EINVAL;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee }
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_SYSCTL_perfc_op: {
843e19887f64dde75055cf8842fc4db2171eff45johnlev xen_sysctl_perfc_desc_t *scdp;
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * If 'desc' is NULL, then the caller is asking for
843e19887f64dde75055cf8842fc4db2171eff45johnlev * the number of counters. If 'desc' is non-NULL,
843e19887f64dde75055cf8842fc4db2171eff45johnlev * then we need to know how many counters there are
843e19887f64dde75055cf8842fc4db2171eff45johnlev * before wiring down the output buffer appropriately.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*LINTED: constant in conditional context*/
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab get_xen_guest_handle_u(scdp, op.u.perfc_op.desc);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (scdp != NULL) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev static int numcounters = -1;
33649781048a478eaa5fa15460fc764530f86c8cmrj static int numvals = -1;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (numcounters == -1) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev dop.cmd = XEN_SYSCTL_perfc_op;
843e19887f64dde75055cf8842fc4db2171eff45johnlev dop.interface_version =
843e19887f64dde75055cf8842fc4db2171eff45johnlev XEN_SYSCTL_INTERFACE_VERSION;
843e19887f64dde75055cf8842fc4db2171eff45johnlev dop.u.perfc_op.cmd = XEN_SYSCTL_PERFCOP_query;
33649781048a478eaa5fa15460fc764530f86c8cmrj /*LINTED: constant in conditional context*/
33649781048a478eaa5fa15460fc764530f86c8cmrj set_xen_guest_handle_u(dop.u.perfc_op.desc,
33649781048a478eaa5fa15460fc764530f86c8cmrj NULL);
33649781048a478eaa5fa15460fc764530f86c8cmrj /*LINTED: constant in conditional context*/
33649781048a478eaa5fa15460fc764530f86c8cmrj set_xen_guest_handle_u(dop.u.perfc_op.val,
33649781048a478eaa5fa15460fc764530f86c8cmrj NULL);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = HYPERVISOR_sysctl(&dop);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error != 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev numcounters = dop.u.perfc_op.nr_counters;
33649781048a478eaa5fa15460fc764530f86c8cmrj numvals = dop.u.perfc_op.nr_vals;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev ASSERT(numcounters != -1);
33649781048a478eaa5fa15460fc764530f86c8cmrj ASSERT(numvals != -1);
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_handle(&sub_ie, &op.u.perfc_op.desc,
843e19887f64dde75055cf8842fc4db2171eff45johnlev (sizeof (xen_sysctl_perfc_desc_t) * numcounters),
843e19887f64dde75055cf8842fc4db2171eff45johnlev IE_EXPORT);
33649781048a478eaa5fa15460fc764530f86c8cmrj error = import_handle(&sub2_ie, &op.u.perfc_op.val,
33649781048a478eaa5fa15460fc764530f86c8cmrj (sizeof (xen_sysctl_perfc_val_t) * numvals),
33649781048a478eaa5fa15460fc764530f86c8cmrj IE_EXPORT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XEN_SYSCTL_getdomaininfolist: {
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_handle(&sub_ie, &op.u.getdomaininfolist.buffer,
843e19887f64dde75055cf8842fc4db2171eff45johnlev (op.u.getdomaininfolist.max_domains *
843e19887f64dde75055cf8842fc4db2171eff45johnlev sizeof (xen_domctl_getdomaininfo_t)), IE_EXPORT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab case XEN_SYSCTL_getcpuinfo:
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab error = import_handle(&sub_ie, &op.u.getcpuinfo.info,
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab op.u.getcpuinfo.max_cpus *
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab sizeof (xen_sysctl_cpuinfo_t), IE_EXPORT);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlev printf("unrecognized HYPERVISOR_sysctl %d\n", op.cmd);
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = -X_EINVAL;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = HYPERVISOR_sysctl(&op);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&op_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&sub_ie, &error);
33649781048a478eaa5fa15460fc764530f86c8cmrj export_buffer(&sub2_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevprivcmd_HYPERVISOR_platform_op(xen_platform_op_t *opp)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee import_export_t op_ie, sub_ie, sub2_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev xen_platform_op_t op;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int error;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (import_buffer(&op_ie, opp, &op, sizeof (op), IE_IMPEXP) != 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EFAULT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev sub_ie = null_ie;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee sub2_ie = null_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Check this first because our wrapper will forcibly overwrite it.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (op.interface_version != XENPF_INTERFACE_VERSION) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = -X_EACCES;
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&op_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * Now handle any platform ops with embedded pointers elsewhere
843e19887f64dde75055cf8842fc4db2171eff45johnlev * in the user address space that also need to be tacked down
843e19887f64dde75055cf8842fc4db2171eff45johnlev * while the hypervisor futzes with them.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (op.cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENPF_settime:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENPF_add_memtype:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENPF_del_memtype:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENPF_read_memtype:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENPF_platform_quirk:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XENPF_enter_acpi_sleep:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XENPF_change_freq:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XENPF_panic_init:
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENPF_microcode_update:
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_handle(&sub_ie, &op.u.microcode.data,
843e19887f64dde75055cf8842fc4db2171eff45johnlev op.u.microcode.length, IE_IMPORT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XENPF_getidletime:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = import_handle(&sub_ie, &op.u.getidletime.cpumap_bitmap,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee op.u.getidletime.cpumap_nr_cpus, IE_IMPEXP);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee if (error != 0)
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = import_handle(&sub2_ie, &op.u.getidletime.idletime,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee op.u.getidletime.cpumap_nr_cpus * sizeof (uint64_t),
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee IE_EXPORT);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XENPF_set_processor_pminfo: {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee size_t s;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee switch (op.u.set_pminfo.type) {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_PM_PX:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee s = op.u.set_pminfo.u.perf.state_count *
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee sizeof (xen_processor_px_t);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee if (op.u.set_pminfo.u.perf.flags & XEN_PX_PSS) {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = import_handle(&sub_ie,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee &op.u.set_pminfo.u.perf.states, s,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee IE_IMPORT);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee }
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_PM_CX:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee s = op.u.set_pminfo.u.power.count *
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee sizeof (xen_processor_cx_t);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = import_handle(&sub_ie,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee &op.u.set_pminfo.u.power.states, s, IE_IMPORT);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_PM_TX:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee default:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = -X_EINVAL;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee }
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee }
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XENPF_firmware_info: {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee uint16_t len;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee void *uaddr;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee switch (op.u.firmware_info.type) {
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_FW_DISK_INFO:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee /*
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee * Ugh.. another hokey interface. The first 16 bits
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee * of the buffer are also used as the (input) length.
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee */
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee uaddr = uaddr_from_handle(
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee &op.u.firmware_info.u.disk_info.edd_params);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = ddi_copyin(uaddr, &len, sizeof (len), 0);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee if (error != 0)
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = import_handle(&sub_ie,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee &op.u.firmware_info.u.disk_info.edd_params, len,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee IE_IMPEXP);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_FW_VBEDDC_INFO:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = import_handle(&sub_ie,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee &op.u.firmware_info.u.vbeddc_info.edid, 128,
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee IE_EXPORT);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case XEN_FW_DISK_MBR_SIGNATURE:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee default:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee }
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee }
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee /* FIXME: see this with non-existed ID 38 ???? */
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef DEBUG
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee printf("unrecognized HYPERVISOR_platform_op %d pid %d\n",
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee op.cmd, curthread->t_procp->p_pid);
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EINVAL);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = HYPERVISOR_platform_op(&op);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&op_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&sub_ie, &error);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee export_buffer(&sub2_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevprivcmd_HYPERVISOR_memory_op(int cmd, void *arg)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev int error = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev import_export_t op_ie, sub_ie, gpfn_ie, mfn_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev union {
843e19887f64dde75055cf8842fc4db2171eff45johnlev domid_t domid;
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xen_memory_reservation resv;
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xen_machphys_mfn_list xmml;
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xen_add_to_physmap xatp;
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xen_memory_map mm;
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xen_foreign_memory_map fmm;
525b892b4871655735786931d81ffcced2641b0dMark Johnson struct xen_pod_target pd;
843e19887f64dde75055cf8842fc4db2171eff45johnlev } op_arg;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev op_ie = sub_ie = gpfn_ie = mfn_ie = null_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_increase_reservation:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_decrease_reservation:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_populate_physmap: {
843e19887f64dde75055cf8842fc4db2171eff45johnlev ulong_t *taddr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (import_buffer(&op_ie, arg, &op_arg, sizeof (op_arg.resv),
843e19887f64dde75055cf8842fc4db2171eff45johnlev IE_IMPEXP) != 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EFAULT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_handle(&sub_ie, &op_arg.resv.extent_start,
843e19887f64dde75055cf8842fc4db2171eff45johnlev (op_arg.resv.nr_extents * sizeof (ulong_t)), IE_IMPEXP);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == -X_EFAULT)
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*LINTED: constant in conditional context*/
843e19887f64dde75055cf8842fc4db2171eff45johnlev get_xen_guest_handle(taddr, op_arg.resv.extent_start);
843e19887f64dde75055cf8842fc4db2171eff45johnlev else
843e19887f64dde75055cf8842fc4db2171eff45johnlev taddr = sub_ie.ie_kaddr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_increase_reservation:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV4(increase__reservation__start,
843e19887f64dde75055cf8842fc4db2171eff45johnlev domid_t, op_arg.resv.domid,
843e19887f64dde75055cf8842fc4db2171eff45johnlev ulong_t, op_arg.resv.nr_extents,
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint_t, op_arg.resv.extent_order,
843e19887f64dde75055cf8842fc4db2171eff45johnlev ulong_t *, taddr);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_decrease_reservation:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV4(decrease__reservation__start,
843e19887f64dde75055cf8842fc4db2171eff45johnlev domid_t, op_arg.resv.domid,
843e19887f64dde75055cf8842fc4db2171eff45johnlev ulong_t, op_arg.resv.nr_extents,
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint_t, op_arg.resv.extent_order,
843e19887f64dde75055cf8842fc4db2171eff45johnlev ulong_t *, taddr);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_populate_physmap:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV3(populate__physmap__start,
843e19887f64dde75055cf8842fc4db2171eff45johnlev domid_t, op_arg.resv.domid,
843e19887f64dde75055cf8842fc4db2171eff45johnlev ulong_t, op_arg.resv.nr_extents,
843e19887f64dde75055cf8842fc4db2171eff45johnlev ulong_t *, taddr);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_maximum_ram_page:
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_current_reservation:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_maximum_reservation:
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab case XENMEM_maximum_gpfn:
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (import_buffer(&op_ie, arg, &op_arg, sizeof (op_arg.domid),
843e19887f64dde75055cf8842fc4db2171eff45johnlev IE_IMPEXP) != 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EFAULT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_machphys_mfn_list: {
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (import_buffer(&op_ie, arg, &op_arg, sizeof (op_arg.xmml),
843e19887f64dde75055cf8842fc4db2171eff45johnlev IE_IMPEXP) != 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EFAULT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_handle(&sub_ie, &op_arg.xmml.extent_start,
843e19887f64dde75055cf8842fc4db2171eff45johnlev (op_arg.xmml.max_extents * sizeof (ulong_t)), IE_IMPEXP);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_add_to_physmap:
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (import_buffer(&op_ie, arg, &op_arg, sizeof (op_arg.xatp),
843e19887f64dde75055cf8842fc4db2171eff45johnlev IE_IMPEXP) != 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EFAULT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV4(add__to__physmap__start, domid_t,
843e19887f64dde75055cf8842fc4db2171eff45johnlev op_arg.xatp.domid, uint_t, op_arg.xatp.space, ulong_t,
843e19887f64dde75055cf8842fc4db2171eff45johnlev op_arg.xatp.idx, ulong_t, op_arg.xatp.gpfn);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_memory_map:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_machine_memory_map: {
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (import_buffer(&op_ie, arg, &op_arg, sizeof (op_arg.mm),
843e19887f64dde75055cf8842fc4db2171eff45johnlev IE_EXPORT) != 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EFAULT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * XXPV: ugh. e820entry is packed, but not in the kernel, since
843e19887f64dde75055cf8842fc4db2171eff45johnlev * we remove all attributes; seems like this is a nice way to
843e19887f64dde75055cf8842fc4db2171eff45johnlev * break mysteriously.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_handle(&sub_ie, &op_arg.mm.buffer,
843e19887f64dde75055cf8842fc4db2171eff45johnlev (op_arg.mm.nr_entries * 20), IE_IMPEXP);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_set_memory_map: {
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xen_memory_map *taddr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (import_buffer(&op_ie, arg, &op_arg, sizeof (op_arg.fmm),
843e19887f64dde75055cf8842fc4db2171eff45johnlev IE_IMPORT) != 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EFAULT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * As above.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_handle(&sub_ie, &op_arg.fmm.map.buffer,
843e19887f64dde75055cf8842fc4db2171eff45johnlev (op_arg.fmm.map.nr_entries * 20), IE_IMPEXP);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == -X_EFAULT)
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*LINTED: constant in conditional context*/
843e19887f64dde75055cf8842fc4db2171eff45johnlev get_xen_guest_handle(taddr, op_arg.fmm.map.buffer);
843e19887f64dde75055cf8842fc4db2171eff45johnlev else
843e19887f64dde75055cf8842fc4db2171eff45johnlev taddr = sub_ie.ie_kaddr;
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV3(set__memory__map__start, domid_t,
843e19887f64dde75055cf8842fc4db2171eff45johnlev op_arg.fmm.domid, int, op_arg.fmm.map.nr_entries,
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct xen_memory_map *, taddr);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
525b892b4871655735786931d81ffcced2641b0dMark Johnson case XENMEM_set_pod_target:
525b892b4871655735786931d81ffcced2641b0dMark Johnson case XENMEM_get_pod_target:
525b892b4871655735786931d81ffcced2641b0dMark Johnson if (import_buffer(&op_ie, arg, &op_arg, sizeof (op_arg.pd),
525b892b4871655735786931d81ffcced2641b0dMark Johnson IE_IMPEXP) != 0)
525b892b4871655735786931d81ffcced2641b0dMark Johnson return (-X_EFAULT);
525b892b4871655735786931d81ffcced2641b0dMark Johnson break;
525b892b4871655735786931d81ffcced2641b0dMark Johnson
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlev printf("unrecognized HYPERVISOR_memory_op %d\n", cmd);
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EINVAL);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = HYPERVISOR_memory_op(cmd,
843e19887f64dde75055cf8842fc4db2171eff45johnlev (arg == NULL) ? NULL: &op_arg);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&op_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&sub_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&gpfn_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&mfn_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_increase_reservation:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(increase__reservation__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_decrease_reservation:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(decrease__reservation__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_populate_physmap:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(populate__physmap__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_add_to_physmap:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(add__to__physmap__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENMEM_set_memory_map:
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(set__memory__map__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevprivcmd_HYPERVISOR_event_channel_op(int cmd, void *arg)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev int error;
843e19887f64dde75055cf8842fc4db2171eff45johnlev size_t size;
843e19887f64dde75055cf8842fc4db2171eff45johnlev import_export_t op_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint32_t flags;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case EVTCHNOP_alloc_unbound:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (evtchn_alloc_unbound_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev flags = IE_IMPEXP;
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case EVTCHNOP_bind_interdomain:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (evtchn_bind_interdomain_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev flags = IE_IMPEXP;
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case EVTCHNOP_bind_virq:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (evtchn_bind_virq_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev flags = IE_IMPEXP;
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case EVTCHNOP_bind_pirq:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (evtchn_bind_pirq_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev flags = IE_IMPEXP;
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case EVTCHNOP_bind_ipi:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (evtchn_bind_ipi_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev flags = IE_IMPEXP;
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case EVTCHNOP_close:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (evtchn_close_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev flags = IE_IMPORT;
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case EVTCHNOP_send:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (evtchn_send_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev flags = IE_IMPORT;
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case EVTCHNOP_status:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (evtchn_status_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev flags = IE_IMPEXP;
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case EVTCHNOP_bind_vcpu:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (evtchn_bind_vcpu_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev flags = IE_IMPORT;
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case EVTCHNOP_unmask:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (evtchn_unmask_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev flags = IE_IMPORT;
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab case EVTCHNOP_reset:
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab size = sizeof (evtchn_reset_t);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab flags = IE_IMPORT;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlev printf("unrecognized HYPERVISOR_event_channel op %d\n", cmd);
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EINVAL);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_buffer(&op_ie, arg, NULL, size, flags);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev /*
843e19887f64dde75055cf8842fc4db2171eff45johnlev * If there is sufficient demand, we can replace this void * with
843e19887f64dde75055cf8842fc4db2171eff45johnlev * the proper op structure pointer.
843e19887f64dde75055cf8842fc4db2171eff45johnlev */
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV2(evtchn__op__start, int, cmd, void *,
843e19887f64dde75055cf8842fc4db2171eff45johnlev ((error == -X_EFAULT) ? arg : op_ie.ie_kaddr));
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = HYPERVISOR_event_channel_op(cmd, op_ie.ie_kaddr);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&op_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(evtchn__op__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevprivcmd_HYPERVISOR_xen_version(int cmd, void *arg)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev int error;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int size = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev import_export_t op_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint32_t flags = IE_EXPORT;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENVER_version:
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENVER_extraversion:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (xen_extraversion_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENVER_compile_info:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (xen_compile_info_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENVER_capabilities:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (xen_capabilities_info_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENVER_changeset:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (xen_changeset_info_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENVER_platform_parameters:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (xen_platform_parameters_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENVER_get_features:
843e19887f64dde75055cf8842fc4db2171eff45johnlev flags = IE_IMPEXP;
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (xen_feature_info_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENVER_pagesize:
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case XENVER_guest_handle:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (xen_domain_handle_t);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlev printf("unrecognized HYPERVISOR_xen_version op %d\n", cmd);
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EINVAL);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_buffer(&op_ie, arg, NULL, size, flags);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = HYPERVISOR_xen_version(cmd, op_ie.ie_kaddr);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&op_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybeeprivcmd_HYPERVISOR_xsm_op(void *uacmctl)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev int error;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab struct xen_acmctl *acmctl;
843e19887f64dde75055cf8842fc4db2171eff45johnlev import_export_t op_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab error = import_buffer(&op_ie, uacmctl, NULL, sizeof (*acmctl),
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab IE_IMPEXP);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (error != 0)
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab return (error);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab acmctl = op_ie.ie_kaddr;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab if (acmctl->interface_version != ACM_INTERFACE_VERSION) {
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#ifdef DEBUG
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab printf("acm vers mismatch (cmd %d, found 0x%x, need 0x%x\n",
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab acmctl->cmd, acmctl->interface_version,
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab ACM_INTERFACE_VERSION);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab#endif
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab error = -X_EACCES;
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab export_buffer(&op_ie, &error);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab return (error);
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab }
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee /* FIXME: flask ops??? */
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab switch (acmctl->cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case ACMOP_setpolicy:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case ACMOP_getpolicy:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case ACMOP_dumpstats:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case ACMOP_getssid:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case ACMOP_getdecision:
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab case ACMOP_chgpolicy:
a576ab5b6e08c47732b3dedca9eaa8a8cbb85720rab case ACMOP_relabeldoms:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee /* flags = IE_IMPEXP; */
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef DEBUG
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee printf("unrecognized HYPERVISOR_xsm_op op %d\n", acmctl->cmd);
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EINVAL);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == 0)
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = HYPERVISOR_xsm_op(acmctl);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&op_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevprivcmd_HYPERVISOR_mmuext_op(struct mmuext_op *op, int count, uint_t *scount,
843e19887f64dde75055cf8842fc4db2171eff45johnlev domid_t domid)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev int error, bytes;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint_t kscount;
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct mmuext_op *kop, single_kop;
843e19887f64dde75055cf8842fc4db2171eff45johnlev import_export_t op_ie, scnt_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev op_ie = scnt_ie = null_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (count >= 1) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev bytes = count * sizeof (*kop);
843e19887f64dde75055cf8842fc4db2171eff45johnlev kop = (count == 1) ? &single_kop : kmem_alloc(bytes, KM_SLEEP);
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_buffer(&op_ie, op, kop, bytes, IE_IMPORT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV2(mmu__ext__op__start, int, count, struct mmuext_op *,
843e19887f64dde75055cf8842fc4db2171eff45johnlev ((error == -X_EFAULT) ? op : kop));
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (scount != NULL && error == 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_buffer(&scnt_ie, scount, &kscount,
843e19887f64dde75055cf8842fc4db2171eff45johnlev sizeof (kscount), IE_EXPORT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = HYPERVISOR_mmuext_op(kop, count, &kscount, domid);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&op_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&scnt_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev DTRACE_XPV1(mmu__ext__op__end, int, error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (count > 1)
843e19887f64dde75055cf8842fc4db2171eff45johnlev kmem_free(kop, bytes);
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevprivcmd_HYPERVISOR_hvm_op(int cmd, void *arg)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev int error;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int size = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev import_export_t arg_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev uint32_t flags = IE_IMPORT;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case HVMOP_set_param:
843e19887f64dde75055cf8842fc4db2171eff45johnlev case HVMOP_get_param:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (struct xen_hvm_param);
843e19887f64dde75055cf8842fc4db2171eff45johnlev flags = IE_IMPEXP;
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case HVMOP_set_pci_intx_level:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (struct xen_hvm_set_pci_intx_level);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case HVMOP_set_isa_irq_level:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (struct xen_hvm_set_isa_irq_level);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case HVMOP_set_pci_link_route:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (struct xen_hvm_set_pci_link_route);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case HVMOP_track_dirty_vram:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee size = sizeof (struct xen_hvm_track_dirty_vram);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case HVMOP_modified_memory:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee size = sizeof (struct xen_hvm_modified_memory);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case HVMOP_set_mem_type:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee size = sizeof (struct xen_hvm_set_mem_type);
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlev printf("unrecognized HVM op 0x%x\n", cmd);
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EINVAL);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_buffer(&arg_ie, arg, NULL, size, flags);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = HYPERVISOR_hvm_op(cmd, arg_ie.ie_kaddr);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&arg_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevstatic int
843e19887f64dde75055cf8842fc4db2171eff45johnlevprivcmd_HYPERVISOR_sched_op(int cmd, void *arg)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev int error;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int size = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev import_export_t op_ie;
843e19887f64dde75055cf8842fc4db2171eff45johnlev struct sched_remote_shutdown op;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (cmd) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case SCHEDOP_remote_shutdown:
843e19887f64dde75055cf8842fc4db2171eff45johnlev size = sizeof (struct sched_remote_shutdown);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlev printf("unrecognized sched op 0x%x\n", cmd);
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (-X_EINVAL);
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = import_buffer(&op_ie, arg, &op, size, IE_IMPORT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error == 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = HYPERVISOR_sched_op(cmd, (arg == NULL) ? NULL : &op);
843e19887f64dde75055cf8842fc4db2171eff45johnlev export_buffer(&op_ie, &error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlevint allow_all_hypercalls = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlevint privcmd_efault_debug = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev/*ARGSUSED*/
843e19887f64dde75055cf8842fc4db2171eff45johnlevint
843e19887f64dde75055cf8842fc4db2171eff45johnlevdo_privcmd_hypercall(void *uarg, int mode, cred_t *cr, int *rval)
843e19887f64dde75055cf8842fc4db2171eff45johnlev{
843e19887f64dde75055cf8842fc4db2171eff45johnlev privcmd_hypercall_t __hc, *hc = &__hc;
843e19887f64dde75055cf8842fc4db2171eff45johnlev int error;
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (ddi_copyin(uarg, hc, sizeof (*hc), mode))
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (EFAULT);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev switch (hc->op) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev case __HYPERVISOR_mmu_update:
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = privcmd_HYPERVISOR_mmu_update(
843e19887f64dde75055cf8842fc4db2171eff45johnlev (mmu_update_t *)hc->arg[0], (int)hc->arg[1],
843e19887f64dde75055cf8842fc4db2171eff45johnlev (int *)hc->arg[2], (domid_t)hc->arg[3]);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case __HYPERVISOR_domctl:
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = privcmd_HYPERVISOR_domctl(
843e19887f64dde75055cf8842fc4db2171eff45johnlev (xen_domctl_t *)hc->arg[0]);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case __HYPERVISOR_sysctl:
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = privcmd_HYPERVISOR_sysctl(
843e19887f64dde75055cf8842fc4db2171eff45johnlev (xen_sysctl_t *)hc->arg[0]);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case __HYPERVISOR_platform_op:
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = privcmd_HYPERVISOR_platform_op(
843e19887f64dde75055cf8842fc4db2171eff45johnlev (xen_platform_op_t *)hc->arg[0]);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case __HYPERVISOR_memory_op:
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = privcmd_HYPERVISOR_memory_op(
843e19887f64dde75055cf8842fc4db2171eff45johnlev (int)hc->arg[0], (void *)hc->arg[1]);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case __HYPERVISOR_event_channel_op:
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = privcmd_HYPERVISOR_event_channel_op(
843e19887f64dde75055cf8842fc4db2171eff45johnlev (int)hc->arg[0], (void *)hc->arg[1]);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case __HYPERVISOR_xen_version:
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = privcmd_HYPERVISOR_xen_version(
843e19887f64dde75055cf8842fc4db2171eff45johnlev (int)hc->arg[0], (void *)hc->arg[1]);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case __HYPERVISOR_mmuext_op:
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = privcmd_HYPERVISOR_mmuext_op(
843e19887f64dde75055cf8842fc4db2171eff45johnlev (struct mmuext_op *)hc->arg[0], (int)hc->arg[1],
843e19887f64dde75055cf8842fc4db2171eff45johnlev (uint_t *)hc->arg[2], (domid_t)hc->arg[3]);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee case __HYPERVISOR_xsm_op:
349b53dd4e695e3d833b5380540385145b2d3ae8Stuart Maybee error = privcmd_HYPERVISOR_xsm_op((void *)hc->arg[0]);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case __HYPERVISOR_hvm_op:
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = privcmd_HYPERVISOR_hvm_op(
843e19887f64dde75055cf8842fc4db2171eff45johnlev (int)hc->arg[0], (void *)hc->arg[1]);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev case __HYPERVISOR_sched_op:
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = privcmd_HYPERVISOR_sched_op(
843e19887f64dde75055cf8842fc4db2171eff45johnlev (int)hc->arg[0], (void *)hc->arg[1]);
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev default:
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (allow_all_hypercalls)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = __hypercall5(hc->op, hc->arg[0], hc->arg[1],
843e19887f64dde75055cf8842fc4db2171eff45johnlev hc->arg[2], hc->arg[3], hc->arg[4]);
843e19887f64dde75055cf8842fc4db2171eff45johnlev else {
843e19887f64dde75055cf8842fc4db2171eff45johnlev#ifdef DEBUG
843e19887f64dde75055cf8842fc4db2171eff45johnlev printf("unrecognized hypercall %ld\n", hc->op);
843e19887f64dde75055cf8842fc4db2171eff45johnlev#endif
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = -X_EPERM;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev break;
843e19887f64dde75055cf8842fc4db2171eff45johnlev }
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev if (error > 0) {
843e19887f64dde75055cf8842fc4db2171eff45johnlev *rval = error;
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = 0;
843e19887f64dde75055cf8842fc4db2171eff45johnlev } else if (error != 0)
843e19887f64dde75055cf8842fc4db2171eff45johnlev error = xen_xlate_errcode(error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev
843e19887f64dde75055cf8842fc4db2171eff45johnlev return (error);
843e19887f64dde75055cf8842fc4db2171eff45johnlev}