From: ssnf Subject: Re: [PATCH] vmd: handle the reset control register at 0xcf9 To: mlarkin@nested.page Cc: tech@openbsd.org Date: Tue, 25 Aug 2026 21:10:28 +0000 --- usr.sbin/vmd/x86_vm.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/usr.sbin/vmd/x86_vm.c b/usr.sbin/vmd/x86_vm.c index 1b5ade90f9b..bcb40a63d04 100644 --- a/usr.sbin/vmd/x86_vm.c +++ b/usr.sbin/vmd/x86_vm.c @@ -45,6 +45,10 @@ typedef uint8_t (*io_fn_t)(struct vm_run_params *); #define LOWMEM_KB 576 #define MAX_PORTS 65536 +#define RST_CNT 0xcf9 +#define RST_CNT_SYS_RST 0x01 +#define RST_CNT_RST_CPU 0x02 +#define RST_CNT_RESET (RST_CNT_SYS_RST | RST_CNT_RST_CPU) io_fn_t ioports_map[MAX_PORTS]; @@ -52,7 +56,7 @@ int translate_gva(struct vm_exit*, uint64_t, uint64_t *, int); static int loadfile_bios(gzFile, off_t, struct vcpu_reg_state *); static int vcpu_exit_eptviolation(struct vm_run_params *); -static void vcpu_exit_inout(struct vm_run_params *); +static int vcpu_exit_inout(struct vm_run_params *); extern struct vmd_vm *current_vm; extern int con_fd; @@ -449,12 +453,16 @@ unpause_vm_md(struct vmd_vm *vm) * Parameters: * vrp: vcpu run parameters containing guest state for this exit */ -void +int vcpu_exit_inout(struct vm_run_params *vrp) { struct vm_exit *vei = vrp->vrp_exit; uint8_t intr = 0xFF; + if (vei->vei.vei_dir == VEI_DIR_OUT && + vei->vei.vei_port == RST_CNT && + (vei->vei.vei_data & RST_CNT_RESET) == RST_CNT_RESET) + return (EAGAIN); if (vei->vei.vei_rep || vei->vei.vei_string) { #ifdef MMIO_DEBUG log_info("%s: %s%s%s %d-byte, enc=%d, data=0x%08x, port=0x%04x", @@ -483,6 +491,7 @@ vcpu_exit_inout(struct vm_run_params *vrp) if (intr != 0xFF) vcpu_assert_irq(vrp->vrp_vm_id, vrp->vrp_vcpu_id, intr); + return (0); } /* @@ -509,6 +518,7 @@ vcpu_exit(struct vm_run_params *vrp) { int ret; + ret = 0; switch (vrp->vrp_exit_reason) { case VMX_EXIT_INT_WINDOW: case SVM_VMEXIT_VINTR: @@ -528,12 +538,10 @@ vcpu_exit(struct vm_run_params *vrp) case SVM_VMEXIT_NPF: case VMX_EXIT_EPT_VIOLATION: ret = vcpu_exit_eptviolation(vrp); - if (ret) - return (ret); break; case VMX_EXIT_IO: case SVM_VMEXIT_IOIO: - vcpu_exit_inout(vrp); + ret = vcpu_exit_inout(vrp); break; case VMX_EXIT_HLT: case SVM_VMEXIT_HLT: @@ -547,7 +555,7 @@ vcpu_exit(struct vm_run_params *vrp) log_debug("unknown exit reason 0x%x", vrp->vrp_exit_reason); } - return (0); + return (ret); } /* -- 2.51.0