public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Arthur Bied-Charreton <a.bied-charreton@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH qemu-server v5 05/21] cpu flags: normalize CPU flags to QEMU's format
Date: Fri, 15 May 2026 11:28:22 +0200	[thread overview]
Message-ID: <20260515092839.238064-6-a.bied-charreton@proxmox.com> (raw)
In-Reply-To: <20260515092839.238064-1-a.bied-charreton@proxmox.com>

The QMP commands used in query_supported_cpu_flags() return some flags
multiple times in different formats, like for example 'sse4.2', 'sse4-2'
and 'sse4_2'.

In order to have a unified format, add the normalize_cpu_flag helper to
the CPUFlags module, which returns the alias QEMU has for a given flag
value. The list is sourced from x86_cpu_initfn() in
qemu/target/i386/cpu.c.

Suggested-by: Fiona Ebner <f.ebner@proxmox.com>
Signed-off-by: Arthur Bied-Charreton <a.bied-charreton@proxmox.com>
---
 src/PVE/QemuServer.pm          |  7 ++---
 src/PVE/QemuServer/CPUFlags.pm | 53 ++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 4 deletions(-)

diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm
index 57123e56..af55c322 100644
--- a/src/PVE/QemuServer.pm
+++ b/src/PVE/QemuServer.pm
@@ -69,6 +69,7 @@ use PVE::QemuServer::CPUConfig qw(
     get_intel_tdx_object
     get_cvm_type
 );
+use PVE::QemuServer::CPUFlags;
 use PVE::QemuServer::Drive qw(
     is_valid_drivename
     checked_volume_format
@@ -2992,10 +2993,8 @@ sub query_supported_cpu_flags {
             my $props = $cmd_result->{model}->{props};
             foreach my $prop (keys %$props) {
                 next if $props->{$prop} ne JSON::true;
-                # QEMU returns some flags multiple times, with '_', '.' or '-'
-                # (e.g. lahf_lm and lahf-lm; sse4.2, sse4-2 and sse4_2; ...).
-                # We only keep those with underscores, to match /proc/cpuinfo
-                $prop =~ s/\.|-/_/g;
+                $prop = PVE::QemuServer::CPUFlags::normalize_cpu_flag($prop);
+
                 $flags->{$prop} = 1;
             }
         };
diff --git a/src/PVE/QemuServer/CPUFlags.pm b/src/PVE/QemuServer/CPUFlags.pm
index a681eb75..e17ed00c 100644
--- a/src/PVE/QemuServer/CPUFlags.pm
+++ b/src/PVE/QemuServer/CPUFlags.pm
@@ -14,6 +14,7 @@ our @EXPORT_OK = qw(
     supported_cpu_flags_names
     get_supported_cpu_flags
     query_understood_cpu_flags
+    normalize_cpu_flag
 );
 
 my $supported_vm_specific_cpu_flags_by_arch = {
@@ -93,6 +94,58 @@ for my $arch ($supported_vm_specific_cpu_flags_by_arch->%*) {
 
 my @supported_cpu_flags_name_sorted = sort keys $all_supported_vm_specific_cpu_flags->%*;
 
+# qemu/target/i386/cpu.c, x86_cpu_initfn()
+my $qemu_cpu_flag_alias_map = {
+    sse3 => 'pni',
+    pclmuldq => 'pclmulqdq',
+    'sse4-1' => 'sse4.1',
+    'sse4-2' => 'sse4.2',
+    xd => 'nx',
+    ffxsr => 'fxsr-opt',
+    i64 => 'lm',
+    ds_cpl => 'ds-cpl',
+    tsc_adjust => 'tsc-adjust',
+    fxsr_opt => 'fxsr-opt',
+    lahf_lm => 'lahf-lm',
+    cmp_legacy => 'cmp-legacy',
+    nodeid_msr => 'nodeid-msr',
+    perfctr_core => 'perfctr-core',
+    perfctr_nb => 'perfctr-nb',
+    kvm_nopiodelay => 'kvm-nopiodelay',
+    kvm_mmu => 'kvm-mmu',
+    kvm_asyncpf => 'kvm-asyncpf',
+    kvm_asyncpf_int => 'kvm-asyncpf-int',
+    kvm_steal_time => 'kvm-steal-time',
+    kvm_pv_eoi => 'kvm-pv-eoi',
+    kvm_pv_unhalt => 'kvm-pv-unhalt',
+    kvm_poll_control => 'kvm-poll-control',
+    svm_lock => 'svm-lock',
+    nrip_save => 'nrip-save',
+    tsc_scale => 'tsc-scale',
+    vmcb_clean => 'vmcb-clean',
+    pause_filter => 'pause-filter',
+    sse4_1 => 'sse4.1',
+    sse4_2 => 'sse4.2',
+    'hv-apicv' => 'hv-avic',
+    lbr_fmt => 'lbr-fmt',
+};
+
+=head3 normalize_cpu_flag($flag)
+
+Normalize a CPU flag to its QEMU form.
+
+QEMU defines aliases for some CPU flags (see C<x86_cpu_initfn()> in
+C<target/i386/cpu.c>). For example, C<sse4_2> and C<sse4-2> are both aliases for
+C<sse4.2>.
+
+If C<$flag> has a known alias, return that, otherwise return C<$flag> unchanged.
+
+=cut
+
+sub normalize_cpu_flag($flag) {
+    return $qemu_cpu_flag_alias_map->{$flag} // $flag;
+}
+
 # Understood CPU flags are written to a file at 'pve-qemu' compile time and
 # shipped below this directory by the pve-qemu-kvm package.
 my $understood_cpu_flag_dir = "/usr/share/kvm";
-- 
2.47.3




  parent reply	other threads:[~2026-05-15  9:29 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-15  9:28 [PATCH docs/manager/qemu-server v5 00/21] Add API and UI for custom CPU models Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH pve-docs v5 01/21] qm: add anchor to "CPU Type" section Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH qemu-server v5 02/21] cpu config: rename CPU models config path variable Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH qemu-server v5 03/21] cpu flags: move cpu flags-related utilities to their own module Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH qemu-server v5 04/21] cpu flags: compare against JSON::true when querying supported flags Arthur Bied-Charreton
