From: Stefan Reiter <s.reiter@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [RFC pve-qemu 1/9] Add -list-flags command line option
Date: Thu, 28 Oct 2021 13:41:42 +0200 [thread overview]
Message-ID: <20211028114150.3245864-2-s.reiter@proxmox.com> (raw)
In-Reply-To: <20211028114150.3245864-1-s.reiter@proxmox.com>
Useful for retrieving flags from default CPU models.
Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
---
...E-Add-list-flags-command-line-option.patch | 213 ++++++++++++++++++
debian/patches/series | 1 +
2 files changed, 214 insertions(+)
create mode 100644 debian/patches/pve/0049-PVE-Add-list-flags-command-line-option.patch
diff --git a/debian/patches/pve/0049-PVE-Add-list-flags-command-line-option.patch b/debian/patches/pve/0049-PVE-Add-list-flags-command-line-option.patch
new file mode 100644
index 0000000..56ced90
--- /dev/null
+++ b/debian/patches/pve/0049-PVE-Add-list-flags-command-line-option.patch
@@ -0,0 +1,213 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Stefan Reiter <s.reiter@proxmox.com>
+Date: Wed, 27 May 2020 13:51:52 +0200
+Subject: [PATCH] PVE: Add -list-flags command line option
+
+Prints all flags for a given cpu model to stdout.
+
+Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
+---
+ include/sysemu/cpus.h | 1 +
+ qemu-options.hx | 8 ++++++
+ softmmu/cpus.c | 10 +++++++
+ softmmu/vl.c | 20 ++++++++++++++
+ target/i386/cpu-sysemu.c | 2 +-
+ target/i386/cpu.c | 58 ++++++++++++++++++++++++++++++++++++++++
+ target/i386/cpu.h | 4 +++
+ 7 files changed, 102 insertions(+), 1 deletion(-)
+
+diff --git a/include/sysemu/cpus.h b/include/sysemu/cpus.h
+index 868f1192de..433265b166 100644
+--- a/include/sysemu/cpus.h
++++ b/include/sysemu/cpus.h
+@@ -56,5 +56,6 @@ extern int smp_threads;
+ #endif
+
+ void list_cpus(const char *optarg);
++int list_cpu_flags(const char *model_name, Error **errp);
+
+ #endif
+diff --git a/qemu-options.hx b/qemu-options.hx
+index 83aa59a920..33a8a31aa4 100644
+--- a/qemu-options.hx
++++ b/qemu-options.hx
+@@ -137,6 +137,14 @@ SRST
+ selection)
+ ERST
+
++DEF("list-flags", 0, QEMU_OPTION_list_flags,
++ "-list-flags list all flags of specified -cpu on stdout, then exit. Respects -machine versions.\n", QEMU_ARCH_I386)
++SRST
++``-list-flags``
++ List all flags of specified -cpu on stdout, then exit. Respects
++ -machine versions.
++ERST
++
+ DEF("accel", HAS_ARG, QEMU_OPTION_accel,
+ "-accel [accel=]accelerator[,prop[=value][,...]]\n"
+ " select accelerator (kvm, xen, hax, hvf, nvmm, whpx or tcg; use 'help' for a list)\n"
+diff --git a/softmmu/cpus.c b/softmmu/cpus.c
+index 071085f840..f8351e2154 100644
+--- a/softmmu/cpus.c
++++ b/softmmu/cpus.c
+@@ -726,6 +726,16 @@ void list_cpus(const char *optarg)
+ #endif
+ }
+
++int list_cpu_flags(const char *model_name, Error **errp)
++{
++#if defined(cpu_list_flags)
++ return cpu_list_flags(model_name, errp);
++#endif
++
++ fprintf(stderr, "-list-flags not available for this architecture\n");
++ return 1;
++}
++
+ void qmp_memsave(int64_t addr, int64_t size, const char *filename,
+ bool has_cpu, int64_t cpu_index, Error **errp)
+ {
+diff --git a/softmmu/vl.c b/softmmu/vl.c
+index 5ca11e7469..f47f076a1f 100644
+--- a/softmmu/vl.c
++++ b/softmmu/vl.c
+@@ -145,6 +145,7 @@ typedef struct ObjectOption {
+ } ObjectOption;
+
+ static const char *cpu_option;
++bool list_cpu_flags_opt = false;
+ static const char *mem_path;
+ static const char *incoming;
+ static const char *loadvm;
+@@ -2817,6 +2818,9 @@ void qemu_init(int argc, char **argv, char **envp)
+ /* hw initialization will check this */
+ cpu_option = optarg;
+ break;
++ case QEMU_OPTION_list_flags:
++ list_cpu_flags_opt = true;
++ break;
+ case QEMU_OPTION_hda:
+ case QEMU_OPTION_hdb:
+ case QEMU_OPTION_hdc:
+@@ -3635,6 +3639,22 @@ void qemu_init(int argc, char **argv, char **envp)
+ }
+ trace_init_file();
+
++ /* list flags if requested, then exit */
++ if (list_cpu_flags_opt) {
++ if (!cpu_option) {
++ printf("-cpu argument required for -list-flags\n");
++ exit(1);
++ }
++
++ /* Check for and remove cpu parameters other than model */
++ char *commaIdx = strchr(cpu_option, ',');
++ if (commaIdx != NULL) {
++ *commaIdx = 0;
++ }
++
++ exit(list_cpu_flags(cpu_option, &error_fatal));
++ }
++
+ qemu_init_main_loop(&error_fatal);
+ cpu_timers_init();
+
+diff --git a/target/i386/cpu-sysemu.c b/target/i386/cpu-sysemu.c
+index 1078e3d157..1ebff3d847 100644
+--- a/target/i386/cpu-sysemu.c
++++ b/target/i386/cpu-sysemu.c
+@@ -142,7 +142,7 @@ static void object_apply_props(Object *obj, QDict *props, Error **errp)
+ }
+
+ /* Create X86CPU object according to model+props specification */
+-static X86CPU *x86_cpu_from_model(const char *model, QDict *props, Error **errp)
++X86CPU *x86_cpu_from_model(const char *model, QDict *props, Error **errp)
+ {
+ X86CPU *xc = NULL;
+ X86CPUClass *xcc;
+diff --git a/target/i386/cpu.c b/target/i386/cpu.c
+index 34a7ce865b..a972dff4ed 100644
+--- a/target/i386/cpu.c
++++ b/target/i386/cpu.c
+@@ -6855,3 +6855,61 @@ static void x86_cpu_register_types(void)
+ }
+
+ type_init(x86_cpu_register_types)
++
++int x86_cpu_list_flags(const char *model_name, Error **errp) {
++ X86CPU *cpu;
++
++ cpu = x86_cpu_from_model(model_name, NULL, errp);
++ if (!cpu) {
++ fprintf(stderr, "Unknown CPU model '%s'\n", model_name);
++ return 1;
++ }
++
++ strList *result = NULL;
++ x86_cpu_list_feature_names(cpu->env.features, &result);
++ if (!result) {
++ fprintf(stderr, "No flags found for CPU model '%s'\n", model_name);
++ return 1;
++ }
++
++ strList *flag = result;
++ strList *seen = NULL;
++ strList **seenPtr;
++
++ while (flag) {
++ /* with 'host' and 'max' there are some flags without a value */
++ if (!flag->value) {
++ goto nextLoop;
++ }
++
++ /* don't print duplicates */
++ bool newFlag = true;
++ seenPtr = &seen;
++ while (*seenPtr) {
++ if (newFlag && strcmp((*seenPtr)->value, flag->value) == 0) {
++ newFlag = false;
++ }
++ seenPtr = &(*seenPtr)->next;
++ }
++
++ if (newFlag) {
++ printf("%s ", flag->value);
++
++ /* insert into 'seen' list; seenPtr points to first empty '->next'
++ * after loop above, so we can insert there directly */
++ strList *new = g_new0(strList, 1);
++ new->value = g_strdup(flag->value);
++ *seenPtr = new;
++ }
++
++nextLoop:
++ flag = flag->next;
++ }
++ printf("\n");
++
++ if (seen) {
++ g_free(seen);
++ }
++ g_free(result);
++ return 0;
++}
+diff --git a/target/i386/cpu.h b/target/i386/cpu.h
+index 6c50d3ab4f..bb88f53a2d 100644
+--- a/target/i386/cpu.h
++++ b/target/i386/cpu.h
+@@ -2013,6 +2013,7 @@ uint64_t cpu_get_tsc(CPUX86State *env);
+
+ #define cpu_signal_handler cpu_x86_signal_handler
+ #define cpu_list x86_cpu_list
++#define cpu_list_flags x86_cpu_list_flags
+
+ /* MMU modes definitions */
+ #define MMU_KSMAP_IDX 0
+@@ -2246,4 +2247,7 @@ static inline uint64_t cr4_reserved_bits(CPUX86State *env)
+ # define TARGET_VSYSCALL_PAGE (UINT64_C(-10) << 20)
+ #endif
+
++X86CPU *x86_cpu_from_model(const char *model, QDict *props, Error **errp);
++int x86_cpu_list_flags(const char *model_name, Error **errp);
++
+ #endif /* I386_CPU_H */
diff --git a/debian/patches/series b/debian/patches/series
index fb5c213..70ce86e 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -59,3 +59,4 @@ pve/0045-block-io-accept-NULL-qiov-in-bdrv_pad_request.patch
pve/0046-block-add-alloc-track-driver.patch
pve/0047-PVE-whitelist-invalid-QAPI-names-for-backwards-compa.patch
pve/0048-PVE-savevm-async-register-yank-before-migration_inco.patch
+pve/0049-PVE-Add-list-flags-command-line-option.patch
--
2.30.2
next prev parent reply other threads:[~2021-10-28 11:42 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-28 11:41 [pve-devel] [RFC 0/9] Unfinished: Custom CPU type API and GUI Stefan Reiter
2021-10-28 11:41 ` Stefan Reiter [this message]
2021-10-28 11:41 ` [pve-devel] [RFC qemu-server 2/9] api: add recognized-flags and supported-flags endpoints Stefan Reiter
2021-10-28 11:41 ` [pve-devel] [RFC qemu-server 3/9] api: add /cpu/model/* get endpoint Stefan Reiter
2021-10-28 11:41 ` [pve-devel] [RFC qemu-server 4/9] api: add /cpu/model/* get/create/delete/update endpoints Stefan Reiter
2021-10-28 11:41 ` [pve-devel] [RFC manager 5/9] gui: VMCPUFlagSelector: fix unknownFlags behaviour Stefan Reiter
2021-10-28 11:41 ` [pve-devel] [RFC manager 6/9] gui: CPUModelSelector: fix dirty state on default Stefan Reiter
2021-10-28 11:41 ` [pve-devel] [RFC manager 7/9] gui: CPUModelSelector: add 'allowCustom' Stefan Reiter
2021-10-28 11:41 ` [pve-devel] [RFC manager 8/9] gui: add basic custom CPU model editor Stefan Reiter
2021-10-28 11:41 ` [pve-devel] [RFC manager 9/9] Initial attempt at CPU flag editor for custom models Stefan Reiter
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=20211028114150.3245864-2-s.reiter@proxmox.com \
--to=s.reiter@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.