Re: [Call For Test] Single USB device passthrough for Bhyve

From: ShengYi Hung <aokblast_at_freebsd.org>
Date: Thu, 28 Aug 2025 15:00:59 UTC

Hello all:

I have some updates. I patch the vm-bhyve in
https://github.com/freebsd/vm-bhyve/pull/36 so everyone who setup their vms
by using the vm-bhyve can use the patched version to test your device.

ShengYi Hung <aokblast@freebsd.org> writes:

> Hello:
> Sorry, I forgot to mention this in the mail—it’s already summarized in the patch.
> Currently, we only support device selection based on VID and PID. If there are
> multiple identical devices, the chosen one depends on the order
> that /dev/usbctl ioctl returns to userspace.
>
> A simpler way to determine which device is selected is by checking the usbconfig order—the topmost entry is the one that gets selected.
>
> In libusb, there is a function called libusb_wrap_sys_device that can
> open a /dev/usb/ugen device using a file descriptor and build a
> libusb_device context from it. This approach would let us manually
> select a specific ugen device instead of relying solely on VID/PID,
> which solves the problem of handling multiple identical devices.
>
> However, the FreeBSD ugen interface uses two file descriptors, which makes this implementation a bit more complicated.
>
> Shawn Webb <shawn.webb@hardenedbsd.org> writes:
>
>> On Wed, Aug 27, 2025 at 12:36:12AM +0800, ShengYi Hung wrote:
>>> 
>>> Hello all:
>>> 
>>> 
>>> I am currently working on implementing single USB device passthrough for
>>> bhyve.
>>> 
>>> The patch is over here: https://reviews.freebsd.org/D52166
>>> 
>>> At this stage, all four types of transfers are supported: control, bulk, interrupt,
>>> and isochronous. I have verified functionality with a few devices, but broader
>>> testing is definitely needed to ensure stability and
>>> compatibility. The isochornous xfer remain untested since it is
>>> a little bit hard for me to setup uvc test in guest.
>>> 
>>> In addition, device hotplug is supported. This means that once the guest is
>>> running, you can physically remove a device and reattach it without
>>> requiring a restart.
>>> 
>>> To build this feature, please apply all parent patches listed on
>>> Phabricator and rebuild kernel, libusb, and usbconfig.
>>> 
>>> To test passthrough, append the following argument in your bhyve
>>> config, -s 30,xhci,passthru.vid.pid
>>> Here, vid and pid are the hexadecimal value of the vendor id
>>> and product id of the target device. You can obtain these values with:
>>> usbconfig dump_all_desc.
>>> 
>>> I would greatly appreciate it if more people could test this feature and
>>> provide feedback. Thanks!
>>
>> Thanks for working on this! If I have multiple of the same device
>> connected (two Yubikeys for example), would this pass through both
>> devices or just one? If just one, which would it be?
>>
>> Thanks,

-- 
Best Regards.
ShengYi Hung.