Index | Thread | Search

From:
Mike Larkin <mlarkin@nested.page>
Subject:
Re: [PATCH] vmd: handle the reset control register at 0xcf9
To:
ssnf <ssnf@ssnf.xyz>
Cc:
tech@openbsd.org
Date:
Tue, 25 Aug 2026 14:38:16 -0700

Download raw body.

Thread
On Tue, Aug 25, 2026 at 09:10:28PM +0000, ssnf wrote:

This seems pretty good. dv@, you ok with it too?

-ml

> ---
>  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
>