Fork of QEMU that supports PCI Passthrough on macOS http://www.qemu.org
  • C 82.8%
  • C++ 6.1%
  • Python 3.4%
  • Dylan 2.7%
  • Shell 1.7%
  • Other 3.1%
Find a file
2026-07-11 14:09:20 -07:00
.github/workflows github: fix config mistake preventing repo lockdown commenting 2022-04-26 16:12:26 +01:00
.gitlab/issue_templates gitlab: update bug template for sec issues & tool assistance 2026-06-23 10:55:09 +01:00
.gitlab-ci.d Changes: 2026-06-26 07:58:03 -04:00
accel workaround irqchip bug after merge 2026-07-11 14:09:20 -07:00
audio audio: Use unsigned PCM bias 2026-04-28 18:53:58 +04:00
authz qom: drop user_creatable_add_type method 2026-05-21 12:39:54 +01:00
backends Merge remote-tracking branch 'upstream/master' into wip 2026-07-09 13:27:49 -07:00
block qom: replace 'can_be_deleted' with 'prepare_delete' 2026-07-07 11:16:22 +02:00
bsd-user target/arm: Rename isar_feature_aa64_sve_aes 2026-06-29 11:03:46 +01:00
chardev monitor: pass chardev ID into monitor constructor instead of object 2026-07-07 11:16:23 +02:00
common-user buildsys: Remove MIPS TCG backend 2026-05-21 08:20:58 +02:00
configs hw/hexagon: Define hexagon "virt" machine 2026-06-29 06:03:00 -07:00
contrib Merge remote-tracking branch 'upstream/master' into wip 2026-07-09 13:27:49 -07:00
crypto crypto/x509-utils: fix gnutls error code in crt_init failure path 2026-07-07 17:10:24 +02:00
disas disas/riscv: enable mnret disassembly 2026-06-16 20:00:47 +10:00
docs Merge remote-tracking branch 'upstream/master' into wip 2026-07-09 13:27:49 -07:00
dump dump: fix misleading VMCOREINFO phys_base parse error 2026-06-30 19:12:59 +04:00
ebpf ebpf: fix swapped toeplitz/indirection args in set_data trace 2026-07-07 17:10:24 +02:00
fpu fpu: Handle all rounding modes in partsN_round_to_int_normal 2026-06-10 16:54:40 +01:00
fsdev hw/9pfs: add max_xattr option 2026-06-29 15:10:31 +02:00
gdbstub monitor: pass chardev ID into monitor constructor instead of object 2026-07-07 11:16:23 +02:00
host/include meson: Drop host_arch rename for riscv64 2026-01-17 10:46:07 +11:00
hw Merge remote-tracking branch 'upstream/master' into wip 2026-07-09 13:27:49 -07:00
include Merge remote-tracking branch 'upstream/master' into wip 2026-07-09 13:27:49 -07:00
io io: invert the return semantics of qio_channel_flush 2026-05-21 12:39:54 +01:00
libdecnumber libdecnumber: replace FSF postal address with licenses URL 2025-06-26 00:42:37 +02:00
linux-headers linux-headers: Update to Linux v7.2-rc1 with KVM_S390_VM_CPU_FEAT_ASTFLEIE2 2026-07-06 13:37:54 +02:00
linux-user Accelerators patches queue 2026-07-06 18:38:14 +02:00
migration Monitor patches for 2026-07-07 2026-07-07 19:17:41 +02:00
monitor monitor: add support for auto-deleting monitors upon close 2026-07-07 11:16:27 +02:00
nbd block: Add flags parameter to blk_*_pdiscard() 2026-05-19 17:25:48 +02:00
net qom: replace 'can_be_deleted' with 'prepare_delete' 2026-07-07 11:16:22 +02:00
pc-bios qemu-openbios queue 2026-07-08 16:01:29 +02:00
plugins plugins: use int64_t for the syscall filter return value 2026-06-18 16:47:12 -07:00
po po: update Italian translation 2024-08-13 19:01:42 +02:00
python tests: switch from -mon to -object monitor-qmp 2026-07-07 11:16:27 +02:00
pyvenv meson, mkvenv: add functests custom target 2026-02-23 13:24:42 -05:00
qapi Monitor patches for 2026-07-07 2026-07-07 19:17:41 +02:00
qga qga/vss: Drop unused define uuid(x) 2026-06-17 15:15:43 +02:00
qobject json-parser: add location to JSON parsing errors 2026-07-02 13:56:35 +02:00
qom qom: add trace events for user creatable create/delete APIs 2026-07-07 11:16:27 +02:00
replay replay: Use Linux key codes 2026-05-25 02:01:14 +04:00
roms Update OpenBIOS images to e5ac46dd built from submodule. 2026-07-07 22:07:16 +01:00
rust system/memory: move RamDiscardManager to separate compilation unit 2026-06-22 17:08:48 -04:00
scripts ui/spice: add cleanup on shutdown 2026-06-24 15:41:14 +04:00
scsi scsi/pr-manager-helper: free path on finalization 2026-05-11 23:59:33 +04:00
semihosting accel/tcg: Move cpu_loop_exit_*() out of 'exec/cpu-common.h' 2026-06-18 14:27:21 +02:00
stats qapi: Move include/qapi/qmp/ to include/qobject/ 2025-02-10 15:33:16 +01:00
storage-daemon monitor: rename monitor_init* to monitor_new* 2026-07-07 11:16:23 +02:00
stubs monitor: implement "user creatable" interface for adding monitors 2026-07-07 11:16:25 +02:00
subprojects libvhost-user: look for available vq buffers upon SET_VRING_KICK 2026-07-04 05:03:47 -04:00
system Merge remote-tracking branch 'upstream/master' into wip 2026-07-09 13:27:49 -07:00
target Merge remote-tracking branch 'upstream/master' into wip 2026-07-09 13:27:49 -07:00
tcg tcg/loongarch64: Fix cmp_vec with TCG_COND_NE 2026-07-07 11:16:05 -07:00
tests tcg/loongarch64: Fix cmp_vec with TCG_COND_NE 2026-07-08 16:00:20 +02:00
tools monitor: drop unused monitor_cur_is_qmp 2026-07-07 11:16:25 +02:00
trace trace/control: Fix -Wunused-but-set-global warning with clang 23+ 2026-06-18 11:01:40 -04:00
ui monitor: replace 'common' with 'parent_obj' in MonitorHMP 2026-07-07 11:16:22 +02:00
util Merge remote-tracking branch 'upstream/master' into wip 2026-07-09 13:27:49 -07:00
.b4-config b4: Drop linktrailermask 2025-07-03 13:42:28 +02:00
.dir-locals.el
.editorconfig scripts/kernel-doc: Delete the old Perl kernel-doc script 2025-08-30 16:37:23 +01:00
.exrc
.gdbinit
.git-blame-ignore-revs metadata: add .git-blame-ignore-revs 2023-04-04 15:56:44 +01:00
.gitattributes rust: patch bilge-impl to allow compilation with 1.63.0 2024-11-05 14:18:16 +01:00
.gitignore configure: rename --enable-pypi to --enable-download, control subprojects too 2023-06-06 16:30:01 +02:00
.gitlab-ci.yml docs: Document GitLab custom CI/CD variables 2021-07-29 07:56:01 +02:00
.gitmodules .gitmodules: restore qemu-project mirror of u-boot-sam460ex 2025-10-07 07:33:39 +01:00
.gitpublish .gitpublish: use origin/master as default base 2025-10-07 07:33:39 +01:00
.mailmap MAINTAINERS: update Song Gao's email address 2026-07-07 08:41:29 -04:00
.patchew.yml scripts/checkpatch: roll diff tweaking into checkpatch itself 2021-06-25 10:08:33 +01:00
.readthedocs.yml readthedocs: don't build extra formats 2025-08-12 14:59:50 -04:00
.travis.yml travis.yml: Remove the aarch64 job 2025-06-11 12:17:17 +02:00
block.c block: Fix references in bdrv_bsc_*() function comments 2026-03-31 14:52:06 +02:00
blockdev-nbd.c nbd: Avoid deadlock in client connecting to same-process server 2025-11-13 12:50:57 -06:00
blockdev.c block: Fix BDS use after free during shutdown 2025-12-15 17:31:08 +01:00
blockjob.c block: rename block/aio-wait.h to qemu/aio-wait.h 2025-12-27 10:11:12 +01:00
clippy.toml meson, cargo: require Rust 1.83.0 2025-09-17 19:00:56 +02:00
configure Accelerators patches queue 2026-06-18 16:28:12 -04:00
COPYING COPYING: replace FSF postal address with licenses URL 2025-06-26 00:42:37 +02:00
COPYING.LIB COPYING: replace FSF postal address with licenses URL 2025-06-26 00:42:37 +02:00
cpu-common.c cpu: Move cpu_breakpoint_test out of line 2026-07-06 15:42:18 +02:00
cpu-target.c cpu: Rename CPUState @singlestep_enabled -> @singlestep_flags 2026-07-06 15:42:18 +02:00
event-loop-base.c qom: replace 'can_be_deleted' with 'prepare_delete' 2026-07-07 11:16:22 +02:00
gitdm.config contrib/gitdm: add group-map for Microsoft 2025-11-24 09:45:30 +00:00
hmp-commands-info.hx monitor: Do not check multiple TARGET_* to build 'info tlb' command 2026-05-06 12:58:08 +02:00
hmp-commands.hx hmp-commands.hx: fix button_state doc 2026-06-17 19:22:49 +04:00
iothread.c darwin: prevent App Nap and I/O throttling from demoting guest performance 2026-05-04 17:13:55 -04:00
job-qmp.c qapi job: Elide redundant has_FOO in generated C 2022-12-14 20:04:47 +01:00
job.c block: rename block/aio-wait.h to qemu/aio-wait.h 2025-12-27 10:11:12 +01:00
Kconfig dump: Build stubs once for non-x86 targets 2026-01-22 10:48:46 +01:00
Kconfig.host vfio: Allow building on Darwin hosts 2026-05-04 16:53:37 -04:00
LICENSE
MAINTAINERS Merge remote-tracking branch 'upstream/master' into wip 2026-07-09 13:27:49 -07:00
Makefile Revert "Makefile: include tests/Makefile.include before ninja calculation" 2026-06-01 17:16:10 +01:00
meson.build Merge remote-tracking branch 'upstream/master' into wip 2026-07-09 13:27:49 -07:00
meson_options.txt Remove the deprecated glusterfs block driver 2026-05-19 17:25:48 +02:00
module-common.c
os-posix.c os: add an ability to lock memory on_fault 2025-02-12 11:36:01 -05:00
os-wasm.c include/qemu/osdep.h: Add Emscripten-specific OS dependencies 2025-05-06 16:02:04 +02:00
os-win32.c include: Rename sysemu/ -> system/ 2024-12-20 17:44:56 +01:00
page-vary-common.c page-vary: Build finalize_target_page_bits as common code 2026-02-26 00:12:07 +01:00
page-vary-system.c page-vary: Build migration_legacy_page_bits as common code 2026-02-26 00:12:12 +01:00
pythondeps.toml python: bump qemu.qmp to v0.0.6 2026-05-21 12:39:54 +01:00
qemu-bridge-helper.c
qemu-edid.c qemu-edid: Restrict input parameter -d to avoid division by zero 2022-10-12 13:38:15 +02:00
qemu-img-cmds.hx qemu-img info: Add cache mode option 2025-10-29 12:10:10 +01:00
qemu-img.c qemu-img: add sub-command --remove-all to 'qemu-img bitmap' 2026-06-08 17:00:46 +02:00
qemu-io-cmds.c qemu-io: Add 'aio_discard' command 2026-05-19 17:25:48 +02:00
qemu-io.c qapi: Move include/qapi/qmp/ to include/qobject/ 2025-02-10 15:33:16 +01:00
qemu-keymap.c qemu-keymap: Use Linux key codes 2026-05-25 02:01:35 +04:00
qemu-nbd.c nbd: Defer trace init until after daemonization 2025-03-05 13:00:22 -06:00
qemu-options.hx MIPS and SuperH patches queue 2026-07-08 15:59:51 +02:00
qemu.nsi pc-bios: Move device tree files in their own subdir 2025-04-25 17:09:58 +02:00
qemu.sasl sasl: remove comment about obsolete kerberos versions 2021-06-14 13:28:50 +01:00
README.md Update README with Thunderbolt device requirements 2026-07-06 17:38:24 -07:00
README.upstream.rst add some basic docs for this fork 2026-05-04 21:42:33 -04:00
replication.c replication: move include out of root directory 2021-05-26 14:49:46 +02:00
run.in run: introduce a script for running devel commands 2025-12-27 10:11:12 +01:00
target-info-qom.c hw/riscv: Register generic riscv[32|64] QOM interfaces 2026-05-27 08:03:27 +02:00
target-info-stub.c target-info: introduce TargetInfo in QOM 2026-05-14 10:41:17 -07:00
target-info.c target-info: Add target_riscv64() 2026-05-27 08:50:37 +02:00
trace-events cpu: Better name cpu_single_step() trace event 2026-07-06 15:42:18 +02:00
VERSION Open 11.1 development tree 2026-04-22 14:19:37 -04:00
version.rc

