xref: /freebsd/lib/libvmmapi/riscv/vmmapi_machdep.c (revision 7ab1a32cd43cbae61ad4dd435d6a482bbf61cb52)
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