Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Sep 2025 13:05:00 +0000
From:      Jonathan Vasquez <jon@xyinn.org>
To:        "freebsd-virtualization@freebsd.org" <freebsd-virtualization@freebsd.org>
Subject:   Re: GPU Passthrough on FreeBSD 14.3 (AMD Radeon RX 6900 XT and Windows 10 Pro)
Message-ID:  <-rzPcOUnhEy7jFcu7cF7V_kjAVPV_2deuhv7EY-eJl536fUllXK-3SSnWq13HStABMZuphkRAysMMhDXvd_MWIlH4QaMGU-8l2nXKeOY-Eo=@xyinn.org>
In-Reply-To: <9c53f1805e22fcf2c9eb878e0c7cc9a723c30dd8.camel@FreeBSD.org>
References:  <6CV-OY6BcErrWRit9jSpi6fWsYBG3E_Z3u6eTLPcz6foPAZV1gQpZYaZTR7JA_1ot5RQVqrWQaLxJFySXjspIhSbBJGxmckcDQyzxhALNus=@xyinn.org> <21e892ba-bea5-4e65-91cf-409e5e927f67@FreeBSD.org> <l8EqFTkrrLvYOUcKLKIRbCxHHRDMjM--eRHlFwVyC0oHzp58cXM9bP9uLrbMe3wree4k9tI4ERHgFiBt3s9KB7htgR7FXaNNwmub7bq7K14=@xyinn.org> <77221679b528434788d667441d1a32a2@userve.net> <44d9286c-0866-4805-827d-5cb91511800b@tilda.center> <mOxiSfmxWrHIMEStshHuwzAKYh003kyxHWvA_NY42h2TJfzeGaYSA5ePY1WNK67MtP_quGeVkFzRTTeSf7ESI-gMBbcoxtr7DeQ24xr5Ntg=@xyinn.org> <3HATaLlOogPiMZWbxSnWPCnJC11_unXloaoQzyF8Ek01s9gZGVqnKKruZgFTrqHQBCi5xWNEzLzK37xiNdn3yCwXG8U7NfXKRmwY8_5xCLw=@xyinn.org> <7CNs3oS07TqJcWsTrJCZmDlAypBuy9yh4xr_iAgGnUOGjqAP5iRl1JMkuna8LwFSNIvphQLojKi214B4w6ef2q2IRgvjdolLwUD8KCnXaSQ=@xyinn.org> <9c53f1805e22fcf2c9eb878e0c7cc9a723c30dd8.camel@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help


Hello all,

I was able to get another stable vm on idle (this time without leaving Task Manager
opened) for another 22 hours. I also spent some time today improving my start/stop
scripts. Using Corvin's suggestion about the "daemon" process, I was able to
now successfully start the VM at boot time without blocking. I had to make some
adjustments to my bhyve script so it doesn't use "-l com1,stdio", because during
boot time, even with me making the script require "LOGIN syscons", it still
would throw the following error:

Unable to initialize backend 'stdio' for LPC device com1
100 Device emulation initialization error: Inappropriate ioctl for device

Which prevented the VM from starting. I've switched to using "-o console=stdio"
and that worked. I'm able to get regular console output, which allows the VM
to always start up successfully, and also allows us to log to a file when we run
our vm start script through daemon.