QEMU + apple-vfio

This is a fork of QEMU that adds PCI passthrough on Apple Silicon Macs via a DriverKit system extension, packaged as a single macOS app that bundles QEMU and the dext together.

The upstream QEMU README is preserved at README.upstream.rst.

This document covers building the macOS host app from source. Since, we have not yet received the necessary entitlements from Apple, we cannot release binaries of this project yet.


Prerequisites

  • Apple Silicon Mac running macOS 26 (Tahoe) or newer
  • Xcode 26.3+ with the macOS installed
  • An Apple Developer account
  • A non-TB5 Thunderbolt device like an eGPU enclosure. Keep in mind that newer Thunderbolt 5 enclosures DO NOT WORK correctly with Apple Silicon. Best to stick to an older Thunderbolt 4 or 3 enclosure.

Configure the Xcode project for your Apple Developer team

Open the project:

open contrib/apple-vfio/VFIOUserHostApp.xcodeproj

Before building anything, make sure you've logged into Xcode with your Apple Developer account (Xcode -> Settings -> Apple Accounts), and that your computer is authorized

Then for each of the three targets — VFIOUserHostApp, VFIOUserPCIDriver, and qemu-vfio-apple:

  1. Select the target in the project navigator.
  2. Go to Signing & Capabilities.
  3. Change Team to your own team in the dropdown. Leave Automatically manage signing checked.
  4. Update Bundle Identifier, replacing the scottjg. prefix with one registered to your team (e.g. com.example.). Keep the suffixes intact so the parent/child relationship between the app and dext is preserved:
    • com.example.VFIOUserHostApp
    • com.example.VFIOUserHostApp.VFIOUserPCIDriver
    • com.example.VFIOUserHostApp.qemu-vfio-apple

