From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 8BE261FF139 for ; Tue, 10 Feb 2026 14:54:19 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id C18E12C96; Tue, 10 Feb 2026 14:54:56 +0100 (CET) From: Fiona Ebner To: pve-devel@lists.proxmox.com Subject: [PATCH qemu-server 2/2] cpu config: use static CPU model list shipped by QEMU package if available Date: Tue, 10 Feb 2026 14:52:29 +0100 Message-ID: <20260210135417.184127-3-f.ebner@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260210135417.184127-1-f.ebner@proxmox.com> References: <20260210135417.184127-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1770731576640 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.016 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: A5U5WP7K3YQMBE2WN533SNKZDYD5I4LJ X-Message-ID-Hash: A5U5WP7K3YQMBE2WN533SNKZDYD5I4LJ X-MailFrom: f.ebner@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Suggested-by: Thomas Lamprecht Signed-off-by: Fiona Ebner --- Requires the following series by Dominik to be applied: https://lore.proxmox.com/pve-devel/20260205141959.3615131-1-d.csapak@proxmox.com/T/ src/PVE/QemuServer/CPUConfig.pm | 237 +++++++++++++++++--------------- 1 file changed, 126 insertions(+), 111 deletions(-) diff --git a/src/PVE/QemuServer/CPUConfig.pm b/src/PVE/QemuServer/CPUConfig.pm index 165c48a7..a52e7815 100644 --- a/src/PVE/QemuServer/CPUConfig.pm +++ b/src/PVE/QemuServer/CPUConfig.pm @@ -104,119 +104,134 @@ my $all_cpu_models; # helper to make it easier for testing # initializes both '$cpu_models_by_arch' and '$all_cpu_models' sub initialize_cpu_models { - $cpu_models_by_arch = { - x86_64 => { - # Intel CPUs - 486 => 'GenuineIntel', - pentium => 'GenuineIntel', - pentium2 => 'GenuineIntel', - pentium3 => 'GenuineIntel', - coreduo => 'GenuineIntel', - core2duo => 'GenuineIntel', - Conroe => 'GenuineIntel', - Penryn => 'GenuineIntel', - Nehalem => 'GenuineIntel', - 'Nehalem-IBRS' => 'GenuineIntel', - Westmere => 'GenuineIntel', - 'Westmere-IBRS' => 'GenuineIntel', - SandyBridge => 'GenuineIntel', - 'SandyBridge-IBRS' => 'GenuineIntel', - IvyBridge => 'GenuineIntel', - 'IvyBridge-IBRS' => 'GenuineIntel', - Haswell => 'GenuineIntel', - 'Haswell-IBRS' => 'GenuineIntel', - 'Haswell-noTSX' => 'GenuineIntel', - 'Haswell-noTSX-IBRS' => 'GenuineIntel', - Broadwell => 'GenuineIntel', - 'Broadwell-IBRS' => 'GenuineIntel', - 'Broadwell-noTSX' => 'GenuineIntel', - 'Broadwell-noTSX-IBRS' => 'GenuineIntel', - 'Skylake-Client' => 'GenuineIntel', - 'Skylake-Client-IBRS' => 'GenuineIntel', - 'Skylake-Client-noTSX-IBRS' => 'GenuineIntel', - 'Skylake-Client-v4' => 'GenuineIntel', - 'Skylake-Server' => 'GenuineIntel', - 'Skylake-Server-IBRS' => 'GenuineIntel', - 'Skylake-Server-noTSX-IBRS' => 'GenuineIntel', - 'Skylake-Server-v4' => 'GenuineIntel', - 'Skylake-Server-v5' => 'GenuineIntel', - 'Cascadelake-Server' => 'GenuineIntel', - 'Cascadelake-Server-v2' => 'GenuineIntel', - 'Cascadelake-Server-noTSX' => 'GenuineIntel', - 'Cascadelake-Server-v4' => 'GenuineIntel', - 'Cascadelake-Server-v5' => 'GenuineIntel', - 'Cooperlake' => 'GenuineIntel', - 'Cooperlake-v2' => 'GenuineIntel', - KnightsMill => 'GenuineIntel', - 'Icelake-Client' => 'GenuineIntel', # depreacated, removed with QEMU 7.1 - 'Icelake-Client-noTSX' => 'GenuineIntel', # depreacated, removed with QEMU 7.1 - 'Icelake-Server' => 'GenuineIntel', - 'Icelake-Server-noTSX' => 'GenuineIntel', - 'Icelake-Server-v3' => 'GenuineIntel', - 'Icelake-Server-v4' => 'GenuineIntel', - 'Icelake-Server-v5' => 'GenuineIntel', - 'Icelake-Server-v6' => 'GenuineIntel', - 'Icelake-Server-v7' => 'GenuineIntel', - 'SapphireRapids' => 'GenuineIntel', - 'SapphireRapids-v2' => 'GenuineIntel', - 'SapphireRapids-v3' => 'GenuineIntel', - 'SapphireRapids-v4' => 'GenuineIntel', - 'GraniteRapids' => 'GenuineIntel', - 'GraniteRapids-v2' => 'GenuineIntel', - 'GraniteRapids-v3' => 'GenuineIntel', - 'SierraForest' => 'GenuineIntel', - 'SierraForest-v2' => 'GenuineIntel', - 'SierraForest-v3' => 'GenuineIntel', - 'ClearwaterForest' => 'GenuineIntel', + my $cpu_models_x86_64_file = '/usr/share/kvm/cpu-models-x86_64.json'; + my $cpu_models_aarch64_file = '/usr/share/kvm/cpu-models-aarch64.json'; - # AMD CPUs - athlon => 'AuthenticAMD', - phenom => 'AuthenticAMD', - Opteron_G1 => 'AuthenticAMD', - Opteron_G2 => 'AuthenticAMD', - Opteron_G3 => 'AuthenticAMD', - Opteron_G4 => 'AuthenticAMD', - Opteron_G5 => 'AuthenticAMD', - EPYC => 'AuthenticAMD', - 'EPYC-IBPB' => 'AuthenticAMD', - 'EPYC-v3' => 'AuthenticAMD', - 'EPYC-v4' => 'AuthenticAMD', - 'EPYC-v5' => 'AuthenticAMD', - 'EPYC-Rome' => 'AuthenticAMD', - 'EPYC-Rome-v2' => 'AuthenticAMD', - 'EPYC-Rome-v3' => 'AuthenticAMD', - 'EPYC-Rome-v4' => 'AuthenticAMD', - 'EPYC-Rome-v5' => 'AuthenticAMD', - 'EPYC-Milan' => 'AuthenticAMD', - 'EPYC-Milan-v2' => 'AuthenticAMD', - 'EPYC-Milan-v3' => 'AuthenticAMD', - 'EPYC-Genoa' => 'AuthenticAMD', - 'EPYC-Genoa-v2' => 'AuthenticAMD', - 'EPYC-Turin' => 'AuthenticAMD', + if (-f $cpu_models_x86_64_file) { # QEMU package is new enough to ship static model files + my $json_text = PVE::Tools::file_get_contents($cpu_models_x86_64_file); + ($json_text) = $json_text =~ /(.*)/; # untaint + $cpu_models_by_arch->{'x86_64'} = eval { decode_json($json_text) } + or die "unable to decode contents of '$cpu_models_x86_64_file' - $@\n"; - # generic types, use vendor from host node - kvm32 => 'default', - kvm64 => 'default', - qemu32 => 'default', - qemu64 => 'default', - max => 'default', - }, - aarch64 => { - 'a64fx' => 'ARM', - 'cortex-a35' => 'ARM', - 'cortex-a53' => 'ARM', - 'cortex-a55' => 'ARM', - 'cortex-a57' => 'ARM', - 'cortex-a710' => 'ARM', - 'cortex-a72' => 'ARM', - 'cortex-a76' => 'ARM', - 'neoverse-n1' => 'ARM', - 'neoverse-n2' => 'ARM', - 'neoverse-v1' => 'ARM', - # 32 bit and deprecated models were not added - max => 'default', - }, - }; + $json_text = PVE::Tools::file_get_contents($cpu_models_aarch64_file); + ($json_text) = $json_text =~ /(.*)/; # untaint + $cpu_models_by_arch->{'aarch64'} = eval { decode_json($json_text) } + or die "unable to decode contents of '$cpu_models_aarch64_file' - $@\n"; + } else { # FIXME PVE 10.x - remove hard-coded list + $cpu_models_by_arch = { + x86_64 => { + # Intel CPUs + 486 => 'GenuineIntel', + pentium => 'GenuineIntel', + pentium2 => 'GenuineIntel', + pentium3 => 'GenuineIntel', + coreduo => 'GenuineIntel', + core2duo => 'GenuineIntel', + Conroe => 'GenuineIntel', + Penryn => 'GenuineIntel', + Nehalem => 'GenuineIntel', + 'Nehalem-IBRS' => 'GenuineIntel', + Westmere => 'GenuineIntel', + 'Westmere-IBRS' => 'GenuineIntel', + SandyBridge => 'GenuineIntel', + 'SandyBridge-IBRS' => 'GenuineIntel', + IvyBridge => 'GenuineIntel', + 'IvyBridge-IBRS' => 'GenuineIntel', + Haswell => 'GenuineIntel', + 'Haswell-IBRS' => 'GenuineIntel', + 'Haswell-noTSX' => 'GenuineIntel', + 'Haswell-noTSX-IBRS' => 'GenuineIntel', + Broadwell => 'GenuineIntel', + 'Broadwell-IBRS' => 'GenuineIntel', + 'Broadwell-noTSX' => 'GenuineIntel', + 'Broadwell-noTSX-IBRS' => 'GenuineIntel', + 'Skylake-Client' => 'GenuineIntel', + 'Skylake-Client-IBRS' => 'GenuineIntel', + 'Skylake-Client-noTSX-IBRS' => 'GenuineIntel', + 'Skylake-Client-v4' => 'GenuineIntel', + 'Skylake-Server' => 'GenuineIntel', + 'Skylake-Server-IBRS' => 'GenuineIntel', + 'Skylake-Server-noTSX-IBRS' => 'GenuineIntel', + 'Skylake-Server-v4' => 'GenuineIntel', + 'Skylake-Server-v5' => 'GenuineIntel', + 'Cascadelake-Server' => 'GenuineIntel', + 'Cascadelake-Server-v2' => 'GenuineIntel', + 'Cascadelake-Server-noTSX' => 'GenuineIntel', + 'Cascadelake-Server-v4' => 'GenuineIntel', + 'Cascadelake-Server-v5' => 'GenuineIntel', + 'Cooperlake' => 'GenuineIntel', + 'Cooperlake-v2' => 'GenuineIntel', + KnightsMill => 'GenuineIntel', + 'Icelake-Client' => 'GenuineIntel', # depreacated, removed with QEMU 7.1 + 'Icelake-Client-noTSX' => 'GenuineIntel', # depreacated, removed with QEMU 7.1 + 'Icelake-Server' => 'GenuineIntel', + 'Icelake-Server-noTSX' => 'GenuineIntel', + 'Icelake-Server-v3' => 'GenuineIntel', + 'Icelake-Server-v4' => 'GenuineIntel', + 'Icelake-Server-v5' => 'GenuineIntel', + 'Icelake-Server-v6' => 'GenuineIntel', + 'Icelake-Server-v7' => 'GenuineIntel', + 'SapphireRapids' => 'GenuineIntel', + 'SapphireRapids-v2' => 'GenuineIntel', + 'SapphireRapids-v3' => 'GenuineIntel', + 'SapphireRapids-v4' => 'GenuineIntel', + 'GraniteRapids' => 'GenuineIntel', + 'GraniteRapids-v2' => 'GenuineIntel', + 'GraniteRapids-v3' => 'GenuineIntel', + 'SierraForest' => 'GenuineIntel', + 'SierraForest-v2' => 'GenuineIntel', + 'SierraForest-v3' => 'GenuineIntel', + 'ClearwaterForest' => 'GenuineIntel', + + # AMD CPUs + athlon => 'AuthenticAMD', + phenom => 'AuthenticAMD', + Opteron_G1 => 'AuthenticAMD', + Opteron_G2 => 'AuthenticAMD', + Opteron_G3 => 'AuthenticAMD', + Opteron_G4 => 'AuthenticAMD', + Opteron_G5 => 'AuthenticAMD', + EPYC => 'AuthenticAMD', + 'EPYC-IBPB' => 'AuthenticAMD', + 'EPYC-v3' => 'AuthenticAMD', + 'EPYC-v4' => 'AuthenticAMD', + 'EPYC-v5' => 'AuthenticAMD', + 'EPYC-Rome' => 'AuthenticAMD', + 'EPYC-Rome-v2' => 'AuthenticAMD', + 'EPYC-Rome-v3' => 'AuthenticAMD', + 'EPYC-Rome-v4' => 'AuthenticAMD', + 'EPYC-Rome-v5' => 'AuthenticAMD', + 'EPYC-Milan' => 'AuthenticAMD', + 'EPYC-Milan-v2' => 'AuthenticAMD', + 'EPYC-Milan-v3' => 'AuthenticAMD', + 'EPYC-Genoa' => 'AuthenticAMD', + 'EPYC-Genoa-v2' => 'AuthenticAMD', + 'EPYC-Turin' => 'AuthenticAMD', + + # generic types, use vendor from host node + kvm32 => 'default', + kvm64 => 'default', + qemu32 => 'default', + qemu64 => 'default', + max => 'default', + }, + aarch64 => { + 'a64fx' => 'ARM', + 'cortex-a35' => 'ARM', + 'cortex-a53' => 'ARM', + 'cortex-a55' => 'ARM', + 'cortex-a57' => 'ARM', + 'cortex-a710' => 'ARM', + 'cortex-a72' => 'ARM', + 'cortex-a76' => 'ARM', + 'neoverse-n1' => 'ARM', + 'neoverse-n2' => 'ARM', + 'neoverse-v1' => 'ARM', + # 32 bit and deprecated models were not added + max => 'default', + }, + }; + } my $host_arch = get_host_arch(); # The host CPU model only exists if the arch matches -- 2.47.3