2026-05-15  9:28 ` Arthur Bied-Charreton [this message]
2026-05-15  9:28 ` [PATCH qemu-server v5 06/21] cpu flags: add helper querying CPU flags with nodes supporting them Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH qemu-server v5 07/21] cpu config: rename custom CPU model config loader Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH qemu-server v5 08/21] cpu config: add helpers to lock and write config Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH qemu-server v5 09/21] cpu: register standard option for CPU format Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH qemu-server v5 10/21] api: cpu flags: improve flags list returned by endpoint Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH qemu-server v5 11/21] custom cpu models: avoid redundant config load Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH pve-manager v5 12/21] cluster: reorder imports Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH pve-manager v5 13/21] cluster: makefile: reorder perl sources and align backslashes Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH pve-manager v5 14/21] api: add endpoint querying available CPU flags cluster-wide Arthur Bied-Charreton
2026-05-15  9:45   ` Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH pve-manager v5 15/21] api: add CRUD handlers for custom CPU models Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH pve-manager v5 16/21] ui: cpu model selector: allow filtering out custom models Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH pve-manager v5 17/21] ui: add basic custom CPU model editor Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH pve-manager v5 18/21] ui: cpu flags selector: add CPU flag editor for custom models Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH pve-manager v5 19/21] ui: cpu flags selector: allow filtering out flags supported on 0 nodes Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH pve-manager v5 20/21] ui: cpu flags selector: add search bar for large lists of flags Arthur Bied-Charreton
2026-05-15  9:28 ` [PATCH pve-manager v5 21/21] ui: group custom CPU with resource mappings Arthur Bied-Charreton
2026-05-15 17:05 ` [PATCH docs/manager/qemu-server v5 00/21] Add API and UI for custom CPU models Max R. Carrara

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260515092839.238064-6-a.bied-charreton@proxmox.com \
    --to=a.bied-charreton@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal