/* $NetBSD: nvmm_internal.h,v 1.12.2.5 2020/08/18 09:29:52 martin Exp $ */
/*
* Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Maxime Villard.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _NVMM_INTERNAL_H_
#define _NVMM_INTERNAL_H_
#define NVMM_MAX_MACHINES 128
#define NVMM_MAX_VCPUS 256
#define NVMM_MAX_HMAPPINGS 32
#define NVMM_MAX_RAM (128ULL * (1 << 30))
struct nvmm_owner {
pid_t pid;
};
struct nvmm_cpu {
/* Shared. */
bool present;
nvmm_cpuid_t cpuid;
kmutex_t lock;
/* Comm page. */
struct nvmm_comm_page *comm;
/* Last host CPU on which the VCPU ran. */
int hcpu_last;
/* Implementation-specific. */
void *cpudata;
};
struct nvmm_hmapping {
bool present;
uintptr_t hva;
size_t size;
struct uvm_object *uobj;
};
struct nvmm_machine {
bool present;
nvmm_machid_t machid;
time_t time;
struct nvmm_owner *owner;
krwlock_t lock;
/* Comm */
struct uvm_object *commuobj;
/* Kernel */
struct vmspace *vm;
gpaddr_t gpa_begin;
gpaddr_t gpa_end;
/* Host Mappings */
struct nvmm_hmapping hmap[NVMM_MAX_HMAPPINGS];
/* CPU */
volatile unsigned int ncpus;
struct nvmm_cpu cpus[NVMM_MAX_VCPUS];
/* Implementation-specific */
void *machdata;
};
struct nvmm_impl {
const char *name;
bool (*ident)(void);
void (*init)(void);
void (*fini)(void);
void (*capability)(struct nvmm_capability *);
size_t mach_conf_max;
const size_t *mach_conf_sizes;
size_t vcpu_conf_max;
const size_t *vcpu_conf_sizes;
size_t state_size;
void (*machine_create)(struct nvmm_machine *);
void (*machine_destroy)(struct nvmm_machine *);
int (*machine_configure)(struct nvmm_machine *, uint64_t, void *);
int (*vcpu_create)(struct nvmm_machine *, struct nvmm_cpu *);
void (*vcpu_destroy)(struct nvmm_machine *, struct nvmm_cpu *);
int (*vcpu_configure)(struct nvmm_cpu *, uint64_t, void *);
void (*vcpu_setstate)(struct nvmm_cpu *);
void (*vcpu_getstate)(struct nvmm_cpu *);
int (*vcpu_inject)(struct nvmm_cpu *);
int (*vcpu_run)(struct nvmm_machine *, struct nvmm_cpu *,
struct nvmm_vcpu_exit *);
};
#if defined(__x86_64__)
extern const struct nvmm_impl nvmm_x86_svm;
extern const struct nvmm_impl nvmm_x86_vmx;
#endif
static inline bool
nvmm_return_needed(void)
{
lwp_t *l = curlwp;
int needed;
KPREEMPT_DISABLE(l);
needed = l->l_cpu->ci_want_resched;
KPREEMPT_ENABLE(l);
if (needed) {
return true;
}
if (curlwp->l_flag & LW_USERRET) {
return true;
}
return false;
}
#endif /* _NVMM_INTERNAL_H_ */