xref: /dflybsd-src/sys/dev/virtual/nvmm/nvmm_internal.h (revision cca384e4794b145c2db2c13903239d9c019de498)
16d65b43dSAaron LI /*
2bfc69df0SAaron LI  * Copyright (c) 2018-2021 Maxime Villard, m00nbsd.net
36d65b43dSAaron LI  * All rights reserved.
46d65b43dSAaron LI  *
57f0e1ce2SAaron LI  * This code is part of the NVMM hypervisor.
66d65b43dSAaron LI  *
76d65b43dSAaron LI  * Redistribution and use in source and binary forms, with or without
86d65b43dSAaron LI  * modification, are permitted provided that the following conditions
96d65b43dSAaron LI  * are met:
106d65b43dSAaron LI  * 1. Redistributions of source code must retain the above copyright
116d65b43dSAaron LI  *    notice, this list of conditions and the following disclaimer.
126d65b43dSAaron LI  * 2. Redistributions in binary form must reproduce the above copyright
136d65b43dSAaron LI  *    notice, this list of conditions and the following disclaimer in the
146d65b43dSAaron LI  *    documentation and/or other materials provided with the distribution.
156d65b43dSAaron LI  *
167f0e1ce2SAaron LI  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
177f0e1ce2SAaron LI  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
187f0e1ce2SAaron LI  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
197f0e1ce2SAaron LI  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
207f0e1ce2SAaron LI  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
217f0e1ce2SAaron LI  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
227f0e1ce2SAaron LI  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
237f0e1ce2SAaron LI  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
247f0e1ce2SAaron LI  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
257f0e1ce2SAaron LI  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
267f0e1ce2SAaron LI  * SUCH DAMAGE.
276d65b43dSAaron LI  */
286d65b43dSAaron LI 
296d65b43dSAaron LI #ifndef _NVMM_INTERNAL_H_
306d65b43dSAaron LI #define _NVMM_INTERNAL_H_
316d65b43dSAaron LI 
32634ba020SAaron LI #ifndef _KERNEL
33634ba020SAaron LI #error "This file should not be included by userland programs."
34634ba020SAaron LI #endif
35634ba020SAaron LI 
3642862644SAaron LI #include "nvmm_os.h"
3742862644SAaron LI 
386d65b43dSAaron LI #define NVMM_MAX_MACHINES	128
39ddb95be1SAaron LI #define NVMM_MAX_VCPUS		128
406d65b43dSAaron LI #define NVMM_MAX_HMAPPINGS	32
4122b29b22SMatthew Dillon 
4222b29b22SMatthew Dillon #if defined(__NetBSD__)
4322b29b22SMatthew Dillon #define NVMM_MAX_RAM		(128ULL * (1 << 30))
4422b29b22SMatthew Dillon #elif defined(__DragonFly__)
4522b29b22SMatthew Dillon #define NVMM_MAX_RAM		(127ULL * 1024ULL * (1 << 30))
4622b29b22SMatthew Dillon #else
4722b29b22SMatthew Dillon #error "OS dependency for NVMM_MAX_RAM required"
4822b29b22SMatthew Dillon #endif
496d65b43dSAaron LI 
50d8a75061SAaron LI #define NVMM_COMM_PAGE_SIZE	\
51d8a75061SAaron LI 	(roundup(sizeof(struct nvmm_comm_page), PAGE_SIZE))
52d8a75061SAaron LI 
536d65b43dSAaron LI struct nvmm_owner {
546d65b43dSAaron LI 	pid_t pid;
556d65b43dSAaron LI };
566d65b43dSAaron LI 
576d65b43dSAaron LI struct nvmm_cpu {
586d65b43dSAaron LI 	/* Shared. */
596d65b43dSAaron LI 	bool present;
606d65b43dSAaron LI 	nvmm_cpuid_t cpuid;
6142862644SAaron LI 	os_mtx_t lock;
626d65b43dSAaron LI 
636d65b43dSAaron LI 	/* Comm page. */
646d65b43dSAaron LI 	struct nvmm_comm_page *comm;
656d65b43dSAaron LI 
666d65b43dSAaron LI 	/* Last host CPU on which the VCPU ran. */
676d65b43dSAaron LI 	int hcpu_last;
686d65b43dSAaron LI 
696d65b43dSAaron LI 	/* Implementation-specific. */
706d65b43dSAaron LI 	void *cpudata;
716d65b43dSAaron LI };
726d65b43dSAaron LI 
736d65b43dSAaron LI struct nvmm_hmapping {
746d65b43dSAaron LI 	bool present;
756d65b43dSAaron LI 	uintptr_t hva;
766d65b43dSAaron LI 	size_t size;
7742862644SAaron LI 	os_vmobj_t *vmobj;
786d65b43dSAaron LI };
796d65b43dSAaron LI 
806d65b43dSAaron LI struct nvmm_machine {
816d65b43dSAaron LI 	bool present;
826d65b43dSAaron LI 	nvmm_machid_t machid;
836d65b43dSAaron LI 	time_t time;
846d65b43dSAaron LI 	struct nvmm_owner *owner;
8542862644SAaron LI 	os_rwl_t lock;
866d65b43dSAaron LI 
876d65b43dSAaron LI 	/* Comm */
8842862644SAaron LI 	os_vmobj_t *commvmobj;
896d65b43dSAaron LI 
906d65b43dSAaron LI 	/* Kernel */
916d65b43dSAaron LI 	struct vmspace *vm;
926d65b43dSAaron LI 	gpaddr_t gpa_begin;
936d65b43dSAaron LI 	gpaddr_t gpa_end;
946d65b43dSAaron LI 
956d65b43dSAaron LI 	/* Host Mappings */
966d65b43dSAaron LI 	struct nvmm_hmapping hmap[NVMM_MAX_HMAPPINGS];
976d65b43dSAaron LI 
986d65b43dSAaron LI 	/* CPU */
996d65b43dSAaron LI 	volatile unsigned int ncpus;
1006d65b43dSAaron LI 	struct nvmm_cpu cpus[NVMM_MAX_VCPUS];
1016d65b43dSAaron LI 
1026d65b43dSAaron LI 	/* Implementation-specific */
1036d65b43dSAaron LI 	void *machdata;
1046d65b43dSAaron LI };
1056d65b43dSAaron LI 
1066d65b43dSAaron LI struct nvmm_impl {
1076d65b43dSAaron LI 	const char *name;
1086d65b43dSAaron LI 	bool (*ident)(void);
1096d65b43dSAaron LI 	void (*init)(void);
1106d65b43dSAaron LI 	void (*fini)(void);
1116d65b43dSAaron LI 	void (*capability)(struct nvmm_capability *);
1126d65b43dSAaron LI 
1136d65b43dSAaron LI 	size_t mach_conf_max;
1146d65b43dSAaron LI 	const size_t *mach_conf_sizes;
1156d65b43dSAaron LI 
1166d65b43dSAaron LI 	size_t vcpu_conf_max;
1176d65b43dSAaron LI 	const size_t *vcpu_conf_sizes;
1186d65b43dSAaron LI 
1196d65b43dSAaron LI 	size_t state_size;
1206d65b43dSAaron LI 
1216d65b43dSAaron LI 	void (*machine_create)(struct nvmm_machine *);
1226d65b43dSAaron LI 	void (*machine_destroy)(struct nvmm_machine *);
1236d65b43dSAaron LI 	int (*machine_configure)(struct nvmm_machine *, uint64_t, void *);
1246d65b43dSAaron LI 
1256d65b43dSAaron LI 	int (*vcpu_create)(struct nvmm_machine *, struct nvmm_cpu *);
1266d65b43dSAaron LI 	void (*vcpu_destroy)(struct nvmm_machine *, struct nvmm_cpu *);
1276d65b43dSAaron LI 	int (*vcpu_configure)(struct nvmm_cpu *, uint64_t, void *);
1286d65b43dSAaron LI 	void (*vcpu_setstate)(struct nvmm_cpu *);
1296d65b43dSAaron LI 	void (*vcpu_getstate)(struct nvmm_cpu *);
1306d65b43dSAaron LI 	int (*vcpu_inject)(struct nvmm_cpu *);
1316d65b43dSAaron LI 	int (*vcpu_run)(struct nvmm_machine *, struct nvmm_cpu *,
1326d65b43dSAaron LI 	    struct nvmm_vcpu_exit *);
1336d65b43dSAaron LI };
1346d65b43dSAaron LI 
1356d65b43dSAaron LI #if defined(__x86_64__)
1366d65b43dSAaron LI extern const struct nvmm_impl nvmm_x86_svm;
1376d65b43dSAaron LI extern const struct nvmm_impl nvmm_x86_vmx;
1386d65b43dSAaron LI #endif
1396d65b43dSAaron LI 
140*002185e5SAaron LI extern struct nvmm_owner nvmm_root_owner;
141*002185e5SAaron LI extern volatile unsigned int nmachines;
142*002185e5SAaron LI extern const struct nvmm_impl *nvmm_impl;
143*002185e5SAaron LI 
144*002185e5SAaron LI const struct nvmm_impl *nvmm_ident(void);
145*002185e5SAaron LI int	nvmm_init(void);
146*002185e5SAaron LI void	nvmm_fini(void);
147*002185e5SAaron LI int	nvmm_ioctl(struct nvmm_owner *, unsigned long, void *);
148*002185e5SAaron LI void	nvmm_kill_machines(struct nvmm_owner *);
149*002185e5SAaron LI 
1506d65b43dSAaron LI #endif /* _NVMM_INTERNAL_H_ */
151