Build with Product → Build (⌘B). The app lands in ~/Library/Developer/Xcode/DerivedData/VFIOUserHostApp-*/Build/Products/Debug/VFIOUserHostApp.app


Copy the app to /Applications

This step is required. macOS will not stage a DriverKit extension unless its host app lives under /Applications (or another system-managed location). The app contains an at-launch helper that offers to move itself, but it deliberately skips that prompt for builds running out of DerivedData so developers don't get nagged on every rebuild.

So, after building in Xcode, manually copy the app:

  1. In Xcode, right-click VFIOUserHostApp.app under Products and choose Show in Finder.
  2. Drag VFIOUserHostApp.app into /Applications.
  3. Launch it from /Applications (not from DerivedData).

If you skip this step, the dext won't load and the app's "Install System Extension" button will fail silently or report an activation error.


First launch

On first launch from /Applications:

  1. Select the option to install the system extension.
  2. macOS shows a notification: "System Extension Blocked". Open System Settings → Privacy & Security, scroll to the bottom, and click Allow next to the entry for VFIOUserPCIDriver.
  3. Select the option to install the CLI tools.
  4. You can quit the app.
  5. Open a new terminal and run qemu-vfio-apple driver-status to verify the driver is installed
  6. Run qemu-vfio-apple list-devices to confirm that your eGPU is recognized and the driver attached.
  7. Run qemu-vfio-apple run to start the VM with your eGPU.
  8. Sign into the Ubuntu user with the password 'ubuntu'

