Index | Thread | Search

From:
hshoexer <hshoexer@yerbouti.franken.de>
Subject:
Re: Sysupgrade on i386 vmm to current snapshot hangs on boot into upgrade kernel
To:
tech@openbsd.org
Date:
Tue, 7 Apr 2026 11:46:34 +0200

Download raw body.

Thread
  • Alexander Bluhm:

    Sysupgrade on i386 vmm to current snapshot hangs on boot into upgrade kernel

  • hshoexer:

    Sysupgrade on i386 vmm to current snapshot hangs on boot into upgrade kernel

  • Mike Larkin:

    Sysupgrade on i386 vmm to current snapshot hangs on boot into upgrade kernel

  • Hi,
    
    On Sun, Apr 05, 2026 at 01:08:51PM -0500, Brent Cook wrote:
    > On Sun, Apr 05, 2026 at 04:58:11AM -0500, Brent Cook wrote:
    > > On Tue, Mar 31, 2026 at 1:35???PM Alexander Bluhm <bluhm@openbsd.org> wrote:
    > > 
    > > > On Tue, Mar 31, 2026 at 09:30:30AM -0700, Mike Larkin wrote:
    > > > > rebuild the host kernel with HZ=1000 and see if running that makes the
    > > > problem
    > > > > go away.
    > > >
    > > > I have option HZ=1000 in host's sys/conf/GENERIC now.  It does not help.
    > > > Guest's GENERIC is unmodified.
    > > >
    > > > When the i386 guest boots, its GENERIC either says
    > > > cpu0: AMD EPYC 73F3 16-Core Processor ("AuthenticAMD" 686-class, 512KB L2
    > > > cache) 3.50 GHz, 19-01-01
    > > > or
    > > > cpu0: AMD EPYC 73F3 16-Core Processor ("AuthenticAMD" 686-class, 512KB L2
    > > > cache) 74 MHz, 19-01-01
    > > >
    > > >
    > > Same thing here, but this is a clue why RAMDISK_CD hangs but not GENERIC
    > > are hanging, at least for me.
    > > 
    > > Adding pvclock0 allows RAMDISK_CD to boot 100% of the time in my local vmm
    > > machine.
    > > 
    > > diff --git a/sys/arch/i386/conf/RAMDISK_CD b/sys/arch/i386/conf/RAMDISK_CD
    > > index c00f6dcbbb4..24bd4e465a9 100644
    > > --- a/sys/arch/i386/conf/RAMDISK_CD
    > > +++ b/sys/arch/i386/conf/RAMDISK_CD
    > > @@ -28,6 +28,7 @@ config                bsd root on rd0a swap on rd0b and
    > > wd0b and sd0b
    > >  mainbus0       at root
    > > 
    > >  pvbus0         at mainbus0     # Paravirtual device bus
    > > +pvclock0       at pvbus?       # KVM/VMD paravirtual clock
    > > 
    > >  acpi0          at bios?
    > >  #acpitimer*    at acpi?
    > > 
    > > 
    > 
    > Ugh, that last paste was ugly, sorry. Switching mail clients:
    > 
    > Would anyone be able to give this diff a try? It's working locally; I
    > was able reliably get the i8254 to calibrate to 4GHz, and see no hangs
    > either in RAMDISK_CD or when switching sysctl
    > kern.timecounter.hardware=i8254. Now my i386 VMM machine can
    > sysupgrade reliably
    
    diff works for me with openbsd i386 and amd64 with the RAMDISK_CD
    and switching timecounter from pvclock0 to i8254 back and forth.
    
    > The main change here is to set the timestamp right in the vcpu thread
    > instead of later in the event loop in i8253_reset. Otherwise, a latch
    > command issued before i8253_reset runs will be using a new start value,
    > but an old stale ts value. Maybe this makes the clock_gettime in
    > i8253_reset unnecessary, but I left it in.
    > 
    > This also adjusts a couple of the register states to match that of
    > Bhyve when the mode is updated or there is a latch command:
    > 
    > https://github.com/freebsd/freebsd-src/blob/main/sys/amd64/vmm/io/vatpit.c#L239
    > https://github.com/freebsd/freebsd-src/blob/main/sys/amd64/vmm/io/vatpit.c#L330
    > 
    > Hopefully this makes sense, or if it's the wrong approach, at least
    > inspires the correct fix.
    > 
    > diff --git a/usr.sbin/vmd/i8253.c b/usr.sbin/vmd/i8253.c
    > index 9e32d9382b6..091716a2f32 100644
    > --- a/usr.sbin/vmd/i8253.c
    > +++ b/usr.sbin/vmd/i8253.c
    > @@ -262,12 +262,14 @@ vcpu_exit_i8253(struct vm_run_params *vrp)
    >  					    ticks % i8253_channel[sel].start;
    >  				} else
    >  					i8253_channel[sel].olatch = 0;
    > +				i8253_channel[sel].last_r = 2;
    >  				goto ret;
    >  			} else if (rw != TIMER_16BIT) {
    >  				log_warnx("%s: i8253 PIT: unsupported counter "
    >  				    "%d rw mode 0x%x selected", __func__,
    >  				    sel, (rw & TIMER_16BIT));
    >  			}
    > +			i8253_channel[sel].last_w = 0;
    >  			i8253_channel[sel].mode = (out_data & 0xe) >> 1;
    >  
    >  			goto ret;
    > @@ -293,6 +295,9 @@ vcpu_exit_i8253(struct vm_run_params *vrp)
    >  				if (i8253_channel[sel].start == 0)
    >  					i8253_channel[sel].start = 0xffff;
    >  
    > +				clock_gettime(CLOCK_MONOTONIC,
    > +				    &i8253_channel[sel].ts);
    > +
    >  				DPRINTF("%s: channel %d reset, mode=%d, "
    >  				    "start=%d\n", __func__,
    >  				    sel, i8253_channel[sel].mode,
    > 
    
    
  • Alexander Bluhm:

    Sysupgrade on i386 vmm to current snapshot hangs on boot into upgrade kernel

  • hshoexer:

    Sysupgrade on i386 vmm to current snapshot hangs on boot into upgrade kernel

  • Mike Larkin:

    Sysupgrade on i386 vmm to current snapshot hangs on boot into upgrade kernel