I've also observed that there were a few times when I restarted the VM without
restarting the host, 2-3 times, and each time the video output worked (meaning
I wasn't affected by the AMD Hardware Reset Bug). However, after that I wasn't
able to get that working anymore. So I would still recommend restarting the host.

I added the following to the script:

- Daemonized support so the VM starts up non-blocking. This also includes
  logging to a file at /var/log/vm_gaming.log. I didn't add -P and -p since the
  pid addresses looked off. We also don't seem to need it at the moment.
- Added the restart command (with a note about the AMD issue).
- Added some quality of life stuff like having some variables at the top
  to easily set your start/stop paths.

Some other things are that if I do "service vm_gaming <some command>", the
current console in tmux seems to get really laggy and the input gets weird. If
I open another tmux window, then input is fine again. There are no other
consequences other than laggy/wrong input in the current console. This doesn't
seem to negatively affect anything when starting it automatically at boot time
through rc.d.

One last thing is that I noticed that when I do a "shutdown -r now", I don't
see windows getting the ACPI shutdown signal, so I don't see Windows gracefully
shutting down. I have read if you do "reboot" it will just send the SIGTERM signal,
and kill everything afterwards, so the "shutdown" command should be used to
give advance notice to processes. Given that my rc.d script has "shutdown" in
the keywords list, I was expecting the "vm_gaming_stop" command to be ran
automatically in order to gracefully shutdown the VM, and clean itself up. Is this
not working because I'm not using -P / -p?

I've updated my blog post to include all of these new scripts and modifications.

I'll post the current scripts below. Thanks for reading.

Jonathan


## Bhyve Scripts

### start script

This is the main script that will start your vm. Save this as **`start.sh`**
in a folder called **`gaming`** somewhere on your system:

```
#!/bin/sh

VM_DIR="$(dirname $(realpath $0))"
VM_NAME="$(basename $VM_DIR)"

cd "$VM_DIR"

bhyve -AHPSw -c sockets=1,cores=16,threads=1 -m 32G \
-s 0,hostbridge \
-s 1,nvme,disk0.img \
-s 3:0,passthru,3/0/0 \
-s 3:1,passthru,3/0/1 \
-s 13:0,passthru,13/0/0 \
-s 30,xhci,tablet \
-s 31,lpc \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd,fwcfg=qemu \
-o console=stdio \
$VM_NAME

# Exit the script here and leave some options for debugging more
# ergonomically after the exit line.
exit

# Only use this when installing the VM for the first time:

# VNC. Once you install Windows and enable RDP, you can turn this off.
-s 29,fbuf,tcp=0.0.0.0:5900,w=1024,h=768,wait \

# The Windows ISO and the VirtIO Drivers ISO.
# You can download the latest stable virtio drivers at:
# https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
-s 4,ahci-cd,../files/Win10_22H2_English_x64v1_2023.iso \
-s 5,ahci-cd,../files/virtio-win-0.1.271.iso \

# If you want a network device without using virtio, you can use e1000.
# You should install the virtio drivers and use virtio-net instead for
# better performance.
-s 2,e1000,tap0 \
-s 2,virtio-net,tap0 \
```

### stop script

This is your stop script. Save this as **`stop.sh`** somewhere.

**`NOTE:`** This is currently set up to kill any process with **`bhyve`** in
the name. On this system I'm only running one bhyve VM, which is the gaming one.
Adjust accordingly to restrict its scope.

```
#!/bin/sh

# Send SIGTERM twice to make sure Windows listens to
# the ACPI shutdown signal.
pkill bhyve
pkill bhyve

# Wait a bit for the guest to shutdown properly before
# we continue shutting down the host.
sleep 10

bhyvectl --vm=gaming --destroy
```

### rc.d script

This script will allow you to start the VM automatically at boot time. Save this
file in your **`/usr/local/etc/rc.d/`** directory with the name **`vm_gaming`**.
Make sure to adjust any paths to where you saved your start/stop scripts:

**`NOTE:`** At the moment I noticed that if I do a **`shutdown -r now`**, I don't
actually see Windows gracefully shutting down (like when I send the ACPI shutdown
signal). Currently looking into this.

```
#!/bin/sh

# PROVIDE: vm_gaming
# REQUIRE: LOGIN
# KEYWORD: nojail shutdown

. /etc/rc.subr

name=vm_gaming
rcvar=vm_gaming_enable

start_cmd="${name}_start"
stop_cmd="${name}_stop"
restart_cmd="${name}_restart"

path_to_start_script="/atlantis/vms/gaming/start.sh"
path_to_stop_script="/atlantis/vms/gaming/stop.sh"

vm_gaming_start()
{
        daemon \
                -o /var/log/${name}.log \
                "${path_to_start_script}"
}

vm_gaming_stop()
{
        "${path_to_stop_script}"
}

vm_gaming_restart()
{
        # NOTE: AMD users will most likely experience the famous
        # AMD Hardware Reset Bug. This means that after you reboot
        # the guest, you most likely won't have video out. If this
        # happens, you'll need to restart the host. Sometimes this
        # command will work for AMD users though. So you can try a
        # restart and see if it works.
        vm_gaming_stop
        vm_gaming_start
}

load_rc_config $name

: ${vm_gaming_enable:="NO"}

run_rc_command "$1"
```



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?-rzPcOUnhEy7jFcu7cF7V_kjAVPV_2deuhv7EY-eJl536fUllXK-3SSnWq13HStABMZuphkRAysMMhDXvd_MWIlH4QaMGU-8l2nXKeOY-Eo=>