1*7ab1a32cSRuslan Bukin /*- 2*7ab1a32cSRuslan Bukin * SPDX-License-Identifier: BSD-2-Clause 3*7ab1a32cSRuslan Bukin * 4*7ab1a32cSRuslan Bukin * Copyright (c) 2011 NetApp, Inc. 5*7ab1a32cSRuslan Bukin * All rights reserved. 6*7ab1a32cSRuslan Bukin * 7*7ab1a32cSRuslan Bukin * Redistribution and use in source and binary forms, with or without 8*7ab1a32cSRuslan Bukin * modification, are permitted provided that the following conditions 9*7ab1a32cSRuslan Bukin * are met: 10*7ab1a32cSRuslan Bukin * 1. Redistributions of source code must retain the above copyright 11*7ab1a32cSRuslan Bukin * notice, this list of conditions and the following disclaimer. 12*7ab1a32cSRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright 13*7ab1a32cSRuslan Bukin * notice, this list of conditions and the following disclaimer in the 14*7ab1a32cSRuslan Bukin * documentation and/or other materials provided with the distribution. 15*7ab1a32cSRuslan Bukin * 16*7ab1a32cSRuslan Bukin * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND 17*7ab1a32cSRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*7ab1a32cSRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*7ab1a32cSRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE 20*7ab1a32cSRuslan Bukin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*7ab1a32cSRuslan Bukin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*7ab1a32cSRuslan Bukin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*7ab1a32cSRuslan Bukin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*7ab1a32cSRuslan Bukin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*7ab1a32cSRuslan Bukin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*7ab1a32cSRuslan Bukin * SUCH DAMAGE. 27*7ab1a32cSRuslan Bukin */ 28*7ab1a32cSRuslan Bukin 29*7ab1a32cSRuslan Bukin #include <sys/types.h> 30*7ab1a32cSRuslan Bukin #include <sys/ioctl.h> 31*7ab1a32cSRuslan Bukin 32*7ab1a32cSRuslan Bukin #include <machine/vmm.h> 33*7ab1a32cSRuslan Bukin #include <machine/vmm_dev.h> 34*7ab1a32cSRuslan Bukin #include <machine/vmm_snapshot.h> 35*7ab1a32cSRuslan Bukin 36*7ab1a32cSRuslan Bukin #include <assert.h> 37*7ab1a32cSRuslan Bukin #include <string.h> 38*7ab1a32cSRuslan Bukin 39*7ab1a32cSRuslan Bukin #include "vmmapi.h" 40*7ab1a32cSRuslan Bukin #include "internal.h" 41*7ab1a32cSRuslan Bukin 42*7ab1a32cSRuslan Bukin const char *vm_capstrmap[] = { 43*7ab1a32cSRuslan Bukin [VM_CAP_MAX] = NULL, 44*7ab1a32cSRuslan Bukin }; 45*7ab1a32cSRuslan Bukin 46*7ab1a32cSRuslan Bukin #define VM_MD_IOCTLS \ 47*7ab1a32cSRuslan Bukin VM_ATTACH_APLIC, \ 48*7ab1a32cSRuslan Bukin VM_ASSERT_IRQ, \ 49*7ab1a32cSRuslan Bukin VM_DEASSERT_IRQ, \ 50*7ab1a32cSRuslan Bukin VM_RAISE_MSI 51*7ab1a32cSRuslan Bukin 52*7ab1a32cSRuslan Bukin const cap_ioctl_t vm_ioctl_cmds[] = { 53*7ab1a32cSRuslan Bukin VM_COMMON_IOCTLS, 54*7ab1a32cSRuslan Bukin VM_MD_IOCTLS, 55*7ab1a32cSRuslan Bukin }; 56*7ab1a32cSRuslan Bukin size_t vm_ioctl_ncmds = nitems(vm_ioctl_cmds); 57*7ab1a32cSRuslan Bukin 58*7ab1a32cSRuslan Bukin int 59*7ab1a32cSRuslan Bukin vm_attach_aplic(struct vmctx *ctx, uint64_t mem_start, size_t mem_size) 60*7ab1a32cSRuslan Bukin { 61*7ab1a32cSRuslan Bukin struct vm_aplic_descr aplic; 62*7ab1a32cSRuslan Bukin 63*7ab1a32cSRuslan Bukin bzero(&aplic, sizeof(aplic)); 64*7ab1a32cSRuslan Bukin aplic.mem_start = mem_start; 65*7ab1a32cSRuslan Bukin aplic.mem_size = mem_size; 66*7ab1a32cSRuslan Bukin 67*7ab1a32cSRuslan Bukin return (ioctl(ctx->fd, VM_ATTACH_APLIC, &aplic)); 68*7ab1a32cSRuslan Bukin } 69*7ab1a32cSRuslan Bukin 70*7ab1a32cSRuslan Bukin int 71*7ab1a32cSRuslan Bukin vm_assert_irq(struct vmctx *ctx, uint32_t irq) 72*7ab1a32cSRuslan Bukin { 73*7ab1a32cSRuslan Bukin struct vm_irq vi; 74*7ab1a32cSRuslan Bukin 75*7ab1a32cSRuslan Bukin bzero(&vi, sizeof(vi)); 76*7ab1a32cSRuslan Bukin vi.irq = irq; 77*7ab1a32cSRuslan Bukin 78*7ab1a32cSRuslan Bukin return (ioctl(ctx->fd, VM_ASSERT_IRQ, &vi)); 79*7ab1a32cSRuslan Bukin } 80*7ab1a32cSRuslan Bukin 81*7ab1a32cSRuslan Bukin int 82*7ab1a32cSRuslan Bukin vm_deassert_irq(struct vmctx *ctx, uint32_t irq) 83*7ab1a32cSRuslan Bukin { 84*7ab1a32cSRuslan Bukin struct vm_irq vi; 85*7ab1a32cSRuslan Bukin 86*7ab1a32cSRuslan Bukin bzero(&vi, sizeof(vi)); 87*7ab1a32cSRuslan Bukin vi.irq = irq; 88*7ab1a32cSRuslan Bukin 89*7ab1a32cSRuslan Bukin return (ioctl(ctx->fd, VM_DEASSERT_IRQ, &vi)); 90*7ab1a32cSRuslan Bukin } 91*7ab1a32cSRuslan Bukin 92*7ab1a32cSRuslan Bukin int 93*7ab1a32cSRuslan Bukin vm_raise_msi(struct vmctx *ctx, uint64_t addr, uint64_t msg, 94*7ab1a32cSRuslan Bukin int bus, int slot, int func) 95*7ab1a32cSRuslan Bukin { 96*7ab1a32cSRuslan Bukin struct vm_msi vmsi; 97*7ab1a32cSRuslan Bukin 98*7ab1a32cSRuslan Bukin bzero(&vmsi, sizeof(vmsi)); 99*7ab1a32cSRuslan Bukin vmsi.addr = addr; 100*7ab1a32cSRuslan Bukin vmsi.msg = msg; 101*7ab1a32cSRuslan Bukin vmsi.bus = bus; 102*7ab1a32cSRuslan Bukin vmsi.slot = slot; 103*7ab1a32cSRuslan Bukin vmsi.func = func; 104*7ab1a32cSRuslan Bukin 105*7ab1a32cSRuslan Bukin return (ioctl(ctx->fd, VM_RAISE_MSI, &vmsi)); 106*7ab1a32cSRuslan Bukin } 107*7ab1a32cSRuslan Bukin 108*7ab1a32cSRuslan Bukin int 109*7ab1a32cSRuslan Bukin vm_inject_exception(struct vcpu *vcpu, uint64_t scause) 110*7ab1a32cSRuslan Bukin { 111*7ab1a32cSRuslan Bukin struct vm_exception vmexc; 112*7ab1a32cSRuslan Bukin 113*7ab1a32cSRuslan Bukin bzero(&vmexc, sizeof(vmexc)); 114*7ab1a32cSRuslan Bukin vmexc.scause = scause; 115*7ab1a32cSRuslan Bukin 116*7ab1a32cSRuslan Bukin return (vcpu_ioctl(vcpu, VM_INJECT_EXCEPTION, &vmexc)); 117*7ab1a32cSRuslan Bukin } 118