On Tue, Apr 28, 2026 at 04:50:51PM +0300, Doru Blânzeanu wrote:
> 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;
> +
We probably want to put this behind a compile-time guard:
#if defined(CONFIG_MSHV)
...
#endif
> /* 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);
nit: convention is to declare variables at the top of a fn:
int cpu_fd = mshv_vcpufd(cpu);
void *regs_page;
...
regs_page = mmap(..., cpu_fd, ...);
> + if (rp == MAP_FAILED) {
> + warn_report("register page mmap failed, falling back to hypercalls:
> %s",
We're not falling back at this specific place. so it probably makes
sense to just say register page mmap failed and leave it at that here.
> + 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