---
name: "pvbus"
section: "4"
platform: "openbsd"
package: "man"
version: "8.0-current-20261101"
release: "OpenBSD 8.0-current (2026-11-01)"
platforms: ["openbsd"]
url: "https://new.carta.tech/pvbus"
---

# pvbus(4)

paravirtual device tree root

## NAME

**pvbus** – paravirtual device tree root

## SYNOPSIS

**pvbus0 at mainbus0**

**#include \<sys/types.h\>**

**#include \<sys/ioctl.h\>**

**#include \<dev/pv/pvvar.h\>**

## DESCRIPTION

**pvbus** is used on virtual machines that are running on hypervisors. It provides a pseudo-bus for all paravirtual devices that do not attach to a well-known bus like [pci(4)](/pci/4.md). The **pvbus** driver is responsible for detecting the hypervisor interface, checking the capabilities, attaching the paravirtual devices, and providing access to supported information stores.

### Supported hypervisors

- KVM

  Kernel-based Virtual Machine

- Hyper-V

  Microsoft Hyper-V

- OpenBSD

  OpenBSD [vmm(4)](/vmm/4.md)

- VMware

  VMware vSphere Hypervisor and ESXi

- Xen

  Xen VMM

Note that a hypervisor can attempt to emulate other hypervisors, so multiple hypervisor interfaces may be available on the same host.

### VMware paravirtual devices

- [vmt(4)](/vmt/4.md)

  VMware Tools driver and “guestinfo” information store

### Hyper-V paravirtual devices

- [hvn(4)](/hvn/4.md)

  Hyper-V virtual networking interface

- [hvs(4)](/hvs/4.md)

  Hyper-V virtual disk

- [hyperv(4)](/hyperv/4.md)

  Hyper-V guest nexus device

### Xen paravirtual devices

- [xbf(4)](/xbf/4.md)

  Xen Blkfront virtual disk

- [xen(4)](/xen/4.md)

  Xen domU nexus device and XenStore information store

- [xnf(4)](/xnf/4.md)

  Xen Netfront virtual networking interface

## IOCTL INTERFACE

**pvbus** supports [ioctl(2)](/ioctl/2.md) commands to exchange information with the hypervisor interface, as implemented in the [hostctl(8)](/hostctl/8.md) program. Each detected hypervisor interface is available as a character special device file, */dev/pvbus0*, */dev/pvbus1*, etc. All available commands use the same *pvbus\_req* structure:

```
struct pvbus_req {
	size_t			 pvr_keylen;
	char			*pvr_key;
	size_t			 pvr_valuelen;
	char			*pvr_value;
};
```

The caller is responsible for attaching character buffers to the *pvr\_key* and *pvr\_value* fields and to set their length in *pvr\_keylen* and *pvr\_valuelen* accordingly. All keys and values are nul-terminated strings.

The following [ioctl(2)](/ioctl/2.md) commands are available:

- PVBUSIOC\_KVREAD

  Read the value from *pvr\_key* and return it in *pvr\_value*. If *pvr\_valuelen* is not enough for the value, the command will fail and [errno(2)](/errno/2.md) is set to ERANGE.

- PVBUSIOC\_KVTYPE

  Return the type of the attached hypervisor interface as a string in *pvr\_key*; see Supported hypervisors.

- PVBUSIOC\_KVWRITE

  Write the new value *pvr\_value* to the key *pvr\_key*. This command requires write permissions on the device file.

## FILES

- /dev/pvbus*u*

  **pvbus** device unit *u* file.

## SEE ALSO

[autoconf(4)](/autoconf/4.md), [intro(4)](/intro/4.md), [mainbus(4)](/mainbus/4.md), [vmm(4)](/vmm/4.md), [hostctl(8)](/hostctl/8.md)

## HISTORY

The **pvbus** pseudo-bus first appeared in OpenBSD 5.8.

## AUTHORS

The **pvbus** pseudo-bus was written by Reyk Floeter ⟨*reyk@openbsd.org*⟩.
