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
vm_attach_aplic(struct vmctx * ctx,uint64_t mem_start,size_t mem_size)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
vm_assert_irq(struct vmctx * ctx,uint32_t irq)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
vm_deassert_irq(struct vmctx * ctx,uint32_t irq)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
vm_raise_msi(struct vmctx * ctx,uint64_t addr,uint64_t msg,int bus,int slot,int func)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
vm_inject_exception(struct vcpu * vcpu,uint64_t scause)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