Module Name: src
Committed By: maxv
Date: Wed Oct 23 12:02:56 UTC 2019
Modified Files:
src/lib/libnvmm: libnvmm.c libnvmm_x86.c nvmm.h
src/tests/lib/libnvmm: h_io_assist.c h_mem_assist.c
Log Message:
Three changes in libnvmm:
- Add 'mach' and 'vcpu' backpointers in the nvmm_io and nvmm_mem
structures.
- Rename 'nvmm_callbacks' to 'nvmm_assist_callbacks'.
- Rename and migrate NVMM_MACH_CONF_CALLBACKS to NVMM_VCPU_CONF_CALLBACKS,
it now becomes per-VCPU.
To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/lib/libnvmm/libnvmm.c
cvs rdiff -u -r1.36 -r1.37 src/lib/libnvmm/libnvmm_x86.c
cvs rdiff -u -r1.13 -r1.14 src/lib/libnvmm/nvmm.h
cvs rdiff -u -r1.9 -r1.10 src/tests/lib/libnvmm/h_io_assist.c
cvs rdiff -u -r1.15 -r1.16 src/tests/lib/libnvmm/h_mem_assist.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libnvmm/libnvmm.c
diff -u src/lib/libnvmm/libnvmm.c:1.15 src/lib/libnvmm/libnvmm.c:1.16
--- src/lib/libnvmm/libnvmm.c:1.15 Wed Oct 23 07:01:11 2019
+++ src/lib/libnvmm/libnvmm.c Wed Oct 23 12:02:55 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: libnvmm.c,v 1.15 2019/10/23 07:01:11 maxv Exp $ */
+/* $NetBSD: libnvmm.c,v 1.16 2019/10/23 12:02:55 maxv Exp $ */
/*
* Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
@@ -260,12 +260,6 @@ nvmm_machine_configure(struct nvmm_machi
struct nvmm_ioc_machine_configure args;
int ret;
- switch (op) {
- case NVMM_MACH_CONF_CALLBACKS:
- memcpy(&mach->cbs, conf, sizeof(mach->cbs));
- return 0;
- }
-
args.machid = mach->machid;
args.op = op;
args.conf = conf;
@@ -335,6 +329,12 @@ nvmm_vcpu_configure(struct nvmm_machine
struct nvmm_ioc_vcpu_configure args;
int ret;
+ switch (op) {
+ case NVMM_VCPU_CONF_CALLBACKS:
+ memcpy(&vcpu->cbs, conf, sizeof(vcpu->cbs));
+ return 0;
+ }
+
args.machid = mach->machid;
args.cpuid = vcpu->cpuid;
args.op = op;
Index: src/lib/libnvmm/libnvmm_x86.c
diff -u src/lib/libnvmm/libnvmm_x86.c:1.36 src/lib/libnvmm/libnvmm_x86.c:1.37
--- src/lib/libnvmm/libnvmm_x86.c:1.36 Wed Oct 23 07:01:11 2019
+++ src/lib/libnvmm/libnvmm_x86.c Wed Oct 23 12:02:55 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: libnvmm_x86.c,v 1.36 2019/10/23 07:01:11 maxv Exp $ */
+/* $NetBSD: libnvmm_x86.c,v 1.37 2019/10/23 12:02:55 maxv Exp $ */
/*
* Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
@@ -555,9 +555,10 @@ rep_set_cnt(struct nvmm_x64_state *state
}
static int
-read_guest_memory(struct nvmm_machine *mach, struct nvmm_x64_state *state,
+read_guest_memory(struct nvmm_machine *mach, struct nvmm_vcpu *vcpu,
gvaddr_t gva, uint8_t *data, size_t size)
{
+ struct nvmm_x64_state *state = vcpu->state;
struct nvmm_mem mem;
nvmm_prot_t prot;
gpaddr_t gpa;
@@ -585,11 +586,13 @@ read_guest_memory(struct nvmm_machine *m
is_mmio = (ret == -1);
if (is_mmio) {
+ mem.mach = mach;
+ mem.vcpu = vcpu;
mem.data = data;
mem.gpa = gpa;
mem.write = false;
mem.size = size;
- (*mach->cbs.mem)(&mem);
+ (*vcpu->cbs.mem)(&mem);
} else {
if (__predict_false(!(prot & NVMM_PROT_READ))) {
errno = EFAULT;
@@ -599,7 +602,7 @@ read_guest_memory(struct nvmm_machine *m
}
if (remain > 0) {
- ret = read_guest_memory(mach, state, gva + size,
+ ret = read_guest_memory(mach, vcpu, gva + size,
data + size, remain);
} else {
ret = 0;
@@ -609,9 +612,10 @@ read_guest_memory(struct nvmm_machine *m
}
static int
-write_guest_memory(struct nvmm_machine *mach, struct nvmm_x64_state *state,
+write_guest_memory(struct nvmm_machine *mach, struct nvmm_vcpu *vcpu,
gvaddr_t gva, uint8_t *data, size_t size)
{
+ struct nvmm_x64_state *state = vcpu->state;
struct nvmm_mem mem;
nvmm_prot_t prot;
gpaddr_t gpa;
@@ -639,11 +643,13 @@ write_guest_memory(struct nvmm_machine *
is_mmio = (ret == -1);
if (is_mmio) {
+ mem.mach = mach;
+ mem.vcpu = vcpu;
mem.data = data;
mem.gpa = gpa;
mem.write = true;
mem.size = size;
- (*mach->cbs.mem)(&mem);
+ (*vcpu->cbs.mem)(&mem);
} else {
if (__predict_false(!(prot & NVMM_PROT_WRITE))) {
errno = EFAULT;
@@ -653,7 +659,7 @@ write_guest_memory(struct nvmm_machine *
}
if (remain > 0) {
- ret = write_guest_memory(mach, state, gva + size,
+ ret = write_guest_memory(mach, vcpu, gva + size,
data + size, remain);
} else {
ret = 0;
@@ -664,12 +670,12 @@ write_guest_memory(struct nvmm_machine *
/* -------------------------------------------------------------------------- */
-static int fetch_segment(struct nvmm_machine *, struct nvmm_x64_state *);
+static int fetch_segment(struct nvmm_machine *, struct nvmm_vcpu *);
#define NVMM_IO_BATCH_SIZE 32
static int
-assist_io_batch(struct nvmm_machine *mach, struct nvmm_x64_state *state,
+assist_io_batch(struct nvmm_machine *mach, struct nvmm_vcpu *vcpu,
struct nvmm_io *io, gvaddr_t gva, uint64_t cnt)
{
uint8_t iobuf[NVMM_IO_BATCH_SIZE];
@@ -683,18 +689,18 @@ assist_io_batch(struct nvmm_machine *mac
io->data = iobuf;
if (!io->in) {
- ret = read_guest_memory(mach, state, gva, iobuf, iosize);
+ ret = read_guest_memory(mach, vcpu, gva, iobuf, iosize);
if (ret == -1)
return -1;
}
for (i = 0; i < iocnt; i++) {
- (*mach->cbs.io)(io);
+ (*vcpu->cbs.io)(io);
io->data += io->size;
}
if (io->in) {
- ret = write_guest_memory(mach, state, gva, iobuf, iosize);
+ ret = write_guest_memory(mach, vcpu, gva, iobuf, iosize);
if (ret == -1)
return -1;
}
@@ -721,6 +727,8 @@ nvmm_assist_io(struct nvmm_machine *mach
return -1;
}
+ io.mach = mach;
+ io.vcpu = vcpu;
io.port = exit->u.io.port;
io.in = exit->u.io.in;
io.size = exit->u.io.operand_size;
@@ -763,7 +771,7 @@ nvmm_assist_io(struct nvmm_machine *mach
if (io.in) {
seg = NVMM_X64_SEG_ES;
} else {
- seg = fetch_segment(mach, state);
+ seg = fetch_segment(mach, vcpu);
if (seg == -1)
return -1;
}
@@ -781,7 +789,7 @@ nvmm_assist_io(struct nvmm_machine *mach
}
if (exit->u.io.rep && !psld) {
- iocnt = assist_io_batch(mach, state, &io, gva, cnt);
+ iocnt = assist_io_batch(mach, vcpu, &io, gva, cnt);
if (iocnt == -1)
return -1;
goto done;
@@ -792,14 +800,14 @@ nvmm_assist_io(struct nvmm_machine *mach
if (!exit->u.io.str) {
memcpy(io.data, &state->gprs[NVMM_X64_GPR_RAX], io.size);
} else {
- ret = read_guest_memory(mach, state, gva, io.data,
+ ret = read_guest_memory(mach, vcpu, gva, io.data,
io.size);
if (ret == -1)
return -1;
}
}
- (*mach->cbs.io)(&io);
+ (*vcpu->cbs.io)(&io);
if (io.in) {
if (!exit->u.io.str) {
@@ -809,7 +817,7 @@ nvmm_assist_io(struct nvmm_machine *mach
state->gprs[NVMM_X64_GPR_RAX] &= size_to_mask(4);
}
} else {
- ret = write_guest_memory(mach, state, gva, io.data,
+ ret = write_guest_memory(mach, vcpu, gva, io.data,
io.size);
if (ret == -1)
return -1;
@@ -849,20 +857,20 @@ struct x86_emul {
bool readreg;
bool backprop;
bool notouch;
- void (*func)(struct nvmm_machine *, struct nvmm_mem *, uint64_t *);
+ void (*func)(struct nvmm_vcpu *, struct nvmm_mem *, uint64_t *);
};
-static void x86_func_or(struct nvmm_machine *, struct nvmm_mem *, uint64_t *);
-static void x86_func_and(struct nvmm_machine *, struct nvmm_mem *, uint64_t *);
-static void x86_func_xchg(struct nvmm_machine *, struct nvmm_mem *, uint64_t *);
-static void x86_func_sub(struct nvmm_machine *, struct nvmm_mem *, uint64_t *);
-static void x86_func_xor(struct nvmm_machine *, struct nvmm_mem *, uint64_t *);
-static void x86_func_cmp(struct nvmm_machine *, struct nvmm_mem *, uint64_t *);
-static void x86_func_test(struct nvmm_machine *, struct nvmm_mem *, uint64_t *);
-static void x86_func_mov(struct nvmm_machine *, struct nvmm_mem *, uint64_t *);
-static void x86_func_stos(struct nvmm_machine *, struct nvmm_mem *, uint64_t *);
-static void x86_func_lods(struct nvmm_machine *, struct nvmm_mem *, uint64_t *);
-static void x86_func_movs(struct nvmm_machine *, struct nvmm_mem *, uint64_t *);
+static void x86_func_or(struct nvmm_vcpu *, struct nvmm_mem *, uint64_t *);
+static void x86_func_and(struct nvmm_vcpu *, struct nvmm_mem *, uint64_t *);
+static void x86_func_xchg(struct nvmm_vcpu *, struct nvmm_mem *, uint64_t *);
+static void x86_func_sub(struct nvmm_vcpu *, struct nvmm_mem *, uint64_t *);
+static void x86_func_xor(struct nvmm_vcpu *, struct nvmm_mem *, uint64_t *);
+static void x86_func_cmp(struct nvmm_vcpu *, struct nvmm_mem *, uint64_t *);
+static void x86_func_test(struct nvmm_vcpu *, struct nvmm_mem *, uint64_t *);
+static void x86_func_mov(struct nvmm_vcpu *, struct nvmm_mem *, uint64_t *);
+static void x86_func_stos(struct nvmm_vcpu *, struct nvmm_mem *, uint64_t *);
+static void x86_func_lods(struct nvmm_vcpu *, struct nvmm_mem *, uint64_t *);
+static void x86_func_movs(struct nvmm_vcpu *, struct nvmm_mem *, uint64_t *);
static const struct x86_emul x86_emul_or = {
.readreg = true,
@@ -2721,7 +2729,7 @@ EXEC_DISPATCHER(xor)
*/
static void
-x86_func_or(struct nvmm_machine *mach, struct nvmm_mem *mem, uint64_t *gprs)
+x86_func_or(struct nvmm_vcpu *vcpu, struct nvmm_mem *mem, uint64_t *gprs)
{
uint64_t *retval = (uint64_t *)mem->data;
const bool write = mem->write;
@@ -2733,7 +2741,7 @@ x86_func_or(struct nvmm_machine *mach, s
/* Fetch the value to be OR'ed (op2). */
mem->data = (uint8_t *)&op2;
mem->write = false;
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
/* Perform the OR. */
ret = exec_or(*op1, op2, &fl, mem->size);
@@ -2742,7 +2750,7 @@ x86_func_or(struct nvmm_machine *mach, s
/* Write back the result. */
mem->data = (uint8_t *)&ret;
mem->write = true;
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
} else {
/* Return data to the caller. */
*retval = ret;
@@ -2753,7 +2761,7 @@ x86_func_or(struct nvmm_machine *mach, s
}
static void
-x86_func_and(struct nvmm_machine *mach, struct nvmm_mem *mem, uint64_t *gprs)
+x86_func_and(struct nvmm_vcpu *vcpu, struct nvmm_mem *mem, uint64_t *gprs)
{
uint64_t *retval = (uint64_t *)mem->data;
const bool write = mem->write;
@@ -2765,7 +2773,7 @@ x86_func_and(struct nvmm_machine *mach,
/* Fetch the value to be AND'ed (op2). */
mem->data = (uint8_t *)&op2;
mem->write = false;
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
/* Perform the AND. */
ret = exec_and(*op1, op2, &fl, mem->size);
@@ -2774,7 +2782,7 @@ x86_func_and(struct nvmm_machine *mach,
/* Write back the result. */
mem->data = (uint8_t *)&ret;
mem->write = true;
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
} else {
/* Return data to the caller. */
*retval = ret;
@@ -2785,7 +2793,7 @@ x86_func_and(struct nvmm_machine *mach,
}
static void
-x86_func_xchg(struct nvmm_machine *mach, struct nvmm_mem *mem, uint64_t *gprs)
+x86_func_xchg(struct nvmm_vcpu *vcpu, struct nvmm_mem *mem, uint64_t *gprs)
{
uint64_t *op1, op2;
@@ -2795,19 +2803,19 @@ x86_func_xchg(struct nvmm_machine *mach,
/* Fetch op2. */
mem->data = (uint8_t *)&op2;
mem->write = false;
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
/* Write op1 in op2. */
mem->data = (uint8_t *)op1;
mem->write = true;
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
/* Write op2 in op1. */
*op1 = op2;
}
static void
-x86_func_sub(struct nvmm_machine *mach, struct nvmm_mem *mem, uint64_t *gprs)
+x86_func_sub(struct nvmm_vcpu *vcpu, struct nvmm_mem *mem, uint64_t *gprs)
{
uint64_t *retval = (uint64_t *)mem->data;
const bool write = mem->write;
@@ -2822,7 +2830,7 @@ x86_func_sub(struct nvmm_machine *mach,
/* Fetch the value to be SUB'ed (op1 or op2). */
mem->data = (uint8_t *)&tmp;
mem->write = false;
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
/* Perform the SUB. */
ret = exec_sub(*op1, *op2, &fl, mem->size);
@@ -2831,7 +2839,7 @@ x86_func_sub(struct nvmm_machine *mach,
/* Write back the result. */
mem->data = (uint8_t *)&ret;
mem->write = true;
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
} else {
/* Return data to the caller. */
*retval = ret;
@@ -2842,7 +2850,7 @@ x86_func_sub(struct nvmm_machine *mach,
}
static void
-x86_func_xor(struct nvmm_machine *mach, struct nvmm_mem *mem, uint64_t *gprs)
+x86_func_xor(struct nvmm_vcpu *vcpu, struct nvmm_mem *mem, uint64_t *gprs)
{
uint64_t *retval = (uint64_t *)mem->data;
const bool write = mem->write;
@@ -2854,7 +2862,7 @@ x86_func_xor(struct nvmm_machine *mach,
/* Fetch the value to be XOR'ed (op2). */
mem->data = (uint8_t *)&op2;
mem->write = false;
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
/* Perform the XOR. */
ret = exec_xor(*op1, op2, &fl, mem->size);
@@ -2863,7 +2871,7 @@ x86_func_xor(struct nvmm_machine *mach,
/* Write back the result. */
mem->data = (uint8_t *)&ret;
mem->write = true;
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
} else {
/* Return data to the caller. */
*retval = ret;
@@ -2874,7 +2882,7 @@ x86_func_xor(struct nvmm_machine *mach,
}
static void
-x86_func_cmp(struct nvmm_machine *mach, struct nvmm_mem *mem, uint64_t *gprs)
+x86_func_cmp(struct nvmm_vcpu *vcpu, struct nvmm_mem *mem, uint64_t *gprs)
{
uint64_t *op1, *op2, fl;
uint64_t tmp;
@@ -2887,7 +2895,7 @@ x86_func_cmp(struct nvmm_machine *mach,
/* Fetch the value to be CMP'ed (op1 or op2). */
mem->data = (uint8_t *)&tmp;
mem->write = false;
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
/* Perform the CMP. */
exec_sub(*op1, *op2, &fl, mem->size);
@@ -2897,7 +2905,7 @@ x86_func_cmp(struct nvmm_machine *mach,
}
static void
-x86_func_test(struct nvmm_machine *mach, struct nvmm_mem *mem, uint64_t *gprs)
+x86_func_test(struct nvmm_vcpu *vcpu, struct nvmm_mem *mem, uint64_t *gprs)
{
uint64_t *op1, *op2, fl;
uint64_t tmp;
@@ -2910,7 +2918,7 @@ x86_func_test(struct nvmm_machine *mach,
/* Fetch the value to be TEST'ed (op1 or op2). */
mem->data = (uint8_t *)&tmp;
mem->write = false;
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
/* Perform the TEST. */
exec_and(*op1, *op2, &fl, mem->size);
@@ -2920,21 +2928,21 @@ x86_func_test(struct nvmm_machine *mach,
}
static void
-x86_func_mov(struct nvmm_machine *mach, struct nvmm_mem *mem, uint64_t *gprs)
+x86_func_mov(struct nvmm_vcpu *vcpu, struct nvmm_mem *mem, uint64_t *gprs)
{
/*
* Nothing special, just move without emulation.
*/
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
}
static void
-x86_func_stos(struct nvmm_machine *mach, struct nvmm_mem *mem, uint64_t *gprs)
+x86_func_stos(struct nvmm_vcpu *vcpu, struct nvmm_mem *mem, uint64_t *gprs)
{
/*
* Just move, and update RDI.
*/
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
if (gprs[NVMM_X64_GPR_RFLAGS] & PSL_D) {
gprs[NVMM_X64_GPR_RDI] -= mem->size;
@@ -2944,12 +2952,12 @@ x86_func_stos(struct nvmm_machine *mach,
}
static void
-x86_func_lods(struct nvmm_machine *mach, struct nvmm_mem *mem, uint64_t *gprs)
+x86_func_lods(struct nvmm_vcpu *vcpu, struct nvmm_mem *mem, uint64_t *gprs)
{
/*
* Just move, and update RSI.
*/
- (*mach->cbs.mem)(mem);
+ (*vcpu->cbs.mem)(mem);
if (gprs[NVMM_X64_GPR_RFLAGS] & PSL_D) {
gprs[NVMM_X64_GPR_RSI] -= mem->size;
@@ -2959,7 +2967,7 @@ x86_func_lods(struct nvmm_machine *mach,
}
static void
-x86_func_movs(struct nvmm_machine *mach, struct nvmm_mem *mem, uint64_t *gprs)
+x86_func_movs(struct nvmm_vcpu *vcpu, struct nvmm_mem *mem, uint64_t *gprs)
{
/*
* Special instruction: double memory operand. Don't call the cb,
@@ -3049,8 +3057,9 @@ store_to_gva(struct nvmm_x64_state *stat
}
static int
-fetch_segment(struct nvmm_machine *mach, struct nvmm_x64_state *state)
+fetch_segment(struct nvmm_machine *mach, struct nvmm_vcpu *vcpu)
{
+ struct nvmm_x64_state *state = vcpu->state;
uint8_t inst_bytes[5], byte;
size_t i, fetchsize;
gvaddr_t gva;
@@ -3067,7 +3076,7 @@ fetch_segment(struct nvmm_machine *mach,
segment_apply(&state->segs[NVMM_X64_SEG_CS], &gva);
}
- ret = read_guest_memory(mach, state, gva, inst_bytes, fetchsize);
+ ret = read_guest_memory(mach, vcpu, gva, inst_bytes, fetchsize);
if (ret == -1)
return -1;
@@ -3106,9 +3115,10 @@ fetch_segment(struct nvmm_machine *mach,
}
static int
-fetch_instruction(struct nvmm_machine *mach, struct nvmm_x64_state *state,
+fetch_instruction(struct nvmm_machine *mach, struct nvmm_vcpu *vcpu,
struct nvmm_vcpu_exit *exit)
{
+ struct nvmm_x64_state *state = vcpu->state;
size_t fetchsize;
gvaddr_t gva;
int ret;
@@ -3124,7 +3134,7 @@ fetch_instruction(struct nvmm_machine *m
segment_apply(&state->segs[NVMM_X64_SEG_CS], &gva);
}
- ret = read_guest_memory(mach, state, gva, exit->u.mem.inst_bytes,
+ ret = read_guest_memory(mach, vcpu, gva, exit->u.mem.inst_bytes,
fetchsize);
if (ret == -1)
return -1;
@@ -3135,9 +3145,10 @@ fetch_instruction(struct nvmm_machine *m
}
static int
-assist_mem_double(struct nvmm_machine *mach, struct nvmm_x64_state *state,
+assist_mem_double(struct nvmm_machine *mach, struct nvmm_vcpu *vcpu,
struct x86_instr *instr)
{
+ struct nvmm_x64_state *state = vcpu->state;
struct nvmm_mem mem;
uint8_t data[8];
gvaddr_t gva;
@@ -3150,7 +3161,7 @@ assist_mem_double(struct nvmm_machine *m
ret = store_to_gva(state, instr, &instr->src, &gva, size);
if (ret == -1)
return -1;
- ret = read_guest_memory(mach, state, gva, data, size);
+ ret = read_guest_memory(mach, vcpu, gva, data, size);
if (ret == -1)
return -1;
@@ -3158,26 +3169,30 @@ assist_mem_double(struct nvmm_machine *m
ret = store_to_gva(state, instr, &instr->dst, &gva, size);
if (ret == -1)
return -1;
- ret = write_guest_memory(mach, state, gva, data, size);
+ ret = write_guest_memory(mach, vcpu, gva, data, size);
if (ret == -1)
return -1;
mem.size = size;
- (*instr->emul->func)(mach, &mem, state->gprs);
+ (*instr->emul->func)(vcpu, &mem, state->gprs);
return 0;
}
static int
-assist_mem_single(struct nvmm_machine *mach, struct nvmm_x64_state *state,
- struct x86_instr *instr, struct nvmm_vcpu_exit *exit)
+assist_mem_single(struct nvmm_machine *mach, struct nvmm_vcpu *vcpu,
+ struct x86_instr *instr)
{
+ struct nvmm_x64_state *state = vcpu->state;
+ struct nvmm_vcpu_exit *exit = vcpu->exit;
struct nvmm_mem mem;
uint8_t membuf[8];
uint64_t val;
memset(membuf, 0, sizeof(membuf));
+ mem.mach = mach;
+ mem.vcpu = vcpu;
mem.gpa = exit->u.mem.gpa;
mem.size = instr->operand_size;
mem.data = membuf;
@@ -3246,7 +3261,7 @@ assist_mem_single(struct nvmm_machine *m
memcpy(mem.data, &val, mem.size);
}
- (*instr->emul->func)(mach, &mem, state->gprs);
+ (*instr->emul->func)(vcpu, &mem, state->gprs);
if (instr->emul->notouch) {
/* We're done. */
@@ -3313,7 +3328,7 @@ nvmm_assist_mem(struct nvmm_machine *mac
* The instruction was not fetched from the kernel. Fetch
* it ourselves.
*/
- ret = fetch_instruction(mach, state, exit);
+ ret = fetch_instruction(mach, vcpu, exit);
if (ret == -1)
return -1;
}
@@ -3334,9 +3349,9 @@ nvmm_assist_mem(struct nvmm_machine *mac
}
if (instr.opcode->movs) {
- ret = assist_mem_double(mach, state, &instr);
+ ret = assist_mem_double(mach, vcpu, &instr);
} else {
- ret = assist_mem_single(mach, state, &instr, exit);
+ ret = assist_mem_single(mach, vcpu, &instr);
}
if (ret == -1) {
errno = ENODEV;
Index: src/lib/libnvmm/nvmm.h
diff -u src/lib/libnvmm/nvmm.h:1.13 src/lib/libnvmm/nvmm.h:1.14
--- src/lib/libnvmm/nvmm.h:1.13 Wed Oct 23 07:01:11 2019
+++ src/lib/libnvmm/nvmm.h Wed Oct 23 12:02:55 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: nvmm.h,v 1.13 2019/10/23 07:01:11 maxv Exp $ */
+/* $NetBSD: nvmm.h,v 1.14 2019/10/23 12:02:55 maxv Exp $ */
/*
* Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
@@ -40,21 +40,10 @@
#define NVMM_USER_VERSION 1
-struct nvmm_io {
- uint64_t port;
- bool in;
- size_t size;
- uint8_t *data;
-};
-
-struct nvmm_mem {
- gpaddr_t gpa;
- bool write;
- size_t size;
- uint8_t *data;
-};
+struct nvmm_io;
+struct nvmm_mem;
-struct nvmm_callbacks {
+struct nvmm_assist_callbacks {
void (*io)(struct nvmm_io *);
void (*mem)(struct nvmm_mem *);
};
@@ -63,17 +52,35 @@ struct nvmm_machine {
nvmm_machid_t machid;
struct nvmm_comm_page **pages;
void *areas; /* opaque */
- struct nvmm_callbacks cbs;
};
struct nvmm_vcpu {
nvmm_cpuid_t cpuid;
+ struct nvmm_assist_callbacks cbs;
struct nvmm_vcpu_state *state;
struct nvmm_vcpu_event *event;
struct nvmm_vcpu_exit *exit;
};
-#define NVMM_MACH_CONF_CALLBACKS NVMM_MACH_CONF_LIBNVMM_BEGIN
+struct nvmm_io {
+ struct nvmm_machine *mach;
+ struct nvmm_vcpu *vcpu;
+ uint64_t port;
+ bool in;
+ size_t size;
+ uint8_t *data;
+};
+
+struct nvmm_mem {
+ struct nvmm_machine *mach;
+ struct nvmm_vcpu *vcpu;
+ gpaddr_t gpa;
+ bool write;
+ size_t size;
+ uint8_t *data;
+};
+
+#define NVMM_VCPU_CONF_CALLBACKS NVMM_VCPU_CONF_LIBNVMM_BEGIN
#define NVMM_PROT_READ 0x01
#define NVMM_PROT_WRITE 0x02
Index: src/tests/lib/libnvmm/h_io_assist.c
diff -u src/tests/lib/libnvmm/h_io_assist.c:1.9 src/tests/lib/libnvmm/h_io_assist.c:1.10
--- src/tests/lib/libnvmm/h_io_assist.c:1.9 Wed Oct 23 07:01:12 2019
+++ src/tests/lib/libnvmm/h_io_assist.c Wed Oct 23 12:02:55 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: h_io_assist.c,v 1.9 2019/10/23 07:01:12 maxv Exp $ */
+/* $NetBSD: h_io_assist.c,v 1.10 2019/10/23 12:02:55 maxv Exp $ */
/*
* Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
@@ -354,7 +354,7 @@ static const struct test tests[] = {
{ NULL, NULL, NULL, NULL, false }
};
-static struct nvmm_callbacks callbacks = {
+static struct nvmm_assist_callbacks callbacks = {
.io = io_callback,
.mem = NULL
};
@@ -377,7 +377,7 @@ int main(int argc, char *argv[])
err(errno, "nvmm_machine_create");
if (nvmm_vcpu_create(&mach, 0, &vcpu) == -1)
err(errno, "nvmm_vcpu_create");
- nvmm_machine_configure(&mach, NVMM_MACH_CONF_CALLBACKS, &callbacks);
+ nvmm_vcpu_configure(&mach, &vcpu, NVMM_VCPU_CONF_CALLBACKS, &callbacks);
map_pages(&mach);
for (i = 0; tests[i].name != NULL; i++) {
Index: src/tests/lib/libnvmm/h_mem_assist.c
diff -u src/tests/lib/libnvmm/h_mem_assist.c:1.15 src/tests/lib/libnvmm/h_mem_assist.c:1.16
--- src/tests/lib/libnvmm/h_mem_assist.c:1.15 Wed Oct 23 07:01:12 2019
+++ src/tests/lib/libnvmm/h_mem_assist.c Wed Oct 23 12:02:55 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: h_mem_assist.c,v 1.15 2019/10/23 07:01:12 maxv Exp $ */
+/* $NetBSD: h_mem_assist.c,v 1.16 2019/10/23 12:02:55 maxv Exp $ */
/*
* Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
@@ -119,7 +119,7 @@ run_machine(struct nvmm_machine *mach, s
}
}
-static struct nvmm_callbacks callbacks = {
+static struct nvmm_assist_callbacks callbacks = {
.io = NULL,
.mem = mem_callback
};
@@ -357,7 +357,7 @@ test_vm64(void)
err(errno, "nvmm_machine_create");
if (nvmm_vcpu_create(&mach, 0, &vcpu) == -1)
err(errno, "nvmm_vcpu_create");
- nvmm_machine_configure(&mach, NVMM_MACH_CONF_CALLBACKS, &callbacks);
+ nvmm_vcpu_configure(&mach, &vcpu, NVMM_VCPU_CONF_CALLBACKS, &callbacks);
map_pages64(&mach);
for (i = 0; tests64[i].name != NULL; i++) {
@@ -443,7 +443,7 @@ test_vm16(void)
err(errno, "nvmm_machine_create");
if (nvmm_vcpu_create(&mach, 0, &vcpu) == -1)
err(errno, "nvmm_vcpu_create");
- nvmm_machine_configure(&mach, NVMM_MACH_CONF_CALLBACKS, &callbacks);
+ nvmm_vcpu_configure(&mach, &vcpu, NVMM_VCPU_CONF_CALLBACKS, &callbacks);
map_pages16(&mach);
for (i = 0; tests16[i].name != NULL; i++) {