Code layout

contrib/
├── apple-vfio/                          # macOS host app + dext + CLI launcher
│   ├── VFIOUserHostApp.xcodeproj/       # the Xcode project
│   ├── VFIOUserHostApp/                 # SwiftUI host app
│   ├── VFIOUserPCIDriver/               # DriverKit dext (C++/IIG)
│   ├── qemu-vfio-apple/                 # Swift CLI launcher embedded in the app
│   ├── scripts/                         # build-phase scripts and dist tooling
│   └── image-builder/                   # prebaked Ubuntu guest image pipeline
└── apple-dma/                           # guest-side DMA companion device driver
    ├── linux/                           # apple_dma Linux kernel module (DKMS)

QEMU-side changes for the Apple VFIO backend live under hw/vfio/ (apple-device.c, container-apple.c, apple-dma.c, etc.) and are gated by host_os == 'darwin' in hw/vfio/meson.build.

contrib/apple-dma/linux/ is required in the guest. Only the dext can program the DART (Apple's IOMMU), so we ship a paravirtual PCI device (hw/vfio/apple-dma.c) plus a matching DKMS kmod that hooks dma_map_ops for passthrough devices and forwards each map/unmap to QEMU over a doorbell-driven shared-memory ring; QEMU asks the dext to update the DART. The prebaked image installs the kmod automatically; BYO guests need to build and load it.