17ab1a32cSRuslan Bukin /*- 27ab1a32cSRuslan Bukin * SPDX-License-Identifier: BSD-2-Clause 37ab1a32cSRuslan Bukin * 47ab1a32cSRuslan Bukin * Copyright (c) 2011 NetApp, Inc. 57ab1a32cSRuslan Bukin * All rights reserved. 67ab1a32cSRuslan Bukin * 77ab1a32cSRuslan Bukin * Redistribution and use in source and binary forms, with or without 87ab1a32cSRuslan Bukin * modification, are permitted provided that the following conditions 97ab1a32cSRuslan Bukin * are met: 107ab1a32cSRuslan Bukin * 1. Redistributions of source code must retain the above copyright 117ab1a32cSRuslan Bukin * notice, this list of conditions and the following disclaimer. 127ab1a32cSRuslan Bukin * 2. Redistributions in binary form must reproduce the above copyright 137ab1a32cSRuslan Bukin * notice, this list of conditions and the following disclaimer in the 147ab1a32cSRuslan Bukin * documentation and/or other materials provided with the distribution. 157ab1a32cSRuslan Bukin * 167ab1a32cSRuslan Bukin * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND 177ab1a32cSRuslan Bukin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 187ab1a32cSRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 197ab1a32cSRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE 207ab1a32cSRuslan Bukin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 217ab1a32cSRuslan Bukin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 227ab1a32cSRuslan Bukin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 237ab1a32cSRuslan Bukin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 247ab1a32cSRuslan Bukin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 257ab1a32cSRuslan Bukin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 267ab1a32cSRuslan Bukin * SUCH DAMAGE. 277ab1a32cSRuslan Bukin */ 287ab1a32cSRuslan Bukin 297ab1a32cSRuslan Bukin #include <sys/types.h> 307ab1a32cSRuslan Bukin #include <sys/ioctl.h> 317ab1a32cSRuslan Bukin 327ab1a32cSRuslan Bukin #include <machine/vmm.h> 337ab1a32cSRuslan Bukin #include <machine/vmm_dev.h> 347ab1a32cSRuslan Bukin #include <machine/vmm_snapshot.h> 357ab1a32cSRuslan Bukin 367ab1a32cSRuslan Bukin #include <assert.h> 377ab1a32cSRuslan Bukin #include <string.h> 387ab1a32cSRuslan Bukin 397ab1a32cSRuslan Bukin #include "vmmapi.h" 407ab1a32cSRuslan Bukin #include "internal.h" 417ab1a32cSRuslan Bukin 427ab1a32cSRuslan Bukin const char *vm_capstrmap[] = { 43*a7bf553dSRuslan Bukin [VM_CAP_SSTC] = "sstc", 447ab1a32cSRuslan Bukin [VM_CAP_MAX] = NULL, 457ab1a32cSRuslan Bukin }; 467ab1a32cSRuslan Bukin 477ab1a32cSRuslan Bukin #define VM_MD_IOCTLS \ 487ab1a32cSRuslan Bukin VM_ATTACH_APLIC, \ 497ab1a32cSRuslan Bukin VM_ASSERT_IRQ, \ 507ab1a32cSRuslan Bukin VM_DEASSERT_IRQ, \ 517ab1a32cSRuslan Bukin VM_RAISE_MSI 527ab1a32cSRuslan Bukin 537ab1a32cSRuslan Bukin const cap_ioctl_t vm_ioctl_cmds[] = { 547ab1a32cSRuslan Bukin VM_COMMON_IOCTLS, 557ab1a32cSRuslan Bukin VM_MD_IOCTLS, 567ab1a32cSRuslan Bukin }; 577ab1a32cSRuslan Bukin size_t vm_ioctl_ncmds = nitems(vm_ioctl_cmds); 587ab1a32cSRuslan Bukin 597ab1a32cSRuslan Bukin int 607ab1a32cSRuslan Bukin vm_attach_aplic(struct vmctx *ctx, uint64_t mem_start, size_t mem_size) 617ab1a32cSRuslan Bukin { 627ab1a32cSRuslan Bukin struct vm_aplic_descr aplic; 637ab1a32cSRuslan Bukin 647ab1a32cSRuslan Bukin bzero(&aplic, sizeof(aplic)); 657ab1a32cSRuslan Bukin aplic.mem_start = mem_start; 667ab1a32cSRuslan Bukin aplic.mem_size = mem_size; 677ab1a32cSRuslan Bukin 687ab1a32cSRuslan Bukin return (ioctl(ctx->fd, VM_ATTACH_APLIC, &aplic)); 697ab1a32cSRuslan Bukin } 707ab1a32cSRuslan Bukin 717ab1a32cSRuslan Bukin int 727ab1a32cSRuslan Bukin vm_assert_irq(struct vmctx *ctx, uint32_t irq) 737ab1a32cSRuslan Bukin { 747ab1a32cSRuslan Bukin struct vm_irq vi; 757ab1a32cSRuslan Bukin 767ab1a32cSRuslan Bukin bzero(&vi, sizeof(vi)); 777ab1a32cSRuslan Bukin vi.irq = irq; 787ab1a32cSRuslan Bukin 797ab1a32cSRuslan Bukin return (ioctl(ctx->fd, VM_ASSERT_IRQ, &vi)); 807ab1a32cSRuslan Bukin } 817ab1a32cSRuslan Bukin 827ab1a32cSRuslan Bukin int 837ab1a32cSRuslan Bukin vm_deassert_irq(struct vmctx *ctx, uint32_t irq) 847ab1a32cSRuslan Bukin { 857ab1a32cSRuslan Bukin struct vm_irq vi; 867ab1a32cSRuslan Bukin 877ab1a32cSRuslan Bukin bzero(&vi, sizeof(vi)); 887ab1a32cSRuslan Bukin vi.irq = irq; 897ab1a32cSRuslan Bukin 907ab1a32cSRuslan Bukin return (ioctl(ctx->fd, VM_DEASSERT_IRQ, &vi)); 917ab1a32cSRuslan Bukin } 927ab1a32cSRuslan Bukin 937ab1a32cSRuslan Bukin int 947ab1a32cSRuslan Bukin vm_raise_msi(struct vmctx *ctx, uint64_t addr, uint64_t msg, 957ab1a32cSRuslan Bukin int bus, int slot, int func) 967ab1a32cSRuslan Bukin { 977ab1a32cSRuslan Bukin struct vm_msi vmsi; 987ab1a32cSRuslan Bukin 997ab1a32cSRuslan Bukin bzero(&vmsi, sizeof(vmsi)); 1007ab1a32cSRuslan Bukin vmsi.addr = addr; 1017ab1a32cSRuslan Bukin vmsi.msg = msg; 1027ab1a32cSRuslan Bukin vmsi.bus = bus; 1037ab1a32cSRuslan Bukin vmsi.slot = slot; 1047ab1a32cSRuslan Bukin vmsi.func = func; 1057ab1a32cSRuslan Bukin 1067ab1a32cSRuslan Bukin return (ioctl(ctx->fd, VM_RAISE_MSI, &vmsi)); 1077ab1a32cSRuslan Bukin } 1087ab1a32cSRuslan Bukin 1097ab1a32cSRuslan Bukin int 1107ab1a32cSRuslan Bukin vm_inject_exception(struct vcpu *vcpu, uint64_t scause) 1117ab1a32cSRuslan Bukin { 1127ab1a32cSRuslan Bukin struct vm_exception vmexc; 1137ab1a32cSRuslan Bukin 1147ab1a32cSRuslan Bukin bzero(&vmexc, sizeof(vmexc)); 1157ab1a32cSRuslan Bukin vmexc.scause = scause; 1167ab1a32cSRuslan Bukin 1177ab1a32cSRuslan Bukin return (vcpu_ioctl(vcpu, VM_INJECT_EXCEPTION, &vmexc)); 1187ab1a32cSRuslan Bukin } 119