Index | Thread | Search

From:
ssnf <ssnf@ssnf.xyz>
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

Download raw body.

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