xref: /dragonfly/sys/dev/virtual/nvmm/nvmm_internal.h (revision 7a6db4cc)
1 /*	$NetBSD: nvmm_internal.h,v 1.12.2.5 2020/08/18 09:29:52 martin Exp $	*/
2 
3 /*
4  * Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Maxime Villard.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef _NVMM_INTERNAL_H_
33 #define _NVMM_INTERNAL_H_
34 
35 #define NVMM_MAX_MACHINES	128
36 #define NVMM_MAX_VCPUS		256
37 #define NVMM_MAX_HMAPPINGS	32
38 #define NVMM_MAX_RAM		(128ULL * (1 << 30))
39 
40 struct nvmm_owner {
41 	pid_t pid;
42 };
43 
44 struct nvmm_cpu {
45 	/* Shared. */
46 	bool present;
47 	nvmm_cpuid_t cpuid;
48 	kmutex_t lock;
49 
50 	/* Comm page. */
51 	struct nvmm_comm_page *comm;
52 
53 	/* Last host CPU on which the VCPU ran. */
54 	int hcpu_last;
55 
56 	/* Implementation-specific. */
57 	void *cpudata;
58 };
59 
60 struct nvmm_hmapping {
61 	bool present;
62 	uintptr_t hva;
63 	size_t size;
64 	struct uvm_object *uobj;
65 };
66 
67 struct nvmm_machine {
68 	bool present;
69 	nvmm_machid_t machid;
70 	time_t time;
71 	struct nvmm_owner *owner;
72 	krwlock_t lock;
73 
74 	/* Comm */
75 	struct uvm_object *commuobj;
76 
77 	/* Kernel */
78 	struct vmspace *vm;
79 	gpaddr_t gpa_begin;
80 	gpaddr_t gpa_end;
81 
82 	/* Host Mappings */
83 	struct nvmm_hmapping hmap[NVMM_MAX_HMAPPINGS];
84 
85 	/* CPU */
86 	volatile unsigned int ncpus;
87 	struct nvmm_cpu cpus[NVMM_MAX_VCPUS];
88 
89 	/* Implementation-specific */
90 	void *machdata;
91 };
92 
93 struct nvmm_impl {
94 	const char *name;
95 	bool (*ident)(void);
96 	void (*init)(void);
97 	void (*fini)(void);
98 	void (*capability)(struct nvmm_capability *);
99 
100 	size_t mach_conf_max;
101 	const size_t *mach_conf_sizes;
102 
103 	size_t vcpu_conf_max;
104 	const size_t *vcpu_conf_sizes;
105 
106 	size_t state_size;
107 
108 	void (*machine_create)(struct nvmm_machine *);
109 	void (*machine_destroy)(struct nvmm_machine *);
110 	int (*machine_configure)(struct nvmm_machine *, uint64_t, void *);
111 
112 	int (*vcpu_create)(struct nvmm_machine *, struct nvmm_cpu *);
113 	void (*vcpu_destroy)(struct nvmm_machine *, struct nvmm_cpu *);
114 	int (*vcpu_configure)(struct nvmm_cpu *, uint64_t, void *);
115 	void (*vcpu_setstate)(struct nvmm_cpu *);
116 	void (*vcpu_getstate)(struct nvmm_cpu *);
117 	int (*vcpu_inject)(struct nvmm_cpu *);
118 	int (*vcpu_run)(struct nvmm_machine *, struct nvmm_cpu *,
119 	    struct nvmm_vcpu_exit *);
120 };
121 
122 #if defined(__x86_64__)
123 extern const struct nvmm_impl nvmm_x86_svm;
124 extern const struct nvmm_impl nvmm_x86_vmx;
125 #endif
126 
127 static inline bool
128 nvmm_return_needed(void)
129 {
130 	if (preempt_needed()) {
131 		return true;
132 	}
133 	if (curlwp->l_flag & LW_USERRET) {
134 		return true;
135 	}
136 	return false;
137 }
138 
139 #endif /* _NVMM_INTERNAL_H_ */
140