Index | Thread | Search

From:
Dave Voutila <dv@sisu.io>
Subject:
Re: [PATCH] vmd: handle the reset control register at 0xcf9
To:
Mike Larkin <mlarkin@nested.page>
Cc:
ssnf <ssnf@ssnf.xyz>, tech@openbsd.org
Date:
Tue, 25 Aug 2026 17:16:43 -0400

Download raw body.

Thread
Mike Larkin <mlarkin@nested.page> writes:

> On Sun, Aug 23, 2026 at 12:28:28AM +0000, ssnf wrote:
>> Handle guest writes to the x86 reset control register and terminate
>> the VM on a reset request.
>>
>> Tested on a 9front guest with fshalt -r.
>> ---
>>  usr.sbin/vmd/x86_vm.c | 5 +++++
>>  1 file changed, 5 insertions(+)
>>
>> diff --git a/usr.sbin/vmd/x86_vm.c b/usr.sbin/vmd/x86_vm.c
>> index 1b5ade90f9b..a0197c34b4c 100644
>> --- a/usr.sbin/vmd/x86_vm.c
>> +++ b/usr.sbin/vmd/x86_vm.c
>> @@ -507,6 +507,7 @@ vcpu_exit_inout(struct vm_run_params *vrp)
>>  int
>>  vcpu_exit(struct vm_run_params *vrp)
>>  {
>> +	struct vm_exit *vei = vrp->vrp_exit;
>>  	int ret;
>>
>>  	switch (vrp->vrp_exit_reason) {
>> @@ -533,6 +534,10 @@ vcpu_exit(struct vm_run_params *vrp)
>>  		break;
>>  	case VMX_EXIT_IO:
>>  	case SVM_VMEXIT_IOIO:
>> +		if (vei->vei.vei_dir == VEI_DIR_OUT &&
>> +		    vei->vei.vei_port == 0xcf9 &&
>> +		    (vei->vei.vei_data & 0x06) == 0x06)
>> +			return (EAGAIN);
>>  		vcpu_exit_inout(vrp);
>>  		break;
>>  	case VMX_EXIT_HLT:
>> --
>> 2.51.0
>>
>
> I am not opposed to the general idea of supporting this register, but I would
> ask for the following changes:
>
> 1. move the checks above into vcpu_exit_inout ; that function is where in/out
>    instruction emulation is done, not directly in the vcpu_exit handler. make
>    vcpu_exit_inout return a value, and you can return EAGAIN there and pass
>    it up the chain like you are doing above.
>

Good point!

> 2. use #defines for 0xcf9 and whatever 0x06 means
>
> Happy to take a look again if those changes are made. Thx!

Same.