When the vcpu is created, call mmap to configure access to the register page.
Update CPUArchState to store a pointer to the mmapped hv_vp_register_page. Signed-off-by: Doru Blânzeanu <[email protected]> --- target/i386/cpu.h | 3 +++ target/i386/mshv/mshv-cpu.c | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 0b539155c4..0108e2157b 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -2016,6 +2016,9 @@ typedef struct CPUArchState { uint64_t msr_bndcfgs; uint64_t efer; + /* Shared register page */ + struct hv_vp_register_page *regs_page; + /* Beginning of state preserved by INIT (dummy marker). */ struct {} start_init_save; diff --git a/target/i386/mshv/mshv-cpu.c b/target/i386/mshv/mshv-cpu.c index 9defd05db6..42b6fb1912 100644 --- a/target/i386/mshv/mshv-cpu.c +++ b/target/i386/mshv/mshv-cpu.c @@ -1595,6 +1595,19 @@ void mshv_arch_init_vcpu(CPUState *cpu) + sizeof(hv_input_get_vp_registers) > HV_HYP_PAGE_SIZE)); + + /* mmap the registers page */ + void *rp = mmap(NULL, page, PROT_READ | PROT_WRITE, + MAP_SHARED, mshv_vcpufd(cpu), + MSHV_VP_MMAP_OFFSET_REGISTERS * page); + if (rp == MAP_FAILED) { + warn_report("register page mmap failed, falling back to hypercalls: %s", + strerror(errno)); + env->regs_page = NULL; + } else { + env->regs_page = (struct hv_vp_register_page *) rp; + } + state->hvcall_args.base = mem; state->hvcall_args.input_page = mem; state->hvcall_args.output_page = (uint8_t *)mem + page; @@ -1608,6 +1621,11 @@ void mshv_arch_destroy_vcpu(CPUState *cpu) CPUX86State *env = &x86_cpu->env; AccelCPUState *state = cpu->accel; + /* Unmap the register page */ + if (env->regs_page) { + munmap(env->regs_page, HV_HYP_PAGE_SIZE); + env->regs_page = NULL; + } g_free(state->hvcall_args.base); state->hvcall_args = (MshvHvCallArgs){0}; g_clear_pointer(&env->emu_mmio_buf, g_free); -- 2.53.0
