Proxmox VE 9's qemu-server hardcodes the x86 ISA tpm-tis device model in
add_tpm_device() (src/PVE/QemuServer.pm). QEMU's aarch64 virt machine has
no ISA bus and only exposes TPM as the sysbus device tpm-tis-device. As a
result, any VM with arch: aarch64 and a tpmstate0 configured fails to start:
qemu-system-aarch64: -device tpm-tis,tpmdev=tpmdev: 'tpm-tis' is not a valid device model name
This is not a configuration gap — no qm/PVE setting works around it, it
requires a source patch. Tracked upstream as
Bugzilla #4219 (open since
2022-09-15, status "MORE INFO NEEDED"). A community fix was sent to pve-devel
in January 2025 ("cfg2cmd: use tpm-tis and tpm-tis-device depending on the
arch") but got no replies and was never merged.
tpm-arm64.patch — applies against qemu-server v9.2.1
(proxmox/qemu-server commit 601c77f, the tip as of 2026-07-24):
add_tpm_device()now takes an$archparameter and pickstpm-tisforx86_64/tpm-tis-deviceotherwise.- Adds a regression test fixture,
src/test/cfg2cmd/aarch64/simple-arm-tpm.conf(+.conf.cmdsnapshot), covering an aarch64 VM withtpmstate0configured.
Verified:
make debbuilds cleanly (only pre-existing cosmetic lintian warnings about man page line-wrapping, unrelated to this change).- Full
cfg2cmdtest suite (102 tests) passes. - New aarch64 test emits
-device 'tpm-tis-device,tpmdev=tpmdev'. - Existing x86_64/q35 TPM tests (
efi-secboot-and-tpm.conf,efi-secboot-and-tpm-q35.conf) still emit-device 'tpm-tis,tpmdev=tpmdev'— no regression.
Confirmed on real hardware (2026-07-25): installed on a live PVE 9 box, an aarch64 Linux guest boots successfully with a v2.0 TPM state attached. Not yet tested with a Windows aarch64 guest — even with the correct device model, upstream reports (swtpm project issue #493) suggest Windows-on-ARM64 guests may still fail to fully initialize the TPM.
tpm-arm64.patch.old— the original unified diff (source fix + test fixture only, no commit metadata). Superseded by the item below; kept for reference.patch-for-upstream/0001-fix-4219-cfg2cmd-use-tpm-tis-device-for-TPM-on-non-x.patch— propergit format-patchoutput (commit message,Signed-off-by, ready to mail) for submitting upstream. Apply withgit am <file>inside aqemu-serverv9.2.1 checkout.qemu-server_9.2.1_amd64.deb— prebuilt package with the fix applied.sha256sum:4809923bac162771145705ab7237a995b7ea76f788aebfa63c1e5245e636ad49
Not yet sent. Two things to sort out first:
-
CLA: Proxmox requires a signed Contributor License Agreement before any patch can be merged — send the Individual CLA to
office@proxmox.comif not already on file. Status as of this writing: unconfirmed. -
Send the patch via
git send-email(required — plain mail clients mangle patch formatting) from wherever you have SMTP/mail configured:git send-email --to=pve-devel@lists.proxmox.com \ patch-for-upstream/0001-fix-4219-cfg2cmd-use-tpm-tis-device-for-TPM-on-non-x.patchSigned-off-by / author identity used:
daemonhorn <daemonhorn@nullcore.com>(matches this machine's git config — update the patch first withgit commit --amendif you want a different identity before sending).
sha256sum qemu-server_9.2.1_amd64.deb # confirm it matches the hash above
dpkg -l qemu-server # note current version
apt-get install --reinstall --download-only qemu-server # cache the official .deb for revert
cp /usr/share/perl5/PVE/QemuServer.pm ~/QemuServer.pm.orig # extra safety copy
apt install ./qemu-server_9.2.1_amd64.deb
apt-mark hold qemu-server
# qm CLI forks fresh perl each run and picks up the patch immediately.
# Restart these only if testing via GUI/API:
systemctl restart pvedaemon pveproxy pvestatd
Avoid installing while VMs are actively starting/stopping/migrating.
Test:
qm set <vmid> --arch aarch64 --bios ovmf --tpmstate0 <storage>:1,version=v2.0
qm start <vmid>
apt-mark unhold qemu-server
apt-get install --reinstall qemu-server # restores stock binary from cache
dpkg -V qemu-server # should report no discrepancies
systemctl restart pvedaemon pveproxy pvestatd # only if you restarted them above
rm -f ~/QemuServer.pm.orig
Pre-built Debian package that should match hash above: https://drive.google.com/file/d/1qGKpCZfRI99XYmz_6lgP8kTSpu9gkOCv/view?usp=sharing