* [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR)
@ 2024-01-03 17:33 Alex Bennée
2024-01-03 17:33 ` [PATCH v2 01/43] tests/avocado: Add a test for a little-endian microblaze machine Alex Bennée
` (43 more replies)
0 siblings, 44 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
This brings in the first batch of testing updates for the next
release. The main bulk of these is Daniel and Thomas' cleanups of the
qtest timeouts and allowing meson control them. There are a few minor
tweaks I've made to some avocado and gitlab tests.
The big update is support for reading register values in TCG plugins.
After feedback from Akihiko I've left all the smarts to the plugin and
made the interface a simple "all the registers" dump. There is a
follow on patch to make the register code a little more efficient by
checking disassembly. However we can leave the door open for future
API enhancements if the translator ever learns to reliably know when
registers might be touched.
v2
--
- Review feedback for register API
- readthedocs update
- add expectation docs for plugins
The following still need review:
docs/devel: document some plugin assumptions
docs/devel: lift example and plugin API sections up
contrib/plugins: optimise the register value tracking
contrib/plugins: extend execlog to track register changes
contrib/plugins: fix imatch
plugins: add an API to read registers
gdbstub: expose api to find registers
readthodocs: fully specify a build environment
gitlab: include microblazeel in testing
tests/avocado: use snapshot=on in kvm_xen_guest
Akihiko Odaki (15):
hw/riscv: Use misa_mxl instead of misa_mxl_max
target/riscv: Remove misa_mxl validation
target/riscv: Move misa_mxl_max to class
target/riscv: Validate misa_mxl_max only once
target/arm: Use GDBFeature for dynamic XML
target/ppc: Use GDBFeature for dynamic XML
target/riscv: Use GDBFeature for dynamic XML
gdbstub: Use GDBFeature for gdb_register_coprocessor
gdbstub: Use GDBFeature for GDBRegisterState
gdbstub: Change gdb_get_reg_cb and gdb_set_reg_cb
gdbstub: Simplify XML lookup
gdbstub: Infer number of core registers from XML
hw/core/cpu: Remove gdb_get_dynamic_xml member
gdbstub: Add members to identify registers to GDBFeature
plugins: Use different helpers when reading registers
Alex Bennée (11):
tests/avocado: use snapshot=on in kvm_xen_guest
gitlab: include microblazeel in testing
chardev: use bool for fe_is_open
readthodocs: fully specify a build environment
gdbstub: expose api to find registers
plugins: add an API to read registers
contrib/plugins: fix imatch
contrib/plugins: extend execlog to track register changes
contrib/plugins: optimise the register value tracking
docs/devel: lift example and plugin API sections up
docs/devel: document some plugin assumptions
Daniel P. Berrangé (12):
qtest: bump min meson timeout to 60 seconds
qtest: bump migration-test timeout to 8 minutes
qtest: bump qom-test timeout to 15 minutes
qtest: bump npcm7xx_pwn-test timeout to 5 minutes
qtest: bump test-hmp timeout to 4 minutes
qtest: bump pxe-test timeout to 10 minutes
qtest: bump prom-env-test timeout to 6 minutes
qtest: bump boot-serial-test timeout to 3 minutes
qtest: bump qos-test timeout to 2 minutes
qtest: bump aspeed_smc-test timeout to 6 minutes
qtest: bump bios-table-test timeout to 9 minutes
mtest2make: stop disabling meson test timeouts
Thomas Huth (5):
tests/avocado: Add a test for a little-endian microblaze machine
tests/qtest: Bump the device-introspect-test timeout to 12 minutes
tests/unit: Bump test-aio-multithread test timeout to 2 minutes
tests/unit: Bump test-crypto-block test timeout to 5 minutes
tests/fp: Bump fp-test-mulAdd test timeout to 3 minutes
docs/devel/tcg-plugins.rst | 72 ++++++-
docs/requirements.txt | 2 +
accel/tcg/plugin-helpers.h | 3 +-
include/chardev/char-fe.h | 19 +-
include/exec/gdbstub.h | 62 +++++-
include/hw/core/cpu.h | 7 +-
include/qemu/plugin.h | 1 +
include/qemu/qemu-plugin.h | 51 ++++-
target/arm/cpu.h | 27 +--
target/arm/internals.h | 14 +-
target/hexagon/internal.h | 4 +-
target/microblaze/cpu.h | 4 +-
target/ppc/cpu-qom.h | 1 +
target/ppc/cpu.h | 5 +-
target/riscv/cpu.h | 9 +-
target/s390x/cpu.h | 2 -
accel/tcg/plugin-gen.c | 43 +++-
chardev/char-fe.c | 16 +-
chardev/char.c | 2 +-
contrib/plugins/execlog.c | 322 +++++++++++++++++++++++-----
gdbstub/gdbstub.c | 198 +++++++++++------
hw/core/cpu-common.c | 5 +-
hw/riscv/boot.c | 2 +-
plugins/api.c | 114 +++++++++-
target/arm/cpu.c | 2 -
target/arm/cpu64.c | 1 -
target/arm/gdbstub.c | 230 ++++++++++----------
target/arm/gdbstub64.c | 122 +++++------
target/avr/cpu.c | 1 -
target/hexagon/cpu.c | 4 +-
target/hexagon/gdbstub.c | 10 +-
target/i386/cpu.c | 2 -
target/loongarch/cpu.c | 2 -
target/loongarch/gdbstub.c | 13 +-
target/m68k/cpu.c | 1 -
target/m68k/helper.c | 26 ++-
target/microblaze/cpu.c | 6 +-
target/microblaze/gdbstub.c | 9 +-
target/ppc/cpu_init.c | 7 -
target/ppc/gdbstub.c | 114 +++++-----
target/riscv/cpu.c | 154 ++++++-------
target/riscv/gdbstub.c | 151 +++++++------
target/riscv/kvm/kvm-cpu.c | 10 +-
target/riscv/machine.c | 7 +-
target/riscv/tcg/tcg-cpu.c | 44 +---
target/riscv/translate.c | 3 +-
target/rx/cpu.c | 1 -
target/s390x/cpu.c | 1 -
target/s390x/gdbstub.c | 105 +++++----
.gitlab-ci.d/buildtest.yml | 4 +-
.readthedocs.yml | 19 +-
plugins/qemu-plugins.symbols | 2 +
scripts/feature_to_c.py | 14 +-
scripts/mtest2make.py | 3 +-
tests/avocado/kvm_xen_guest.py | 2 +-
tests/avocado/machine_microblaze.py | 26 +++
tests/fp/meson.build | 2 +-
tests/qtest/meson.build | 25 +--
tests/unit/meson.build | 2 +
59 files changed, 1396 insertions(+), 714 deletions(-)
create mode 100644 docs/requirements.txt
--
2.39.2
^ permalink raw reply [flat|nested] 76+ messages in thread
* [PATCH v2 01/43] tests/avocado: Add a test for a little-endian microblaze machine
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 02/43] tests/avocado: use snapshot=on in kvm_xen_guest Alex Bennée
` (42 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
From: Thomas Huth <thuth@redhat.com>
We've already got a test for a big endian microblaze machine, but so
far we lack one for a little endian machine. Now that the QEMU advent
calendar featured such an image, we can test the little endian mode,
too.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215161851.71508-1-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/avocado/machine_microblaze.py | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/tests/avocado/machine_microblaze.py b/tests/avocado/machine_microblaze.py
index 8d0efff30d2..807709cd11e 100644
--- a/tests/avocado/machine_microblaze.py
+++ b/tests/avocado/machine_microblaze.py
@@ -5,6 +5,8 @@
# This work is licensed under the terms of the GNU GPL, version 2 or
# later. See the COPYING file in the top-level directory.
+import time
+from avocado_qemu import exec_command, exec_command_and_wait_for_pattern
from avocado_qemu import QemuSystemTest
from avocado_qemu import wait_for_console_pattern
from avocado.utils import archive
@@ -33,3 +35,27 @@ def test_microblaze_s3adsp1800(self):
# The kernel sometimes gets stuck after the "This architecture ..."
# message, that's why we don't test for a later string here. This
# needs some investigation by a microblaze wizard one day...
+
+ def test_microblazeel_s3adsp1800(self):
+ """
+ :avocado: tags=arch:microblazeel
+ :avocado: tags=machine:petalogix-s3adsp1800
+ """
+
+ self.require_netdev('user')
+ tar_url = ('http://www.qemu-advent-calendar.org/2023/download/'
+ 'day13.tar.gz')
+ tar_hash = '6623d5fff5f84cfa8f34e286f32eff6a26546f44'
+ file_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
+ archive.extract(file_path, self.workdir)
+ self.vm.set_console()
+ self.vm.add_args('-kernel', self.workdir + '/day13/xmaton.bin')
+ self.vm.add_args('-nic', 'user,tftp=' + self.workdir + '/day13/')
+ self.vm.launch()
+ wait_for_console_pattern(self, 'QEMU Advent Calendar 2023')
+ time.sleep(0.1)
+ exec_command(self, 'root')
+ time.sleep(0.1)
+ exec_command_and_wait_for_pattern(self,
+ 'tftp -g -r xmaton.png 10.0.2.2 ; md5sum xmaton.png',
+ '821cd3cab8efd16ad6ee5acc3642a8ea')
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 02/43] tests/avocado: use snapshot=on in kvm_xen_guest
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
2024-01-03 17:33 ` [PATCH v2 01/43] tests/avocado: Add a test for a little-endian microblaze machine Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-11 13:30 ` Philippe Mathieu-Daudé
2024-01-03 17:33 ` [PATCH v2 03/43] gitlab: include microblazeel in testing Alex Bennée
` (41 subsequent siblings)
43 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
This ensures the rootfs is never permanently changed as we don't need
persistence between tests anyway.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/avocado/kvm_xen_guest.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/avocado/kvm_xen_guest.py b/tests/avocado/kvm_xen_guest.py
index 5391283113e..f8cb458d5db 100644
--- a/tests/avocado/kvm_xen_guest.py
+++ b/tests/avocado/kvm_xen_guest.py
@@ -59,7 +59,7 @@ def common_vm_setup(self):
def run_and_check(self):
self.vm.add_args('-kernel', self.kernel_path,
'-append', self.kernel_params,
- '-drive', f"file={self.rootfs},if=none,format=raw,id=drv0",
+ '-drive', f"file={self.rootfs},if=none,snapshot=on,format=raw,id=drv0",
'-device', 'xen-disk,drive=drv0,vdev=xvda',
'-device', 'virtio-net-pci,netdev=unet',
'-netdev', 'user,id=unet,hostfwd=:127.0.0.1:0-:22')
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 03/43] gitlab: include microblazeel in testing
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
2024-01-03 17:33 ` [PATCH v2 01/43] tests/avocado: Add a test for a little-endian microblaze machine Alex Bennée
2024-01-03 17:33 ` [PATCH v2 02/43] tests/avocado: use snapshot=on in kvm_xen_guest Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-11 13:15 ` Thomas Huth
2024-01-03 17:33 ` [PATCH v2 04/43] chardev: use bool for fe_is_open Alex Bennée
` (40 subsequent siblings)
43 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
This reverts aeb5f8f248e (gitlab: build the correct microblaze target)
now we actually have a little-endian test in avocado thanks to this
years advent calendar.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
.gitlab-ci.d/buildtest.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.gitlab-ci.d/buildtest.yml b/.gitlab-ci.d/buildtest.yml
index 91663946de4..ef71dfe8665 100644
--- a/.gitlab-ci.d/buildtest.yml
+++ b/.gitlab-ci.d/buildtest.yml
@@ -41,7 +41,7 @@ build-system-ubuntu:
variables:
IMAGE: ubuntu2204
CONFIGURE_ARGS: --enable-docs
- TARGETS: alpha-softmmu microblaze-softmmu mips64el-softmmu
+ TARGETS: alpha-softmmu microblazeel-softmmu mips64el-softmmu
MAKE_CHECK_ARGS: check-build
check-system-ubuntu:
@@ -61,7 +61,7 @@ avocado-system-ubuntu:
variables:
IMAGE: ubuntu2204
MAKE_CHECK_ARGS: check-avocado
- AVOCADO_TAGS: arch:alpha arch:microblaze arch:mips64el
+ AVOCADO_TAGS: arch:alpha arch:microblazeel arch:mips64el
build-system-debian:
extends:
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 04/43] chardev: use bool for fe_is_open
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (2 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 03/43] gitlab: include microblazeel in testing Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 05/43] qtest: bump min meson timeout to 60 seconds Alex Bennée
` (39 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
The function qemu_chr_fe_init already treats be->fe_open as a bool and
if it acts like a bool it should be one. While we are at it make the
variable name more descriptive and add kdoc decorations.
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231211145959.93759-1-alex.bennee@linaro.org>
---
v2
- rename to fe_is_open at f4bug's request
---
include/chardev/char-fe.h | 19 ++++++++++++-------
chardev/char-fe.c | 16 ++++++++--------
chardev/char.c | 2 +-
3 files changed, 21 insertions(+), 16 deletions(-)
diff --git a/include/chardev/char-fe.h b/include/chardev/char-fe.h
index 0ff6f875116..ecef1828355 100644
--- a/include/chardev/char-fe.h
+++ b/include/chardev/char-fe.h
@@ -7,8 +7,12 @@
typedef void IOEventHandler(void *opaque, QEMUChrEvent event);
typedef int BackendChangeHandler(void *opaque);
-/* This is the backend as seen by frontend, the actual backend is
- * Chardev */
+/**
+ * struct CharBackend - back end as seen by front end
+ * @fe_is_open: the front end is ready for IO
+ *
+ * The actual backend is Chardev
+ */
struct CharBackend {
Chardev *chr;
IOEventHandler *chr_event;
@@ -17,7 +21,7 @@ struct CharBackend {
BackendChangeHandler *chr_be_change;
void *opaque;
int tag;
- int fe_open;
+ bool fe_is_open;
};
/**
@@ -156,12 +160,13 @@ void qemu_chr_fe_set_echo(CharBackend *be, bool echo);
/**
* qemu_chr_fe_set_open:
+ * @be: a CharBackend
+ * @is_open: the front end open status
*
- * Set character frontend open status. This is an indication that the
- * front end is ready (or not) to begin doing I/O.
- * Without associated Chardev, do nothing.
+ * This is an indication that the front end is ready (or not) to begin
+ * doing I/O. Without associated Chardev, do nothing.
*/
-void qemu_chr_fe_set_open(CharBackend *be, int fe_open);
+void qemu_chr_fe_set_open(CharBackend *be, bool is_open);
/**
* qemu_chr_fe_printf:
diff --git a/chardev/char-fe.c b/chardev/char-fe.c
index 7789f7be9c8..20222a4cad5 100644
--- a/chardev/char-fe.c
+++ b/chardev/char-fe.c
@@ -211,7 +211,7 @@ bool qemu_chr_fe_init(CharBackend *b, Chardev *s, Error **errp)
}
}
- b->fe_open = false;
+ b->fe_is_open = false;
b->tag = tag;
b->chr = s;
return true;
@@ -257,7 +257,7 @@ void qemu_chr_fe_set_handlers_full(CharBackend *b,
bool sync_state)
{
Chardev *s;
- int fe_open;
+ bool fe_open;
s = b->chr;
if (!s) {
@@ -265,10 +265,10 @@ void qemu_chr_fe_set_handlers_full(CharBackend *b,
}
if (!opaque && !fd_can_read && !fd_read && !fd_event) {
- fe_open = 0;
+ fe_open = false;
remove_fd_in_watch(s);
} else {
- fe_open = 1;
+ fe_open = true;
}
b->chr_can_read = fd_can_read;
b->chr_read = fd_read;
@@ -336,7 +336,7 @@ void qemu_chr_fe_set_echo(CharBackend *be, bool echo)
}
}
-void qemu_chr_fe_set_open(CharBackend *be, int fe_open)
+void qemu_chr_fe_set_open(CharBackend *be, bool is_open)
{
Chardev *chr = be->chr;
@@ -344,12 +344,12 @@ void qemu_chr_fe_set_open(CharBackend *be, int fe_open)
return;
}
- if (be->fe_open == fe_open) {
+ if (be->fe_is_open == is_open) {
return;
}
- be->fe_open = fe_open;
+ be->fe_is_open = is_open;
if (CHARDEV_GET_CLASS(chr)->chr_set_fe_open) {
- CHARDEV_GET_CLASS(chr)->chr_set_fe_open(chr, fe_open);
+ CHARDEV_GET_CLASS(chr)->chr_set_fe_open(chr, is_open);
}
}
diff --git a/chardev/char.c b/chardev/char.c
index 996a024c7a2..0653b112e92 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -750,7 +750,7 @@ static int qmp_query_chardev_foreach(Object *obj, void *data)
value->label = g_strdup(chr->label);
value->filename = g_strdup(chr->filename);
- value->frontend_open = chr->be && chr->be->fe_open;
+ value->frontend_open = chr->be && chr->be->fe_is_open;
QAPI_LIST_PREPEND(*list, value);
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 05/43] qtest: bump min meson timeout to 60 seconds
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (3 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 04/43] chardev: use bool for fe_is_open Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 06/43] qtest: bump migration-test timeout to 8 minutes Alex Bennée
` (38 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
Even some of the relatively fast qtests can sometimes hit the 30 second
timeout in GitLab CI under high parallelism/load conditions. Bump the
min to 60 seconds to give a higher margin for reliability.
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Message-ID: <20230717182859.707658-2-berrange@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-2-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/qtest/meson.build | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 47dabf91d04..366872ed57b 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -1,12 +1,7 @@
slow_qtests = {
- 'ahci-test' : 60,
'bios-tables-test' : 120,
- 'boot-serial-test' : 60,
'migration-test' : 150,
'npcm7xx_pwm-test': 150,
- 'prom-env-test' : 60,
- 'pxe-test' : 60,
- 'qos-test' : 60,
'qom-test' : 300,
'test-hmp' : 120,
}
@@ -383,8 +378,8 @@ foreach dir : target_dirs
env: qtest_env,
args: ['--tap', '-k'],
protocol: 'tap',
- timeout: slow_qtests.get(test, 30),
- priority: slow_qtests.get(test, 30),
+ timeout: slow_qtests.get(test, 60),
+ priority: slow_qtests.get(test, 60),
suite: ['qtest', 'qtest-' + target_base])
endforeach
endforeach
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 06/43] qtest: bump migration-test timeout to 8 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (4 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 05/43] qtest: bump min meson timeout to 60 seconds Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 07/43] qtest: bump qom-test timeout to 15 minutes Alex Bennée
` (37 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
The migration test should take between 1 min 30 and 2 mins on reasonably
modern hardware. The test is not especially compute bound, rather its
running time is dominated by the guest RAM size relative to the
bandwidth cap, which forces each iteration to take at least 30 seconds.
None the less under high load conditions with multiple QEMU processes
spawned and competing with other parallel tests, the worst case running
time might be somewhat extended. Bumping the timeout to 8 minutes gives
us good headroom, while still catching stuck tests relatively quickly.
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Message-ID: <20230717182859.707658-3-berrange@redhat.com>
[thuth: Bump timeout to 8 minutes to make it work on very loaded systems, too]
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-3-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/qtest/meson.build | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 366872ed57b..f184d051cfe 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -1,6 +1,6 @@
slow_qtests = {
'bios-tables-test' : 120,
- 'migration-test' : 150,
+ 'migration-test' : 480,
'npcm7xx_pwm-test': 150,
'qom-test' : 300,
'test-hmp' : 120,
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 07/43] qtest: bump qom-test timeout to 15 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (5 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 06/43] qtest: bump migration-test timeout to 8 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 08/43] qtest: bump npcm7xx_pwn-test timeout to 5 minutes Alex Bennée
` (36 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
The qom-test is periodically hitting the 5 minute timeout when running
on the aarch64 emulator under GitLab CI. With an --enable-debug build
it can take over 10 minutes for arm/aarch64 targets. Setting timeout
to 15 minutes gives enough headroom to hopefully make it reliable.
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Message-ID: <20230717182859.707658-4-berrange@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-4-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/qtest/meson.build | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index f184d051cfe..000ac54b7d6 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -2,7 +2,7 @@ slow_qtests = {
'bios-tables-test' : 120,
'migration-test' : 480,
'npcm7xx_pwm-test': 150,
- 'qom-test' : 300,
+ 'qom-test' : 900,
'test-hmp' : 120,
}
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 08/43] qtest: bump npcm7xx_pwn-test timeout to 5 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (6 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 07/43] qtest: bump qom-test timeout to 15 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:40 ` Philippe Mathieu-Daudé
2024-01-08 12:26 ` Ilya Leoshkevich
2024-01-03 17:33 ` [PATCH v2 09/43] qtest: bump test-hmp timeout to 4 minutes Alex Bennée
` (35 subsequent siblings)
43 siblings, 2 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
The npcm7xx_pwn-test takes 3 & 1/2 minutes in a --enable-debug build.
Bumping to 5 minutes will give more headroom.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-ID: <20230717182859.707658-5-berrange@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-5-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/qtest/meson.build | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 000ac54b7d6..84cec0a847d 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -1,7 +1,7 @@
slow_qtests = {
'bios-tables-test' : 120,
'migration-test' : 480,
- 'npcm7xx_pwm-test': 150,
+ 'npcm7xx_pwm-test': 300,
'qom-test' : 900,
'test-hmp' : 120,
}
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 09/43] qtest: bump test-hmp timeout to 4 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (7 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 08/43] qtest: bump npcm7xx_pwn-test timeout to 5 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 10/43] qtest: bump pxe-test timeout to 10 minutes Alex Bennée
` (34 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
The hmp test takes just under 3 minutes in a --enable-debug
build. Bumping to 4 minutes will give more headroom.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-ID: <20230717182859.707658-6-berrange@redhat.com>
[thuth: fix copy-n-paste error in the description]
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-6-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/qtest/meson.build | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 84cec0a847d..7a4160df046 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -3,7 +3,7 @@ slow_qtests = {
'migration-test' : 480,
'npcm7xx_pwm-test': 300,
'qom-test' : 900,
- 'test-hmp' : 120,
+ 'test-hmp' : 240,
}
qtests_generic = [
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 10/43] qtest: bump pxe-test timeout to 10 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (8 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 09/43] qtest: bump test-hmp timeout to 4 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:43 ` Philippe Mathieu-Daudé
2024-01-03 17:33 ` [PATCH v2 11/43] qtest: bump prom-env-test timeout to 6 minutes Alex Bennée
` (33 subsequent siblings)
43 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
The pxe-test uses the boot_sector_test() function, and that already
uses a timeout of 600 seconds. So adjust the timeout on the meson
side accordingly.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
[thuth: Bump timeout to 600s and adjust commit description]
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-7-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/qtest/meson.build | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 7a4160df046..ec93d5a384f 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -4,6 +4,7 @@ slow_qtests = {
'npcm7xx_pwm-test': 300,
'qom-test' : 900,
'test-hmp' : 240,
+ 'pxe-test': 600,
}
qtests_generic = [
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 11/43] qtest: bump prom-env-test timeout to 6 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (9 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 10/43] qtest: bump pxe-test timeout to 10 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 12/43] qtest: bump boot-serial-test timeout to 3 minutes Alex Bennée
` (32 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
The prom-env-test can take more than 5 minutes in a --enable-debug
build on a loaded system. Bumping to 6 minutes will give more headroom.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
[thuth: Bump timeout to 6 minutes instead of 3]
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-8-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/qtest/meson.build | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index ec93d5a384f..c7944e8dbe9 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -5,6 +5,7 @@ slow_qtests = {
'qom-test' : 900,
'test-hmp' : 240,
'pxe-test': 600,
+ 'prom-env-test': 360,
}
qtests_generic = [
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 12/43] qtest: bump boot-serial-test timeout to 3 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (10 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 11/43] qtest: bump prom-env-test timeout to 6 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-12 15:13 ` Thomas Huth
2024-01-03 17:33 ` [PATCH v2 13/43] qtest: bump qos-test timeout to 2 minutes Alex Bennée
` (31 subsequent siblings)
43 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
The boot-serial-test takes about 1 + 1/2 minutes in a --enable-debug
build. Bumping to 3 minutes will give more headroom.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-ID: <20230717182859.707658-9-berrange@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-9-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/qtest/meson.build | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index c7944e8dbe9..dc1e6da5c7b 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -6,6 +6,7 @@ slow_qtests = {
'test-hmp' : 240,
'pxe-test': 600,
'prom-env-test': 360,
+ 'boot-serial-test': 180,
}
qtests_generic = [
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 13/43] qtest: bump qos-test timeout to 2 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (11 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 12/43] qtest: bump boot-serial-test timeout to 3 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 14/43] qtest: bump aspeed_smc-test timeout to 6 minutes Alex Bennée
` (30 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
The qos-test takes just under 1 minute in a --enable-debug
build. Bumping to 2 minutes will give more headroom.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-ID: <20230717182859.707658-10-berrange@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-10-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/qtest/meson.build | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index dc1e6da5c7b..b02ca540cff 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -7,6 +7,7 @@ slow_qtests = {
'pxe-test': 600,
'prom-env-test': 360,
'boot-serial-test': 180,
+ 'qos-test': 120,
}
qtests_generic = [
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 14/43] qtest: bump aspeed_smc-test timeout to 6 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (12 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 13/43] qtest: bump qos-test timeout to 2 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 15/43] qtest: bump bios-table-test timeout to 9 minutes Alex Bennée
` (29 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
On a loaded system with --enable-debug, this test can take longer than
5 minutes. Raising the timeout to 6 minutes gives greater headroom for
such situations.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
[thuth: Increase the timeout to 6 minutes for very loaded systems]
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-11-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/qtest/meson.build | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index b02ca540cff..da53dd66c97 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -1,4 +1,5 @@
slow_qtests = {
+ 'aspeed_smc-test': 360,
'bios-tables-test' : 120,
'migration-test' : 480,
'npcm7xx_pwm-test': 300,
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 15/43] qtest: bump bios-table-test timeout to 9 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (13 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 14/43] qtest: bump aspeed_smc-test timeout to 6 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 16/43] tests/qtest: Bump the device-introspect-test timeout to 12 minutes Alex Bennée
` (28 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
This is reliably hitting the current 2 minute timeout in GitLab CI,
and for the TCI job, it even hits a 6 minute timeout.
Reviewed-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Message-ID: <20230717182859.707658-12-berrange@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-12-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/qtest/meson.build | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index da53dd66c97..6e8d00d53cb 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -1,6 +1,6 @@
slow_qtests = {
'aspeed_smc-test': 360,
- 'bios-tables-test' : 120,
+ 'bios-tables-test' : 540,
'migration-test' : 480,
'npcm7xx_pwm-test': 300,
'qom-test' : 900,
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 16/43] tests/qtest: Bump the device-introspect-test timeout to 12 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (14 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 15/43] qtest: bump bios-table-test timeout to 9 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 17/43] tests/unit: Bump test-aio-multithread test timeout to 2 minutes Alex Bennée
` (27 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
From: Thomas Huth <thuth@redhat.com>
When running the test in slow mode on a very loaded system with the
arm/aarch64 target and with --enable-debug, it can take longer than
10 minutes to finish the introspection test. Bump the timeout to twelve
minutes to make sure that it also finishes in such situations.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-13-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/qtest/meson.build | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
index 6e8d00d53cb..16916ae857b 100644
--- a/tests/qtest/meson.build
+++ b/tests/qtest/meson.build
@@ -1,6 +1,7 @@
slow_qtests = {
'aspeed_smc-test': 360,
'bios-tables-test' : 540,
+ 'device-introspect-test' : 720,
'migration-test' : 480,
'npcm7xx_pwm-test': 300,
'qom-test' : 900,
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 17/43] tests/unit: Bump test-aio-multithread test timeout to 2 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (15 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 16/43] tests/qtest: Bump the device-introspect-test timeout to 12 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 18/43] tests/unit: Bump test-crypto-block test timeout to 5 minutes Alex Bennée
` (26 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
From: Thomas Huth <thuth@redhat.com>
When running the tests in slow mode on a very loaded system and with
--enable-debug, the test-aio-multithread can take longer than 1 minute.
Bump the timeout to two minutes to make sure that it also passes in
such situations.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-14-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/unit/meson.build | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/unit/meson.build b/tests/unit/meson.build
index a05d4710904..0b0c7c14115 100644
--- a/tests/unit/meson.build
+++ b/tests/unit/meson.build
@@ -172,6 +172,7 @@ test_env.set('G_TEST_SRCDIR', meson.current_source_dir())
test_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
slow_tests = {
+ 'test-aio-multithread' : 120,
'test-crypto-tlscredsx509': 45,
'test-crypto-tlssession': 45
}
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 18/43] tests/unit: Bump test-crypto-block test timeout to 5 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (16 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 17/43] tests/unit: Bump test-aio-multithread test timeout to 2 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 19/43] tests/fp: Bump fp-test-mulAdd test timeout to 3 minutes Alex Bennée
` (25 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
From: Thomas Huth <thuth@redhat.com>
When running the tests in slow mode on a very loaded system and with
--enable-debug, the test-crypto-block can take longer than 4 minutes.
Bump the timeout to 5 minutes to make sure that it also passes in
such situations.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-15-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/unit/meson.build | 1 +
1 file changed, 1 insertion(+)
diff --git a/tests/unit/meson.build b/tests/unit/meson.build
index 0b0c7c14115..a99dec43120 100644
--- a/tests/unit/meson.build
+++ b/tests/unit/meson.build
@@ -173,6 +173,7 @@ test_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
slow_tests = {
'test-aio-multithread' : 120,
+ 'test-crypto-block' : 300,
'test-crypto-tlscredsx509': 45,
'test-crypto-tlssession': 45
}
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 19/43] tests/fp: Bump fp-test-mulAdd test timeout to 3 minutes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (17 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 18/43] tests/unit: Bump test-crypto-block test timeout to 5 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 20/43] mtest2make: stop disabling meson test timeouts Alex Bennée
` (24 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
From: Thomas Huth <thuth@redhat.com>
When running the tests in slow mode with --enable-debug on a very loaded
system, the fp-test-mulAdd test can take longer than 2 minutes. Bump the
timeout to three minutes to make sure it passes in such situations, too.
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-16-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
tests/fp/meson.build | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/fp/meson.build b/tests/fp/meson.build
index cbc17392d67..3b7fc637499 100644
--- a/tests/fp/meson.build
+++ b/tests/fp/meson.build
@@ -124,7 +124,7 @@ test('fp-test-mulAdd', fptest,
# no fptest_rounding_args
args: fptest_args +
['f16_mulAdd', 'f32_mulAdd', 'f64_mulAdd', 'f128_mulAdd'],
- suite: ['softfloat-slow', 'softfloat-ops-slow', 'slow'], timeout: 90)
+ suite: ['softfloat-slow', 'softfloat-ops-slow', 'slow'], timeout: 180)
executable(
'fp-bench',
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 20/43] mtest2make: stop disabling meson test timeouts
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (18 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 19/43] tests/fp: Bump fp-test-mulAdd test timeout to 3 minutes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 21/43] readthodocs: fully specify a build environment Alex Bennée
` (23 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
From: Daniel P. Berrangé <berrange@redhat.com>
The mtest2make.py script passes the arg '-t 0' to 'meson test' which
disables all test timeouts. This is a major source of pain when running
in GitLab CI and a test gets stuck. It will stall until GitLab kills the
CI job. This leaves us with little easily consumable information about
the stalled test. The TAP format doesn't show the test name until it is
completed, and TAP output from multiple tests it interleaved. So we
have to analyse the log to figure out what tests had un-finished TAP
output present and thus infer which test case caused the hang. This is
very time consuming and error prone.
By allowing meson to kill stalled tests, we get a direct display of what
test program got stuck, which lets us more directly focus in on what
specific test case within the test program hung.
The other issue with disabling meson test timeouts by default is that it
makes it more likely that maintainers inadvertantly introduce slowdowns.
For example the recent-ish change that accidentally made migrate-test
take 15-20 minutes instead of around 1 minute.
The main risk of this change is that the individual test timeouts might
be too short to allow completion in high load scenarios. Thus, there is
likely to be some short term pain where we have to bump the timeouts for
certain tests to make them reliable enough. The preceeding few patches
raised the timeouts for all failures that were immediately apparent
in GitLab CI.
Even with the possible short term instability, this should still be a
net win for debuggability of failed CI pipelines over the long term.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-ID: <20230717182859.707658-13-berrange@redhat.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20231215070357.10888-17-thuth@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
scripts/mtest2make.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/scripts/mtest2make.py b/scripts/mtest2make.py
index 179dd548718..eb01a05ddbd 100644
--- a/scripts/mtest2make.py
+++ b/scripts/mtest2make.py
@@ -27,7 +27,8 @@ def names(self, base):
.speed.slow = $(foreach s,$(sort $(filter-out %-thorough, $1)), --suite $s)
.speed.thorough = $(foreach s,$(sort $1), --suite $s)
-.mtestargs = --no-rebuild -t 0
+TIMEOUT_MULTIPLIER = 1
+.mtestargs = --no-rebuild -t $(TIMEOUT_MULTIPLIER)
ifneq ($(SPEED), quick)
.mtestargs += --setup $(SPEED)
endif
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 21/43] readthodocs: fully specify a build environment
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (19 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 20/43] mtest2make: stop disabling meson test timeouts Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 22/43] hw/riscv: Use misa_mxl instead of misa_mxl_max Alex Bennée
` (22 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
qemu-stable
This is now expected by rtd so I've expanded using their example as
22.04 is one of our supported platforms. I tried to work out if there
was an easy way to re-generate a requirements.txt from our
pythondeps.toml but in the end went for the easier solution.
Cc: <qemu-stable@nongnu.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231221174200.2693694-1-alex.bennee@linaro.org>
---
docs/requirements.txt | 2 ++
.readthedocs.yml | 19 ++++++++++++-------
2 files changed, 14 insertions(+), 7 deletions(-)
create mode 100644 docs/requirements.txt
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 00000000000..691e5218ec7
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,2 @@
+sphinx==5.3.0
+sphinx_rtd_theme==1.1.1
diff --git a/.readthedocs.yml b/.readthedocs.yml
index 7fb7b8dd61a..0b262469ce6 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -5,16 +5,21 @@
# Required
version: 2
+# Set the version of Python and other tools you might need
+build:
+ os: ubuntu-22.04
+ tools:
+ python: "3.11"
+
# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: docs/conf.py
+# We recommend specifying your dependencies to enable reproducible builds:
+# https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
+python:
+ install:
+ - requirements: docs/requirements.txt
+
# We want all the document formats
formats: all
-
-# For consistency, we require that QEMU's Sphinx extensions
-# run with at least the same minimum version of Python that
-# we require for other Python in our codebase (our conf.py
-# enforces this, and some code needs it.)
-python:
- version: 3.6
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 22/43] hw/riscv: Use misa_mxl instead of misa_mxl_max
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (20 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 21/43] readthodocs: fully specify a build environment Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 23/43] target/riscv: Remove misa_mxl validation Alex Bennée
` (21 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
The effective MXL value matters when booting.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-Id: <20231213-riscv-v7-1-a760156a337f@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
hw/riscv/boot.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/riscv/boot.c b/hw/riscv/boot.c
index 0ffca05189f..bc67c0bd189 100644
--- a/hw/riscv/boot.c
+++ b/hw/riscv/boot.c
@@ -36,7 +36,7 @@
bool riscv_is_32bit(RISCVHartArrayState *harts)
{
- return harts->harts[0].env.misa_mxl_max == MXL_RV32;
+ return harts->harts[0].env.misa_mxl == MXL_RV32;
}
/*
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 23/43] target/riscv: Remove misa_mxl validation
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (21 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 22/43] hw/riscv: Use misa_mxl instead of misa_mxl_max Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-08 15:42 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 24/43] target/riscv: Move misa_mxl_max to class Alex Bennée
` (20 subsequent siblings)
43 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
It is initialized with a simple assignment and there is little room for
error. In fact, the validation is even more complex.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Acked-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Message-Id: <20231213-riscv-v7-2-a760156a337f@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
target/riscv/tcg/tcg-cpu.c | 15 +++------------
1 file changed, 3 insertions(+), 12 deletions(-)
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 8a35683a345..ee17f65afb6 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -148,7 +148,7 @@ static void riscv_cpu_validate_misa_priv(CPURISCVState *env, Error **errp)
}
}
-static void riscv_cpu_validate_misa_mxl(RISCVCPU *cpu, Error **errp)
+static void riscv_cpu_validate_misa_mxl(RISCVCPU *cpu)
{
RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu);
CPUClass *cc = CPU_CLASS(mcc);
@@ -168,11 +168,6 @@ static void riscv_cpu_validate_misa_mxl(RISCVCPU *cpu, Error **errp)
default:
g_assert_not_reached();
}
-
- if (env->misa_mxl_max != env->misa_mxl) {
- error_setg(errp, "misa_mxl_max must be equal to misa_mxl");
- return;
- }
}
static void riscv_cpu_validate_priv_spec(RISCVCPU *cpu, Error **errp)
@@ -673,7 +668,6 @@ static bool riscv_cpu_is_generic(Object *cpu_obj)
static bool tcg_cpu_realize(CPUState *cs, Error **errp)
{
RISCVCPU *cpu = RISCV_CPU(cs);
- Error *local_err = NULL;
if (!riscv_cpu_tcg_compatible(cpu)) {
g_autofree char *name = riscv_cpu_get_name(cpu);
@@ -682,14 +676,11 @@ static bool tcg_cpu_realize(CPUState *cs, Error **errp)
return false;
}
- riscv_cpu_validate_misa_mxl(cpu, &local_err);
- if (local_err != NULL) {
- error_propagate(errp, local_err);
- return false;
- }
+ riscv_cpu_validate_misa_mxl(cpu);
#ifndef CONFIG_USER_ONLY
CPURISCVState *env = &cpu->env;
+ Error *local_err = NULL;
CPU(cs)->tcg_cflags |= CF_PCREL;
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 24/43] target/riscv: Move misa_mxl_max to class
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (22 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 23/43] target/riscv: Remove misa_mxl validation Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-11 23:28 ` Alistair Francis
2024-01-03 17:33 ` [PATCH v2 25/43] target/riscv: Validate misa_mxl_max only once Alex Bennée
` (19 subsequent siblings)
43 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
misa_mxl_max is common for all instances of a RISC-V CPU class so they
are better put into class.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-Id: <20231213-riscv-v7-3-a760156a337f@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
target/riscv/cpu.h | 4 +-
target/riscv/cpu.c | 118 +++++++++++++++++++------------------
target/riscv/gdbstub.c | 12 ++--
target/riscv/kvm/kvm-cpu.c | 10 ++--
target/riscv/machine.c | 7 +--
target/riscv/tcg/tcg-cpu.c | 12 ++--
target/riscv/translate.c | 3 +-
7 files changed, 87 insertions(+), 79 deletions(-)
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index d74b361be64..060b7f69a74 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -169,7 +169,6 @@ struct CPUArchState {
/* RISCVMXL, but uint32_t for vmstate migration */
uint32_t misa_mxl; /* current mxl */
- uint32_t misa_mxl_max; /* max mxl for this cpu */
uint32_t misa_ext; /* current extensions */
uint32_t misa_ext_mask; /* max ext for this cpu */
uint32_t xl; /* current xlen */
@@ -450,6 +449,7 @@ struct RISCVCPUClass {
DeviceRealize parent_realize;
ResettablePhases parent_phases;
+ uint32_t misa_mxl_max; /* max mxl for this cpu */
};
static inline int riscv_has_ext(CPURISCVState *env, target_ulong ext)
@@ -756,7 +756,7 @@ enum riscv_pmu_event_idx {
/* used by tcg/tcg-cpu.c*/
void isa_ext_update_enabled(RISCVCPU *cpu, uint32_t ext_offset, bool en);
bool isa_ext_is_enabled(RISCVCPU *cpu, uint32_t ext_offset);
-void riscv_cpu_set_misa(CPURISCVState *env, RISCVMXL mxl, uint32_t ext);
+void riscv_cpu_set_misa_ext(CPURISCVState *env, uint32_t ext);
typedef struct RISCVCPUMultiExtConfig {
const char *name;
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 83c7c0cf07b..2ab61df2217 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -274,9 +274,8 @@ const char *riscv_cpu_get_trap_name(target_ulong cause, bool async)
}
}
-void riscv_cpu_set_misa(CPURISCVState *env, RISCVMXL mxl, uint32_t ext)
+void riscv_cpu_set_misa_ext(CPURISCVState *env, uint32_t ext)
{
- env->misa_mxl_max = env->misa_mxl = mxl;
env->misa_ext_mask = env->misa_ext = ext;
}
@@ -378,11 +377,7 @@ static void riscv_any_cpu_init(Object *obj)
{
RISCVCPU *cpu = RISCV_CPU(obj);
CPURISCVState *env = &cpu->env;
-#if defined(TARGET_RISCV32)
- riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVD | RVC | RVU);
-#elif defined(TARGET_RISCV64)
- riscv_cpu_set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVU);
-#endif
+ riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVU);
#ifndef CONFIG_USER_ONLY
set_satp_mode_max_supported(RISCV_CPU(obj),
@@ -403,16 +398,14 @@ static void riscv_max_cpu_init(Object *obj)
{
RISCVCPU *cpu = RISCV_CPU(obj);
CPURISCVState *env = &cpu->env;
- RISCVMXL mlx = MXL_RV64;
-#ifdef TARGET_RISCV32
- mlx = MXL_RV32;
-#endif
- riscv_cpu_set_misa(env, mlx, 0);
env->priv_ver = PRIV_VERSION_LATEST;
#ifndef CONFIG_USER_ONLY
- set_satp_mode_max_supported(RISCV_CPU(obj), mlx == MXL_RV32 ?
- VM_1_10_SV32 : VM_1_10_SV57);
+#ifdef TARGET_RISCV32
+ set_satp_mode_max_supported(cpu, VM_1_10_SV32);
+#else
+ set_satp_mode_max_supported(cpu, VM_1_10_SV57);
+#endif
#endif
}
@@ -420,8 +413,6 @@ static void riscv_max_cpu_init(Object *obj)
static void rv64_base_cpu_init(Object *obj)
{
CPURISCVState *env = &RISCV_CPU(obj)->env;
- /* We set this in the realise function */
- riscv_cpu_set_misa(env, MXL_RV64, 0);
/* Set latest version of privileged specification */
env->priv_ver = PRIV_VERSION_LATEST;
#ifndef CONFIG_USER_ONLY
@@ -433,8 +424,7 @@ static void rv64_sifive_u_cpu_init(Object *obj)
{
RISCVCPU *cpu = RISCV_CPU(obj);
CPURISCVState *env = &cpu->env;
- riscv_cpu_set_misa(env, MXL_RV64,
- RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
+ riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
env->priv_ver = PRIV_VERSION_1_10_0;
#ifndef CONFIG_USER_ONLY
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV39);
@@ -452,7 +442,7 @@ static void rv64_sifive_e_cpu_init(Object *obj)
CPURISCVState *env = &RISCV_CPU(obj)->env;
RISCVCPU *cpu = RISCV_CPU(obj);
- riscv_cpu_set_misa(env, MXL_RV64, RVI | RVM | RVA | RVC | RVU);
+ riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVC | RVU);
env->priv_ver = PRIV_VERSION_1_10_0;
#ifndef CONFIG_USER_ONLY
set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
@@ -469,7 +459,7 @@ static void rv64_thead_c906_cpu_init(Object *obj)
CPURISCVState *env = &RISCV_CPU(obj)->env;
RISCVCPU *cpu = RISCV_CPU(obj);
- riscv_cpu_set_misa(env, MXL_RV64, RVG | RVC | RVS | RVU);
+ riscv_cpu_set_misa_ext(env, RVG | RVC | RVS | RVU);
env->priv_ver = PRIV_VERSION_1_11_0;
cpu->cfg.ext_zfa = true;
@@ -500,7 +490,7 @@ static void rv64_veyron_v1_cpu_init(Object *obj)
CPURISCVState *env = &RISCV_CPU(obj)->env;
RISCVCPU *cpu = RISCV_CPU(obj);
- riscv_cpu_set_misa(env, MXL_RV64, RVG | RVC | RVS | RVU | RVH);
+ riscv_cpu_set_misa_ext(env, RVG | RVC | RVS | RVU | RVH);
env->priv_ver = PRIV_VERSION_1_12_0;
/* Enable ISA extensions */
@@ -544,8 +534,6 @@ static void rv128_base_cpu_init(Object *obj)
exit(EXIT_FAILURE);
}
CPURISCVState *env = &RISCV_CPU(obj)->env;
- /* We set this in the realise function */
- riscv_cpu_set_misa(env, MXL_RV128, 0);
/* Set latest version of privileged specification */
env->priv_ver = PRIV_VERSION_LATEST;
#ifndef CONFIG_USER_ONLY
@@ -556,8 +544,6 @@ static void rv128_base_cpu_init(Object *obj)
static void rv32_base_cpu_init(Object *obj)
{
CPURISCVState *env = &RISCV_CPU(obj)->env;
- /* We set this in the realise function */
- riscv_cpu_set_misa(env, MXL_RV32, 0);
/* Set latest version of privileged specification */
env->priv_ver = PRIV_VERSION_LATEST;
#ifndef CONFIG_USER_ONLY
@@ -569,8 +555,7 @@ static void rv32_sifive_u_cpu_init(Object *obj)
{
RISCVCPU *cpu = RISCV_CPU(obj);
CPURISCVState *env = &cpu->env;
- riscv_cpu_set_misa(env, MXL_RV32,
- RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
+ riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
env->priv_ver = PRIV_VERSION_1_10_0;
#ifndef CONFIG_USER_ONLY
set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32);
@@ -588,7 +573,7 @@ static void rv32_sifive_e_cpu_init(Object *obj)
CPURISCVState *env = &RISCV_CPU(obj)->env;
RISCVCPU *cpu = RISCV_CPU(obj);
- riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVA | RVC | RVU);
+ riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVC | RVU);
env->priv_ver = PRIV_VERSION_1_10_0;
#ifndef CONFIG_USER_ONLY
set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
@@ -605,7 +590,7 @@ static void rv32_ibex_cpu_init(Object *obj)
CPURISCVState *env = &RISCV_CPU(obj)->env;
RISCVCPU *cpu = RISCV_CPU(obj);
- riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVC | RVU);
+ riscv_cpu_set_misa_ext(env, RVI | RVM | RVC | RVU);
env->priv_ver = PRIV_VERSION_1_12_0;
#ifndef CONFIG_USER_ONLY
set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
@@ -622,7 +607,7 @@ static void rv32_imafcu_nommu_cpu_init(Object *obj)
CPURISCVState *env = &RISCV_CPU(obj)->env;
RISCVCPU *cpu = RISCV_CPU(obj);
- riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVC | RVU);
+ riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVC | RVU);
env->priv_ver = PRIV_VERSION_1_10_0;
#ifndef CONFIG_USER_ONLY
set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
@@ -845,7 +830,7 @@ static void riscv_cpu_reset_hold(Object *obj)
mcc->parent_phases.hold(obj);
}
#ifndef CONFIG_USER_ONLY
- env->misa_mxl = env->misa_mxl_max;
+ env->misa_mxl = mcc->misa_mxl_max;
env->priv = PRV_M;
env->mstatus &= ~(MSTATUS_MIE | MSTATUS_MPRV);
if (env->misa_mxl > MXL_RV32) {
@@ -1213,6 +1198,12 @@ static void riscv_cpu_post_init(Object *obj)
static void riscv_cpu_init(Object *obj)
{
+ RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(obj);
+ RISCVCPU *cpu = RISCV_CPU(obj);
+ CPURISCVState *env = &cpu->env;
+
+ env->misa_mxl = mcc->misa_mxl_max;
+
#ifndef CONFIG_USER_ONLY
qdev_init_gpio_in(DEVICE(obj), riscv_cpu_set_irq,
IRQ_LOCAL_MAX + IRQ_LOCAL_GUEST_MAX);
@@ -1657,7 +1648,7 @@ static void cpu_get_marchid(Object *obj, Visitor *v, const char *name,
visit_type_bool(v, name, &value, errp);
}
-static void riscv_cpu_class_init(ObjectClass *c, void *data)
+static void riscv_cpu_common_class_init(ObjectClass *c, void *data)
{
RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);
CPUClass *cc = CPU_CLASS(c);
@@ -1699,6 +1690,13 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
device_class_set_props(dc, riscv_cpu_properties);
}
+static void riscv_cpu_class_init(ObjectClass *c, void *data)
+{
+ RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);
+
+ mcc->misa_mxl_max = (uint32_t)(uintptr_t)data;
+}
+
static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str,
int max_str_len)
{
@@ -1764,18 +1762,22 @@ void riscv_cpu_list(void)
g_slist_free(list);
}
-#define DEFINE_CPU(type_name, initfn) \
- { \
- .name = type_name, \
- .parent = TYPE_RISCV_CPU, \
- .instance_init = initfn \
+#define DEFINE_CPU(type_name, misa_mxl_max, initfn) \
+ { \
+ .name = (type_name), \
+ .parent = TYPE_RISCV_CPU, \
+ .instance_init = (initfn), \
+ .class_init = riscv_cpu_class_init, \
+ .class_data = (void *)(misa_mxl_max) \
}
-#define DEFINE_DYNAMIC_CPU(type_name, initfn) \
- { \
- .name = type_name, \
- .parent = TYPE_RISCV_DYNAMIC_CPU, \
- .instance_init = initfn \
+#define DEFINE_DYNAMIC_CPU(type_name, misa_mxl_max, initfn) \
+ { \
+ .name = (type_name), \
+ .parent = TYPE_RISCV_DYNAMIC_CPU, \
+ .instance_init = (initfn), \
+ .class_init = riscv_cpu_class_init, \
+ .class_data = (void *)(misa_mxl_max) \
}
static const TypeInfo riscv_cpu_type_infos[] = {
@@ -1788,29 +1790,31 @@ static const TypeInfo riscv_cpu_type_infos[] = {
.instance_post_init = riscv_cpu_post_init,
.abstract = true,
.class_size = sizeof(RISCVCPUClass),
- .class_init = riscv_cpu_class_init,
+ .class_init = riscv_cpu_common_class_init,
},
{
.name = TYPE_RISCV_DYNAMIC_CPU,
.parent = TYPE_RISCV_CPU,
.abstract = true,
},
- DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, riscv_any_cpu_init),
- DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, riscv_max_cpu_init),
#if defined(TARGET_RISCV32)
- DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE32, rv32_base_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_IBEX, rv32_ibex_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E31, rv32_sifive_e_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E34, rv32_imafcu_nommu_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U34, rv32_sifive_u_cpu_init),
+ DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, MXL_RV32, riscv_any_cpu_init),
+ DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, MXL_RV32, riscv_max_cpu_init),
+ DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE32, MXL_RV32, rv32_base_cpu_init),
+ DEFINE_CPU(TYPE_RISCV_CPU_IBEX, MXL_RV32, rv32_ibex_cpu_init),
+ DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E31, MXL_RV32, rv32_sifive_e_cpu_init),
+ DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E34, MXL_RV32, rv32_imafcu_nommu_cpu_init),
+ DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U34, MXL_RV32, rv32_sifive_u_cpu_init),
#elif defined(TARGET_RISCV64)
- DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE64, rv64_base_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E51, rv64_sifive_e_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U54, rv64_sifive_u_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_SHAKTI_C, rv64_sifive_u_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_THEAD_C906, rv64_thead_c906_cpu_init),
- DEFINE_CPU(TYPE_RISCV_CPU_VEYRON_V1, rv64_veyron_v1_cpu_init),
- DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, rv128_base_cpu_init),
+ DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, MXL_RV64, riscv_any_cpu_init),
+ DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, MXL_RV64, riscv_max_cpu_init),
+ DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE64, MXL_RV64, rv64_base_cpu_init),
+ DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E51, MXL_RV64, rv64_sifive_e_cpu_init),
+ DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U54, MXL_RV64, rv64_sifive_u_cpu_init),
+ DEFINE_CPU(TYPE_RISCV_CPU_SHAKTI_C, MXL_RV64, rv64_sifive_u_cpu_init),
+ DEFINE_CPU(TYPE_RISCV_CPU_THEAD_C906, MXL_RV64, rv64_thead_c906_cpu_init),
+ DEFINE_CPU(TYPE_RISCV_CPU_VEYRON_V1, MXL_RV64, rv64_veyron_v1_cpu_init),
+ DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, MXL_RV128, rv128_base_cpu_init),
#endif
};
diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c
index 58b3ace0fe9..365040228a1 100644
--- a/target/riscv/gdbstub.c
+++ b/target/riscv/gdbstub.c
@@ -49,6 +49,7 @@ static const struct TypeSize vec_lanes[] = {
int riscv_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
{
+ RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);
RISCVCPU *cpu = RISCV_CPU(cs);
CPURISCVState *env = &cpu->env;
target_ulong tmp;
@@ -61,7 +62,7 @@ int riscv_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
return 0;
}
- switch (env->misa_mxl_max) {
+ switch (mcc->misa_mxl_max) {
case MXL_RV32:
return gdb_get_reg32(mem_buf, tmp);
case MXL_RV64:
@@ -75,12 +76,13 @@ int riscv_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
int riscv_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
{
+ RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);
RISCVCPU *cpu = RISCV_CPU(cs);
CPURISCVState *env = &cpu->env;
int length = 0;
target_ulong tmp;
- switch (env->misa_mxl_max) {
+ switch (mcc->misa_mxl_max) {
case MXL_RV32:
tmp = (int32_t)ldl_p(mem_buf);
length = 4;
@@ -214,11 +216,12 @@ static int riscv_gdb_set_virtual(CPURISCVState *cs, uint8_t *mem_buf, int n)
static int riscv_gen_dynamic_csr_xml(CPUState *cs, int base_reg)
{
+ RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);
RISCVCPU *cpu = RISCV_CPU(cs);
CPURISCVState *env = &cpu->env;
GString *s = g_string_new(NULL);
riscv_csr_predicate_fn predicate;
- int bitsize = 16 << env->misa_mxl_max;
+ int bitsize = 16 << mcc->misa_mxl_max;
int i;
#if !defined(CONFIG_USER_ONLY)
@@ -310,6 +313,7 @@ static int ricsv_gen_dynamic_vector_xml(CPUState *cs, int base_reg)
void riscv_cpu_register_gdb_regs_for_features(CPUState *cs)
{
+ RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);
RISCVCPU *cpu = RISCV_CPU(cs);
CPURISCVState *env = &cpu->env;
if (env->misa_ext & RVD) {
@@ -326,7 +330,7 @@ void riscv_cpu_register_gdb_regs_for_features(CPUState *cs)
ricsv_gen_dynamic_vector_xml(cs, base_reg),
"riscv-vector.xml", 0);
}
- switch (env->misa_mxl_max) {
+ switch (mcc->misa_mxl_max) {
case MXL_RV32:
gdb_register_coprocessor(cs, riscv_gdb_get_virtual,
riscv_gdb_set_virtual,
diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
index 117e33cf90f..ed86f21b8f2 100644
--- a/target/riscv/kvm/kvm-cpu.c
+++ b/target/riscv/kvm/kvm-cpu.c
@@ -1499,14 +1499,14 @@ static void kvm_cpu_accel_register_types(void)
}
type_init(kvm_cpu_accel_register_types);
-static void riscv_host_cpu_init(Object *obj)
+static void riscv_host_cpu_class_init(ObjectClass *c, void *data)
{
- CPURISCVState *env = &RISCV_CPU(obj)->env;
+ RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);
#if defined(TARGET_RISCV32)
- env->misa_mxl_max = env->misa_mxl = MXL_RV32;
+ mcc->misa_mxl_max = MXL_RV32;
#elif defined(TARGET_RISCV64)
- env->misa_mxl_max = env->misa_mxl = MXL_RV64;
+ mcc->misa_mxl_max = MXL_RV64;
#endif
}
@@ -1514,7 +1514,7 @@ static const TypeInfo riscv_kvm_cpu_type_infos[] = {
{
.name = TYPE_RISCV_CPU_HOST,
.parent = TYPE_RISCV_CPU,
- .instance_init = riscv_host_cpu_init,
+ .class_init = riscv_host_cpu_class_init,
}
};
diff --git a/target/riscv/machine.c b/target/riscv/machine.c
index fdde243e040..4c8d9a66595 100644
--- a/target/riscv/machine.c
+++ b/target/riscv/machine.c
@@ -178,10 +178,9 @@ static const VMStateDescription vmstate_pointermasking = {
static bool rv128_needed(void *opaque)
{
- RISCVCPU *cpu = opaque;
- CPURISCVState *env = &cpu->env;
+ RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(opaque);
- return env->misa_mxl_max == MXL_RV128;
+ return mcc->misa_mxl_max == MXL_RV128;
}
static const VMStateDescription vmstate_rv128 = {
@@ -372,7 +371,7 @@ const VMStateDescription vmstate_riscv_cpu = {
VMSTATE_UINTTL(env.vext_ver, RISCVCPU),
VMSTATE_UINT32(env.misa_mxl, RISCVCPU),
VMSTATE_UINT32(env.misa_ext, RISCVCPU),
- VMSTATE_UINT32(env.misa_mxl_max, RISCVCPU),
+ VMSTATE_UNUSED(4),
VMSTATE_UINT32(env.misa_ext_mask, RISCVCPU),
VMSTATE_UINTTL(env.priv, RISCVCPU),
VMSTATE_BOOL(env.virt_enabled, RISCVCPU),
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index ee17f65afb6..7f6712c81a4 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -152,10 +152,9 @@ static void riscv_cpu_validate_misa_mxl(RISCVCPU *cpu)
{
RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu);
CPUClass *cc = CPU_CLASS(mcc);
- CPURISCVState *env = &cpu->env;
/* Validate that MISA_MXL is set properly. */
- switch (env->misa_mxl_max) {
+ switch (mcc->misa_mxl_max) {
#ifdef TARGET_RISCV64
case MXL_RV64:
case MXL_RV128:
@@ -274,6 +273,7 @@ static void riscv_cpu_disable_priv_spec_isa_exts(RISCVCPU *cpu)
*/
void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
{
+ RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu);
CPURISCVState *env = &cpu->env;
Error *local_err = NULL;
@@ -454,7 +454,7 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcb), true);
cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcmp), true);
cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcmt), true);
- if (riscv_has_ext(env, RVF) && env->misa_mxl_max == MXL_RV32) {
+ if (riscv_has_ext(env, RVF) && mcc->misa_mxl_max == MXL_RV32) {
cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcf), true);
}
}
@@ -462,7 +462,7 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
/* zca, zcd and zcf has a PRIV 1.12.0 restriction */
if (riscv_has_ext(env, RVC) && env->priv_ver >= PRIV_VERSION_1_12_0) {
cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zca), true);
- if (riscv_has_ext(env, RVF) && env->misa_mxl_max == MXL_RV32) {
+ if (riscv_has_ext(env, RVF) && mcc->misa_mxl_max == MXL_RV32) {
cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcf), true);
}
if (riscv_has_ext(env, RVD)) {
@@ -470,7 +470,7 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
}
}
- if (env->misa_mxl_max != MXL_RV32 && cpu->cfg.ext_zcf) {
+ if (mcc->misa_mxl_max != MXL_RV32 && cpu->cfg.ext_zcf) {
error_setg(errp, "Zcf extension is only relevant to RV32");
return;
}
@@ -956,7 +956,7 @@ static void riscv_init_max_cpu_extensions(Object *obj)
const RISCVCPUMultiExtConfig *prop;
/* Enable RVG, RVJ and RVV that are disabled by default */
- riscv_cpu_set_misa(env, env->misa_mxl, env->misa_ext | RVG | RVJ | RVV);
+ riscv_cpu_set_misa_ext(env, env->misa_ext | RVG | RVJ | RVV);
for (prop = riscv_cpu_extensions; prop && prop->name; prop++) {
isa_ext_update_enabled(cpu, prop->offset, true);
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
index f0be79bb160..7e383c5eebf 100644
--- a/target/riscv/translate.c
+++ b/target/riscv/translate.c
@@ -1167,6 +1167,7 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
{
DisasContext *ctx = container_of(dcbase, DisasContext, base);
CPURISCVState *env = cpu_env(cs);
+ RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);
RISCVCPU *cpu = RISCV_CPU(cs);
uint32_t tb_flags = ctx->base.tb->flags;
@@ -1188,7 +1189,7 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
ctx->cfg_vta_all_1s = cpu->cfg.rvv_ta_all_1s;
ctx->vstart_eq_zero = FIELD_EX32(tb_flags, TB_FLAGS, VSTART_EQ_ZERO);
ctx->vl_eq_vlmax = FIELD_EX32(tb_flags, TB_FLAGS, VL_EQ_VLMAX);
- ctx->misa_mxl_max = env->misa_mxl_max;
+ ctx->misa_mxl_max = mcc->misa_mxl_max;
ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL);
ctx->address_xl = FIELD_EX32(tb_flags, TB_FLAGS, AXL);
ctx->cs = cs;
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 25/43] target/riscv: Validate misa_mxl_max only once
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (23 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 24/43] target/riscv: Move misa_mxl_max to class Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-11 23:29 ` Alistair Francis
2024-01-03 17:33 ` [PATCH v2 26/43] target/arm: Use GDBFeature for dynamic XML Alex Bennée
` (18 subsequent siblings)
43 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
misa_mxl_max is now a class member and initialized only once for each
class. This also moves the initialization of gdb_core_xml_file which
will be referenced before realization in the future.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-Id: <20231213-riscv-v7-4-a760156a337f@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
target/riscv/cpu.c | 21 +++++++++++++++++++++
target/riscv/tcg/tcg-cpu.c | 23 -----------------------
2 files changed, 21 insertions(+), 23 deletions(-)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 2ab61df2217..b799f133604 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1247,6 +1247,26 @@ static const MISAExtInfo misa_ext_info_arr[] = {
MISA_EXT_INFO(RVG, "g", "General purpose (IMAFD_Zicsr_Zifencei)"),
};
+static void riscv_cpu_validate_misa_mxl(RISCVCPUClass *mcc)
+{
+ CPUClass *cc = CPU_CLASS(mcc);
+
+ /* Validate that MISA_MXL is set properly. */
+ switch (mcc->misa_mxl_max) {
+#ifdef TARGET_RISCV64
+ case MXL_RV64:
+ case MXL_RV128:
+ cc->gdb_core_xml_file = "riscv-64bit-cpu.xml";
+ break;
+#endif
+ case MXL_RV32:
+ cc->gdb_core_xml_file = "riscv-32bit-cpu.xml";
+ break;
+ default:
+ g_assert_not_reached();
+ }
+}
+
static int riscv_validate_misa_info_idx(uint32_t bit)
{
int idx;
@@ -1695,6 +1715,7 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);
mcc->misa_mxl_max = (uint32_t)(uintptr_t)data;
+ riscv_cpu_validate_misa_mxl(mcc);
}
static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str,
diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
index 7f6712c81a4..eb243e011ca 100644
--- a/target/riscv/tcg/tcg-cpu.c
+++ b/target/riscv/tcg/tcg-cpu.c
@@ -148,27 +148,6 @@ static void riscv_cpu_validate_misa_priv(CPURISCVState *env, Error **errp)
}
}
-static void riscv_cpu_validate_misa_mxl(RISCVCPU *cpu)
-{
- RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu);
- CPUClass *cc = CPU_CLASS(mcc);
-
- /* Validate that MISA_MXL is set properly. */
- switch (mcc->misa_mxl_max) {
-#ifdef TARGET_RISCV64
- case MXL_RV64:
- case MXL_RV128:
- cc->gdb_core_xml_file = "riscv-64bit-cpu.xml";
- break;
-#endif
- case MXL_RV32:
- cc->gdb_core_xml_file = "riscv-32bit-cpu.xml";
- break;
- default:
- g_assert_not_reached();
- }
-}
-
static void riscv_cpu_validate_priv_spec(RISCVCPU *cpu, Error **errp)
{
CPURISCVState *env = &cpu->env;
@@ -676,8 +655,6 @@ static bool tcg_cpu_realize(CPUState *cs, Error **errp)
return false;
}
- riscv_cpu_validate_misa_mxl(cpu);
-
#ifndef CONFIG_USER_ONLY
CPURISCVState *env = &cpu->env;
Error *local_err = NULL;
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 26/43] target/arm: Use GDBFeature for dynamic XML
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (24 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 25/43] target/riscv: Validate misa_mxl_max only once Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 27/43] target/ppc: " Alex Bennée
` (17 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
In preparation for a change to use GDBFeature as a parameter of
gdb_register_coprocessor(), convert the internal representation of
dynamic feature from plain XML to GDBFeature.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Acked-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20231213-gdb-v17-1-777047380591@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
target/arm/cpu.h | 21 +++---
target/arm/internals.h | 2 +-
target/arm/gdbstub.c | 142 ++++++++++++++++++++---------------------
target/arm/gdbstub64.c | 95 +++++++++++++--------------
4 files changed, 123 insertions(+), 137 deletions(-)
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index a0282e0d281..b2f8ac81f06 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -25,6 +25,7 @@
#include "hw/registerfields.h"
#include "cpu-qom.h"
#include "exec/cpu-defs.h"
+#include "exec/gdbstub.h"
#include "qapi/qapi-types-common.h"
/* ARM processors have a weak memory model */
@@ -136,23 +137,21 @@ enum {
*/
/**
- * DynamicGDBXMLInfo:
- * @desc: Contains the XML descriptions.
- * @num: Number of the registers in this XML seen by GDB.
+ * DynamicGDBFeatureInfo:
+ * @desc: Contains the feature descriptions.
* @data: A union with data specific to the set of registers
* @cpregs_keys: Array that contains the corresponding Key of
* a given cpreg with the same order of the cpreg
* in the XML description.
*/
-typedef struct DynamicGDBXMLInfo {
- char *desc;
- int num;
+typedef struct DynamicGDBFeatureInfo {
+ GDBFeature desc;
union {
struct {
uint32_t *keys;
} cpregs;
} data;
-} DynamicGDBXMLInfo;
+} DynamicGDBFeatureInfo;
/* CPU state for each instance of a generic timer (in cp15 c14) */
typedef struct ARMGenericTimer {
@@ -878,10 +877,10 @@ struct ArchCPU {
uint64_t *cpreg_vmstate_values;
int32_t cpreg_vmstate_array_len;
- DynamicGDBXMLInfo dyn_sysreg_xml;
- DynamicGDBXMLInfo dyn_svereg_xml;
- DynamicGDBXMLInfo dyn_m_systemreg_xml;
- DynamicGDBXMLInfo dyn_m_secextreg_xml;
+ DynamicGDBFeatureInfo dyn_sysreg_feature;
+ DynamicGDBFeatureInfo dyn_svereg_feature;
+ DynamicGDBFeatureInfo dyn_m_systemreg_feature;
+ DynamicGDBFeatureInfo dyn_m_secextreg_feature;
/* Timers used by the generic (architected) timer */
QEMUTimer *gt_timer[NUM_GTIMERS];
diff --git a/target/arm/internals.h b/target/arm/internals.h
index 143d57c0fe4..1136710741f 100644
--- a/target/arm/internals.h
+++ b/target/arm/internals.h
@@ -1446,7 +1446,7 @@ static inline uint64_t pmu_counter_mask(CPUARMState *env)
}
#ifdef TARGET_AARCH64
-int arm_gen_dynamic_svereg_xml(CPUState *cpu, int base_reg);
+GDBFeature *arm_gen_dynamic_svereg_feature(CPUState *cpu, int base_reg);
int aarch64_gdb_get_sve_reg(CPUARMState *env, GByteArray *buf, int reg);
int aarch64_gdb_set_sve_reg(CPUARMState *env, uint8_t *buf, int reg);
int aarch64_gdb_get_fpu_reg(CPUARMState *env, GByteArray *buf, int reg);
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
index 28f546a5ff9..5949adfb31a 100644
--- a/target/arm/gdbstub.c
+++ b/target/arm/gdbstub.c
@@ -26,11 +26,11 @@
#include "cpu-features.h"
#include "cpregs.h"
-typedef struct RegisterSysregXmlParam {
+typedef struct RegisterSysregFeatureParam {
CPUState *cs;
- GString *s;
+ GDBFeatureBuilder builder;
int n;
-} RegisterSysregXmlParam;
+} RegisterSysregFeatureParam;
/* Old gdb always expect FPA registers. Newer (xml-aware) gdb only expect
whatever the target description contains. Due to a historical mishap
@@ -216,7 +216,7 @@ static int arm_gdb_get_sysreg(CPUARMState *env, GByteArray *buf, int reg)
const ARMCPRegInfo *ri;
uint32_t key;
- key = cpu->dyn_sysreg_xml.data.cpregs.keys[reg];
+ key = cpu->dyn_sysreg_feature.data.cpregs.keys[reg];
ri = get_arm_cp_reginfo(cpu->cp_regs, key);
if (ri) {
if (cpreg_field_is_64bit(ri)) {
@@ -233,34 +233,32 @@ static int arm_gdb_set_sysreg(CPUARMState *env, uint8_t *buf, int reg)
return 0;
}
-static void arm_gen_one_xml_sysreg_tag(GString *s, DynamicGDBXMLInfo *dyn_xml,
+static void arm_gen_one_feature_sysreg(GDBFeatureBuilder *builder,
+ DynamicGDBFeatureInfo *dyn_feature,
ARMCPRegInfo *ri, uint32_t ri_key,
- int bitsize, int regnum)
+ int bitsize, int n)
{
- g_string_append_printf(s, "<reg name=\"%s\"", ri->name);
- g_string_append_printf(s, " bitsize=\"%d\"", bitsize);
- g_string_append_printf(s, " regnum=\"%d\"", regnum);
- g_string_append_printf(s, " group=\"cp_regs\"/>");
- dyn_xml->data.cpregs.keys[dyn_xml->num] = ri_key;
- dyn_xml->num++;
+ gdb_feature_builder_append_reg(builder, ri->name, bitsize, n,
+ "int", "cp_regs");
+
+ dyn_feature->data.cpregs.keys[n] = ri_key;
}
-static void arm_register_sysreg_for_xml(gpointer key, gpointer value,
- gpointer p)
+static void arm_register_sysreg_for_feature(gpointer key, gpointer value,
+ gpointer p)
{
uint32_t ri_key = (uintptr_t)key;
ARMCPRegInfo *ri = value;
- RegisterSysregXmlParam *param = (RegisterSysregXmlParam *)p;
- GString *s = param->s;
+ RegisterSysregFeatureParam *param = p;
ARMCPU *cpu = ARM_CPU(param->cs);
CPUARMState *env = &cpu->env;
- DynamicGDBXMLInfo *dyn_xml = &cpu->dyn_sysreg_xml;
+ DynamicGDBFeatureInfo *dyn_feature = &cpu->dyn_sysreg_feature;
if (!(ri->type & (ARM_CP_NO_RAW | ARM_CP_NO_GDB))) {
if (arm_feature(env, ARM_FEATURE_AARCH64)) {
if (ri->state == ARM_CP_STATE_AA64) {
- arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64,
- param->n++);
+ arm_gen_one_feature_sysreg(¶m->builder, dyn_feature,
+ ri, ri_key, 64, param->n++);
}
} else {
if (ri->state == ARM_CP_STATE_AA32) {
@@ -269,32 +267,32 @@ static void arm_register_sysreg_for_xml(gpointer key, gpointer value,
return;
}
if (ri->type & ARM_CP_64BIT) {
- arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 64,
- param->n++);
+ arm_gen_one_feature_sysreg(¶m->builder, dyn_feature,
+ ri, ri_key, 64, param->n++);
} else {
- arm_gen_one_xml_sysreg_tag(s , dyn_xml, ri, ri_key, 32,
- param->n++);
+ arm_gen_one_feature_sysreg(¶m->builder, dyn_feature,
+ ri, ri_key, 32, param->n++);
}
}
}
}
}
-static int arm_gen_dynamic_sysreg_xml(CPUState *cs, int base_reg)
+static GDBFeature *arm_gen_dynamic_sysreg_feature(CPUState *cs, int base_reg)
{
ARMCPU *cpu = ARM_CPU(cs);
- GString *s = g_string_new(NULL);
- RegisterSysregXmlParam param = {cs, s, base_reg};
-
- cpu->dyn_sysreg_xml.num = 0;
- cpu->dyn_sysreg_xml.data.cpregs.keys = g_new(uint32_t, g_hash_table_size(cpu->cp_regs));
- g_string_printf(s, "<?xml version=\"1.0\"?>");
- g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
- g_string_append_printf(s, "<feature name=\"org.qemu.gdb.arm.sys.regs\">");
- g_hash_table_foreach(cpu->cp_regs, arm_register_sysreg_for_xml, ¶m);
- g_string_append_printf(s, "</feature>");
- cpu->dyn_sysreg_xml.desc = g_string_free(s, false);
- return cpu->dyn_sysreg_xml.num;
+ RegisterSysregFeatureParam param = {cs};
+ gsize num_regs = g_hash_table_size(cpu->cp_regs);
+
+ gdb_feature_builder_init(¶m.builder,
+ &cpu->dyn_sysreg_feature.desc,
+ "org.qemu.gdb.arm.sys.regs",
+ "system-registers.xml",
+ base_reg);
+ cpu->dyn_sysreg_feature.data.cpregs.keys = g_new(uint32_t, num_regs);
+ g_hash_table_foreach(cpu->cp_regs, arm_register_sysreg_for_feature, ¶m);
+ gdb_feature_builder_end(¶m.builder);
+ return &cpu->dyn_sysreg_feature.desc;
}
#ifdef CONFIG_TCG
@@ -386,31 +384,29 @@ static int arm_gdb_set_m_systemreg(CPUARMState *env, uint8_t *buf, int reg)
return 0; /* TODO */
}
-static int arm_gen_dynamic_m_systemreg_xml(CPUState *cs, int orig_base_reg)
+static GDBFeature *arm_gen_dynamic_m_systemreg_feature(CPUState *cs,
+ int base_reg)
{
ARMCPU *cpu = ARM_CPU(cs);
CPUARMState *env = &cpu->env;
- GString *s = g_string_new(NULL);
- int base_reg = orig_base_reg;
+ GDBFeatureBuilder builder;
+ int reg = 0;
int i;
- g_string_printf(s, "<?xml version=\"1.0\"?>");
- g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
- g_string_append_printf(s, "<feature name=\"org.gnu.gdb.arm.m-system\">\n");
+ gdb_feature_builder_init(&builder, &cpu->dyn_m_systemreg_feature.desc,
+ "org.gnu.gdb.arm.m-system", "arm-m-system.xml",
+ base_reg);
for (i = 0; i < ARRAY_SIZE(m_sysreg_def); i++) {
if (arm_feature(env, m_sysreg_def[i].feature)) {
- g_string_append_printf(s,
- "<reg name=\"%s\" bitsize=\"32\" regnum=\"%d\"/>\n",
- m_sysreg_def[i].name, base_reg++);
+ gdb_feature_builder_append_reg(&builder, m_sysreg_def[i].name, 32,
+ reg++, "int", NULL);
}
}
- g_string_append_printf(s, "</feature>");
- cpu->dyn_m_systemreg_xml.desc = g_string_free(s, false);
- cpu->dyn_m_systemreg_xml.num = base_reg - orig_base_reg;
+ gdb_feature_builder_end(&builder);
- return cpu->dyn_m_systemreg_xml.num;
+ return &cpu->dyn_m_systemreg_feature.desc;
}
#ifndef CONFIG_USER_ONLY
@@ -428,31 +424,31 @@ static int arm_gdb_set_m_secextreg(CPUARMState *env, uint8_t *buf, int reg)
return 0; /* TODO */
}
-static int arm_gen_dynamic_m_secextreg_xml(CPUState *cs, int orig_base_reg)
+static GDBFeature *arm_gen_dynamic_m_secextreg_feature(CPUState *cs,
+ int base_reg)
{
ARMCPU *cpu = ARM_CPU(cs);
- GString *s = g_string_new(NULL);
- int base_reg = orig_base_reg;
+ GDBFeatureBuilder builder;
+ char *name;
+ int reg = 0;
int i;
- g_string_printf(s, "<?xml version=\"1.0\"?>");
- g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
- g_string_append_printf(s, "<feature name=\"org.gnu.gdb.arm.secext\">\n");
+ gdb_feature_builder_init(&builder, &cpu->dyn_m_secextreg_feature.desc,
+ "org.gnu.gdb.arm.secext", "arm-m-secext.xml",
+ base_reg);
for (i = 0; i < ARRAY_SIZE(m_sysreg_def); i++) {
- g_string_append_printf(s,
- "<reg name=\"%s_ns\" bitsize=\"32\" regnum=\"%d\"/>\n",
- m_sysreg_def[i].name, base_reg++);
- g_string_append_printf(s,
- "<reg name=\"%s_s\" bitsize=\"32\" regnum=\"%d\"/>\n",
- m_sysreg_def[i].name, base_reg++);
+ name = g_strconcat(m_sysreg_def[i].name, "_ns", NULL);
+ gdb_feature_builder_append_reg(&builder, name, 32, reg++,
+ "int", NULL);
+ name = g_strconcat(m_sysreg_def[i].name, "_s", NULL);
+ gdb_feature_builder_append_reg(&builder, name, 32, reg++,
+ "int", NULL);
}
- g_string_append_printf(s, "</feature>");
- cpu->dyn_m_secextreg_xml.desc = g_string_free(s, false);
- cpu->dyn_m_secextreg_xml.num = base_reg - orig_base_reg;
+ gdb_feature_builder_end(&builder);
- return cpu->dyn_m_secextreg_xml.num;
+ return &cpu->dyn_m_secextreg_feature.desc;
}
#endif
#endif /* CONFIG_TCG */
@@ -462,14 +458,14 @@ const char *arm_gdb_get_dynamic_xml(CPUState *cs, const char *xmlname)
ARMCPU *cpu = ARM_CPU(cs);
if (strcmp(xmlname, "system-registers.xml") == 0) {
- return cpu->dyn_sysreg_xml.desc;
+ return cpu->dyn_sysreg_feature.desc.xml;
} else if (strcmp(xmlname, "sve-registers.xml") == 0) {
- return cpu->dyn_svereg_xml.desc;
+ return cpu->dyn_svereg_feature.desc.xml;
} else if (strcmp(xmlname, "arm-m-system.xml") == 0) {
- return cpu->dyn_m_systemreg_xml.desc;
+ return cpu->dyn_m_systemreg_feature.desc.xml;
#ifndef CONFIG_USER_ONLY
} else if (strcmp(xmlname, "arm-m-secext.xml") == 0) {
- return cpu->dyn_m_secextreg_xml.desc;
+ return cpu->dyn_m_secextreg_feature.desc.xml;
#endif
}
return NULL;
@@ -487,7 +483,7 @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
*/
#ifdef TARGET_AARCH64
if (isar_feature_aa64_sve(&cpu->isar)) {
- int nreg = arm_gen_dynamic_svereg_xml(cs, cs->gdb_num_regs);
+ int nreg = arm_gen_dynamic_svereg_feature(cs, cs->gdb_num_regs)->num_regs;
gdb_register_coprocessor(cs, aarch64_gdb_get_sve_reg,
aarch64_gdb_set_sve_reg, nreg,
"sve-registers.xml", 0);
@@ -533,20 +529,20 @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
1, "arm-m-profile-mve.xml", 0);
}
gdb_register_coprocessor(cs, arm_gdb_get_sysreg, arm_gdb_set_sysreg,
- arm_gen_dynamic_sysreg_xml(cs, cs->gdb_num_regs),
+ arm_gen_dynamic_sysreg_feature(cs, cs->gdb_num_regs)->num_regs,
"system-registers.xml", 0);
#ifdef CONFIG_TCG
if (arm_feature(env, ARM_FEATURE_M) && tcg_enabled()) {
gdb_register_coprocessor(cs,
arm_gdb_get_m_systemreg, arm_gdb_set_m_systemreg,
- arm_gen_dynamic_m_systemreg_xml(cs, cs->gdb_num_regs),
+ arm_gen_dynamic_m_systemreg_feature(cs, cs->gdb_num_regs)->num_regs,
"arm-m-system.xml", 0);
#ifndef CONFIG_USER_ONLY
if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
gdb_register_coprocessor(cs,
arm_gdb_get_m_secextreg, arm_gdb_set_m_secextreg,
- arm_gen_dynamic_m_secextreg_xml(cs, cs->gdb_num_regs),
+ arm_gen_dynamic_m_secextreg_feature(cs, cs->gdb_num_regs)->num_regs,
"arm-m-secext.xml", 0);
}
#endif
diff --git a/target/arm/gdbstub64.c b/target/arm/gdbstub64.c
index d7b79a6589b..5286d5c6043 100644
--- a/target/arm/gdbstub64.c
+++ b/target/arm/gdbstub64.c
@@ -247,7 +247,7 @@ int aarch64_gdb_set_pauth_reg(CPUARMState *env, uint8_t *buf, int reg)
return 0;
}
-static void output_vector_union_type(GString *s, int reg_width,
+static void output_vector_union_type(GDBFeatureBuilder *builder, int reg_width,
const char *name)
{
struct TypeSize {
@@ -282,10 +282,10 @@ static void output_vector_union_type(GString *s, int reg_width,
/* First define types and totals in a whole VL */
for (i = 0; i < ARRAY_SIZE(vec_lanes); i++) {
- g_string_append_printf(s,
- "<vector id=\"%s%c%c\" type=\"%s\" count=\"%d\"/>",
- name, vec_lanes[i].sz, vec_lanes[i].suffix,
- vec_lanes[i].gdb_type, reg_width / vec_lanes[i].size);
+ gdb_feature_builder_append_tag(
+ builder, "<vector id=\"%s%c%c\" type=\"%s\" count=\"%d\"/>",
+ name, vec_lanes[i].sz, vec_lanes[i].suffix,
+ vec_lanes[i].gdb_type, reg_width / vec_lanes[i].size);
}
/*
@@ -296,86 +296,77 @@ static void output_vector_union_type(GString *s, int reg_width,
for (i = 0; i < ARRAY_SIZE(suf); i++) {
int bits = 8 << i;
- g_string_append_printf(s, "<union id=\"%sn%c\">", name, suf[i]);
+ gdb_feature_builder_append_tag(builder, "<union id=\"%sn%c\">",
+ name, suf[i]);
for (j = 0; j < ARRAY_SIZE(vec_lanes); j++) {
if (vec_lanes[j].size == bits) {
- g_string_append_printf(s, "<field name=\"%c\" type=\"%s%c%c\"/>",
- vec_lanes[j].suffix, name,
- vec_lanes[j].sz, vec_lanes[j].suffix);
+ gdb_feature_builder_append_tag(
+ builder, "<field name=\"%c\" type=\"%s%c%c\"/>",
+ vec_lanes[j].suffix, name,
+ vec_lanes[j].sz, vec_lanes[j].suffix);
}
}
- g_string_append(s, "</union>");
+ gdb_feature_builder_append_tag(builder, "</union>");
}
/* And now the final union of unions */
- g_string_append_printf(s, "<union id=\"%s\">", name);
+ gdb_feature_builder_append_tag(builder, "<union id=\"%s\">", name);
for (i = ARRAY_SIZE(suf) - 1; i >= 0; i--) {
- g_string_append_printf(s, "<field name=\"%c\" type=\"%sn%c\"/>",
- suf[i], name, suf[i]);
+ gdb_feature_builder_append_tag(builder,
+ "<field name=\"%c\" type=\"%sn%c\"/>",
+ suf[i], name, suf[i]);
}
- g_string_append(s, "</union>");
+ gdb_feature_builder_append_tag(builder, "</union>");
}
-int arm_gen_dynamic_svereg_xml(CPUState *cs, int orig_base_reg)
+GDBFeature *arm_gen_dynamic_svereg_feature(CPUState *cs, int base_reg)
{
ARMCPU *cpu = ARM_CPU(cs);
- GString *s = g_string_new(NULL);
- DynamicGDBXMLInfo *info = &cpu->dyn_svereg_xml;
int reg_width = cpu->sve_max_vq * 128;
int pred_width = cpu->sve_max_vq * 16;
- int base_reg = orig_base_reg;
+ GDBFeatureBuilder builder;
+ char *name;
+ int reg = 0;
int i;
- g_string_printf(s, "<?xml version=\"1.0\"?>");
- g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
- g_string_append_printf(s, "<feature name=\"org.gnu.gdb.aarch64.sve\">");
+ gdb_feature_builder_init(&builder, &cpu->dyn_svereg_feature.desc,
+ "org.gnu.gdb.aarch64.sve", "sve-registers.xml",
+ base_reg);
/* Create the vector union type. */
- output_vector_union_type(s, reg_width, "svev");
+ output_vector_union_type(&builder, reg_width, "svev");
/* Create the predicate vector type. */
- g_string_append_printf(s,
- "<vector id=\"svep\" type=\"uint8\" count=\"%d\"/>",
- pred_width / 8);
+ gdb_feature_builder_append_tag(
+ &builder, "<vector id=\"svep\" type=\"uint8\" count=\"%d\"/>",
+ pred_width / 8);
/* Define the vector registers. */
for (i = 0; i < 32; i++) {
- g_string_append_printf(s,
- "<reg name=\"z%d\" bitsize=\"%d\""
- " regnum=\"%d\" type=\"svev\"/>",
- i, reg_width, base_reg++);
+ name = g_strdup_printf("z%d", i);
+ gdb_feature_builder_append_reg(&builder, name, reg_width, reg++,
+ "svev", NULL);
}
/* fpscr & status registers */
- g_string_append_printf(s, "<reg name=\"fpsr\" bitsize=\"32\""
- " regnum=\"%d\" group=\"float\""
- " type=\"int\"/>", base_reg++);
- g_string_append_printf(s, "<reg name=\"fpcr\" bitsize=\"32\""
- " regnum=\"%d\" group=\"float\""
- " type=\"int\"/>", base_reg++);
+ gdb_feature_builder_append_reg(&builder, "fpsr", 32, reg++,
+ "int", "float");
+ gdb_feature_builder_append_reg(&builder, "fpcr", 32, reg++,
+ "int", "float");
/* Define the predicate registers. */
for (i = 0; i < 16; i++) {
- g_string_append_printf(s,
- "<reg name=\"p%d\" bitsize=\"%d\""
- " regnum=\"%d\" type=\"svep\"/>",
- i, pred_width, base_reg++);
+ name = g_strdup_printf("p%d", i);
+ gdb_feature_builder_append_reg(&builder, name, pred_width, reg++,
+ "svep", NULL);
}
- g_string_append_printf(s,
- "<reg name=\"ffr\" bitsize=\"%d\""
- " regnum=\"%d\" group=\"vector\""
- " type=\"svep\"/>",
- pred_width, base_reg++);
+ gdb_feature_builder_append_reg(&builder, "ffr", pred_width, reg++,
+ "svep", "vector");
/* Define the vector length pseudo-register. */
- g_string_append_printf(s,
- "<reg name=\"vg\" bitsize=\"64\""
- " regnum=\"%d\" type=\"int\"/>",
- base_reg++);
+ gdb_feature_builder_append_reg(&builder, "vg", 64, reg++, "int", NULL);
- g_string_append_printf(s, "</feature>");
+ gdb_feature_builder_end(&builder);
- info->desc = g_string_free(s, false);
- info->num = base_reg - orig_base_reg;
- return info->num;
+ return &cpu->dyn_svereg_feature.desc;
}
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 27/43] target/ppc: Use GDBFeature for dynamic XML
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (25 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 26/43] target/arm: Use GDBFeature for dynamic XML Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 28/43] target/riscv: " Alex Bennée
` (16 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
In preparation for a change to use GDBFeature as a parameter of
gdb_register_coprocessor(), convert the internal representation of
dynamic feature from plain XML to GDBFeature.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20231213-gdb-v17-2-777047380591@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
target/ppc/cpu-qom.h | 1 +
target/ppc/cpu.h | 4 +---
target/ppc/cpu_init.c | 4 ----
target/ppc/gdbstub.c | 51 ++++++++++++++++---------------------------
4 files changed, 21 insertions(+), 39 deletions(-)
diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
index 0241609efef..8247fa23367 100644
--- a/target/ppc/cpu-qom.h
+++ b/target/ppc/cpu-qom.h
@@ -20,6 +20,7 @@
#ifndef QEMU_PPC_CPU_QOM_H
#define QEMU_PPC_CPU_QOM_H
+#include "exec/gdbstub.h"
#include "hw/core/cpu.h"
#ifdef TARGET_PPC64
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index f8101ffa296..f87c26f98a6 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -1471,8 +1471,7 @@ struct PowerPCCPUClass {
int bfd_mach;
uint32_t l1_dcache_size, l1_icache_size;
#ifndef CONFIG_USER_ONLY
- unsigned int gdb_num_sprs;
- const char *gdb_spr_xml;
+ GDBFeature gdb_spr;
#endif
const PPCHash64Options *hash64_opts;
struct ppc_radix_page_info *radix_page_info;
@@ -1525,7 +1524,6 @@ int ppc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
int ppc_cpu_gdb_write_register_apple(CPUState *cpu, uint8_t *buf, int reg);
#ifndef CONFIG_USER_ONLY
hwaddr ppc_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
-void ppc_gdb_gen_spr_xml(PowerPCCPU *cpu);
const char *ppc_gdb_get_dynamic_xml(CPUState *cs, const char *xml_name);
#endif
int ppc64_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
index 40fe14a6c25..a0178c3ce80 100644
--- a/target/ppc/cpu_init.c
+++ b/target/ppc/cpu_init.c
@@ -6682,10 +6682,6 @@ static void init_ppc_proc(PowerPCCPU *cpu)
/* PowerPC implementation specific initialisations (SPRs, timers, ...) */
(*pcc->init_proc)(env);
-#if !defined(CONFIG_USER_ONLY)
- ppc_gdb_gen_spr_xml(cpu);
-#endif
-
/* MSR bits & flags consistency checks */
if (env->msr_mask & (1 << 25)) {
switch (env->flags & (POWERPC_FLAG_SPE | POWERPC_FLAG_VRE)) {
diff --git a/target/ppc/gdbstub.c b/target/ppc/gdbstub.c
index ec5731e5d67..e3be3dbd109 100644
--- a/target/ppc/gdbstub.c
+++ b/target/ppc/gdbstub.c
@@ -300,15 +300,23 @@ int ppc_cpu_gdb_write_register_apple(CPUState *cs, uint8_t *mem_buf, int n)
}
#ifndef CONFIG_USER_ONLY
-void ppc_gdb_gen_spr_xml(PowerPCCPU *cpu)
+static void gdb_gen_spr_feature(CPUState *cs)
{
- PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
+ PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
CPUPPCState *env = &cpu->env;
- GString *xml;
- char *spr_name;
+ GDBFeatureBuilder builder;
unsigned int num_regs = 0;
int i;
+ if (pcc->gdb_spr.xml) {
+ return;
+ }
+
+ gdb_feature_builder_init(&builder, &pcc->gdb_spr,
+ "org.qemu.power.spr", "power-spr.xml",
+ cs->gdb_num_regs);
+
for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
ppc_spr_t *spr = &env->spr_cb[i];
@@ -326,35 +334,13 @@ void ppc_gdb_gen_spr_xml(PowerPCCPU *cpu)
*/
spr->gdb_id = num_regs;
num_regs++;
- }
-
- if (pcc->gdb_spr_xml) {
- return;
- }
- xml = g_string_new("<?xml version=\"1.0\"?>");
- g_string_append(xml, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
- g_string_append(xml, "<feature name=\"org.qemu.power.spr\">");
-
- for (i = 0; i < ARRAY_SIZE(env->spr_cb); i++) {
- ppc_spr_t *spr = &env->spr_cb[i];
-
- if (!spr->name) {
- continue;
- }
-
- spr_name = g_ascii_strdown(spr->name, -1);
- g_string_append_printf(xml, "<reg name=\"%s\"", spr_name);
- g_free(spr_name);
-
- g_string_append_printf(xml, " bitsize=\"%d\"", TARGET_LONG_BITS);
- g_string_append(xml, " group=\"spr\"/>");
+ gdb_feature_builder_append_reg(&builder, g_ascii_strdown(spr->name, -1),
+ TARGET_LONG_BITS, num_regs,
+ "int", "spr");
}
- g_string_append(xml, "</feature>");
-
- pcc->gdb_num_sprs = num_regs;
- pcc->gdb_spr_xml = g_string_free(xml, false);
+ gdb_feature_builder_end(&builder);
}
const char *ppc_gdb_get_dynamic_xml(CPUState *cs, const char *xml_name)
@@ -362,7 +348,7 @@ const char *ppc_gdb_get_dynamic_xml(CPUState *cs, const char *xml_name)
PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
if (strcmp(xml_name, "power-spr.xml") == 0) {
- return pcc->gdb_spr_xml;
+ return pcc->gdb_spr.xml;
}
return NULL;
}
@@ -599,7 +585,8 @@ void ppc_gdb_init(CPUState *cs, PowerPCCPUClass *pcc)
32, "power-vsx.xml", 0);
}
#ifndef CONFIG_USER_ONLY
+ gdb_gen_spr_feature(cs);
gdb_register_coprocessor(cs, gdb_get_spr_reg, gdb_set_spr_reg,
- pcc->gdb_num_sprs, "power-spr.xml", 0);
+ pcc->gdb_spr.num_regs, "power-spr.xml", 0);
#endif
}
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 28/43] target/riscv: Use GDBFeature for dynamic XML
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (26 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 27/43] target/ppc: " Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 29/43] gdbstub: Use GDBFeature for gdb_register_coprocessor Alex Bennée
` (15 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
In preparation for a change to use GDBFeature as a parameter of
gdb_register_coprocessor(), convert the internal representation of
dynamic feature from plain XML to GDBFeature.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-Id: <20231213-gdb-v17-3-777047380591@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
target/riscv/cpu.h | 5 +--
target/riscv/cpu.c | 4 +--
target/riscv/gdbstub.c | 79 +++++++++++++++++++-----------------------
3 files changed, 40 insertions(+), 48 deletions(-)
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index 060b7f69a74..ad7236d7547 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -24,6 +24,7 @@
#include "hw/registerfields.h"
#include "hw/qdev-properties.h"
#include "exec/cpu-defs.h"
+#include "exec/gdbstub.h"
#include "qemu/cpu-float.h"
#include "qom/object.h"
#include "qemu/int128.h"
@@ -424,8 +425,8 @@ struct ArchCPU {
CPURISCVState env;
- char *dyn_csr_xml;
- char *dyn_vreg_xml;
+ GDBFeature dyn_csr_feature;
+ GDBFeature dyn_vreg_feature;
/* Configuration Settings */
RISCVCPUConfig cfg;
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index b799f133604..673e937a5d8 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1534,9 +1534,9 @@ static const char *riscv_gdb_get_dynamic_xml(CPUState *cs, const char *xmlname)
RISCVCPU *cpu = RISCV_CPU(cs);
if (strcmp(xmlname, "riscv-csr.xml") == 0) {
- return cpu->dyn_csr_xml;
+ return cpu->dyn_csr_feature.xml;
} else if (strcmp(xmlname, "riscv-vector.xml") == 0) {
- return cpu->dyn_vreg_xml;
+ return cpu->dyn_vreg_feature.xml;
}
return NULL;
diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c
index 365040228a1..76b72a95954 100644
--- a/target/riscv/gdbstub.c
+++ b/target/riscv/gdbstub.c
@@ -214,13 +214,14 @@ static int riscv_gdb_set_virtual(CPURISCVState *cs, uint8_t *mem_buf, int n)
return 0;
}
-static int riscv_gen_dynamic_csr_xml(CPUState *cs, int base_reg)
+static GDBFeature *riscv_gen_dynamic_csr_feature(CPUState *cs, int base_reg)
{
RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);
RISCVCPU *cpu = RISCV_CPU(cs);
CPURISCVState *env = &cpu->env;
- GString *s = g_string_new(NULL);
+ GDBFeatureBuilder builder;
riscv_csr_predicate_fn predicate;
+ const char *name;
int bitsize = 16 << mcc->misa_mxl_max;
int i;
@@ -233,9 +234,9 @@ static int riscv_gen_dynamic_csr_xml(CPUState *cs, int base_reg)
bitsize = 64;
}
- g_string_printf(s, "<?xml version=\"1.0\"?>");
- g_string_append_printf(s, "<!DOCTYPE feature SYSTEM \"gdb-target.dtd\">");
- g_string_append_printf(s, "<feature name=\"org.gnu.gdb.riscv.csr\">");
+ gdb_feature_builder_init(&builder, &cpu->dyn_csr_feature,
+ "org.gnu.gdb.riscv.csr", "riscv-csr.xml",
+ base_reg);
for (i = 0; i < CSR_TABLE_SIZE; i++) {
if (env->priv_ver < csr_ops[i].min_priv_ver) {
@@ -243,72 +244,64 @@ static int riscv_gen_dynamic_csr_xml(CPUState *cs, int base_reg)
}
predicate = csr_ops[i].predicate;
if (predicate && (predicate(env, i) == RISCV_EXCP_NONE)) {
- if (csr_ops[i].name) {
- g_string_append_printf(s, "<reg name=\"%s\"", csr_ops[i].name);
- } else {
- g_string_append_printf(s, "<reg name=\"csr%03x\"", i);
+ g_autofree char *dynamic_name = NULL;
+ name = csr_ops[i].name;
+ if (!name) {
+ dynamic_name = g_strdup_printf("csr%03x", i);
+ name = dynamic_name;
}
- g_string_append_printf(s, " bitsize=\"%d\"", bitsize);
- g_string_append_printf(s, " regnum=\"%d\"/>", base_reg + i);
+
+ gdb_feature_builder_append_reg(&builder, name, bitsize, i,
+ "int", NULL);
}
}
- g_string_append_printf(s, "</feature>");
-
- cpu->dyn_csr_xml = g_string_free(s, false);
+ gdb_feature_builder_end(&builder);
#if !defined(CONFIG_USER_ONLY)
env->debugger = false;
#endif
- return CSR_TABLE_SIZE;
+ return &cpu->dyn_csr_feature;
}
-static int ricsv_gen_dynamic_vector_xml(CPUState *cs, int base_reg)
+static GDBFeature *ricsv_gen_dynamic_vector_feature(CPUState *cs, int base_reg)
{
RISCVCPU *cpu = RISCV_CPU(cs);
- GString *s = g_string_new(NULL);
- g_autoptr(GString) ts = g_string_new("");
+ GDBFeatureBuilder builder;
int reg_width = cpu->cfg.vlen;
- int num_regs = 0;
int i;
- g_string_printf(s, "<?xml version=\"1.0\"?>");
- g_string_append_printf(s, "<!DOCTYPE target SYSTEM \"gdb-target.dtd\">");
- g_string_append_printf(s, "<feature name=\"org.gnu.gdb.riscv.vector\">");
+ gdb_feature_builder_init(&builder, &cpu->dyn_vreg_feature,
+ "org.gnu.gdb.riscv.vector", "riscv-vector.xml",
+ base_reg);
/* First define types and totals in a whole VL */
for (i = 0; i < ARRAY_SIZE(vec_lanes); i++) {
int count = reg_width / vec_lanes[i].size;
- g_string_printf(ts, "%s", vec_lanes[i].id);
- g_string_append_printf(s,
- "<vector id=\"%s\" type=\"%s\" count=\"%d\"/>",
- ts->str, vec_lanes[i].gdb_type, count);
+ gdb_feature_builder_append_tag(
+ &builder, "<vector id=\"%s\" type=\"%s\" count=\"%d\"/>",
+ vec_lanes[i].id, vec_lanes[i].gdb_type, count);
}
/* Define unions */
- g_string_append_printf(s, "<union id=\"riscv_vector\">");
+ gdb_feature_builder_append_tag(&builder, "<union id=\"riscv_vector\">");
for (i = 0; i < ARRAY_SIZE(vec_lanes); i++) {
- g_string_append_printf(s, "<field name=\"%c\" type=\"%s\"/>",
- vec_lanes[i].suffix,
- vec_lanes[i].id);
+ gdb_feature_builder_append_tag(&builder,
+ "<field name=\"%c\" type=\"%s\"/>",
+ vec_lanes[i].suffix, vec_lanes[i].id);
}
- g_string_append(s, "</union>");
+ gdb_feature_builder_append_tag(&builder, "</union>");
/* Define vector registers */
for (i = 0; i < 32; i++) {
- g_string_append_printf(s,
- "<reg name=\"v%d\" bitsize=\"%d\""
- " regnum=\"%d\" group=\"vector\""
- " type=\"riscv_vector\"/>",
- i, reg_width, base_reg++);
- num_regs++;
+ gdb_feature_builder_append_reg(&builder, g_strdup_printf("v%d", i),
+ reg_width, i, "riscv_vector", "vector");
}
- g_string_append_printf(s, "</feature>");
+ gdb_feature_builder_end(&builder);
- cpu->dyn_vreg_xml = g_string_free(s, false);
- return num_regs;
+ return &cpu->dyn_vreg_feature;
}
void riscv_cpu_register_gdb_regs_for_features(CPUState *cs)
@@ -324,10 +317,9 @@ void riscv_cpu_register_gdb_regs_for_features(CPUState *cs)
32, "riscv-32bit-fpu.xml", 0);
}
if (env->misa_ext & RVV) {
- int base_reg = cs->gdb_num_regs;
gdb_register_coprocessor(cs, riscv_gdb_get_vector,
riscv_gdb_set_vector,
- ricsv_gen_dynamic_vector_xml(cs, base_reg),
+ ricsv_gen_dynamic_vector_feature(cs, cs->gdb_num_regs)->num_regs,
"riscv-vector.xml", 0);
}
switch (mcc->misa_mxl_max) {
@@ -347,9 +339,8 @@ void riscv_cpu_register_gdb_regs_for_features(CPUState *cs)
}
if (cpu->cfg.ext_zicsr) {
- int base_reg = cs->gdb_num_regs;
gdb_register_coprocessor(cs, riscv_gdb_get_csr, riscv_gdb_set_csr,
- riscv_gen_dynamic_csr_xml(cs, base_reg),
+ riscv_gen_dynamic_csr_feature(cs, cs->gdb_num_regs)->num_regs,
"riscv-csr.xml", 0);
}
}
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 29/43] gdbstub: Use GDBFeature for gdb_register_coprocessor
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (27 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 28/43] target/riscv: " Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 30/43] gdbstub: Use GDBFeature for GDBRegisterState Alex Bennée
` (14 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
This is a tree-wide change to introduce GDBFeature parameter to
gdb_register_coprocessor(). The new parameter just replaces num_regs
and xml parameters for now. GDBFeature will be utilized to simplify XML
lookup in a following change.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Acked-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231213-gdb-v17-4-777047380591@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
include/exec/gdbstub.h | 2 +-
gdbstub/gdbstub.c | 13 +++++++------
target/arm/gdbstub.c | 35 +++++++++++++++++++----------------
target/hexagon/cpu.c | 3 +--
target/loongarch/gdbstub.c | 2 +-
target/m68k/helper.c | 6 +++---
target/microblaze/cpu.c | 5 +++--
target/ppc/gdbstub.c | 11 ++++++-----
target/riscv/gdbstub.c | 20 ++++++++++++--------
target/s390x/gdbstub.c | 28 +++++++---------------------
10 files changed, 60 insertions(+), 65 deletions(-)
diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h
index d8a3c56fa2b..ac6fce99a64 100644
--- a/include/exec/gdbstub.h
+++ b/include/exec/gdbstub.h
@@ -38,7 +38,7 @@ typedef int (*gdb_set_reg_cb)(CPUArchState *env, uint8_t *buf, int reg);
*/
void gdb_register_coprocessor(CPUState *cpu,
gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg,
- int num_regs, const char *xml, int g_pos);
+ const GDBFeature *feature, int g_pos);
/**
* gdbserver_start: start the gdb server
diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c
index 46d752bbc2c..068180c83c7 100644
--- a/gdbstub/gdbstub.c
+++ b/gdbstub/gdbstub.c
@@ -544,7 +544,7 @@ static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
void gdb_register_coprocessor(CPUState *cpu,
gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg,
- int num_regs, const char *xml, int g_pos)
+ const GDBFeature *feature, int g_pos)
{
GDBRegisterState *s;
guint i;
@@ -553,7 +553,7 @@ void gdb_register_coprocessor(CPUState *cpu,
for (i = 0; i < cpu->gdb_regs->len; i++) {
/* Check for duplicates. */
s = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
- if (strcmp(s->xml, xml) == 0) {
+ if (strcmp(s->xml, feature->xmlname) == 0) {
return;
}
}
@@ -565,17 +565,18 @@ void gdb_register_coprocessor(CPUState *cpu,
g_array_set_size(cpu->gdb_regs, i + 1);
s = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
s->base_reg = cpu->gdb_num_regs;
- s->num_regs = num_regs;
+ s->num_regs = feature->num_regs;
s->get_reg = get_reg;
s->set_reg = set_reg;
- s->xml = xml;
+ s->xml = feature->xml;
/* Add to end of list. */
- cpu->gdb_num_regs += num_regs;
+ cpu->gdb_num_regs += feature->num_regs;
if (g_pos) {
if (g_pos != s->base_reg) {
error_report("Error: Bad gdb register numbering for '%s', "
- "expected %d got %d", xml, g_pos, s->base_reg);
+ "expected %d got %d", feature->xml,
+ g_pos, s->base_reg);
} else {
cpu->gdb_num_g_regs = cpu->gdb_num_regs;
}
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
index 5949adfb31a..f2b201d3125 100644
--- a/target/arm/gdbstub.c
+++ b/target/arm/gdbstub.c
@@ -483,14 +483,14 @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
*/
#ifdef TARGET_AARCH64
if (isar_feature_aa64_sve(&cpu->isar)) {
- int nreg = arm_gen_dynamic_svereg_feature(cs, cs->gdb_num_regs)->num_regs;
+ GDBFeature *feature = arm_gen_dynamic_svereg_feature(cs, cs->gdb_num_regs);
gdb_register_coprocessor(cs, aarch64_gdb_get_sve_reg,
- aarch64_gdb_set_sve_reg, nreg,
- "sve-registers.xml", 0);
+ aarch64_gdb_set_sve_reg, feature, 0);
} else {
gdb_register_coprocessor(cs, aarch64_gdb_get_fpu_reg,
aarch64_gdb_set_fpu_reg,
- 34, "aarch64-fpu.xml", 0);
+ gdb_find_static_feature("aarch64-fpu.xml"),
+ 0);
}
/*
* Note that we report pauth information via the feature name
@@ -501,19 +501,22 @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
if (isar_feature_aa64_pauth(&cpu->isar)) {
gdb_register_coprocessor(cs, aarch64_gdb_get_pauth_reg,
aarch64_gdb_set_pauth_reg,
- 4, "aarch64-pauth.xml", 0);
+ gdb_find_static_feature("aarch64-pauth.xml"),
+ 0);
}
#endif
} else {
if (arm_feature(env, ARM_FEATURE_NEON)) {
gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
- 49, "arm-neon.xml", 0);
+ gdb_find_static_feature("arm-neon.xml"),
+ 0);
} else if (cpu_isar_feature(aa32_simd_r32, cpu)) {
gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
- 33, "arm-vfp3.xml", 0);
+ gdb_find_static_feature("arm-vfp3.xml"),
+ 0);
} else if (cpu_isar_feature(aa32_vfp_simd, cpu)) {
gdb_register_coprocessor(cs, vfp_gdb_get_reg, vfp_gdb_set_reg,
- 17, "arm-vfp.xml", 0);
+ gdb_find_static_feature("arm-vfp.xml"), 0);
}
if (!arm_feature(env, ARM_FEATURE_M)) {
/*
@@ -521,29 +524,29 @@ void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
* expose to gdb.
*/
gdb_register_coprocessor(cs, vfp_gdb_get_sysreg, vfp_gdb_set_sysreg,
- 2, "arm-vfp-sysregs.xml", 0);
+ gdb_find_static_feature("arm-vfp-sysregs.xml"),
+ 0);
}
}
if (cpu_isar_feature(aa32_mve, cpu) && tcg_enabled()) {
gdb_register_coprocessor(cs, mve_gdb_get_reg, mve_gdb_set_reg,
- 1, "arm-m-profile-mve.xml", 0);
+ gdb_find_static_feature("arm-m-profile-mve.xml"),
+ 0);
}
gdb_register_coprocessor(cs, arm_gdb_get_sysreg, arm_gdb_set_sysreg,
- arm_gen_dynamic_sysreg_feature(cs, cs->gdb_num_regs)->num_regs,
- "system-registers.xml", 0);
+ arm_gen_dynamic_sysreg_feature(cs, cs->gdb_num_regs),
+ 0);
#ifdef CONFIG_TCG
if (arm_feature(env, ARM_FEATURE_M) && tcg_enabled()) {
gdb_register_coprocessor(cs,
arm_gdb_get_m_systemreg, arm_gdb_set_m_systemreg,
- arm_gen_dynamic_m_systemreg_feature(cs, cs->gdb_num_regs)->num_regs,
- "arm-m-system.xml", 0);
+ arm_gen_dynamic_m_systemreg_feature(cs, cs->gdb_num_regs), 0);
#ifndef CONFIG_USER_ONLY
if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
gdb_register_coprocessor(cs,
arm_gdb_get_m_secextreg, arm_gdb_set_m_secextreg,
- arm_gen_dynamic_m_secextreg_feature(cs, cs->gdb_num_regs)->num_regs,
- "arm-m-secext.xml", 0);
+ arm_gen_dynamic_m_secextreg_feature(cs, cs->gdb_num_regs), 0);
}
#endif
}
diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c
index 9d1ffc3b4bb..65ac9c75ad0 100644
--- a/target/hexagon/cpu.c
+++ b/target/hexagon/cpu.c
@@ -341,8 +341,7 @@ static void hexagon_cpu_realize(DeviceState *dev, Error **errp)
gdb_register_coprocessor(cs, hexagon_hvx_gdb_read_register,
hexagon_hvx_gdb_write_register,
- NUM_VREGS + NUM_QREGS,
- "hexagon-hvx.xml", 0);
+ gdb_find_static_feature("hexagon-hvx.xml"), 0);
qemu_init_vcpu(cs);
cpu_reset(cs);
diff --git a/target/loongarch/gdbstub.c b/target/loongarch/gdbstub.c
index 5fc2f19e965..843a869450e 100644
--- a/target/loongarch/gdbstub.c
+++ b/target/loongarch/gdbstub.c
@@ -118,5 +118,5 @@ static int loongarch_gdb_set_fpu(CPULoongArchState *env,
void loongarch_cpu_register_gdb_regs_for_features(CPUState *cs)
{
gdb_register_coprocessor(cs, loongarch_gdb_get_fpu, loongarch_gdb_set_fpu,
- 41, "loongarch-fpu.xml", 0);
+ gdb_find_static_feature("loongarch-fpu.xml"), 0);
}
diff --git a/target/m68k/helper.c b/target/m68k/helper.c
index 0a1544cd68d..675f2dcd5ad 100644
--- a/target/m68k/helper.c
+++ b/target/m68k/helper.c
@@ -152,10 +152,10 @@ void m68k_cpu_init_gdb(M68kCPU *cpu)
if (m68k_feature(env, M68K_FEATURE_CF_FPU)) {
gdb_register_coprocessor(cs, cf_fpu_gdb_get_reg, cf_fpu_gdb_set_reg,
- 11, "cf-fp.xml", 18);
+ gdb_find_static_feature("cf-fp.xml"), 18);
} else if (m68k_feature(env, M68K_FEATURE_FPU)) {
- gdb_register_coprocessor(cs, m68k_fpu_gdb_get_reg,
- m68k_fpu_gdb_set_reg, 11, "m68k-fp.xml", 18);
+ gdb_register_coprocessor(cs, m68k_fpu_gdb_get_reg, m68k_fpu_gdb_set_reg,
+ gdb_find_static_feature("m68k-fp.xml"), 18);
}
/* TODO: Add [E]MAC registers. */
}
diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c
index bbb3335cadd..1998f69828f 100644
--- a/target/microblaze/cpu.c
+++ b/target/microblaze/cpu.c
@@ -297,8 +297,9 @@ static void mb_cpu_initfn(Object *obj)
CPUMBState *env = &cpu->env;
gdb_register_coprocessor(CPU(cpu), mb_cpu_gdb_read_stack_protect,
- mb_cpu_gdb_write_stack_protect, 2,
- "microblaze-stack-protect.xml", 0);
+ mb_cpu_gdb_write_stack_protect,
+ gdb_find_static_feature("microblaze-stack-protect.xml"),
+ 0);
set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
diff --git a/target/ppc/gdbstub.c b/target/ppc/gdbstub.c
index e3be3dbd109..09b852464f3 100644
--- a/target/ppc/gdbstub.c
+++ b/target/ppc/gdbstub.c
@@ -570,23 +570,24 @@ void ppc_gdb_init(CPUState *cs, PowerPCCPUClass *pcc)
{
if (pcc->insns_flags & PPC_FLOAT) {
gdb_register_coprocessor(cs, gdb_get_float_reg, gdb_set_float_reg,
- 33, "power-fpu.xml", 0);
+ gdb_find_static_feature("power-fpu.xml"), 0);
}
if (pcc->insns_flags & PPC_ALTIVEC) {
gdb_register_coprocessor(cs, gdb_get_avr_reg, gdb_set_avr_reg,
- 34, "power-altivec.xml", 0);
+ gdb_find_static_feature("power-altivec.xml"),
+ 0);
}
if (pcc->insns_flags & PPC_SPE) {
gdb_register_coprocessor(cs, gdb_get_spe_reg, gdb_set_spe_reg,
- 34, "power-spe.xml", 0);
+ gdb_find_static_feature("power-spe.xml"), 0);
}
if (pcc->insns_flags2 & PPC2_VSX) {
gdb_register_coprocessor(cs, gdb_get_vsx_reg, gdb_set_vsx_reg,
- 32, "power-vsx.xml", 0);
+ gdb_find_static_feature("power-vsx.xml"), 0);
}
#ifndef CONFIG_USER_ONLY
gdb_gen_spr_feature(cs);
gdb_register_coprocessor(cs, gdb_get_spr_reg, gdb_set_spr_reg,
- pcc->gdb_spr.num_regs, "power-spr.xml", 0);
+ &pcc->gdb_spr, 0);
#endif
}
diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c
index 76b72a95954..a879869fa1a 100644
--- a/target/riscv/gdbstub.c
+++ b/target/riscv/gdbstub.c
@@ -311,28 +311,32 @@ void riscv_cpu_register_gdb_regs_for_features(CPUState *cs)
CPURISCVState *env = &cpu->env;
if (env->misa_ext & RVD) {
gdb_register_coprocessor(cs, riscv_gdb_get_fpu, riscv_gdb_set_fpu,
- 32, "riscv-64bit-fpu.xml", 0);
+ gdb_find_static_feature("riscv-64bit-fpu.xml"),
+ 0);
} else if (env->misa_ext & RVF) {
gdb_register_coprocessor(cs, riscv_gdb_get_fpu, riscv_gdb_set_fpu,
- 32, "riscv-32bit-fpu.xml", 0);
+ gdb_find_static_feature("riscv-32bit-fpu.xml"),
+ 0);
}
if (env->misa_ext & RVV) {
gdb_register_coprocessor(cs, riscv_gdb_get_vector,
riscv_gdb_set_vector,
- ricsv_gen_dynamic_vector_feature(cs, cs->gdb_num_regs)->num_regs,
- "riscv-vector.xml", 0);
+ ricsv_gen_dynamic_vector_feature(cs, cs->gdb_num_regs),
+ 0);
}
switch (mcc->misa_mxl_max) {
case MXL_RV32:
gdb_register_coprocessor(cs, riscv_gdb_get_virtual,
riscv_gdb_set_virtual,
- 1, "riscv-32bit-virtual.xml", 0);
+ gdb_find_static_feature("riscv-32bit-virtual.xml"),
+ 0);
break;
case MXL_RV64:
case MXL_RV128:
gdb_register_coprocessor(cs, riscv_gdb_get_virtual,
riscv_gdb_set_virtual,
- 1, "riscv-64bit-virtual.xml", 0);
+ gdb_find_static_feature("riscv-64bit-virtual.xml"),
+ 0);
break;
default:
g_assert_not_reached();
@@ -340,7 +344,7 @@ void riscv_cpu_register_gdb_regs_for_features(CPUState *cs)
if (cpu->cfg.ext_zicsr) {
gdb_register_coprocessor(cs, riscv_gdb_get_csr, riscv_gdb_set_csr,
- riscv_gen_dynamic_csr_feature(cs, cs->gdb_num_regs)->num_regs,
- "riscv-csr.xml", 0);
+ riscv_gen_dynamic_csr_feature(cs, cs->gdb_num_regs),
+ 0);
}
}
diff --git a/target/s390x/gdbstub.c b/target/s390x/gdbstub.c
index 6fbfd41bc86..02c388dc323 100644
--- a/target/s390x/gdbstub.c
+++ b/target/s390x/gdbstub.c
@@ -69,8 +69,6 @@ int s390_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
/* the values represent the positions in s390-acr.xml */
#define S390_A0_REGNUM 0
#define S390_A15_REGNUM 15
-/* total number of registers in s390-acr.xml */
-#define S390_NUM_AC_REGS 16
static int cpu_read_ac_reg(CPUS390XState *env, GByteArray *buf, int n)
{
@@ -98,8 +96,6 @@ static int cpu_write_ac_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
#define S390_FPC_REGNUM 0
#define S390_F0_REGNUM 1
#define S390_F15_REGNUM 16
-/* total number of registers in s390-fpr.xml */
-#define S390_NUM_FP_REGS 17
static int cpu_read_fp_reg(CPUS390XState *env, GByteArray *buf, int n)
{
@@ -132,8 +128,6 @@ static int cpu_write_fp_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
#define S390_V15L_REGNUM 15
#define S390_V16_REGNUM 16
#define S390_V31_REGNUM 31
-/* total number of registers in s390-vx.xml */
-#define S390_NUM_VREGS 32
static int cpu_read_vreg(CPUS390XState *env, GByteArray *buf, int n)
{
@@ -172,8 +166,6 @@ static int cpu_write_vreg(CPUS390XState *env, uint8_t *mem_buf, int n)
/* the values represent the positions in s390-cr.xml */
#define S390_C0_REGNUM 0
#define S390_C15_REGNUM 15
-/* total number of registers in s390-cr.xml */
-#define S390_NUM_C_REGS 16
#ifndef CONFIG_USER_ONLY
static int cpu_read_c_reg(CPUS390XState *env, GByteArray *buf, int n)
@@ -206,8 +198,6 @@ static int cpu_write_c_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
#define S390_VIRT_CPUTM_REGNUM 1
#define S390_VIRT_BEA_REGNUM 2
#define S390_VIRT_PREFIX_REGNUM 3
-/* total number of registers in s390-virt.xml */
-#define S390_NUM_VIRT_REGS 4
static int cpu_read_virt_reg(CPUS390XState *env, GByteArray *mem_buf, int n)
{
@@ -254,8 +244,6 @@ static int cpu_write_virt_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
#define S390_VIRT_KVM_PFT_REGNUM 1
#define S390_VIRT_KVM_PFS_REGNUM 2
#define S390_VIRT_KVM_PFC_REGNUM 3
-/* total number of registers in s390-virt-kvm.xml */
-#define S390_NUM_VIRT_KVM_REGS 4
static int cpu_read_virt_kvm_reg(CPUS390XState *env, GByteArray *mem_buf, int n)
{
@@ -303,8 +291,6 @@ static int cpu_write_virt_kvm_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
#define S390_GS_GSD_REGNUM 1
#define S390_GS_GSSM_REGNUM 2
#define S390_GS_GSEPLA_REGNUM 3
-/* total number of registers in s390-gs.xml */
-#define S390_NUM_GS_REGS 4
static int cpu_read_gs_reg(CPUS390XState *env, GByteArray *buf, int n)
{
@@ -322,33 +308,33 @@ void s390_cpu_gdb_init(CPUState *cs)
{
gdb_register_coprocessor(cs, cpu_read_ac_reg,
cpu_write_ac_reg,
- S390_NUM_AC_REGS, "s390-acr.xml", 0);
+ gdb_find_static_feature("s390-acr.xml"), 0);
gdb_register_coprocessor(cs, cpu_read_fp_reg,
cpu_write_fp_reg,
- S390_NUM_FP_REGS, "s390-fpr.xml", 0);
+ gdb_find_static_feature("s390-fpr.xml"), 0);
gdb_register_coprocessor(cs, cpu_read_vreg,
cpu_write_vreg,
- S390_NUM_VREGS, "s390-vx.xml", 0);
+ gdb_find_static_feature("s390-vx.xml"), 0);
gdb_register_coprocessor(cs, cpu_read_gs_reg,
cpu_write_gs_reg,
- S390_NUM_GS_REGS, "s390-gs.xml", 0);
+ gdb_find_static_feature("s390-gs.xml"), 0);
#ifndef CONFIG_USER_ONLY
gdb_register_coprocessor(cs, cpu_read_c_reg,
cpu_write_c_reg,
- S390_NUM_C_REGS, "s390-cr.xml", 0);
+ gdb_find_static_feature("s390-cr.xml"), 0);
gdb_register_coprocessor(cs, cpu_read_virt_reg,
cpu_write_virt_reg,
- S390_NUM_VIRT_REGS, "s390-virt.xml", 0);
+ gdb_find_static_feature("s390-virt.xml"), 0);
if (kvm_enabled()) {
gdb_register_coprocessor(cs, cpu_read_virt_kvm_reg,
cpu_write_virt_kvm_reg,
- S390_NUM_VIRT_KVM_REGS, "s390-virt-kvm.xml",
+ gdb_find_static_feature("s390-virt-kvm.xml"),
0);
}
#endif
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 30/43] gdbstub: Use GDBFeature for GDBRegisterState
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (28 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 29/43] gdbstub: Use GDBFeature for gdb_register_coprocessor Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:50 ` Philippe Mathieu-Daudé
2024-01-03 17:33 ` [PATCH v2 31/43] gdbstub: Change gdb_get_reg_cb and gdb_set_reg_cb Alex Bennée
` (13 subsequent siblings)
43 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
Simplify GDBRegisterState by replacing num_regs and xml members with
one member that points to GDBFeature.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231213-gdb-v17-5-777047380591@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
gdbstub/gdbstub.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c
index 068180c83c7..a80729436b6 100644
--- a/gdbstub/gdbstub.c
+++ b/gdbstub/gdbstub.c
@@ -47,10 +47,9 @@
typedef struct GDBRegisterState {
int base_reg;
- int num_regs;
gdb_get_reg_cb get_reg;
gdb_set_reg_cb set_reg;
- const char *xml;
+ const GDBFeature *feature;
} GDBRegisterState;
GDBState gdbserver_state;
@@ -391,7 +390,7 @@ static const char *get_feature_xml(const char *p, const char **newp,
g_ptr_array_add(
xml,
g_markup_printf_escaped("<xi:include href=\"%s\"/>",
- r->xml));
+ r->feature->xmlname));
}
}
g_ptr_array_add(xml, g_strdup("</target>"));
@@ -513,7 +512,7 @@ static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
if (cpu->gdb_regs) {
for (guint i = 0; i < cpu->gdb_regs->len; i++) {
r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
- if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
+ if (r->base_reg <= reg && reg < r->base_reg + r->feature->num_regs) {
return r->get_reg(env, buf, reg - r->base_reg);
}
}
@@ -534,7 +533,7 @@ static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
if (cpu->gdb_regs) {
for (guint i = 0; i < cpu->gdb_regs->len; i++) {
r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
- if (r->base_reg <= reg && reg < r->base_reg + r->num_regs) {
+ if (r->base_reg <= reg && reg < r->base_reg + r->feature->num_regs) {
return r->set_reg(env, mem_buf, reg - r->base_reg);
}
}
@@ -553,7 +552,7 @@ void gdb_register_coprocessor(CPUState *cpu,
for (i = 0; i < cpu->gdb_regs->len; i++) {
/* Check for duplicates. */
s = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
- if (strcmp(s->xml, feature->xmlname) == 0) {
+ if (s->feature == feature) {
return;
}
}
@@ -565,10 +564,9 @@ void gdb_register_coprocessor(CPUState *cpu,
g_array_set_size(cpu->gdb_regs, i + 1);
s = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
s->base_reg = cpu->gdb_num_regs;
- s->num_regs = feature->num_regs;
s->get_reg = get_reg;
s->set_reg = set_reg;
- s->xml = feature->xml;
+ s->feature = feature;
/* Add to end of list. */
cpu->gdb_num_regs += feature->num_regs;
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 31/43] gdbstub: Change gdb_get_reg_cb and gdb_set_reg_cb
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (29 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 30/43] gdbstub: Use GDBFeature for GDBRegisterState Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 32/43] gdbstub: Simplify XML lookup Alex Bennée
` (12 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
Align the parameters of gdb_get_reg_cb and gdb_set_reg_cb with the
gdb_read_register and gdb_write_register members of CPUClass to allow
to unify the logic to access registers of the core and coprocessors
in the future.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231213-gdb-v17-6-777047380591@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
include/exec/gdbstub.h | 4 +-
target/arm/internals.h | 12 +++---
target/hexagon/internal.h | 4 +-
target/microblaze/cpu.h | 4 +-
gdbstub/gdbstub.c | 6 +--
target/arm/gdbstub.c | 51 ++++++++++++++++--------
target/arm/gdbstub64.c | 27 +++++++++----
target/hexagon/gdbstub.c | 10 ++++-
target/loongarch/gdbstub.c | 11 ++++--
target/m68k/helper.c | 20 ++++++++--
target/microblaze/gdbstub.c | 9 ++++-
target/ppc/gdbstub.c | 46 +++++++++++++++++-----
target/riscv/gdbstub.c | 46 ++++++++++++++++------
target/s390x/gdbstub.c | 77 ++++++++++++++++++++++++++++---------
14 files changed, 236 insertions(+), 91 deletions(-)
diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h
index ac6fce99a64..bcaab1bc750 100644
--- a/include/exec/gdbstub.h
+++ b/include/exec/gdbstub.h
@@ -24,8 +24,8 @@ typedef struct GDBFeatureBuilder {
/* Get or set a register. Returns the size of the register. */
-typedef int (*gdb_get_reg_cb)(CPUArchState *env, GByteArray *buf, int reg);
-typedef int (*gdb_set_reg_cb)(CPUArchState *env, uint8_t *buf, int reg);
+typedef int (*gdb_get_reg_cb)(CPUState *cpu, GByteArray *buf, int reg);
+typedef int (*gdb_set_reg_cb)(CPUState *cpu, uint8_t *buf, int reg);
/**
* gdb_register_coprocessor() - register a supplemental set of registers
diff --git a/target/arm/internals.h b/target/arm/internals.h
index 1136710741f..a08f461f444 100644
--- a/target/arm/internals.h
+++ b/target/arm/internals.h
@@ -1447,12 +1447,12 @@ static inline uint64_t pmu_counter_mask(CPUARMState *env)
#ifdef TARGET_AARCH64
GDBFeature *arm_gen_dynamic_svereg_feature(CPUState *cpu, int base_reg);
-int aarch64_gdb_get_sve_reg(CPUARMState *env, GByteArray *buf, int reg);
-int aarch64_gdb_set_sve_reg(CPUARMState *env, uint8_t *buf, int reg);
-int aarch64_gdb_get_fpu_reg(CPUARMState *env, GByteArray *buf, int reg);
-int aarch64_gdb_set_fpu_reg(CPUARMState *env, uint8_t *buf, int reg);
-int aarch64_gdb_get_pauth_reg(CPUARMState *env, GByteArray *buf, int reg);
-int aarch64_gdb_set_pauth_reg(CPUARMState *env, uint8_t *buf, int reg);
+int aarch64_gdb_get_sve_reg(CPUState *cs, GByteArray *buf, int reg);
+int aarch64_gdb_set_sve_reg(CPUState *cs, uint8_t *buf, int reg);
+int aarch64_gdb_get_fpu_reg(CPUState *cs, GByteArray *buf, int reg);
+int aarch64_gdb_set_fpu_reg(CPUState *cs, uint8_t *buf, int reg);
+int aarch64_gdb_get_pauth_reg(CPUState *cs, GByteArray *buf, int reg);
+int aarch64_gdb_set_pauth_reg(CPUState *cs, uint8_t *buf, int reg);
void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp);
void arm_cpu_sme_finalize(ARMCPU *cpu, Error **errp);
void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp);
diff --git a/target/hexagon/internal.h b/target/hexagon/internal.h
index d732b6bb3c7..beb08cb7e38 100644
--- a/target/hexagon/internal.h
+++ b/target/hexagon/internal.h
@@ -33,8 +33,8 @@
int hexagon_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
int hexagon_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
-int hexagon_hvx_gdb_read_register(CPUHexagonState *env, GByteArray *mem_buf, int n);
-int hexagon_hvx_gdb_write_register(CPUHexagonState *env, uint8_t *mem_buf, int n);
+int hexagon_hvx_gdb_read_register(CPUState *env, GByteArray *mem_buf, int n);
+int hexagon_hvx_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n);
void hexagon_debug_vreg(CPUHexagonState *env, int regnum);
void hexagon_debug_qreg(CPUHexagonState *env, int regnum);
diff --git a/target/microblaze/cpu.h b/target/microblaze/cpu.h
index b5374365f5f..1906d8f266a 100644
--- a/target/microblaze/cpu.h
+++ b/target/microblaze/cpu.h
@@ -381,8 +381,8 @@ G_NORETURN void mb_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr,
void mb_cpu_dump_state(CPUState *cpu, FILE *f, int flags);
int mb_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
int mb_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
-int mb_cpu_gdb_read_stack_protect(CPUArchState *cpu, GByteArray *buf, int reg);
-int mb_cpu_gdb_write_stack_protect(CPUArchState *cpu, uint8_t *buf, int reg);
+int mb_cpu_gdb_read_stack_protect(CPUState *cs, GByteArray *buf, int reg);
+int mb_cpu_gdb_write_stack_protect(CPUState *cs, uint8_t *buf, int reg);
static inline uint32_t mb_cpu_read_msr(const CPUMBState *env)
{
diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c
index a80729436b6..21fea7fffae 100644
--- a/gdbstub/gdbstub.c
+++ b/gdbstub/gdbstub.c
@@ -502,7 +502,6 @@ const GDBFeature *gdb_find_static_feature(const char *xmlname)
static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
{
CPUClass *cc = CPU_GET_CLASS(cpu);
- CPUArchState *env = cpu_env(cpu);
GDBRegisterState *r;
if (reg < cc->gdb_num_core_regs) {
@@ -513,7 +512,7 @@ static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
for (guint i = 0; i < cpu->gdb_regs->len; i++) {
r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
if (r->base_reg <= reg && reg < r->base_reg + r->feature->num_regs) {
- return r->get_reg(env, buf, reg - r->base_reg);
+ return r->get_reg(cpu, buf, reg - r->base_reg);
}
}
}
@@ -523,7 +522,6 @@ static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
{
CPUClass *cc = CPU_GET_CLASS(cpu);
- CPUArchState *env = cpu_env(cpu);
GDBRegisterState *r;
if (reg < cc->gdb_num_core_regs) {
@@ -534,7 +532,7 @@ static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
for (guint i = 0; i < cpu->gdb_regs->len; i++) {
r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
if (r->base_reg <= reg && reg < r->base_reg + r->feature->num_regs) {
- return r->set_reg(env, mem_buf, reg - r->base_reg);
+ return r->set_reg(cpu, mem_buf, reg - r->base_reg);
}
}
}
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
index f2b201d3125..059d84f98e5 100644
--- a/target/arm/gdbstub.c
+++ b/target/arm/gdbstub.c
@@ -106,9 +106,10 @@ int arm_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
return 0;
}
-static int vfp_gdb_get_reg(CPUARMState *env, GByteArray *buf, int reg)
+static int vfp_gdb_get_reg(CPUState *cs, GByteArray *buf, int reg)
{
- ARMCPU *cpu = env_archcpu(env);
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
int nregs = cpu_isar_feature(aa32_simd_r32, cpu) ? 32 : 16;
/* VFP data registers are always little-endian. */
@@ -130,9 +131,10 @@ static int vfp_gdb_get_reg(CPUARMState *env, GByteArray *buf, int reg)
return 0;
}
-static int vfp_gdb_set_reg(CPUARMState *env, uint8_t *buf, int reg)
+static int vfp_gdb_set_reg(CPUState *cs, uint8_t *buf, int reg)
{
- ARMCPU *cpu = env_archcpu(env);
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
int nregs = cpu_isar_feature(aa32_simd_r32, cpu) ? 32 : 16;
if (reg < nregs) {
@@ -156,8 +158,11 @@ static int vfp_gdb_set_reg(CPUARMState *env, uint8_t *buf, int reg)
return 0;
}
-static int vfp_gdb_get_sysreg(CPUARMState *env, GByteArray *buf, int reg)
+static int vfp_gdb_get_sysreg(CPUState *cs, GByteArray *buf, int reg)
{
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
+
switch (reg) {
case 0:
return gdb_get_reg32(buf, env->vfp.xregs[ARM_VFP_FPSID]);
@@ -167,8 +172,11 @@ static int vfp_gdb_get_sysreg(CPUARMState *env, GByteArray *buf, int reg)
return 0;
}
-static int vfp_gdb_set_sysreg(CPUARMState *env, uint8_t *buf, int reg)
+static int vfp_gdb_set_sysreg(CPUState *cs, uint8_t *buf, int reg)
{
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
+
switch (reg) {
case 0:
env->vfp.xregs[ARM_VFP_FPSID] = ldl_p(buf);
@@ -180,8 +188,11 @@ static int vfp_gdb_set_sysreg(CPUARMState *env, uint8_t *buf, int reg)
return 0;
}
-static int mve_gdb_get_reg(CPUARMState *env, GByteArray *buf, int reg)
+static int mve_gdb_get_reg(CPUState *cs, GByteArray *buf, int reg)
{
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
+
switch (reg) {
case 0:
return gdb_get_reg32(buf, env->v7m.vpr);
@@ -190,8 +201,11 @@ static int mve_gdb_get_reg(CPUARMState *env, GByteArray *buf, int reg)
}
}
-static int mve_gdb_set_reg(CPUARMState *env, uint8_t *buf, int reg)
+static int mve_gdb_set_reg(CPUState *cs, uint8_t *buf, int reg)
{
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
+
switch (reg) {
case 0:
env->v7m.vpr = ldl_p(buf);
@@ -210,9 +224,10 @@ static int mve_gdb_set_reg(CPUARMState *env, uint8_t *buf, int reg)
* We return the number of bytes copied
*/
-static int arm_gdb_get_sysreg(CPUARMState *env, GByteArray *buf, int reg)
+static int arm_gdb_get_sysreg(CPUState *cs, GByteArray *buf, int reg)
{
- ARMCPU *cpu = env_archcpu(env);
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
const ARMCPRegInfo *ri;
uint32_t key;
@@ -228,7 +243,7 @@ static int arm_gdb_get_sysreg(CPUARMState *env, GByteArray *buf, int reg)
return 0;
}
-static int arm_gdb_set_sysreg(CPUARMState *env, uint8_t *buf, int reg)
+static int arm_gdb_set_sysreg(CPUState *cs, uint8_t *buf, int reg)
{
return 0;
}
@@ -367,8 +382,11 @@ static int m_sysreg_get(CPUARMState *env, GByteArray *buf,
return gdb_get_reg32(buf, *ptr);
}
-static int arm_gdb_get_m_systemreg(CPUARMState *env, GByteArray *buf, int reg)
+static int arm_gdb_get_m_systemreg(CPUState *cs, GByteArray *buf, int reg)
{
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
+
/*
* Here, we emulate MRS instruction, where CONTROL has a mix of
* banked and non-banked bits.
@@ -379,7 +397,7 @@ static int arm_gdb_get_m_systemreg(CPUARMState *env, GByteArray *buf, int reg)
return m_sysreg_get(env, buf, reg, env->v7m.secure);
}
-static int arm_gdb_set_m_systemreg(CPUARMState *env, uint8_t *buf, int reg)
+static int arm_gdb_set_m_systemreg(CPUState *cs, uint8_t *buf, int reg)
{
return 0; /* TODO */
}
@@ -414,12 +432,15 @@ static GDBFeature *arm_gen_dynamic_m_systemreg_feature(CPUState *cs,
* For user-only, we see the non-secure registers via m_systemreg above.
* For secext, encode the non-secure view as even and secure view as odd.
*/
-static int arm_gdb_get_m_secextreg(CPUARMState *env, GByteArray *buf, int reg)
+static int arm_gdb_get_m_secextreg(CPUState *cs, GByteArray *buf, int reg)
{
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
+
return m_sysreg_get(env, buf, reg >> 1, reg & 1);
}
-static int arm_gdb_set_m_secextreg(CPUARMState *env, uint8_t *buf, int reg)
+static int arm_gdb_set_m_secextreg(CPUState *cs, uint8_t *buf, int reg)
{
return 0; /* TODO */
}
diff --git a/target/arm/gdbstub64.c b/target/arm/gdbstub64.c
index 5286d5c6043..caa31ff3fa1 100644
--- a/target/arm/gdbstub64.c
+++ b/target/arm/gdbstub64.c
@@ -72,8 +72,11 @@ int aarch64_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
return 0;
}
-int aarch64_gdb_get_fpu_reg(CPUARMState *env, GByteArray *buf, int reg)
+int aarch64_gdb_get_fpu_reg(CPUState *cs, GByteArray *buf, int reg)
{
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
+
switch (reg) {
case 0 ... 31:
{
@@ -92,8 +95,11 @@ int aarch64_gdb_get_fpu_reg(CPUARMState *env, GByteArray *buf, int reg)
}
}
-int aarch64_gdb_set_fpu_reg(CPUARMState *env, uint8_t *buf, int reg)
+int aarch64_gdb_set_fpu_reg(CPUState *cs, uint8_t *buf, int reg)
{
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
+
switch (reg) {
case 0 ... 31:
/* 128 bit FP register */
@@ -116,9 +122,10 @@ int aarch64_gdb_set_fpu_reg(CPUARMState *env, uint8_t *buf, int reg)
}
}
-int aarch64_gdb_get_sve_reg(CPUARMState *env, GByteArray *buf, int reg)
+int aarch64_gdb_get_sve_reg(CPUState *cs, GByteArray *buf, int reg)
{
- ARMCPU *cpu = env_archcpu(env);
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
switch (reg) {
/* The first 32 registers are the zregs */
@@ -164,9 +171,10 @@ int aarch64_gdb_get_sve_reg(CPUARMState *env, GByteArray *buf, int reg)
return 0;
}
-int aarch64_gdb_set_sve_reg(CPUARMState *env, uint8_t *buf, int reg)
+int aarch64_gdb_set_sve_reg(CPUState *cs, uint8_t *buf, int reg)
{
- ARMCPU *cpu = env_archcpu(env);
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
/* The first 32 registers are the zregs */
switch (reg) {
@@ -210,8 +218,11 @@ int aarch64_gdb_set_sve_reg(CPUARMState *env, uint8_t *buf, int reg)
return 0;
}
-int aarch64_gdb_get_pauth_reg(CPUARMState *env, GByteArray *buf, int reg)
+int aarch64_gdb_get_pauth_reg(CPUState *cs, GByteArray *buf, int reg)
{
+ ARMCPU *cpu = ARM_CPU(cs);
+ CPUARMState *env = &cpu->env;
+
switch (reg) {
case 0: /* pauth_dmask */
case 1: /* pauth_cmask */
@@ -241,7 +252,7 @@ int aarch64_gdb_get_pauth_reg(CPUARMState *env, GByteArray *buf, int reg)
}
}
-int aarch64_gdb_set_pauth_reg(CPUARMState *env, uint8_t *buf, int reg)
+int aarch64_gdb_set_pauth_reg(CPUState *cs, uint8_t *buf, int reg)
{
/* All pseudo registers are read-only. */
return 0;
diff --git a/target/hexagon/gdbstub.c b/target/hexagon/gdbstub.c
index 54d37e006e0..6007e6462b9 100644
--- a/target/hexagon/gdbstub.c
+++ b/target/hexagon/gdbstub.c
@@ -81,8 +81,11 @@ static int gdb_get_qreg(CPUHexagonState *env, GByteArray *mem_buf, int n)
return total;
}
-int hexagon_hvx_gdb_read_register(CPUHexagonState *env, GByteArray *mem_buf, int n)
+int hexagon_hvx_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
{
+ HexagonCPU *cpu = HEXAGON_CPU(cs);
+ CPUHexagonState *env = &cpu->env;
+
if (n < NUM_VREGS) {
return gdb_get_vreg(env, mem_buf, n);
}
@@ -115,8 +118,11 @@ static int gdb_put_qreg(CPUHexagonState *env, uint8_t *mem_buf, int n)
return MAX_VEC_SIZE_BYTES / 8;
}
-int hexagon_hvx_gdb_write_register(CPUHexagonState *env, uint8_t *mem_buf, int n)
+int hexagon_hvx_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
{
+ HexagonCPU *cpu = HEXAGON_CPU(cs);
+ CPUHexagonState *env = &cpu->env;
+
if (n < NUM_VREGS) {
return gdb_put_vreg(env, mem_buf, n);
}
diff --git a/target/loongarch/gdbstub.c b/target/loongarch/gdbstub.c
index 843a869450e..22c6889011e 100644
--- a/target/loongarch/gdbstub.c
+++ b/target/loongarch/gdbstub.c
@@ -84,9 +84,11 @@ int loongarch_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
return length;
}
-static int loongarch_gdb_get_fpu(CPULoongArchState *env,
- GByteArray *mem_buf, int n)
+static int loongarch_gdb_get_fpu(CPUState *cs, GByteArray *mem_buf, int n)
{
+ LoongArchCPU *cpu = LOONGARCH_CPU(cs);
+ CPULoongArchState *env = &cpu->env;
+
if (0 <= n && n < 32) {
return gdb_get_reg64(mem_buf, env->fpr[n].vreg.D(0));
} else if (32 <= n && n < 40) {
@@ -97,9 +99,10 @@ static int loongarch_gdb_get_fpu(CPULoongArchState *env,
return 0;
}
-static int loongarch_gdb_set_fpu(CPULoongArchState *env,
- uint8_t *mem_buf, int n)
+static int loongarch_gdb_set_fpu(CPUState *cs, uint8_t *mem_buf, int n)
{
+ LoongArchCPU *cpu = LOONGARCH_CPU(cs);
+ CPULoongArchState *env = &cpu->env;
int length = 0;
if (0 <= n && n < 32) {
diff --git a/target/m68k/helper.c b/target/m68k/helper.c
index 675f2dcd5ad..a5ee4d87e32 100644
--- a/target/m68k/helper.c
+++ b/target/m68k/helper.c
@@ -69,8 +69,11 @@ void m68k_cpu_list(void)
g_slist_free(list);
}
-static int cf_fpu_gdb_get_reg(CPUM68KState *env, GByteArray *mem_buf, int n)
+static int cf_fpu_gdb_get_reg(CPUState *cs, GByteArray *mem_buf, int n)
{
+ M68kCPU *cpu = M68K_CPU(cs);
+ CPUM68KState *env = &cpu->env;
+
if (n < 8) {
float_status s;
return gdb_get_reg64(mem_buf, floatx80_to_float64(env->fregs[n].d, &s));
@@ -86,8 +89,11 @@ static int cf_fpu_gdb_get_reg(CPUM68KState *env, GByteArray *mem_buf, int n)
return 0;
}
-static int cf_fpu_gdb_set_reg(CPUM68KState *env, uint8_t *mem_buf, int n)
+static int cf_fpu_gdb_set_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ M68kCPU *cpu = M68K_CPU(cs);
+ CPUM68KState *env = &cpu->env;
+
if (n < 8) {
float_status s;
env->fregs[n].d = float64_to_floatx80(ldq_p(mem_buf), &s);
@@ -106,8 +112,11 @@ static int cf_fpu_gdb_set_reg(CPUM68KState *env, uint8_t *mem_buf, int n)
return 0;
}
-static int m68k_fpu_gdb_get_reg(CPUM68KState *env, GByteArray *mem_buf, int n)
+static int m68k_fpu_gdb_get_reg(CPUState *cs, GByteArray *mem_buf, int n)
{
+ M68kCPU *cpu = M68K_CPU(cs);
+ CPUM68KState *env = &cpu->env;
+
if (n < 8) {
int len = gdb_get_reg16(mem_buf, env->fregs[n].l.upper);
len += gdb_get_reg16(mem_buf, 0);
@@ -125,8 +134,11 @@ static int m68k_fpu_gdb_get_reg(CPUM68KState *env, GByteArray *mem_buf, int n)
return 0;
}
-static int m68k_fpu_gdb_set_reg(CPUM68KState *env, uint8_t *mem_buf, int n)
+static int m68k_fpu_gdb_set_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ M68kCPU *cpu = M68K_CPU(cs);
+ CPUM68KState *env = &cpu->env;
+
if (n < 8) {
env->fregs[n].l.upper = lduw_be_p(mem_buf);
env->fregs[n].l.lower = ldq_be_p(mem_buf + 4);
diff --git a/target/microblaze/gdbstub.c b/target/microblaze/gdbstub.c
index 29ac6e9c0f7..6ffc5ad0752 100644
--- a/target/microblaze/gdbstub.c
+++ b/target/microblaze/gdbstub.c
@@ -94,8 +94,10 @@ int mb_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
return gdb_get_reg32(mem_buf, val);
}
-int mb_cpu_gdb_read_stack_protect(CPUMBState *env, GByteArray *mem_buf, int n)
+int mb_cpu_gdb_read_stack_protect(CPUState *cs, GByteArray *mem_buf, int n)
{
+ MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs);
+ CPUMBState *env = &cpu->env;
uint32_t val;
switch (n) {
@@ -153,8 +155,11 @@ int mb_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
return 4;
}
-int mb_cpu_gdb_write_stack_protect(CPUMBState *env, uint8_t *mem_buf, int n)
+int mb_cpu_gdb_write_stack_protect(CPUState *cs, uint8_t *mem_buf, int n)
{
+ MicroBlazeCPU *cpu = MICROBLAZE_CPU(cs);
+ CPUMBState *env = &cpu->env;
+
switch (n) {
case GDB_SP_SHL:
env->slr = ldl_p(mem_buf);
diff --git a/target/ppc/gdbstub.c b/target/ppc/gdbstub.c
index 09b852464f3..8ca37b6bf95 100644
--- a/target/ppc/gdbstub.c
+++ b/target/ppc/gdbstub.c
@@ -369,8 +369,10 @@ static int gdb_find_spr_idx(CPUPPCState *env, int n)
return -1;
}
-static int gdb_get_spr_reg(CPUPPCState *env, GByteArray *buf, int n)
+static int gdb_get_spr_reg(CPUState *cs, GByteArray *buf, int n)
{
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+ CPUPPCState *env = &cpu->env;
int reg;
int len;
@@ -385,8 +387,10 @@ static int gdb_get_spr_reg(CPUPPCState *env, GByteArray *buf, int n)
return len;
}
-static int gdb_set_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
+static int gdb_set_spr_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+ CPUPPCState *env = &cpu->env;
int reg;
int len;
@@ -403,8 +407,10 @@ static int gdb_set_spr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
}
#endif
-static int gdb_get_float_reg(CPUPPCState *env, GByteArray *buf, int n)
+static int gdb_get_float_reg(CPUState *cs, GByteArray *buf, int n)
{
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+ CPUPPCState *env = &cpu->env;
uint8_t *mem_buf;
if (n < 32) {
gdb_get_reg64(buf, *cpu_fpr_ptr(env, n));
@@ -421,8 +427,11 @@ static int gdb_get_float_reg(CPUPPCState *env, GByteArray *buf, int n)
return 0;
}
-static int gdb_set_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
+static int gdb_set_float_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+ CPUPPCState *env = &cpu->env;
+
if (n < 32) {
ppc_maybe_bswap_register(env, mem_buf, 8);
*cpu_fpr_ptr(env, n) = ldq_p(mem_buf);
@@ -436,8 +445,10 @@ static int gdb_set_float_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
return 0;
}
-static int gdb_get_avr_reg(CPUPPCState *env, GByteArray *buf, int n)
+static int gdb_get_avr_reg(CPUState *cs, GByteArray *buf, int n)
{
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+ CPUPPCState *env = &cpu->env;
uint8_t *mem_buf;
if (n < 32) {
@@ -462,8 +473,11 @@ static int gdb_get_avr_reg(CPUPPCState *env, GByteArray *buf, int n)
return 0;
}
-static int gdb_set_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
+static int gdb_set_avr_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+ CPUPPCState *env = &cpu->env;
+
if (n < 32) {
ppc_avr_t *avr = cpu_avr_ptr(env, n);
ppc_maybe_bswap_register(env, mem_buf, 16);
@@ -484,8 +498,11 @@ static int gdb_set_avr_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
return 0;
}
-static int gdb_get_spe_reg(CPUPPCState *env, GByteArray *buf, int n)
+static int gdb_get_spe_reg(CPUState *cs, GByteArray *buf, int n)
{
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+ CPUPPCState *env = &cpu->env;
+
if (n < 32) {
#if defined(TARGET_PPC64)
gdb_get_reg32(buf, env->gpr[n] >> 32);
@@ -508,8 +525,11 @@ static int gdb_get_spe_reg(CPUPPCState *env, GByteArray *buf, int n)
return 0;
}
-static int gdb_set_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
+static int gdb_set_spe_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+ CPUPPCState *env = &cpu->env;
+
if (n < 32) {
#if defined(TARGET_PPC64)
target_ulong lo = (uint32_t)env->gpr[n];
@@ -537,8 +557,11 @@ static int gdb_set_spe_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
return 0;
}
-static int gdb_get_vsx_reg(CPUPPCState *env, GByteArray *buf, int n)
+static int gdb_get_vsx_reg(CPUState *cs, GByteArray *buf, int n)
{
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+ CPUPPCState *env = &cpu->env;
+
if (n < 32) {
gdb_get_reg64(buf, *cpu_vsrl_ptr(env, n));
ppc_maybe_bswap_register(env, gdb_get_reg_ptr(buf, 8), 8);
@@ -547,8 +570,11 @@ static int gdb_get_vsx_reg(CPUPPCState *env, GByteArray *buf, int n)
return 0;
}
-static int gdb_set_vsx_reg(CPUPPCState *env, uint8_t *mem_buf, int n)
+static int gdb_set_vsx_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ PowerPCCPU *cpu = POWERPC_CPU(cs);
+ CPUPPCState *env = &cpu->env;
+
if (n < 32) {
ppc_maybe_bswap_register(env, mem_buf, 8);
*cpu_vsrl_ptr(env, n) = ldq_p(mem_buf);
diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c
index a879869fa1a..68d0fdc1fd6 100644
--- a/target/riscv/gdbstub.c
+++ b/target/riscv/gdbstub.c
@@ -108,8 +108,11 @@ int riscv_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
return length;
}
-static int riscv_gdb_get_fpu(CPURISCVState *env, GByteArray *buf, int n)
+static int riscv_gdb_get_fpu(CPUState *cs, GByteArray *buf, int n)
{
+ RISCVCPU *cpu = RISCV_CPU(cs);
+ CPURISCVState *env = &cpu->env;
+
if (n < 32) {
if (env->misa_ext & RVD) {
return gdb_get_reg64(buf, env->fpr[n]);
@@ -121,8 +124,11 @@ static int riscv_gdb_get_fpu(CPURISCVState *env, GByteArray *buf, int n)
return 0;
}
-static int riscv_gdb_set_fpu(CPURISCVState *env, uint8_t *mem_buf, int n)
+static int riscv_gdb_set_fpu(CPUState *cs, uint8_t *mem_buf, int n)
{
+ RISCVCPU *cpu = RISCV_CPU(cs);
+ CPURISCVState *env = &cpu->env;
+
if (n < 32) {
env->fpr[n] = ldq_p(mem_buf); /* always 64-bit */
return sizeof(uint64_t);
@@ -130,8 +136,10 @@ static int riscv_gdb_set_fpu(CPURISCVState *env, uint8_t *mem_buf, int n)
return 0;
}
-static int riscv_gdb_get_vector(CPURISCVState *env, GByteArray *buf, int n)
+static int riscv_gdb_get_vector(CPUState *cs, GByteArray *buf, int n)
{
+ RISCVCPU *cpu = RISCV_CPU(cs);
+ CPURISCVState *env = &cpu->env;
uint16_t vlenb = riscv_cpu_cfg(env)->vlen >> 3;
if (n < 32) {
int i;
@@ -146,8 +154,10 @@ static int riscv_gdb_get_vector(CPURISCVState *env, GByteArray *buf, int n)
return 0;
}
-static int riscv_gdb_set_vector(CPURISCVState *env, uint8_t *mem_buf, int n)
+static int riscv_gdb_set_vector(CPUState *cs, uint8_t *mem_buf, int n)
{
+ RISCVCPU *cpu = RISCV_CPU(cs);
+ CPURISCVState *env = &cpu->env;
uint16_t vlenb = riscv_cpu_cfg(env)->vlen >> 3;
if (n < 32) {
int i;
@@ -160,8 +170,11 @@ static int riscv_gdb_set_vector(CPURISCVState *env, uint8_t *mem_buf, int n)
return 0;
}
-static int riscv_gdb_get_csr(CPURISCVState *env, GByteArray *buf, int n)
+static int riscv_gdb_get_csr(CPUState *cs, GByteArray *buf, int n)
{
+ RISCVCPU *cpu = RISCV_CPU(cs);
+ CPURISCVState *env = &cpu->env;
+
if (n < CSR_TABLE_SIZE) {
target_ulong val = 0;
int result;
@@ -174,8 +187,11 @@ static int riscv_gdb_get_csr(CPURISCVState *env, GByteArray *buf, int n)
return 0;
}
-static int riscv_gdb_set_csr(CPURISCVState *env, uint8_t *mem_buf, int n)
+static int riscv_gdb_set_csr(CPUState *cs, uint8_t *mem_buf, int n)
{
+ RISCVCPU *cpu = RISCV_CPU(cs);
+ CPURISCVState *env = &cpu->env;
+
if (n < CSR_TABLE_SIZE) {
target_ulong val = ldtul_p(mem_buf);
int result;
@@ -188,25 +204,31 @@ static int riscv_gdb_set_csr(CPURISCVState *env, uint8_t *mem_buf, int n)
return 0;
}
-static int riscv_gdb_get_virtual(CPURISCVState *cs, GByteArray *buf, int n)
+static int riscv_gdb_get_virtual(CPUState *cs, GByteArray *buf, int n)
{
if (n == 0) {
#ifdef CONFIG_USER_ONLY
return gdb_get_regl(buf, 0);
#else
- return gdb_get_regl(buf, cs->priv);
+ RISCVCPU *cpu = RISCV_CPU(cs);
+ CPURISCVState *env = &cpu->env;
+
+ return gdb_get_regl(buf, env->priv);
#endif
}
return 0;
}
-static int riscv_gdb_set_virtual(CPURISCVState *cs, uint8_t *mem_buf, int n)
+static int riscv_gdb_set_virtual(CPUState *cs, uint8_t *mem_buf, int n)
{
if (n == 0) {
#ifndef CONFIG_USER_ONLY
- cs->priv = ldtul_p(mem_buf) & 0x3;
- if (cs->priv == PRV_RESERVED) {
- cs->priv = PRV_S;
+ RISCVCPU *cpu = RISCV_CPU(cs);
+ CPURISCVState *env = &cpu->env;
+
+ env->priv = ldtul_p(mem_buf) & 0x3;
+ if (env->priv == PRV_RESERVED) {
+ env->priv = PRV_S;
}
#endif
return sizeof(target_ulong);
diff --git a/target/s390x/gdbstub.c b/target/s390x/gdbstub.c
index 02c388dc323..c1e7c59b822 100644
--- a/target/s390x/gdbstub.c
+++ b/target/s390x/gdbstub.c
@@ -70,8 +70,11 @@ int s390_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
#define S390_A0_REGNUM 0
#define S390_A15_REGNUM 15
-static int cpu_read_ac_reg(CPUS390XState *env, GByteArray *buf, int n)
+static int cpu_read_ac_reg(CPUState *cs, GByteArray *buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
switch (n) {
case S390_A0_REGNUM ... S390_A15_REGNUM:
return gdb_get_reg32(buf, env->aregs[n]);
@@ -80,8 +83,11 @@ static int cpu_read_ac_reg(CPUS390XState *env, GByteArray *buf, int n)
}
}
-static int cpu_write_ac_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
+static int cpu_write_ac_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
switch (n) {
case S390_A0_REGNUM ... S390_A15_REGNUM:
env->aregs[n] = ldl_p(mem_buf);
@@ -97,8 +103,11 @@ static int cpu_write_ac_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
#define S390_F0_REGNUM 1
#define S390_F15_REGNUM 16
-static int cpu_read_fp_reg(CPUS390XState *env, GByteArray *buf, int n)
+static int cpu_read_fp_reg(CPUState *cs, GByteArray *buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
switch (n) {
case S390_FPC_REGNUM:
return gdb_get_reg32(buf, env->fpc);
@@ -109,8 +118,11 @@ static int cpu_read_fp_reg(CPUS390XState *env, GByteArray *buf, int n)
}
}
-static int cpu_write_fp_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
+static int cpu_write_fp_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
switch (n) {
case S390_FPC_REGNUM:
env->fpc = ldl_p(mem_buf);
@@ -129,8 +141,10 @@ static int cpu_write_fp_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
#define S390_V16_REGNUM 16
#define S390_V31_REGNUM 31
-static int cpu_read_vreg(CPUS390XState *env, GByteArray *buf, int n)
+static int cpu_read_vreg(CPUState *cs, GByteArray *buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
int ret;
switch (n) {
@@ -148,8 +162,11 @@ static int cpu_read_vreg(CPUS390XState *env, GByteArray *buf, int n)
return ret;
}
-static int cpu_write_vreg(CPUS390XState *env, uint8_t *mem_buf, int n)
+static int cpu_write_vreg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
switch (n) {
case S390_V0L_REGNUM ... S390_V15L_REGNUM:
env->vregs[n][1] = ldtul_p(mem_buf + 8);
@@ -168,8 +185,11 @@ static int cpu_write_vreg(CPUS390XState *env, uint8_t *mem_buf, int n)
#define S390_C15_REGNUM 15
#ifndef CONFIG_USER_ONLY
-static int cpu_read_c_reg(CPUS390XState *env, GByteArray *buf, int n)
+static int cpu_read_c_reg(CPUState *cs, GByteArray *buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
switch (n) {
case S390_C0_REGNUM ... S390_C15_REGNUM:
return gdb_get_regl(buf, env->cregs[n]);
@@ -178,8 +198,11 @@ static int cpu_read_c_reg(CPUS390XState *env, GByteArray *buf, int n)
}
}
-static int cpu_write_c_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
+static int cpu_write_c_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
switch (n) {
case S390_C0_REGNUM ... S390_C15_REGNUM:
env->cregs[n] = ldtul_p(mem_buf);
@@ -199,8 +222,11 @@ static int cpu_write_c_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
#define S390_VIRT_BEA_REGNUM 2
#define S390_VIRT_PREFIX_REGNUM 3
-static int cpu_read_virt_reg(CPUS390XState *env, GByteArray *mem_buf, int n)
+static int cpu_read_virt_reg(CPUState *cs, GByteArray *mem_buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
switch (n) {
case S390_VIRT_CKC_REGNUM:
return gdb_get_regl(mem_buf, env->ckc);
@@ -215,24 +241,27 @@ static int cpu_read_virt_reg(CPUS390XState *env, GByteArray *mem_buf, int n)
}
}
-static int cpu_write_virt_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
+static int cpu_write_virt_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
switch (n) {
case S390_VIRT_CKC_REGNUM:
env->ckc = ldtul_p(mem_buf);
- cpu_synchronize_post_init(env_cpu(env));
+ cpu_synchronize_post_init(cs);
return 8;
case S390_VIRT_CPUTM_REGNUM:
env->cputm = ldtul_p(mem_buf);
- cpu_synchronize_post_init(env_cpu(env));
+ cpu_synchronize_post_init(cs);
return 8;
case S390_VIRT_BEA_REGNUM:
env->gbea = ldtul_p(mem_buf);
- cpu_synchronize_post_init(env_cpu(env));
+ cpu_synchronize_post_init(cs);
return 8;
case S390_VIRT_PREFIX_REGNUM:
env->psa = ldtul_p(mem_buf);
- cpu_synchronize_post_init(env_cpu(env));
+ cpu_synchronize_post_init(cs);
return 8;
default:
return 0;
@@ -245,8 +274,11 @@ static int cpu_write_virt_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
#define S390_VIRT_KVM_PFS_REGNUM 2
#define S390_VIRT_KVM_PFC_REGNUM 3
-static int cpu_read_virt_kvm_reg(CPUS390XState *env, GByteArray *mem_buf, int n)
+static int cpu_read_virt_kvm_reg(CPUState *cs, GByteArray *mem_buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
switch (n) {
case S390_VIRT_KVM_PP_REGNUM:
return gdb_get_regl(mem_buf, env->pp);
@@ -261,8 +293,11 @@ static int cpu_read_virt_kvm_reg(CPUS390XState *env, GByteArray *mem_buf, int n)
}
}
-static int cpu_write_virt_kvm_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
+static int cpu_write_virt_kvm_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
switch (n) {
case S390_VIRT_KVM_PP_REGNUM:
env->pp = ldtul_p(mem_buf);
@@ -292,13 +327,19 @@ static int cpu_write_virt_kvm_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
#define S390_GS_GSSM_REGNUM 2
#define S390_GS_GSEPLA_REGNUM 3
-static int cpu_read_gs_reg(CPUS390XState *env, GByteArray *buf, int n)
+static int cpu_read_gs_reg(CPUState *cs, GByteArray *buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
return gdb_get_regl(buf, env->gscb[n]);
}
-static int cpu_write_gs_reg(CPUS390XState *env, uint8_t *mem_buf, int n)
+static int cpu_write_gs_reg(CPUState *cs, uint8_t *mem_buf, int n)
{
+ S390CPU *cpu = S390_CPU(cs);
+ CPUS390XState *env = &cpu->env;
+
env->gscb[n] = ldtul_p(mem_buf);
cpu_synchronize_post_init(env_cpu(env));
return 8;
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 32/43] gdbstub: Simplify XML lookup
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (30 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 31/43] gdbstub: Change gdb_get_reg_cb and gdb_set_reg_cb Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 33/43] gdbstub: Infer number of core registers from XML Alex Bennée
` (11 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
Now we know all instances of GDBFeature that is used in CPU so we can
traverse them to find XML. This removes the need for a CPU-specific
lookup function for dynamic XMLs.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231213-gdb-v17-7-777047380591@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
include/exec/gdbstub.h | 6 +++
gdbstub/gdbstub.c | 118 +++++++++++++++++++++--------------------
hw/core/cpu-common.c | 5 +-
3 files changed, 69 insertions(+), 60 deletions(-)
diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h
index bcaab1bc750..82a8afa237f 100644
--- a/include/exec/gdbstub.h
+++ b/include/exec/gdbstub.h
@@ -27,6 +27,12 @@ typedef struct GDBFeatureBuilder {
typedef int (*gdb_get_reg_cb)(CPUState *cpu, GByteArray *buf, int reg);
typedef int (*gdb_set_reg_cb)(CPUState *cpu, uint8_t *buf, int reg);
+/**
+ * gdb_init_cpu(): Initialize the CPU for gdbstub.
+ * @cpu: The CPU to be initialized.
+ */
+void gdb_init_cpu(CPUState *cpu);
+
/**
* gdb_register_coprocessor() - register a supplemental set of registers
* @cpu - the CPU associated with registers
diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c
index 21fea7fffae..1d5c1da1b24 100644
--- a/gdbstub/gdbstub.c
+++ b/gdbstub/gdbstub.c
@@ -352,6 +352,7 @@ static const char *get_feature_xml(const char *p, const char **newp,
{
CPUState *cpu = gdb_get_first_cpu_in_process(process);
CPUClass *cc = CPU_GET_CLASS(cpu);
+ GDBRegisterState *r;
size_t len;
/*
@@ -365,7 +366,6 @@ static const char *get_feature_xml(const char *p, const char **newp,
/* Is it the main target xml? */
if (strncmp(p, "target.xml", len) == 0) {
if (!process->target_xml) {
- GDBRegisterState *r;
g_autoptr(GPtrArray) xml = g_ptr_array_new_with_free_func(g_free);
g_ptr_array_add(
@@ -380,18 +380,12 @@ static const char *get_feature_xml(const char *p, const char **newp,
g_markup_printf_escaped("<architecture>%s</architecture>",
cc->gdb_arch_name(cpu)));
}
- g_ptr_array_add(
- xml,
- g_markup_printf_escaped("<xi:include href=\"%s\"/>",
- cc->gdb_core_xml_file));
- if (cpu->gdb_regs) {
- for (guint i = 0; i < cpu->gdb_regs->len; i++) {
- r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
- g_ptr_array_add(
- xml,
- g_markup_printf_escaped("<xi:include href=\"%s\"/>",
- r->feature->xmlname));
- }
+ for (guint i = 0; i < cpu->gdb_regs->len; i++) {
+ r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
+ g_ptr_array_add(
+ xml,
+ g_markup_printf_escaped("<xi:include href=\"%s\"/>",
+ r->feature->xmlname));
}
g_ptr_array_add(xml, g_strdup("</target>"));
g_ptr_array_add(xml, NULL);
@@ -400,20 +394,11 @@ static const char *get_feature_xml(const char *p, const char **newp,
}
return process->target_xml;
}
- /* Is it dynamically generated by the target? */
- if (cc->gdb_get_dynamic_xml) {
- g_autofree char *xmlname = g_strndup(p, len);
- const char *xml = cc->gdb_get_dynamic_xml(cpu, xmlname);
- if (xml) {
- return xml;
- }
- }
- /* Is it one of the encoded gdb-xml/ files? */
- for (int i = 0; gdb_static_features[i].xmlname; i++) {
- const char *name = gdb_static_features[i].xmlname;
- if ((strncmp(name, p, len) == 0) &&
- strlen(name) == len) {
- return gdb_static_features[i].xml;
+ /* Is it one of the features? */
+ for (guint i = 0; i < cpu->gdb_regs->len; i++) {
+ r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
+ if (strncmp(p, r->feature->xmlname, len) == 0) {
+ return r->feature->xml;
}
}
@@ -508,12 +493,10 @@ static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
return cc->gdb_read_register(cpu, buf, reg);
}
- if (cpu->gdb_regs) {
- for (guint i = 0; i < cpu->gdb_regs->len; i++) {
- r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
- if (r->base_reg <= reg && reg < r->base_reg + r->feature->num_regs) {
- return r->get_reg(cpu, buf, reg - r->base_reg);
- }
+ for (guint i = 0; i < cpu->gdb_regs->len; i++) {
+ r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
+ if (r->base_reg <= reg && reg < r->base_reg + r->feature->num_regs) {
+ return r->get_reg(cpu, buf, reg - r->base_reg);
}
}
return 0;
@@ -528,51 +511,70 @@ static int gdb_write_register(CPUState *cpu, uint8_t *mem_buf, int reg)
return cc->gdb_write_register(cpu, mem_buf, reg);
}
- if (cpu->gdb_regs) {
- for (guint i = 0; i < cpu->gdb_regs->len; i++) {
- r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
- if (r->base_reg <= reg && reg < r->base_reg + r->feature->num_regs) {
- return r->set_reg(cpu, mem_buf, reg - r->base_reg);
- }
+ for (guint i = 0; i < cpu->gdb_regs->len; i++) {
+ r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
+ if (r->base_reg <= reg && reg < r->base_reg + r->feature->num_regs) {
+ return r->set_reg(cpu, mem_buf, reg - r->base_reg);
}
}
return 0;
}
+static void gdb_register_feature(CPUState *cpu, int base_reg,
+ gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg,
+ const GDBFeature *feature)
+{
+ GDBRegisterState s = {
+ .base_reg = base_reg,
+ .get_reg = get_reg,
+ .set_reg = set_reg,
+ .feature = feature
+ };
+
+ g_array_append_val(cpu->gdb_regs, s);
+}
+
+void gdb_init_cpu(CPUState *cpu)
+{
+ CPUClass *cc = CPU_GET_CLASS(cpu);
+ const GDBFeature *feature;
+
+ cpu->gdb_regs = g_array_new(false, false, sizeof(GDBRegisterState));
+
+ if (cc->gdb_core_xml_file) {
+ feature = gdb_find_static_feature(cc->gdb_core_xml_file);
+ gdb_register_feature(cpu, 0,
+ cc->gdb_read_register, cc->gdb_write_register,
+ feature);
+ }
+
+ cpu->gdb_num_regs = cpu->gdb_num_g_regs = cc->gdb_num_core_regs;
+}
+
void gdb_register_coprocessor(CPUState *cpu,
gdb_get_reg_cb get_reg, gdb_set_reg_cb set_reg,
const GDBFeature *feature, int g_pos)
{
GDBRegisterState *s;
guint i;
+ int base_reg = cpu->gdb_num_regs;
- if (cpu->gdb_regs) {
- for (i = 0; i < cpu->gdb_regs->len; i++) {
- /* Check for duplicates. */
- s = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
- if (s->feature == feature) {
- return;
- }
+ for (i = 0; i < cpu->gdb_regs->len; i++) {
+ /* Check for duplicates. */
+ s = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
+ if (s->feature == feature) {
+ return;
}
- } else {
- cpu->gdb_regs = g_array_new(false, false, sizeof(GDBRegisterState));
- i = 0;
}
- g_array_set_size(cpu->gdb_regs, i + 1);
- s = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
- s->base_reg = cpu->gdb_num_regs;
- s->get_reg = get_reg;
- s->set_reg = set_reg;
- s->feature = feature;
+ gdb_register_feature(cpu, base_reg, get_reg, set_reg, feature);
/* Add to end of list. */
cpu->gdb_num_regs += feature->num_regs;
if (g_pos) {
- if (g_pos != s->base_reg) {
+ if (g_pos != base_reg) {
error_report("Error: Bad gdb register numbering for '%s', "
- "expected %d got %d", feature->xml,
- g_pos, s->base_reg);
+ "expected %d got %d", feature->xml, g_pos, base_reg);
} else {
cpu->gdb_num_g_regs = cpu->gdb_num_regs;
}
diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
index 82dae51a550..cd7903ba6e7 100644
--- a/hw/core/cpu-common.c
+++ b/hw/core/cpu-common.c
@@ -27,6 +27,7 @@
#include "qemu/main-loop.h"
#include "exec/log.h"
#include "exec/cpu-common.h"
+#include "exec/gdbstub.h"
#include "qemu/error-report.h"
#include "qemu/qemu-print.h"
#include "sysemu/tcg.h"
@@ -238,11 +239,10 @@ static void cpu_common_unrealizefn(DeviceState *dev)
static void cpu_common_initfn(Object *obj)
{
CPUState *cpu = CPU(obj);
- CPUClass *cc = CPU_GET_CLASS(obj);
+ gdb_init_cpu(cpu);
cpu->cpu_index = UNASSIGNED_CPU_INDEX;
cpu->cluster_index = UNASSIGNED_CLUSTER_INDEX;
- cpu->gdb_num_regs = cpu->gdb_num_g_regs = cc->gdb_num_core_regs;
/* user-mode doesn't have configurable SMP topology */
/* the default value is changed by qemu_init_vcpu() for system-mode */
cpu->nr_cores = 1;
@@ -262,6 +262,7 @@ static void cpu_common_finalize(Object *obj)
{
CPUState *cpu = CPU(obj);
+ g_array_free(cpu->gdb_regs, TRUE);
qemu_lockcnt_destroy(&cpu->in_ioctl_lock);
qemu_mutex_destroy(&cpu->work_mutex);
}
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 33/43] gdbstub: Infer number of core registers from XML
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (31 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 32/43] gdbstub: Simplify XML lookup Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 34/43] hw/core/cpu: Remove gdb_get_dynamic_xml member Alex Bennée
` (10 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
GDBFeature has the num_regs member so use it where applicable to
remove magic numbers.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-Id: <20231213-gdb-v17-8-777047380591@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
include/hw/core/cpu.h | 3 ++-
target/s390x/cpu.h | 2 --
gdbstub/gdbstub.c | 5 ++++-
target/arm/cpu.c | 1 -
target/arm/cpu64.c | 1 -
target/avr/cpu.c | 1 -
target/hexagon/cpu.c | 1 -
target/i386/cpu.c | 2 --
target/loongarch/cpu.c | 2 --
target/m68k/cpu.c | 1 -
target/microblaze/cpu.c | 1 -
target/riscv/cpu.c | 1 -
target/rx/cpu.c | 1 -
target/s390x/cpu.c | 1 -
14 files changed, 6 insertions(+), 17 deletions(-)
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index c0c8320413e..a6214610603 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -127,7 +127,8 @@ struct SysemuCPUOps;
* @gdb_adjust_breakpoint: Callback for adjusting the address of a
* breakpoint. Used by AVR to handle a gdb mis-feature with
* its Harvard architecture split code and data.
- * @gdb_num_core_regs: Number of core registers accessible to GDB.
+ * @gdb_num_core_regs: Number of core registers accessible to GDB or 0 to infer
+ * from @gdb_core_xml_file.
* @gdb_core_xml_file: File name for core registers GDB XML description.
* @gdb_stop_before_watchpoint: Indicates whether GDB expects the CPU to stop
* before the insn which triggers a watchpoint rather than after it.
diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h
index fa3aac4f973..2d81fbfea5c 100644
--- a/target/s390x/cpu.h
+++ b/target/s390x/cpu.h
@@ -491,8 +491,6 @@ static inline void cpu_get_tb_cpu_state(CPUS390XState *env, vaddr *pc,
#define S390_R13_REGNUM 15
#define S390_R14_REGNUM 16
#define S390_R15_REGNUM 17
-/* Total Core Registers. */
-#define S390_NUM_CORE_REGS 18
static inline void setcc(S390CPU *cpu, uint64_t cc)
{
diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c
index 1d5c1da1b24..801eba9a0b0 100644
--- a/gdbstub/gdbstub.c
+++ b/gdbstub/gdbstub.c
@@ -546,9 +546,12 @@ void gdb_init_cpu(CPUState *cpu)
gdb_register_feature(cpu, 0,
cc->gdb_read_register, cc->gdb_write_register,
feature);
+ cpu->gdb_num_regs = cpu->gdb_num_g_regs = feature->num_regs;
}
- cpu->gdb_num_regs = cpu->gdb_num_g_regs = cc->gdb_num_core_regs;
+ if (cc->gdb_num_core_regs) {
+ cpu->gdb_num_regs = cpu->gdb_num_g_regs = cc->gdb_num_core_regs;
+ }
}
void gdb_register_coprocessor(CPUState *cpu,
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 650e09b29c5..0a02d16220b 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -2498,7 +2498,6 @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
#ifndef CONFIG_USER_ONLY
cc->sysemu_ops = &arm_sysemu_ops;
#endif
- cc->gdb_num_core_regs = 26;
cc->gdb_arch_name = arm_gdb_arch_name;
cc->gdb_get_dynamic_xml = arm_gdb_get_dynamic_xml;
cc->gdb_stop_before_watchpoint = true;
diff --git a/target/arm/cpu64.c b/target/arm/cpu64.c
index 8e30a7993ea..869d8dd24ee 100644
--- a/target/arm/cpu64.c
+++ b/target/arm/cpu64.c
@@ -793,7 +793,6 @@ static void aarch64_cpu_class_init(ObjectClass *oc, void *data)
cc->gdb_read_register = aarch64_cpu_gdb_read_register;
cc->gdb_write_register = aarch64_cpu_gdb_write_register;
- cc->gdb_num_core_regs = 34;
cc->gdb_core_xml_file = "aarch64-core.xml";
cc->gdb_arch_name = aarch64_gdb_arch_name;
diff --git a/target/avr/cpu.c b/target/avr/cpu.c
index 999c010dedb..4bab9e22728 100644
--- a/target/avr/cpu.c
+++ b/target/avr/cpu.c
@@ -251,7 +251,6 @@ static void avr_cpu_class_init(ObjectClass *oc, void *data)
cc->gdb_read_register = avr_cpu_gdb_read_register;
cc->gdb_write_register = avr_cpu_gdb_write_register;
cc->gdb_adjust_breakpoint = avr_cpu_gdb_adjust_breakpoint;
- cc->gdb_num_core_regs = 35;
cc->gdb_core_xml_file = "avr-cpu.xml";
cc->tcg_ops = &avr_tcg_ops;
}
diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c
index 65ac9c75ad0..71678ef9c67 100644
--- a/target/hexagon/cpu.c
+++ b/target/hexagon/cpu.c
@@ -384,7 +384,6 @@ static void hexagon_cpu_class_init(ObjectClass *c, void *data)
cc->get_pc = hexagon_cpu_get_pc;
cc->gdb_read_register = hexagon_gdb_read_register;
cc->gdb_write_register = hexagon_gdb_write_register;
- cc->gdb_num_core_regs = TOTAL_PER_THREAD_REGS;
cc->gdb_stop_before_watchpoint = true;
cc->gdb_core_xml_file = "hexagon-core.xml";
cc->disas_set_info = hexagon_cpu_disas_set_info;
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
index 95d5f16cd5e..b14c97169cd 100644
--- a/target/i386/cpu.c
+++ b/target/i386/cpu.c
@@ -7969,10 +7969,8 @@ static void x86_cpu_common_class_init(ObjectClass *oc, void *data)
cc->gdb_arch_name = x86_gdb_arch_name;
#ifdef TARGET_X86_64
cc->gdb_core_xml_file = "i386-64bit.xml";
- cc->gdb_num_core_regs = 66;
#else
cc->gdb_core_xml_file = "i386-32bit.xml";
- cc->gdb_num_core_regs = 50;
#endif
cc->disas_set_info = x86_disas_set_info;
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
index 07319d6fb97..dfac51a7f60 100644
--- a/target/loongarch/cpu.c
+++ b/target/loongarch/cpu.c
@@ -851,7 +851,6 @@ static void loongarch32_cpu_class_init(ObjectClass *c, void *data)
{
CPUClass *cc = CPU_CLASS(c);
- cc->gdb_num_core_regs = 35;
cc->gdb_core_xml_file = "loongarch-base32.xml";
cc->gdb_arch_name = loongarch32_gdb_arch_name;
}
@@ -865,7 +864,6 @@ static void loongarch64_cpu_class_init(ObjectClass *c, void *data)
{
CPUClass *cc = CPU_CLASS(c);
- cc->gdb_num_core_regs = 35;
cc->gdb_core_xml_file = "loongarch-base64.xml";
cc->gdb_arch_name = loongarch64_gdb_arch_name;
}
diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c
index 11c7e0a7902..a27194b2a59 100644
--- a/target/m68k/cpu.c
+++ b/target/m68k/cpu.c
@@ -564,7 +564,6 @@ static void m68k_cpu_class_init(ObjectClass *c, void *data)
#endif
cc->disas_set_info = m68k_cpu_disas_set_info;
- cc->gdb_num_core_regs = 18;
cc->tcg_ops = &m68k_tcg_ops;
}
diff --git a/target/microblaze/cpu.c b/target/microblaze/cpu.c
index 1998f69828f..9d3fbfe1592 100644
--- a/target/microblaze/cpu.c
+++ b/target/microblaze/cpu.c
@@ -428,7 +428,6 @@ static void mb_cpu_class_init(ObjectClass *oc, void *data)
cc->sysemu_ops = &mb_sysemu_ops;
#endif
device_class_set_props(dc, mb_properties);
- cc->gdb_num_core_regs = 32 + 25;
cc->gdb_core_xml_file = "microblaze-core.xml";
cc->disas_set_info = mb_disas_set_info;
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index 673e937a5d8..a3a98230ca8 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1688,7 +1688,6 @@ static void riscv_cpu_common_class_init(ObjectClass *c, void *data)
cc->get_pc = riscv_cpu_get_pc;
cc->gdb_read_register = riscv_cpu_gdb_read_register;
cc->gdb_write_register = riscv_cpu_gdb_write_register;
- cc->gdb_num_core_regs = 33;
cc->gdb_stop_before_watchpoint = true;
cc->disas_set_info = riscv_cpu_disas_set_info;
#ifndef CONFIG_USER_ONLY
diff --git a/target/rx/cpu.c b/target/rx/cpu.c
index 9cc9d9d15ec..cf11b189116 100644
--- a/target/rx/cpu.c
+++ b/target/rx/cpu.c
@@ -231,7 +231,6 @@ static void rx_cpu_class_init(ObjectClass *klass, void *data)
cc->gdb_write_register = rx_cpu_gdb_write_register;
cc->disas_set_info = rx_cpu_disas_set_info;
- cc->gdb_num_core_regs = 26;
cc->gdb_core_xml_file = "rx-core.xml";
cc->tcg_ops = &rx_tcg_ops;
}
diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c
index 6acfa1c91b2..6fba9497295 100644
--- a/target/s390x/cpu.c
+++ b/target/s390x/cpu.c
@@ -362,7 +362,6 @@ static void s390_cpu_class_init(ObjectClass *oc, void *data)
s390_cpu_class_init_sysemu(cc);
#endif
cc->disas_set_info = s390_cpu_disas_set_info;
- cc->gdb_num_core_regs = S390_NUM_CORE_REGS;
cc->gdb_core_xml_file = "s390x-core64.xml";
cc->gdb_arch_name = s390_gdb_arch_name;
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 34/43] hw/core/cpu: Remove gdb_get_dynamic_xml member
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (32 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 33/43] gdbstub: Infer number of core registers from XML Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 35/43] gdbstub: Add members to identify registers to GDBFeature Alex Bennée
` (9 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
This function is no longer used.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231213-gdb-v17-9-777047380591@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
include/hw/core/cpu.h | 4 ----
target/arm/cpu.h | 6 ------
target/ppc/cpu.h | 1 -
target/arm/cpu.c | 1 -
target/arm/gdbstub.c | 18 ------------------
target/ppc/cpu_init.c | 3 ---
target/ppc/gdbstub.c | 10 ----------
target/riscv/cpu.c | 14 --------------
8 files changed, 57 deletions(-)
diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
index a6214610603..17f99adc0f4 100644
--- a/include/hw/core/cpu.h
+++ b/include/hw/core/cpu.h
@@ -134,9 +134,6 @@ struct SysemuCPUOps;
* before the insn which triggers a watchpoint rather than after it.
* @gdb_arch_name: Optional callback that returns the architecture name known
* to GDB. The caller must free the returned string with g_free.
- * @gdb_get_dynamic_xml: Callback to return dynamically generated XML for the
- * gdb stub. Returns a pointer to the XML contents for the specified XML file
- * or NULL if the CPU doesn't have a dynamically generated content for it.
* @disas_set_info: Setup architecture specific components of disassembly info
* @adjust_watchpoint_address: Perform a target-specific adjustment to an
* address before attempting to match it against watchpoints.
@@ -167,7 +164,6 @@ struct CPUClass {
const char *gdb_core_xml_file;
const gchar * (*gdb_arch_name)(CPUState *cpu);
- const char * (*gdb_get_dynamic_xml)(CPUState *cpu, const char *xmlname);
void (*disas_set_info)(CPUState *cpu, disassemble_info *info);
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index b2f8ac81f06..c8e77440f0f 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -1182,12 +1182,6 @@ hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr,
int arm_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
int arm_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
-/* Returns the dynamically generated XML for the gdb stub.
- * Returns a pointer to the XML contents for the specified XML file or NULL
- * if the XML name doesn't match the predefined one.
- */
-const char *arm_gdb_get_dynamic_xml(CPUState *cpu, const char *xmlname);
-
int arm_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
int cpuid, DumpState *s);
int arm_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index f87c26f98a6..9f94282e13e 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -1524,7 +1524,6 @@ int ppc_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
int ppc_cpu_gdb_write_register_apple(CPUState *cpu, uint8_t *buf, int reg);
#ifndef CONFIG_USER_ONLY
hwaddr ppc_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
-const char *ppc_gdb_get_dynamic_xml(CPUState *cs, const char *xml_name);
#endif
int ppc64_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
int cpuid, DumpState *s);
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 0a02d16220b..9514edaf041 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -2499,7 +2499,6 @@ static void arm_cpu_class_init(ObjectClass *oc, void *data)
cc->sysemu_ops = &arm_sysemu_ops;
#endif
cc->gdb_arch_name = arm_gdb_arch_name;
- cc->gdb_get_dynamic_xml = arm_gdb_get_dynamic_xml;
cc->gdb_stop_before_watchpoint = true;
cc->disas_set_info = arm_disas_set_info;
diff --git a/target/arm/gdbstub.c b/target/arm/gdbstub.c
index 059d84f98e5..a3bb73cfa7c 100644
--- a/target/arm/gdbstub.c
+++ b/target/arm/gdbstub.c
@@ -474,24 +474,6 @@ static GDBFeature *arm_gen_dynamic_m_secextreg_feature(CPUState *cs,
#endif
#endif /* CONFIG_TCG */
-const char *arm_gdb_get_dynamic_xml(CPUState *cs, const char *xmlname)
-{
- ARMCPU *cpu = ARM_CPU(cs);
-
- if (strcmp(xmlname, "system-registers.xml") == 0) {
- return cpu->dyn_sysreg_feature.desc.xml;
- } else if (strcmp(xmlname, "sve-registers.xml") == 0) {
- return cpu->dyn_svereg_feature.desc.xml;
- } else if (strcmp(xmlname, "arm-m-system.xml") == 0) {
- return cpu->dyn_m_systemreg_feature.desc.xml;
-#ifndef CONFIG_USER_ONLY
- } else if (strcmp(xmlname, "arm-m-secext.xml") == 0) {
- return cpu->dyn_m_secextreg_feature.desc.xml;
-#endif
- }
- return NULL;
-}
-
void arm_cpu_register_gdb_regs_for_features(ARMCPU *cpu)
{
CPUState *cs = CPU(cpu);
diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
index a0178c3ce80..909d753b022 100644
--- a/target/ppc/cpu_init.c
+++ b/target/ppc/cpu_init.c
@@ -7380,9 +7380,6 @@ static void ppc_cpu_class_init(ObjectClass *oc, void *data)
#endif
cc->gdb_num_core_regs = 71;
-#ifndef CONFIG_USER_ONLY
- cc->gdb_get_dynamic_xml = ppc_gdb_get_dynamic_xml;
-#endif
#ifdef USE_APPLE_GDB
cc->gdb_read_register = ppc_cpu_gdb_read_register_apple;
cc->gdb_write_register = ppc_cpu_gdb_write_register_apple;
diff --git a/target/ppc/gdbstub.c b/target/ppc/gdbstub.c
index 8ca37b6bf95..f47878a67bd 100644
--- a/target/ppc/gdbstub.c
+++ b/target/ppc/gdbstub.c
@@ -342,16 +342,6 @@ static void gdb_gen_spr_feature(CPUState *cs)
gdb_feature_builder_end(&builder);
}
-
-const char *ppc_gdb_get_dynamic_xml(CPUState *cs, const char *xml_name)
-{
- PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cs);
-
- if (strcmp(xml_name, "power-spr.xml") == 0) {
- return pcc->gdb_spr.xml;
- }
- return NULL;
-}
#endif
#if !defined(CONFIG_USER_ONLY)
diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
index a3a98230ca8..1e3ac556b33 100644
--- a/target/riscv/cpu.c
+++ b/target/riscv/cpu.c
@@ -1529,19 +1529,6 @@ static const gchar *riscv_gdb_arch_name(CPUState *cs)
}
}
-static const char *riscv_gdb_get_dynamic_xml(CPUState *cs, const char *xmlname)
-{
- RISCVCPU *cpu = RISCV_CPU(cs);
-
- if (strcmp(xmlname, "riscv-csr.xml") == 0) {
- return cpu->dyn_csr_feature.xml;
- } else if (strcmp(xmlname, "riscv-vector.xml") == 0) {
- return cpu->dyn_vreg_feature.xml;
- }
-
- return NULL;
-}
-
#ifndef CONFIG_USER_ONLY
static int64_t riscv_get_arch_id(CPUState *cs)
{
@@ -1695,7 +1682,6 @@ static void riscv_cpu_common_class_init(ObjectClass *c, void *data)
cc->get_arch_id = riscv_get_arch_id;
#endif
cc->gdb_arch_name = riscv_gdb_arch_name;
- cc->gdb_get_dynamic_xml = riscv_gdb_get_dynamic_xml;
object_class_property_add(c, "mvendorid", "uint32", cpu_get_mvendorid,
cpu_set_mvendorid, NULL, NULL);
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 35/43] gdbstub: Add members to identify registers to GDBFeature
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (33 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 34/43] hw/core/cpu: Remove gdb_get_dynamic_xml member Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 36/43] plugins: Use different helpers when reading registers Alex Bennée
` (8 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
These members will be used to help plugins to identify registers.
The added members in instances of GDBFeature dynamically generated by
CPUs will be filled in later changes.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-Id: <20231213-gdb-v17-10-777047380591@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
include/exec/gdbstub.h | 3 +++
gdbstub/gdbstub.c | 12 +++++++++---
target/riscv/gdbstub.c | 4 +---
scripts/feature_to_c.py | 14 +++++++++++++-
4 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h
index 82a8afa237f..da9ddfe54c5 100644
--- a/include/exec/gdbstub.h
+++ b/include/exec/gdbstub.h
@@ -13,12 +13,15 @@
typedef struct GDBFeature {
const char *xmlname;
const char *xml;
+ const char *name;
+ const char * const *regs;
int num_regs;
} GDBFeature;
typedef struct GDBFeatureBuilder {
GDBFeature *feature;
GPtrArray *xml;
+ GPtrArray *regs;
int base_reg;
} GDBFeatureBuilder;
diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c
index 801eba9a0b0..420ab2a3766 100644
--- a/gdbstub/gdbstub.c
+++ b/gdbstub/gdbstub.c
@@ -419,9 +419,10 @@ void gdb_feature_builder_init(GDBFeatureBuilder *builder, GDBFeature *feature,
builder->feature = feature;
builder->xml = g_ptr_array_new();
g_ptr_array_add(builder->xml, header);
+ builder->regs = g_ptr_array_new();
builder->base_reg = base_reg;
feature->xmlname = xmlname;
- feature->num_regs = 0;
+ feature->name = name;
}
void gdb_feature_builder_append_tag(const GDBFeatureBuilder *builder,
@@ -440,10 +441,12 @@ void gdb_feature_builder_append_reg(const GDBFeatureBuilder *builder,
const char *type,
const char *group)
{
- if (builder->feature->num_regs < regnum) {
- builder->feature->num_regs = regnum;
+ if (builder->regs->len <= regnum) {
+ g_ptr_array_set_size(builder->regs, regnum + 1);
}
+ builder->regs->pdata[regnum] = (gpointer *)name;
+
if (group) {
gdb_feature_builder_append_tag(
builder,
@@ -469,6 +472,9 @@ void gdb_feature_builder_end(const GDBFeatureBuilder *builder)
}
g_ptr_array_free(builder->xml, TRUE);
+
+ builder->feature->num_regs = builder->regs->len;
+ builder->feature->regs = (void *)g_ptr_array_free(builder->regs, FALSE);
}
const GDBFeature *gdb_find_static_feature(const char *xmlname)
diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c
index 68d0fdc1fd6..d9b52ffd09b 100644
--- a/target/riscv/gdbstub.c
+++ b/target/riscv/gdbstub.c
@@ -266,11 +266,9 @@ static GDBFeature *riscv_gen_dynamic_csr_feature(CPUState *cs, int base_reg)
}
predicate = csr_ops[i].predicate;
if (predicate && (predicate(env, i) == RISCV_EXCP_NONE)) {
- g_autofree char *dynamic_name = NULL;
name = csr_ops[i].name;
if (!name) {
- dynamic_name = g_strdup_printf("csr%03x", i);
- name = dynamic_name;
+ name = g_strdup_printf("csr%03x", i);
}
gdb_feature_builder_append_reg(&builder, name, bitsize, i,
diff --git a/scripts/feature_to_c.py b/scripts/feature_to_c.py
index e04d6b2df7f..807af0e685c 100644
--- a/scripts/feature_to_c.py
+++ b/scripts/feature_to_c.py
@@ -50,7 +50,9 @@ def writeliteral(indent, bytes):
sys.stderr.write(f'unexpected start tag: {element.tag}\n')
exit(1)
+ feature_name = element.attrib['name']
regnum = 0
+ regnames = []
regnums = []
tags = ['feature']
for event, element in events:
@@ -67,6 +69,7 @@ def writeliteral(indent, bytes):
if 'regnum' in element.attrib:
regnum = int(element.attrib['regnum'])
+ regnames.append(element.attrib['name'])
regnums.append(regnum)
regnum += 1
@@ -85,6 +88,15 @@ def writeliteral(indent, bytes):
writeliteral(8, bytes(os.path.basename(input), 'utf-8'))
sys.stdout.write(',\n')
writeliteral(8, read)
- sys.stdout.write(f',\n {num_regs},\n }},\n')
+ sys.stdout.write(',\n')
+ writeliteral(8, bytes(feature_name, 'utf-8'))
+ sys.stdout.write(',\n (const char * const []) {\n')
+
+ for index, regname in enumerate(regnames):
+ sys.stdout.write(f' [{regnums[index] - base_reg}] =\n')
+ writeliteral(16, bytes(regname, 'utf-8'))
+ sys.stdout.write(',\n')
+
+ sys.stdout.write(f' }},\n {num_regs},\n }},\n')
sys.stdout.write(' { NULL }\n};\n')
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 36/43] plugins: Use different helpers when reading registers
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (34 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 35/43] gdbstub: Add members to identify registers to GDBFeature Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-09 14:24 ` Pierrick Bouvier
2024-01-03 17:33 ` [PATCH v2 37/43] gdbstub: expose api to find registers Alex Bennée
` (7 subsequent siblings)
43 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
From: Akihiko Odaki <akihiko.odaki@daynix.com>
This avoids optimizations incompatible when reading registers.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-Id: <20231213-gdb-v17-12-777047380591@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
accel/tcg/plugin-helpers.h | 3 ++-
include/qemu/plugin.h | 1 +
accel/tcg/plugin-gen.c | 43 ++++++++++++++++++++++++++++++++++----
plugins/api.c | 12 +++++++++--
4 files changed, 52 insertions(+), 7 deletions(-)
diff --git a/accel/tcg/plugin-helpers.h b/accel/tcg/plugin-helpers.h
index 8e685e06545..11796436f35 100644
--- a/accel/tcg/plugin-helpers.h
+++ b/accel/tcg/plugin-helpers.h
@@ -1,4 +1,5 @@
#ifdef CONFIG_PLUGIN
-DEF_HELPER_FLAGS_2(plugin_vcpu_udata_cb, TCG_CALL_NO_RWG | TCG_CALL_PLUGIN, void, i32, ptr)
+DEF_HELPER_FLAGS_2(plugin_vcpu_udata_cb_no_wg, TCG_CALL_NO_WG | TCG_CALL_PLUGIN, void, i32, ptr)
+DEF_HELPER_FLAGS_2(plugin_vcpu_udata_cb_no_rwg, TCG_CALL_NO_RWG | TCG_CALL_PLUGIN, void, i32, ptr)
DEF_HELPER_FLAGS_4(plugin_vcpu_mem_cb, TCG_CALL_NO_RWG | TCG_CALL_PLUGIN, void, i32, i32, i64, ptr)
#endif
diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h
index 7fdc3a4849f..b0c5ac68293 100644
--- a/include/qemu/plugin.h
+++ b/include/qemu/plugin.h
@@ -73,6 +73,7 @@ enum plugin_dyn_cb_type {
enum plugin_dyn_cb_subtype {
PLUGIN_CB_REGULAR,
+ PLUGIN_CB_REGULAR_R,
PLUGIN_CB_INLINE,
PLUGIN_N_CB_SUBTYPES,
};
diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
index 78b331b2510..b37ce7683e6 100644
--- a/accel/tcg/plugin-gen.c
+++ b/accel/tcg/plugin-gen.c
@@ -79,6 +79,7 @@ enum plugin_gen_from {
enum plugin_gen_cb {
PLUGIN_GEN_CB_UDATA,
+ PLUGIN_GEN_CB_UDATA_R,
PLUGIN_GEN_CB_INLINE,
PLUGIN_GEN_CB_MEM,
PLUGIN_GEN_ENABLE_MEM_HELPER,
@@ -90,7 +91,10 @@ enum plugin_gen_cb {
* These helpers are stubs that get dynamically switched out for calls
* direct to the plugin if they are subscribed to.
*/
-void HELPER(plugin_vcpu_udata_cb)(uint32_t cpu_index, void *udata)
+void HELPER(plugin_vcpu_udata_cb_no_wg)(uint32_t cpu_index, void *udata)
+{ }
+
+void HELPER(plugin_vcpu_udata_cb_no_rwg)(uint32_t cpu_index, void *udata)
{ }
void HELPER(plugin_vcpu_mem_cb)(unsigned int vcpu_index,
@@ -98,7 +102,7 @@ void HELPER(plugin_vcpu_mem_cb)(unsigned int vcpu_index,
void *userdata)
{ }
-static void gen_empty_udata_cb(void)
+static void gen_empty_udata_cb(void (*gen_helper)(TCGv_i32, TCGv_ptr))
{
TCGv_i32 cpu_index = tcg_temp_ebb_new_i32();
TCGv_ptr udata = tcg_temp_ebb_new_ptr();
@@ -106,12 +110,22 @@ static void gen_empty_udata_cb(void)
tcg_gen_movi_ptr(udata, 0);
tcg_gen_ld_i32(cpu_index, tcg_env,
-offsetof(ArchCPU, env) + offsetof(CPUState, cpu_index));
- gen_helper_plugin_vcpu_udata_cb(cpu_index, udata);
+ gen_helper(cpu_index, udata);
tcg_temp_free_ptr(udata);
tcg_temp_free_i32(cpu_index);
}
+static void gen_empty_udata_cb_no_wg(void)
+{
+ gen_empty_udata_cb(gen_helper_plugin_vcpu_udata_cb_no_wg);
+}
+
+static void gen_empty_udata_cb_no_rwg(void)
+{
+ gen_empty_udata_cb(gen_helper_plugin_vcpu_udata_cb_no_rwg);
+}
+
/*
* For now we only support addi_i64.
* When we support more ops, we can generate one empty inline cb for each.
@@ -192,7 +206,8 @@ static void plugin_gen_empty_callback(enum plugin_gen_from from)
gen_empty_mem_helper);
/* fall through */
case PLUGIN_GEN_FROM_TB:
- gen_wrapped(from, PLUGIN_GEN_CB_UDATA, gen_empty_udata_cb);
+ gen_wrapped(from, PLUGIN_GEN_CB_UDATA, gen_empty_udata_cb_no_rwg);
+ gen_wrapped(from, PLUGIN_GEN_CB_UDATA_R, gen_empty_udata_cb_no_wg);
gen_wrapped(from, PLUGIN_GEN_CB_INLINE, gen_empty_inline_cb);
break;
default:
@@ -588,6 +603,12 @@ static void plugin_gen_tb_udata(const struct qemu_plugin_tb *ptb,
inject_udata_cb(ptb->cbs[PLUGIN_CB_REGULAR], begin_op);
}
+static void plugin_gen_tb_udata_r(const struct qemu_plugin_tb *ptb,
+ TCGOp *begin_op)
+{
+ inject_udata_cb(ptb->cbs[PLUGIN_CB_REGULAR_R], begin_op);
+}
+
static void plugin_gen_tb_inline(const struct qemu_plugin_tb *ptb,
TCGOp *begin_op)
{
@@ -602,6 +623,14 @@ static void plugin_gen_insn_udata(const struct qemu_plugin_tb *ptb,
inject_udata_cb(insn->cbs[PLUGIN_CB_INSN][PLUGIN_CB_REGULAR], begin_op);
}
+static void plugin_gen_insn_udata_r(const struct qemu_plugin_tb *ptb,
+ TCGOp *begin_op, int insn_idx)
+{
+ struct qemu_plugin_insn *insn = g_ptr_array_index(ptb->insns, insn_idx);
+
+ inject_udata_cb(insn->cbs[PLUGIN_CB_INSN][PLUGIN_CB_REGULAR_R], begin_op);
+}
+
static void plugin_gen_insn_inline(const struct qemu_plugin_tb *ptb,
TCGOp *begin_op, int insn_idx)
{
@@ -721,6 +750,9 @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
case PLUGIN_GEN_CB_UDATA:
plugin_gen_tb_udata(plugin_tb, op);
break;
+ case PLUGIN_GEN_CB_UDATA_R:
+ plugin_gen_tb_udata_r(plugin_tb, op);
+ break;
case PLUGIN_GEN_CB_INLINE:
plugin_gen_tb_inline(plugin_tb, op);
break;
@@ -737,6 +769,9 @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
case PLUGIN_GEN_CB_UDATA:
plugin_gen_insn_udata(plugin_tb, op, insn_idx);
break;
+ case PLUGIN_GEN_CB_UDATA_R:
+ plugin_gen_insn_udata_r(plugin_tb, op, insn_idx);
+ break;
case PLUGIN_GEN_CB_INLINE:
plugin_gen_insn_inline(plugin_tb, op, insn_idx);
break;
diff --git a/plugins/api.c b/plugins/api.c
index 5521b0ad36c..ac39cdea0b3 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -89,7 +89,11 @@ void qemu_plugin_register_vcpu_tb_exec_cb(struct qemu_plugin_tb *tb,
void *udata)
{
if (!tb->mem_only) {
- plugin_register_dyn_cb__udata(&tb->cbs[PLUGIN_CB_REGULAR],
+ int index = flags == QEMU_PLUGIN_CB_R_REGS ||
+ flags == QEMU_PLUGIN_CB_RW_REGS ?
+ PLUGIN_CB_REGULAR_R : PLUGIN_CB_REGULAR;
+
+ plugin_register_dyn_cb__udata(&tb->cbs[index],
cb, flags, udata);
}
}
@@ -109,7 +113,11 @@ void qemu_plugin_register_vcpu_insn_exec_cb(struct qemu_plugin_insn *insn,
void *udata)
{
if (!insn->mem_only) {
- plugin_register_dyn_cb__udata(&insn->cbs[PLUGIN_CB_INSN][PLUGIN_CB_REGULAR],
+ int index = flags == QEMU_PLUGIN_CB_R_REGS ||
+ flags == QEMU_PLUGIN_CB_RW_REGS ?
+ PLUGIN_CB_REGULAR_R : PLUGIN_CB_REGULAR;
+
+ plugin_register_dyn_cb__udata(&insn->cbs[PLUGIN_CB_INSN][index],
cb, flags, udata);
}
}
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 37/43] gdbstub: expose api to find registers
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (35 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 36/43] plugins: Use different helpers when reading registers Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 38/43] plugins: add an API to read registers Alex Bennée
` (6 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
Expose an internal API to QEMU to return all the registers for a vCPU.
The list containing the details required to called gdb_read_register().
Based-on: <20231025093128.33116-15-akihiko.odaki@daynix.com>
Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
v2
- just make gdb_get_register_list return everything for a vCPU
vAJB:
This principle difference is the find registers is a single call which
can return a) multiple registers and b) is agnostic to the gdb
feature. This is because I haven't so far found any duplicate
registers in the system so I thing the regname by itself should be
enough. However I do expose the gdb feature name in case the caller
wants to do some additional filtering.
---
include/exec/gdbstub.h | 47 +++++++++++++++++++++++++++++++++++
gdbstub/gdbstub.c | 56 +++++++++++++++++++++++++++++++++++++++++-
2 files changed, 102 insertions(+), 1 deletion(-)
diff --git a/include/exec/gdbstub.h b/include/exec/gdbstub.h
index da9ddfe54c5..7bddea8259e 100644
--- a/include/exec/gdbstub.h
+++ b/include/exec/gdbstub.h
@@ -111,6 +111,53 @@ void gdb_feature_builder_end(const GDBFeatureBuilder *builder);
*/
const GDBFeature *gdb_find_static_feature(const char *xmlname);
+/**
+ * gdb_find_feature() - Find a feature associated with a CPU.
+ * @cpu: The CPU associated with the feature.
+ * @name: The feature's name.
+ *
+ * Return: The feature's number.
+ */
+int gdb_find_feature(CPUState *cpu, const char *name);
+
+/**
+ * gdb_find_feature_register() - Find a register associated with a CPU.
+ * @cpu: The CPU associated with the register.
+ * @feature: The feature's number returned by gdb_find_feature().
+ * @name: The register's name.
+ *
+ * Return: The register's number.
+ */
+int gdb_find_feature_register(CPUState *cpu, int feature, const char *name);
+
+/**
+ * gdb_read_register() - Read a register associated with a CPU.
+ * @cpu: The CPU associated with the register.
+ * @buf: The buffer that the read register will be appended to.
+ * @reg: The register's number returned by gdb_find_feature_register().
+ *
+ * Return: The number of read bytes.
+ */
+int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
+
+/**
+ * typedef GDBRegDesc - a register description from gdbstub
+ */
+typedef struct {
+ int gdb_reg;
+ const char *name;
+ const char *feature_name;
+} GDBRegDesc;
+
+/**
+ * gdb_get_register_list() - Return list of all registers for CPU
+ * @cpu: The CPU being searched
+ *
+ * Returns a GArray of GDBRegDesc, caller frees array but not the
+ * const strings.
+ */
+GArray *gdb_get_register_list(CPUState *cpu);
+
void gdb_set_stop_cpu(CPUState *cpu);
/* in gdbstub-xml.c, generated by scripts/feature_to_c.py */
diff --git a/gdbstub/gdbstub.c b/gdbstub/gdbstub.c
index 420ab2a3766..b0230138246 100644
--- a/gdbstub/gdbstub.c
+++ b/gdbstub/gdbstub.c
@@ -490,7 +490,61 @@ const GDBFeature *gdb_find_static_feature(const char *xmlname)
g_assert_not_reached();
}
-static int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
+int gdb_find_feature(CPUState *cpu, const char *name)
+{
+ GDBRegisterState *r;
+
+ for (guint i = 0; i < cpu->gdb_regs->len; i++) {
+ r = &g_array_index(cpu->gdb_regs, GDBRegisterState, i);
+ if (!strcmp(name, r->feature->name)) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+int gdb_find_feature_register(CPUState *cpu, int feature, const char *name)
+{
+ GDBRegisterState *r;
+
+ r = &g_array_index(cpu->gdb_regs, GDBRegisterState, feature);
+
+ for (int i = 0; i < r->feature->num_regs; i++) {
+ if (r->feature->regs[i] && !strcmp(name, r->feature->regs[i])) {
+ return r->base_reg + i;
+ }
+ }
+
+ return -1;
+}
+
+GArray *gdb_get_register_list(CPUState *cpu)
+{
+ GArray *results = g_array_new(true, true, sizeof(GDBRegDesc));
+
+ /* registers are only available once the CPU is initialised */
+ if (!cpu->gdb_regs) {
+ return results;
+ }
+
+ for (int f = 0; f < cpu->gdb_regs->len; f++) {
+ GDBRegisterState *r = &g_array_index(cpu->gdb_regs, GDBRegisterState, f);
+ for (int i = 0; i < r->feature->num_regs; i++) {
+ const char *name = r->feature->regs[i];
+ GDBRegDesc desc = {
+ r->base_reg + i,
+ name,
+ r->feature->name
+ };
+ g_array_append_val(results, desc);
+ }
+ }
+
+ return results;
+}
+
+int gdb_read_register(CPUState *cpu, GByteArray *buf, int reg)
{
CPUClass *cc = CPU_GET_CLASS(cpu);
GDBRegisterState *r;
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 38/43] plugins: add an API to read registers
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (36 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 37/43] gdbstub: expose api to find registers Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-04 12:05 ` Akihiko Odaki
` (2 more replies)
2024-01-03 17:33 ` [PATCH v2 39/43] contrib/plugins: fix imatch Alex Bennée
` (5 subsequent siblings)
43 siblings, 3 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
We can only request a list of registers once the vCPU has been
initialised so the user needs to use either call the get function on
vCPU initialisation or during the translation phase.
We don't expose the reg number to the plugin instead hiding it behind
an opaque handle. This allows for a bit of future proofing should the
internals need to be changed while also being hashed against the
CPUClass so we can handle different register sets per-vCPU in
hetrogenous situations.
Having an internal state within the plugins also allows us to expand
the interface in future (for example providing callbacks on register
change if the translator can track changes).
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1706
Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
Based-on: <20231025093128.33116-18-akihiko.odaki@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
v3
- also g_intern_string the register name
- make get_registers documentation a bit less verbose
v2
- use new get whole list api, and expose upwards
vAJB:
The main difference to Akikio's version is hiding the gdb register
detail from the plugin for the reasons described above.
---
include/qemu/qemu-plugin.h | 51 +++++++++++++++++-
plugins/api.c | 102 +++++++++++++++++++++++++++++++++++
plugins/qemu-plugins.symbols | 2 +
3 files changed, 153 insertions(+), 2 deletions(-)
diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
index 4daab6efd29..95380895f81 100644
--- a/include/qemu/qemu-plugin.h
+++ b/include/qemu/qemu-plugin.h
@@ -11,6 +11,7 @@
#ifndef QEMU_QEMU_PLUGIN_H
#define QEMU_QEMU_PLUGIN_H
+#include <glib.h>
#include <inttypes.h>
#include <stdbool.h>
#include <stddef.h>
@@ -227,8 +228,8 @@ struct qemu_plugin_insn;
* @QEMU_PLUGIN_CB_R_REGS: callback reads the CPU's regs
* @QEMU_PLUGIN_CB_RW_REGS: callback reads and writes the CPU's regs
*
- * Note: currently unused, plugins cannot read or change system
- * register state.
+ * Note: currently QEMU_PLUGIN_CB_RW_REGS is unused, plugins cannot change
+ * system register state.
*/
enum qemu_plugin_cb_flags {
QEMU_PLUGIN_CB_NO_REGS,
@@ -708,4 +709,50 @@ uint64_t qemu_plugin_end_code(void);
QEMU_PLUGIN_API
uint64_t qemu_plugin_entry_code(void);
+/** struct qemu_plugin_register - Opaque handle for register access */
+struct qemu_plugin_register;
+
+/**
+ * typedef qemu_plugin_reg_descriptor - register descriptions
+ *
+ * @handle: opaque handle for retrieving value with qemu_plugin_read_register
+ * @name: register name
+ * @feature: optional feature descriptor, can be NULL
+ */
+typedef struct {
+ struct qemu_plugin_register *handle;
+ const char *name;
+ const char *feature;
+} qemu_plugin_reg_descriptor;
+
+/**
+ * qemu_plugin_get_registers() - return register list for vCPU
+ * @vcpu_index: vcpu to query
+ *
+ * Returns a GArray of qemu_plugin_reg_descriptor or NULL. Caller
+ * frees the array (but not the const strings).
+ *
+ * Should be used from a qemu_plugin_register_vcpu_init_cb() callback
+ * after the vCPU is initialised.
+ */
+GArray * qemu_plugin_get_registers(unsigned int vcpu_index);
+
+/**
+ * qemu_plugin_read_register() - read register
+ *
+ * @vcpu: vcpu index
+ * @handle: a @qemu_plugin_reg_handle handle
+ * @buf: A GByteArray for the data owned by the plugin
+ *
+ * This function is only available in a context that register read access is
+ * explicitly requested.
+ *
+ * Returns the size of the read register. The content of @buf is in target byte
+ * order. On failure returns -1
+ */
+int qemu_plugin_read_register(unsigned int vcpu,
+ struct qemu_plugin_register *handle,
+ GByteArray *buf);
+
+
#endif /* QEMU_QEMU_PLUGIN_H */
diff --git a/plugins/api.c b/plugins/api.c
index ac39cdea0b3..f8905325c43 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -8,6 +8,7 @@
*
* qemu_plugin_tb
* qemu_plugin_insn
+ * qemu_plugin_register
*
* Which can then be passed back into the API to do additional things.
* As such all the public functions in here are exported in
@@ -35,10 +36,12 @@
*/
#include "qemu/osdep.h"
+#include "qemu/main-loop.h"
#include "qemu/plugin.h"
#include "qemu/log.h"
#include "tcg/tcg.h"
#include "exec/exec-all.h"
+#include "exec/gdbstub.h"
#include "exec/ram_addr.h"
#include "disas/disas.h"
#include "plugin.h"
@@ -435,3 +438,102 @@ uint64_t qemu_plugin_entry_code(void)
#endif
return entry;
}
+
+/*
+ * Register handles
+ *
+ * The plugin infrastructure keeps hold of these internal data
+ * structures which are presented to plugins as opaque handles. They
+ * are global to the system and therefor additions to the hash table
+ * must be protected by the @reg_handle_lock.
+ *
+ * In order to future proof for up-coming heterogeneous work we want
+ * different entries for each CPU type while sharing them in the
+ * common case of multiple cores of the same type.
+ */
+
+static QemuMutex reg_handle_lock;
+
+struct qemu_plugin_register {
+ const char *name;
+ int gdb_reg_num;
+};
+
+static GHashTable *reg_handles; /* hash table of PluginReg */
+
+/* Generate a stable key - would xxhash be overkill? */
+static gpointer cpu_plus_reg_to_key(CPUState *cs, int gdb_regnum)
+{
+ uintptr_t key = (uintptr_t) cs->cc;
+ key ^= gdb_regnum;
+ return GUINT_TO_POINTER(key);
+}
+
+/*
+ * Create register handles.
+ *
+ * We need to create a handle for each register so the plugin
+ * infrastructure can call gdbstub to read a register. We also
+ * construct a result array with those handles and some ancillary data
+ * the plugin might find useful.
+ */
+
+static GArray * create_register_handles(CPUState *cs, GArray *gdbstub_regs) {
+ GArray *find_data = g_array_new(true, true, sizeof(qemu_plugin_reg_descriptor));
+
+ WITH_QEMU_LOCK_GUARD(®_handle_lock) {
+
+ if (!reg_handles) {
+ reg_handles = g_hash_table_new(g_direct_hash, g_direct_equal);
+ }
+
+ for (int i=0; i < gdbstub_regs->len; i++) {
+ GDBRegDesc *grd = &g_array_index(gdbstub_regs, GDBRegDesc, i);
+ gpointer key = cpu_plus_reg_to_key(cs, grd->gdb_reg);
+ struct qemu_plugin_register *val = g_hash_table_lookup(reg_handles, key);
+
+ /* Doesn't exist, create one */
+ if (!val) {
+ val = g_new0(struct qemu_plugin_register, 1);
+ val->gdb_reg_num = grd->gdb_reg;
+ val->name = g_intern_string(grd->name);
+
+ g_hash_table_insert(reg_handles, key, val);
+ }
+
+ /* Create a record for the plugin */
+ qemu_plugin_reg_descriptor desc = {
+ .handle = val,
+ .name = val->name,
+ .feature = g_intern_string(grd->feature_name)
+ };
+ g_array_append_val(find_data, desc);
+ }
+ }
+
+ return find_data;
+}
+
+GArray * qemu_plugin_get_registers(unsigned int vcpu)
+{
+ CPUState *cs = qemu_get_cpu(vcpu);
+ if (cs) {
+ g_autoptr(GArray) regs = gdb_get_register_list(cs);
+ return regs->len ? create_register_handles(cs, regs) : NULL;
+ } else {
+ return NULL;
+ }
+}
+
+int qemu_plugin_read_register(unsigned int vcpu, struct qemu_plugin_register *reg, GByteArray *buf)
+{
+ CPUState *cs = qemu_get_cpu(vcpu);
+ /* assert with debugging on? */
+ return gdb_read_register(cs, buf, reg->gdb_reg_num);
+}
+
+static void __attribute__((__constructor__)) qemu_api_init(void)
+{
+ qemu_mutex_init(®_handle_lock);
+
+}
diff --git a/plugins/qemu-plugins.symbols b/plugins/qemu-plugins.symbols
index 71f6c90549d..6963585c1ea 100644
--- a/plugins/qemu-plugins.symbols
+++ b/plugins/qemu-plugins.symbols
@@ -3,6 +3,7 @@
qemu_plugin_end_code;
qemu_plugin_entry_code;
qemu_plugin_get_hwaddr;
+ qemu_plugin_get_registers;
qemu_plugin_hwaddr_device_name;
qemu_plugin_hwaddr_is_io;
qemu_plugin_hwaddr_phys_addr;
@@ -20,6 +21,7 @@
qemu_plugin_n_vcpus;
qemu_plugin_outs;
qemu_plugin_path_to_binary;
+ qemu_plugin_read_register;
qemu_plugin_register_atexit_cb;
qemu_plugin_register_flush_cb;
qemu_plugin_register_vcpu_exit_cb;
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 39/43] contrib/plugins: fix imatch
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (37 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 38/43] plugins: add an API to read registers Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:47 ` Philippe Mathieu-Daudé
2024-01-03 17:33 ` [PATCH v2 40/43] contrib/plugins: extend execlog to track register changes Alex Bennée
` (4 subsequent siblings)
43 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
We can't directly save the ephemeral imatch from argv as that memory
will get recycled.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
contrib/plugins/execlog.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/contrib/plugins/execlog.c b/contrib/plugins/execlog.c
index 82dc2f584e2..f262e5555eb 100644
--- a/contrib/plugins/execlog.c
+++ b/contrib/plugins/execlog.c
@@ -199,7 +199,7 @@ static void parse_insn_match(char *match)
if (!imatches) {
imatches = g_ptr_array_new();
}
- g_ptr_array_add(imatches, match);
+ g_ptr_array_add(imatches, g_strdup(match));
}
static void parse_vaddr_match(char *match)
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 40/43] contrib/plugins: extend execlog to track register changes
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (38 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 39/43] contrib/plugins: fix imatch Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-05 10:40 ` Frédéric Pétrot
2024-01-03 17:33 ` [PATCH v2 41/43] contrib/plugins: optimise the register value tracking Alex Bennée
` (3 subsequent siblings)
43 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
With the new plugin register API we can now track changes to register
values. Currently the implementation is fairly dumb which will slow
down if a large number of register values are being tracked. This
could be improved by only instrumenting instructions which mention
registers we are interested in tracking.
Example usage:
./qemu-aarch64 -D plugin.log -d plugin \
-cpu max,sve256=on \
-plugin contrib/plugins/libexeclog.so,reg=sp,reg=z\* \
./tests/tcg/aarch64-linux-user/sha512-sve
will display in the execlog any changes to the stack pointer (sp) and
the SVE Z registers.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
Based-On: <20231025093128.33116-19-akihiko.odaki@daynix.com>
---
v3
- prefix 0x to register value
v2
- we now do the glob-like search in the plugin itself.
- fix some erroneous cpus->cpu
vAJB:
Changes for the new API with a simpler glob based "reg" specifier
which can be specified multiple times.
---
docs/devel/tcg-plugins.rst | 9 +-
contrib/plugins/execlog.c | 189 ++++++++++++++++++++++++++++---------
2 files changed, 153 insertions(+), 45 deletions(-)
diff --git a/docs/devel/tcg-plugins.rst b/docs/devel/tcg-plugins.rst
index 81dcd43a612..3a0962723d7 100644
--- a/docs/devel/tcg-plugins.rst
+++ b/docs/devel/tcg-plugins.rst
@@ -497,6 +497,14 @@ arguments if required::
$ qemu-system-arm $(QEMU_ARGS) \
-plugin ./contrib/plugins/libexeclog.so,ifilter=st1w,afilter=0x40001808 -d plugin
+This plugin can also dump registers when they change value. Specify the name of the
+registers with multiple ``reg`` options. You can also use glob style matching if you wish::
+
+ $ qemu-system-arm $(QEMU_ARGS) \
+ -plugin ./contrib/plugins/libexeclog.so,reg=\*_el2,reg=sp -d plugin
+
+Be aware that each additional register to check will slow down execution quite considerably.
+
- contrib/plugins/cache.c
Cache modelling plugin that measures the performance of a given L1 cache
@@ -583,4 +591,3 @@ The following API is generated from the inline documentation in
include the full kernel-doc annotations.
.. kernel-doc:: include/qemu/qemu-plugin.h
-
diff --git a/contrib/plugins/execlog.c b/contrib/plugins/execlog.c
index f262e5555eb..c20e88a6941 100644
--- a/contrib/plugins/execlog.c
+++ b/contrib/plugins/execlog.c
@@ -1,7 +1,7 @@
/*
* Copyright (C) 2021, Alexandre Iooss <erdnaxe@crans.org>
*
- * Log instruction execution with memory access.
+ * Log instruction execution with memory access and register changes
*
* License: GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
@@ -15,30 +15,29 @@
#include <qemu-plugin.h>
+typedef struct {
+ struct qemu_plugin_register *handle;
+ GByteArray *last;
+ GByteArray *new;
+ const char *name;
+} Register;
+
+typedef struct CPU {
+ /* Store last executed instruction on each vCPU as a GString */
+ GString *last_exec;
+ /* Ptr array of Register */
+ GPtrArray *registers;
+} CPU;
+
QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
-/* Store last executed instruction on each vCPU as a GString */
-static GPtrArray *last_exec;
+static CPU *cpus;
+static int num_cpus;
static GRWLock expand_array_lock;
static GPtrArray *imatches;
static GArray *amatches;
-
-/*
- * Expand last_exec array.
- *
- * As we could have multiple threads trying to do this we need to
- * serialise the expansion under a lock.
- */
-static void expand_last_exec(int cpu_index)
-{
- g_rw_lock_writer_lock(&expand_array_lock);
- while (cpu_index >= last_exec->len) {
- GString *s = g_string_new(NULL);
- g_ptr_array_add(last_exec, s);
- }
- g_rw_lock_writer_unlock(&expand_array_lock);
-}
+static GPtrArray *rmatches;
/**
* Add memory read or write information to current instruction log
@@ -50,8 +49,8 @@ static void vcpu_mem(unsigned int cpu_index, qemu_plugin_meminfo_t info,
/* Find vCPU in array */
g_rw_lock_reader_lock(&expand_array_lock);
- g_assert(cpu_index < last_exec->len);
- s = g_ptr_array_index(last_exec, cpu_index);
+ g_assert(cpu_index < num_cpus);
+ s = cpus[cpu_index].last_exec;
g_rw_lock_reader_unlock(&expand_array_lock);
/* Indicate type of memory access */
@@ -77,28 +76,46 @@ static void vcpu_mem(unsigned int cpu_index, qemu_plugin_meminfo_t info,
*/
static void vcpu_insn_exec(unsigned int cpu_index, void *udata)
{
- GString *s;
+ CPU *cpu;
- /* Find or create vCPU in array */
g_rw_lock_reader_lock(&expand_array_lock);
- if (cpu_index >= last_exec->len) {
- g_rw_lock_reader_unlock(&expand_array_lock);
- expand_last_exec(cpu_index);
- g_rw_lock_reader_lock(&expand_array_lock);
- }
- s = g_ptr_array_index(last_exec, cpu_index);
+ g_assert(cpu_index < num_cpus);
+ cpu = &cpus[cpu_index];
g_rw_lock_reader_unlock(&expand_array_lock);
/* Print previous instruction in cache */
- if (s->len) {
- qemu_plugin_outs(s->str);
+ if (cpu->last_exec->len) {
+ if (cpu->registers) {
+ for (int n = 0; n < cpu->registers->len; n++) {
+ Register *reg = cpu->registers->pdata[n];
+ int sz;
+
+ g_byte_array_set_size(reg->new, 0);
+ sz = qemu_plugin_read_register(cpu_index, reg->handle, reg->new);
+ g_assert(sz == reg->last->len);
+
+ if (memcmp(reg->last->data, reg->new->data, sz)) {
+ GByteArray *temp = reg->last;
+ g_string_append_printf(cpu->last_exec, ", %s -> 0x", reg->name);
+ /* TODO: handle BE properly */
+ for (int i = sz; i >= 0; i--) {
+ g_string_append_printf(cpu->last_exec, "%02x",
+ reg->new->data[i]);
+ }
+ reg->last = reg->new;
+ reg->new = temp;
+ }
+ }
+ }
+
+ qemu_plugin_outs(cpu->last_exec->str);
qemu_plugin_outs("\n");
}
/* Store new instruction in cache */
/* vcpu_mem will add memory access information to last_exec */
- g_string_printf(s, "%u, ", cpu_index);
- g_string_append(s, (char *)udata);
+ g_string_printf(cpus[cpu_index].last_exec, "%u, ", cpu_index);
+ g_string_append(cpus[cpu_index].last_exec, (char *)udata);
}
/**
@@ -167,8 +184,10 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
QEMU_PLUGIN_MEM_RW, NULL);
/* Register callback on instruction */
- qemu_plugin_register_vcpu_insn_exec_cb(insn, vcpu_insn_exec,
- QEMU_PLUGIN_CB_NO_REGS, output);
+ qemu_plugin_register_vcpu_insn_exec_cb(
+ insn, vcpu_insn_exec,
+ rmatches ? QEMU_PLUGIN_CB_R_REGS : QEMU_PLUGIN_CB_NO_REGS,
+ output);
/* reset skip */
skip = (imatches || amatches);
@@ -177,17 +196,86 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
}
}
+static Register *init_vcpu_register(int vcpu_index,
+ qemu_plugin_reg_descriptor *desc)
+{
+ Register *reg = g_new0(Register, 1);
+ int r;
+
+ reg->handle = desc->handle;
+ reg->name = g_strdup(desc->name);
+ reg->last = g_byte_array_new();
+ reg->new = g_byte_array_new();
+
+ /* read the initial value */
+ r = qemu_plugin_read_register(vcpu_index, reg->handle, reg->last);
+ g_assert(r > 0);
+ return reg;
+}
+
+static registers_init(int vcpu_index)
+{
+ GPtrArray *registers = g_ptr_array_new();
+ g_autoptr(GArray) reg_list = qemu_plugin_get_registers(vcpu_index);
+
+ if (reg_list && reg_list->len) {
+ /*
+ * Go through each register in the complete list and
+ * see if we want to track it.
+ */
+ for (int r = 0; r < reg_list->len; r++) {
+ qemu_plugin_reg_descriptor *rd = &g_array_index(
+ reg_list, qemu_plugin_reg_descriptor, r);
+ for (int p = 0; p < rmatches->len; p++) {
+ g_autoptr(GPatternSpec) pat = g_pattern_spec_new(rmatches->pdata[p]);
+ if (g_pattern_match_string(pat, rd->name)) {
+ Register *reg = init_vcpu_register(vcpu_index, rd);
+ g_ptr_array_add(registers, reg);
+ }
+ }
+ }
+ }
+ cpus[num_cpus].registers = registers;
+}
+
+/*
+ * Initialise a new vcpu/thread with:
+ * - last_exec tracking data
+ * - list of tracked registers
+ * - initial value of registers
+ *
+ * As we could have multiple threads trying to do this we need to
+ * serialise the expansion under a lock.
+ */
+static void vcpu_init(qemu_plugin_id_t id, unsigned int vcpu_index)
+{
+ g_rw_lock_writer_lock(&expand_array_lock);
+
+ if (vcpu_index >= num_cpus) {
+ cpus = g_realloc_n(cpus, vcpu_index + 1, sizeof(*cpus));
+ while (vcpu_index >= num_cpus) {
+ cpus[num_cpus].last_exec = g_string_new(NULL);
+
+ /* Any registers to track? */
+ if (rmatches && rmatches->len) {
+ registers_init(vcpu_index);
+ }
+ num_cpus++;
+ }
+ }
+
+ g_rw_lock_writer_unlock(&expand_array_lock);
+}
+
/**
* On plugin exit, print last instruction in cache
*/
static void plugin_exit(qemu_plugin_id_t id, void *p)
{
guint i;
- GString *s;
- for (i = 0; i < last_exec->len; i++) {
- s = g_ptr_array_index(last_exec, i);
- if (s->str) {
- qemu_plugin_outs(s->str);
+ for (i = 0; i < num_cpus; i++) {
+ if (cpus[i].last_exec->str) {
+ qemu_plugin_outs(cpus[i].last_exec->str);
qemu_plugin_outs("\n");
}
}
@@ -212,6 +300,18 @@ static void parse_vaddr_match(char *match)
g_array_append_val(amatches, v);
}
+/*
+ * We have to wait until vCPUs are started before we can check the
+ * patterns find anything.
+ */
+static void add_regpat(char *regpat)
+{
+ if (!rmatches) {
+ rmatches = g_ptr_array_new();
+ }
+ g_ptr_array_add(rmatches, g_strdup(regpat));
+}
+
/**
* Install the plugin
*/
@@ -224,9 +324,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
* we don't know the size before emulation.
*/
if (info->system_emulation) {
- last_exec = g_ptr_array_sized_new(info->system.max_vcpus);
- } else {
- last_exec = g_ptr_array_new();
+ cpus = g_new(CPU, info->system.max_vcpus);
}
for (int i = 0; i < argc; i++) {
@@ -236,13 +334,16 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
parse_insn_match(tokens[1]);
} else if (g_strcmp0(tokens[0], "afilter") == 0) {
parse_vaddr_match(tokens[1]);
+ } else if (g_strcmp0(tokens[0], "reg") == 0) {
+ add_regpat(tokens[1]);
} else {
fprintf(stderr, "option parsing failed: %s\n", opt);
return -1;
}
}
- /* Register translation block and exit callbacks */
+ /* Register init, translation block and exit callbacks */
+ qemu_plugin_register_vcpu_init_cb(id, vcpu_init);
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 41/43] contrib/plugins: optimise the register value tracking
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (39 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 40/43] contrib/plugins: extend execlog to track register changes Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 42/43] docs/devel: lift example and plugin API sections up Alex Bennée
` (2 subsequent siblings)
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
This adds an additional flag which attempts to optimise the register
tracking by only instrumenting instructions which are likely to change
its value. This relies on the disassembler showing up the register
names in disassembly so is only enabled when asked for.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
docs/devel/tcg-plugins.rst | 10 +-
contrib/plugins/execlog.c | 189 ++++++++++++++++++++++++++++++-------
2 files changed, 165 insertions(+), 34 deletions(-)
diff --git a/docs/devel/tcg-plugins.rst b/docs/devel/tcg-plugins.rst
index 3a0962723d7..fa7421279f5 100644
--- a/docs/devel/tcg-plugins.rst
+++ b/docs/devel/tcg-plugins.rst
@@ -503,7 +503,15 @@ registers with multiple ``reg`` options. You can also use glob style matching if
$ qemu-system-arm $(QEMU_ARGS) \
-plugin ./contrib/plugins/libexeclog.so,reg=\*_el2,reg=sp -d plugin
-Be aware that each additional register to check will slow down execution quite considerably.
+Be aware that each additional register to check will slow down
+execution quite considerably. You can optimise the number of register
+checks done by using the rdisas option. This will only instrument
+instructions that mention the registers in question in disassembly.
+This is not foolproof as some instructions implicitly change
+instructions. You can use the ifilter to catch these cases:
+
+ $ qemu-system-arm $(QEMU_ARGS) \
+ -plugin ./contrib/plugins/libexeclog.so,ifilter=msr,ifilter=blr,reg=x30,reg=\*_el1,rdisas=on
- contrib/plugins/cache.c
diff --git a/contrib/plugins/execlog.c b/contrib/plugins/execlog.c
index c20e88a6941..a5269baf067 100644
--- a/contrib/plugins/execlog.c
+++ b/contrib/plugins/execlog.c
@@ -27,6 +27,7 @@ typedef struct CPU {
GString *last_exec;
/* Ptr array of Register */
GPtrArray *registers;
+ int index;
} CPU;
QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
@@ -38,6 +39,9 @@ static GRWLock expand_array_lock;
static GPtrArray *imatches;
static GArray *amatches;
static GPtrArray *rmatches;
+static bool disas_assist;
+static GMutex add_reg_name_lock;
+static GPtrArray *all_reg_names;
/**
* Add memory read or write information to current instruction log
@@ -72,9 +76,14 @@ static void vcpu_mem(unsigned int cpu_index, qemu_plugin_meminfo_t info,
}
/**
- * Log instruction execution
+ * Log instruction execution, outputting the last one.
+ *
+ * vcpu_insn_exec() is a copy and paste of vcpu_insn_exec_with_regs()
+ * without the checking of register values when we've attempted to
+ * optimise with disas_assist.
*/
-static void vcpu_insn_exec(unsigned int cpu_index, void *udata)
+
+static CPU *get_cpu(int cpu_index)
{
CPU *cpu;
@@ -83,39 +92,87 @@ static void vcpu_insn_exec(unsigned int cpu_index, void *udata)
cpu = &cpus[cpu_index];
g_rw_lock_reader_unlock(&expand_array_lock);
+ return cpu;
+}
+
+static void insn_check_regs(CPU *cpu) {
+ for (int n = 0; n < cpu->registers->len; n++) {
+ Register *reg = cpu->registers->pdata[n];
+ int sz;
+
+ g_byte_array_set_size(reg->new, 0);
+ sz = qemu_plugin_read_register(cpu->index, reg->handle, reg->new);
+ g_assert(sz == reg->last->len);
+
+ if (memcmp(reg->last->data, reg->new->data, sz)) {
+ GByteArray *temp = reg->last;
+ g_string_append_printf(cpu->last_exec, ", %s -> 0x", reg->name);
+ /* TODO: handle BE properly */
+ for (int i = sz; i >= 0; i--) {
+ g_string_append_printf(cpu->last_exec, "%02x",
+ reg->new->data[i]);
+ }
+ reg->last = reg->new;
+ reg->new = temp;
+ }
+ }
+}
+
+/* Log last instruction while checking registers */
+static void vcpu_insn_exec_with_regs(unsigned int cpu_index, void *udata)
+{
+ CPU *cpu = get_cpu(cpu_index);
+
/* Print previous instruction in cache */
if (cpu->last_exec->len) {
if (cpu->registers) {
- for (int n = 0; n < cpu->registers->len; n++) {
- Register *reg = cpu->registers->pdata[n];
- int sz;
-
- g_byte_array_set_size(reg->new, 0);
- sz = qemu_plugin_read_register(cpu_index, reg->handle, reg->new);
- g_assert(sz == reg->last->len);
-
- if (memcmp(reg->last->data, reg->new->data, sz)) {
- GByteArray *temp = reg->last;
- g_string_append_printf(cpu->last_exec, ", %s -> 0x", reg->name);
- /* TODO: handle BE properly */
- for (int i = sz; i >= 0; i--) {
- g_string_append_printf(cpu->last_exec, "%02x",
- reg->new->data[i]);
- }
- reg->last = reg->new;
- reg->new = temp;
- }
- }
+ insn_check_regs(cpu);
+ }
+
+ qemu_plugin_outs(cpu->last_exec->str);
+ qemu_plugin_outs("\n");
+ }
+
+ /* Store new instruction in cache */
+ /* vcpu_mem will add memory access information to last_exec */
+ g_string_printf(cpu->last_exec, "%u, ", cpu_index);
+ g_string_append(cpu->last_exec, (char *)udata);
+}
+
+/* Log last instruction while checking registers, ignore next */
+static void vcpu_insn_exec_only_regs(unsigned int cpu_index, void *udata)
+{
+ CPU *cpu = get_cpu(cpu_index);
+
+ /* Print previous instruction in cache */
+ if (cpu->last_exec->len) {
+ if (cpu->registers) {
+ insn_check_regs(cpu);
}
qemu_plugin_outs(cpu->last_exec->str);
qemu_plugin_outs("\n");
}
+ /* reset */
+ cpu->last_exec->len = 0;
+}
+
+/* Log last instruction without checking regs, setup next */
+static void vcpu_insn_exec(unsigned int cpu_index, void *udata)
+{
+ CPU *cpu = get_cpu(cpu_index);
+
+ /* Print previous instruction in cache */
+ if (cpu->last_exec->len) {
+ qemu_plugin_outs(cpu->last_exec->str);
+ qemu_plugin_outs("\n");
+ }
+
/* Store new instruction in cache */
/* vcpu_mem will add memory access information to last_exec */
- g_string_printf(cpus[cpu_index].last_exec, "%u, ", cpu_index);
- g_string_append(cpus[cpu_index].last_exec, (char *)udata);
+ g_string_printf(cpu->last_exec, "%u, ", cpu_index);
+ g_string_append(cpu->last_exec, (char *)udata);
}
/**
@@ -128,6 +185,8 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
{
struct qemu_plugin_insn *insn;
bool skip = (imatches || amatches);
+ bool check_regs_this = rmatches;
+ bool check_regs_next = false;
size_t n = qemu_plugin_tb_n_insns(tb);
for (size_t i = 0; i < n; i++) {
@@ -148,7 +207,8 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
/*
* If we are filtering we better check out if we have any
* hits. The skip "latches" so we can track memory accesses
- * after the instruction we care about.
+ * after the instruction we care about. Also enable register
+ * checking on the next instruction.
*/
if (skip && imatches) {
int j;
@@ -156,6 +216,7 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
char *m = g_ptr_array_index(imatches, j);
if (g_str_has_prefix(insn_disas, m)) {
skip = false;
+ check_regs_next = rmatches;
}
}
}
@@ -170,8 +231,38 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
}
}
+ /*
+ * Check the disassembly to see if a register we care about
+ * will be affected by this instruction. This relies on the
+ * dissembler doing something sensible for the registers we
+ * care about.
+ */
+ if (disas_assist && rmatches) {
+ check_regs_next = false;
+ gchar *args = g_strstr_len(insn_disas, -1, " ");
+ for (int n = 0; n < all_reg_names->len; n++) {
+ gchar *reg = g_ptr_array_index(all_reg_names, n);
+ if (g_strrstr(args, reg)) {
+ check_regs_next = true;
+ skip = false;
+ }
+ }
+ }
+
+ /*
+ * We now have 3 choices:
+ *
+ * Log this instruction normally
+ * Log this instruction checking for register changes
+ * Don't log this instruction but check for register changes from the last one
+ */
+
if (skip) {
- g_free(insn_disas);
+ if (check_regs_this) {
+ qemu_plugin_register_vcpu_insn_exec_cb(insn,
+ vcpu_insn_exec_only_regs,
+ QEMU_PLUGIN_CB_R_REGS, NULL);
+ }
} else {
uint32_t insn_opcode;
insn_opcode = *((uint32_t *)qemu_plugin_insn_data(insn));
@@ -184,15 +275,28 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
QEMU_PLUGIN_MEM_RW, NULL);
/* Register callback on instruction */
- qemu_plugin_register_vcpu_insn_exec_cb(
- insn, vcpu_insn_exec,
- rmatches ? QEMU_PLUGIN_CB_R_REGS : QEMU_PLUGIN_CB_NO_REGS,
- output);
+ if (check_regs_this) {
+ qemu_plugin_register_vcpu_insn_exec_cb(
+ insn, vcpu_insn_exec_with_regs,
+ QEMU_PLUGIN_CB_R_REGS,
+ output);
+ } else {
+ qemu_plugin_register_vcpu_insn_exec_cb(
+ insn, vcpu_insn_exec,
+ QEMU_PLUGIN_CB_NO_REGS,
+ output);
+ }
/* reset skip */
skip = (imatches || amatches);
}
+ /* set regs for next */
+ if (disas_assist && rmatches) {
+ check_regs_this = check_regs_next;
+ }
+
+ g_free(insn_disas);
}
}
@@ -200,10 +304,11 @@ static Register *init_vcpu_register(int vcpu_index,
qemu_plugin_reg_descriptor *desc)
{
Register *reg = g_new0(Register, 1);
+ g_autofree gchar *lower = g_utf8_strdown(desc->name, -1);
int r;
reg->handle = desc->handle;
- reg->name = g_strdup(desc->name);
+ reg->name = g_intern_string(lower);
reg->last = g_byte_array_new();
reg->new = g_byte_array_new();
@@ -213,7 +318,7 @@ static Register *init_vcpu_register(int vcpu_index,
return reg;
}
-static registers_init(int vcpu_index)
+static void registers_init(int vcpu_index)
{
GPtrArray *registers = g_ptr_array_new();
g_autoptr(GArray) reg_list = qemu_plugin_get_registers(vcpu_index);
@@ -228,9 +333,20 @@ static registers_init(int vcpu_index)
reg_list, qemu_plugin_reg_descriptor, r);
for (int p = 0; p < rmatches->len; p++) {
g_autoptr(GPatternSpec) pat = g_pattern_spec_new(rmatches->pdata[p]);
- if (g_pattern_match_string(pat, rd->name)) {
+ g_autofree gchar *rd_lower = g_utf8_strdown(rd->name, -1);
+ if (g_pattern_match_string(pat, rd->name) ||
+ g_pattern_match_string(pat, rd_lower)) {
Register *reg = init_vcpu_register(vcpu_index, rd);
g_ptr_array_add(registers, reg);
+
+ /* we need a list of regnames at TB translation time */
+ if (disas_assist) {
+ g_mutex_lock(&add_reg_name_lock);
+ if (!g_ptr_array_find(all_reg_names, reg->name, NULL)) {
+ g_ptr_array_add(all_reg_names, reg->name);
+ }
+ g_mutex_unlock(&add_reg_name_lock);
+ }
}
}
}
@@ -254,6 +370,7 @@ static void vcpu_init(qemu_plugin_id_t id, unsigned int vcpu_index)
if (vcpu_index >= num_cpus) {
cpus = g_realloc_n(cpus, vcpu_index + 1, sizeof(*cpus));
while (vcpu_index >= num_cpus) {
+ cpus[num_cpus].index = vcpu_index;
cpus[num_cpus].last_exec = g_string_new(NULL);
/* Any registers to track? */
@@ -336,6 +453,12 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
parse_vaddr_match(tokens[1]);
} else if (g_strcmp0(tokens[0], "reg") == 0) {
add_regpat(tokens[1]);
+ } else if (g_strcmp0(tokens[0], "rdisas") == 0) {
+ if (!qemu_plugin_bool_parse(tokens[0], tokens[1], &disas_assist)) {
+ fprintf(stderr, "boolean argument parsing failed: %s\n", opt);
+ return -1;
+ }
+ all_reg_names = g_ptr_array_new();
} else {
fprintf(stderr, "option parsing failed: %s\n", opt);
return -1;
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 42/43] docs/devel: lift example and plugin API sections up
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (40 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 41/43] contrib/plugins: optimise the register value tracking Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-09 14:25 ` Pierrick Bouvier
2024-01-11 14:01 ` Philippe Mathieu-Daudé
2024-01-03 17:33 ` [PATCH v2 43/43] docs/devel: document some plugin assumptions Alex Bennée
2024-01-11 12:37 ` [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
43 siblings, 2 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
This makes them a bit more visible in the TCG emulation menu rather
than hiding them away bellow the ToC limit.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
docs/devel/tcg-plugins.rst | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/docs/devel/tcg-plugins.rst b/docs/devel/tcg-plugins.rst
index fa7421279f5..535a74684c5 100644
--- a/docs/devel/tcg-plugins.rst
+++ b/docs/devel/tcg-plugins.rst
@@ -143,7 +143,7 @@ requested. The plugin isn't completely uninstalled until the safe work
has executed while all vCPUs are quiescent.
Example Plugins
----------------
+===============
There are a number of plugins included with QEMU and you are
encouraged to contribute your own plugins plugins upstream. There is a
@@ -591,8 +591,8 @@ The plugin has a number of arguments, all of them are optional:
configuration arguments implies ``l2=on``.
(default: N = 2097152 (2MB), B = 64, A = 16)
-API
----
+Plugin API
+==========
The following API is generated from the inline documentation in
``include/qemu/qemu-plugin.h``. Please ensure any updates to the API
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* [PATCH v2 43/43] docs/devel: document some plugin assumptions
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (41 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 42/43] docs/devel: lift example and plugin API sections up Alex Bennée
@ 2024-01-03 17:33 ` Alex Bennée
2024-01-09 14:28 ` Pierrick Bouvier
2024-01-11 12:37 ` [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
43 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-03 17:33 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
Alex Bennée, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
While we attempt to hide implementation details from the plugin we
shouldn't be totally obtuse. Let the user know what they can and can't
expect with the various instrumentation options.
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
docs/devel/tcg-plugins.rst | 49 ++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/docs/devel/tcg-plugins.rst b/docs/devel/tcg-plugins.rst
index 535a74684c5..9cc09d8c3da 100644
--- a/docs/devel/tcg-plugins.rst
+++ b/docs/devel/tcg-plugins.rst
@@ -112,6 +112,55 @@ details are opaque to plugins. The plugin is able to query select
details of instructions and system configuration only through the
exported *qemu_plugin* functions.
+However the following assumptions can be made:
+
+Translation Blocks
+++++++++++++++++++
+
+All code will go through a translation phase although not all
+translations will be necessarily be executed. You need to instrument
+actual executions to track what is happening.
+
+It is quite normal to see the same address translated multiple times.
+If you want to track the code in system emulation you should examine
+the underlying physical address (``qemu_plugin_insn_haddr``) to take
+into account the effects of virtual memory although if the system does
+paging this will change too.
+
+Not all instructions in a block will always execute so if its
+important to track individual instruction execution you need to
+instrument them directly. However asynchronous interrupts will not
+change control flow mid-block.
+
+Instructions
+++++++++++++
+
+Instruction instrumentation runs before the instruction executes. You
+can be can be sure the instruction will be dispatched, but you can't
+be sure it will complete. Generally this will be because of a
+synchronous exception (e.g. SIGILL) triggered by the instruction
+attempting to execute. If you want to be sure you will need to
+instrument the next instruction as well. See the ``execlog.c`` plugin
+for examples of how to track this and finalise details after execution.
+
+Memory Accesses
++++++++++++++++
+
+Memory callbacks are called after a successful load or store.
+Unsuccessful operations (i.e. faults) will not be visible to memory
+instrumentation although the execution side effects can be observed
+(e.g. entering a exception handler).
+
+System Idle and Resume States
++++++++++++++++++++++++++++++
+
+The ``qemu_plugin_register_vcpu_idle_cb`` and
+``qemu_plugin_register_vcpu_resume_cb`` functions can be used to track
+when CPUs go into and return from sleep states when waiting for
+external I/O. Be aware though that these may occur less frequently
+than in real HW due to the inefficiencies of emulation giving less
+chance for the CPU to idle.
+
Internals
---------
--
2.39.2
^ permalink raw reply related [flat|nested] 76+ messages in thread
* Re: [PATCH v2 08/43] qtest: bump npcm7xx_pwn-test timeout to 5 minutes
2024-01-03 17:33 ` [PATCH v2 08/43] qtest: bump npcm7xx_pwn-test timeout to 5 minutes Alex Bennée
@ 2024-01-03 17:40 ` Philippe Mathieu-Daudé
2024-01-08 10:50 ` Thomas Huth
2024-01-08 12:26 ` Ilya Leoshkevich
1 sibling, 1 reply; 76+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-01-03 17:40 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
On 3/1/24 18:33, Alex Bennée wrote:
> From: Daniel P. Berrangé <berrange@redhat.com>
>
> The npcm7xx_pwn-test takes 3 & 1/2 minutes in a --enable-debug build.
> Bumping to 5 minutes will give more headroom.
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> Message-ID: <20230717182859.707658-5-berrange@redhat.com>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> Message-Id: <20231215070357.10888-5-thuth@redhat.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> tests/qtest/meson.build | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
> index 000ac54b7d6..84cec0a847d 100644
> --- a/tests/qtest/meson.build
> +++ b/tests/qtest/meson.build
> @@ -1,7 +1,7 @@
> slow_qtests = {
> 'bios-tables-test' : 120,
> 'migration-test' : 480,
> - 'npcm7xx_pwm-test': 150,
> + 'npcm7xx_pwm-test': 300,
The tests seem parallelizable, maybe this file could be split?
> 'qom-test' : 900,
> 'test-hmp' : 120,
> }
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 10/43] qtest: bump pxe-test timeout to 10 minutes
2024-01-03 17:33 ` [PATCH v2 10/43] qtest: bump pxe-test timeout to 10 minutes Alex Bennée
@ 2024-01-03 17:43 ` Philippe Mathieu-Daudé
2024-01-04 9:31 ` Daniel P. Berrangé
0 siblings, 1 reply; 76+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-01-03 17:43 UTC (permalink / raw)
To: Alex Bennée, qemu-devel, Daniel P. Berrangé
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
Hi Daniel,
On 3/1/24 18:33, Alex Bennée wrote:
> From: Daniel P. Berrangé <berrange@redhat.com>
>
> The pxe-test uses the boot_sector_test() function, and that already
> uses a timeout of 600 seconds. So adjust the timeout on the meson
> side accordingly.
IIRC few years ago you said tests running on CI ('Tier-1') should
respect a time limit. IMO 10min seems too much for CI, should this
test be skipped there?
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> [thuth: Bump timeout to 600s and adjust commit description]
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> Message-Id: <20231215070357.10888-7-thuth@redhat.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> tests/qtest/meson.build | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
> index 7a4160df046..ec93d5a384f 100644
> --- a/tests/qtest/meson.build
> +++ b/tests/qtest/meson.build
> @@ -4,6 +4,7 @@ slow_qtests = {
> 'npcm7xx_pwm-test': 300,
> 'qom-test' : 900,
> 'test-hmp' : 240,
> + 'pxe-test': 600,
> }
>
> qtests_generic = [
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 39/43] contrib/plugins: fix imatch
2024-01-03 17:33 ` [PATCH v2 39/43] contrib/plugins: fix imatch Alex Bennée
@ 2024-01-03 17:47 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 76+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-01-03 17:47 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
On 3/1/24 18:33, Alex Bennée wrote:
> We can't directly save the ephemeral imatch from argv as that memory
> will get recycled.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> contrib/plugins/execlog.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/contrib/plugins/execlog.c b/contrib/plugins/execlog.c
> index 82dc2f584e2..f262e5555eb 100644
> --- a/contrib/plugins/execlog.c
> +++ b/contrib/plugins/execlog.c
> @@ -199,7 +199,7 @@ static void parse_insn_match(char *match)
Could 'match' become const?
> if (!imatches) {
> imatches = g_ptr_array_new();
> }
> - g_ptr_array_add(imatches, match);
> + g_ptr_array_add(imatches, g_strdup(match));
> }
>
> static void parse_vaddr_match(char *match)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 30/43] gdbstub: Use GDBFeature for GDBRegisterState
2024-01-03 17:33 ` [PATCH v2 30/43] gdbstub: Use GDBFeature for GDBRegisterState Alex Bennée
@ 2024-01-03 17:50 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 76+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-01-03 17:50 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Akihiko Odaki
On 3/1/24 18:33, Alex Bennée wrote:
> From: Akihiko Odaki <akihiko.odaki@daynix.com>
>
> Simplify GDBRegisterState by replacing num_regs and xml members with
> one member that points to GDBFeature.
>
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
> Message-Id: <20231213-gdb-v17-5-777047380591@daynix.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> gdbstub/gdbstub.c | 14 ++++++--------
> 1 file changed, 6 insertions(+), 8 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 10/43] qtest: bump pxe-test timeout to 10 minutes
2024-01-03 17:43 ` Philippe Mathieu-Daudé
@ 2024-01-04 9:31 ` Daniel P. Berrangé
0 siblings, 0 replies; 76+ messages in thread
From: Daniel P. Berrangé @ 2024-01-04 9:31 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Alex Bennée, qemu-devel, qemu-s390x, qemu-ppc,
Richard Henderson, Song Gao, Marc-André Lureau,
David Hildenbrand, Aurelien Jarno, Yoshinori Sato, Yanan Wang,
Bin Meng, Laurent Vivier, Michael Rolnik, Alexandre Iooss,
David Woodhouse, Laurent Vivier, Paolo Bonzini, Brian Cain,
Daniel Henrique Barboza, Beraldo Leal, Paul Durrant,
Mahmoud Mandour, Thomas Huth, Liu Zhiwei, Cleber Rosa, kvm,
Peter Maydell, Wainer dos Santos Moschetta, qemu-arm, Weiwei Li,
John Snow, Daniel Henrique Barboza, Nicholas Piggin,
Palmer Dabbelt, Marcel Apfelbaum, Ilya Leoshkevich,
Cédric Le Goater, Edgar E. Iglesias, Eduardo Habkost,
Pierrick Bouvier, qemu-riscv, Alistair Francis
On Wed, Jan 03, 2024 at 06:43:52PM +0100, Philippe Mathieu-Daudé wrote:
> Hi Daniel,
>
> On 3/1/24 18:33, Alex Bennée wrote:
> > From: Daniel P. Berrangé <berrange@redhat.com>
> >
> > The pxe-test uses the boot_sector_test() function, and that already
> > uses a timeout of 600 seconds. So adjust the timeout on the meson
> > side accordingly.
>
> IIRC few years ago you said tests running on CI ('Tier-1') should
> respect a time limit. IMO 10min seems too much for CI, should this
> test be skipped there?
This isn't going to take 10 minutes in reality. We're setting timeouts
such that we avoid false-failures in the extreme worst case scenarios.
>
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > [thuth: Bump timeout to 600s and adjust commit description]
> > Signed-off-by: Thomas Huth <thuth@redhat.com>
> > Message-Id: <20231215070357.10888-7-thuth@redhat.com>
> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> > ---
> > tests/qtest/meson.build | 1 +
> > 1 file changed, 1 insertion(+)
> >
> > diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
> > index 7a4160df046..ec93d5a384f 100644
> > --- a/tests/qtest/meson.build
> > +++ b/tests/qtest/meson.build
> > @@ -4,6 +4,7 @@ slow_qtests = {
> > 'npcm7xx_pwm-test': 300,
> > 'qom-test' : 900,
> > 'test-hmp' : 240,
> > + 'pxe-test': 600,
> > }
> > qtests_generic = [
>
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 38/43] plugins: add an API to read registers
2024-01-03 17:33 ` [PATCH v2 38/43] plugins: add an API to read registers Alex Bennée
@ 2024-01-04 12:05 ` Akihiko Odaki
2024-01-04 12:22 ` Alex Bennée
2024-01-09 15:05 ` Pierrick Bouvier
2024-01-12 3:49 ` Pierrick Bouvier
2 siblings, 1 reply; 76+ messages in thread
From: Akihiko Odaki @ 2024-01-04 12:05 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, Pierrick Bouvier, qemu-riscv,
Alistair Francis
On 2024/01/04 2:33, Alex Bennée wrote:
> We can only request a list of registers once the vCPU has been
> initialised so the user needs to use either call the get function on
> vCPU initialisation or during the translation phase.
>
> We don't expose the reg number to the plugin instead hiding it behind
> an opaque handle. This allows for a bit of future proofing should the
> internals need to be changed while also being hashed against the
> CPUClass so we can handle different register sets per-vCPU in
> hetrogenous situations.
>
> Having an internal state within the plugins also allows us to expand
> the interface in future (for example providing callbacks on register
> change if the translator can track changes).
>
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1706
> Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
> Based-on: <20231025093128.33116-18-akihiko.odaki@daynix.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>
> ---
> v3
> - also g_intern_string the register name
> - make get_registers documentation a bit less verbose
> v2
> - use new get whole list api, and expose upwards
>
> vAJB:
>
> The main difference to Akikio's version is hiding the gdb register
> detail from the plugin for the reasons described above.
> ---
> include/qemu/qemu-plugin.h | 51 +++++++++++++++++-
> plugins/api.c | 102 +++++++++++++++++++++++++++++++++++
> plugins/qemu-plugins.symbols | 2 +
> 3 files changed, 153 insertions(+), 2 deletions(-)
>
> diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
> index 4daab6efd29..95380895f81 100644
> --- a/include/qemu/qemu-plugin.h
> +++ b/include/qemu/qemu-plugin.h
> @@ -11,6 +11,7 @@
> #ifndef QEMU_QEMU_PLUGIN_H
> #define QEMU_QEMU_PLUGIN_H
>
> +#include <glib.h>
> #include <inttypes.h>
> #include <stdbool.h>
> #include <stddef.h>
> @@ -227,8 +228,8 @@ struct qemu_plugin_insn;
> * @QEMU_PLUGIN_CB_R_REGS: callback reads the CPU's regs
> * @QEMU_PLUGIN_CB_RW_REGS: callback reads and writes the CPU's regs
> *
> - * Note: currently unused, plugins cannot read or change system
> - * register state.
> + * Note: currently QEMU_PLUGIN_CB_RW_REGS is unused, plugins cannot change
> + * system register state.
> */
> enum qemu_plugin_cb_flags {
> QEMU_PLUGIN_CB_NO_REGS,
> @@ -708,4 +709,50 @@ uint64_t qemu_plugin_end_code(void);
> QEMU_PLUGIN_API
> uint64_t qemu_plugin_entry_code(void);
>
> +/** struct qemu_plugin_register - Opaque handle for register access */
> +struct qemu_plugin_register;
Just in case you missed my comment for the earlier version:
What about identifying a register with an index in an array returned
by qemu_plugin_get_registers(). That saves troubles having the handle
member in qemu_plugin_reg_descriptor.
Regards,
Akihiko Odaki
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 38/43] plugins: add an API to read registers
2024-01-04 12:05 ` Akihiko Odaki
@ 2024-01-04 12:22 ` Alex Bennée
2024-01-04 13:22 ` Akihiko Odaki
0 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-04 12:22 UTC (permalink / raw)
To: Akihiko Odaki
Cc: qemu-devel, qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, Pierrick Bouvier, qemu-riscv,
Alistair Francis
Akihiko Odaki <akihiko.odaki@daynix.com> writes:
> On 2024/01/04 2:33, Alex Bennée wrote:
>> We can only request a list of registers once the vCPU has been
>> initialised so the user needs to use either call the get function on
>> vCPU initialisation or during the translation phase.
>> We don't expose the reg number to the plugin instead hiding it
>> behind
>> an opaque handle. This allows for a bit of future proofing should the
>> internals need to be changed while also being hashed against the
>> CPUClass so we can handle different register sets per-vCPU in
>> hetrogenous situations.
>> Having an internal state within the plugins also allows us to expand
>> the interface in future (for example providing callbacks on register
>> change if the translator can track changes).
>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1706
>> Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
>> Based-on: <20231025093128.33116-18-akihiko.odaki@daynix.com>
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> ---
>> v3
>> - also g_intern_string the register name
>> - make get_registers documentation a bit less verbose
>> v2
>> - use new get whole list api, and expose upwards
>> vAJB:
>> The main difference to Akikio's version is hiding the gdb register
>> detail from the plugin for the reasons described above.
>> ---
>> include/qemu/qemu-plugin.h | 51 +++++++++++++++++-
>> plugins/api.c | 102 +++++++++++++++++++++++++++++++++++
>> plugins/qemu-plugins.symbols | 2 +
>> 3 files changed, 153 insertions(+), 2 deletions(-)
>> diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
>> index 4daab6efd29..95380895f81 100644
>> --- a/include/qemu/qemu-plugin.h
>> +++ b/include/qemu/qemu-plugin.h
>> @@ -11,6 +11,7 @@
>> #ifndef QEMU_QEMU_PLUGIN_H
>> #define QEMU_QEMU_PLUGIN_H
>> +#include <glib.h>
>> #include <inttypes.h>
>> #include <stdbool.h>
>> #include <stddef.h>
>> @@ -227,8 +228,8 @@ struct qemu_plugin_insn;
>> * @QEMU_PLUGIN_CB_R_REGS: callback reads the CPU's regs
>> * @QEMU_PLUGIN_CB_RW_REGS: callback reads and writes the CPU's regs
>> *
>> - * Note: currently unused, plugins cannot read or change system
>> - * register state.
>> + * Note: currently QEMU_PLUGIN_CB_RW_REGS is unused, plugins cannot change
>> + * system register state.
>> */
>> enum qemu_plugin_cb_flags {
>> QEMU_PLUGIN_CB_NO_REGS,
>> @@ -708,4 +709,50 @@ uint64_t qemu_plugin_end_code(void);
>> QEMU_PLUGIN_API
>> uint64_t qemu_plugin_entry_code(void);
>> +/** struct qemu_plugin_register - Opaque handle for register
>> access */
>> +struct qemu_plugin_register;
>
> Just in case you missed my comment for the earlier version:
>
> What about identifying a register with an index in an array returned
> by qemu_plugin_get_registers(). That saves troubles having the handle
> member in qemu_plugin_reg_descriptor.
The handle gets de-referenced internally in the plugin api and
additional checking could be added there. If we pass an index then we'd
end up having to track the index assigned during get_registers as well
as account for a potential skew in the index value if the register
layout varies between vCPUs (although I admit this is future proofing
for potential heterogeneous models).
The concept of opaque handle == pointer is fairly common in the QEMU
code base. We are not making it hard for a plugin author to bypass this
"protection", just making it clear if you do so your violating the
principle of the API.
>
> Regards,
> Akihiko Odaki
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 38/43] plugins: add an API to read registers
2024-01-04 12:22 ` Alex Bennée
@ 2024-01-04 13:22 ` Akihiko Odaki
0 siblings, 0 replies; 76+ messages in thread
From: Akihiko Odaki @ 2024-01-04 13:22 UTC (permalink / raw)
To: Alex Bennée
Cc: qemu-devel, qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, Pierrick Bouvier, qemu-riscv,
Alistair Francis
On 2024/01/04 21:22, Alex Bennée wrote:
> Akihiko Odaki <akihiko.odaki@daynix.com> writes:
>
>> On 2024/01/04 2:33, Alex Bennée wrote:
>>> We can only request a list of registers once the vCPU has been
>>> initialised so the user needs to use either call the get function on
>>> vCPU initialisation or during the translation phase.
>>> We don't expose the reg number to the plugin instead hiding it
>>> behind
>>> an opaque handle. This allows for a bit of future proofing should the
>>> internals need to be changed while also being hashed against the
>>> CPUClass so we can handle different register sets per-vCPU in
>>> hetrogenous situations.
>>> Having an internal state within the plugins also allows us to expand
>>> the interface in future (for example providing callbacks on register
>>> change if the translator can track changes).
>>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1706
>>> Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
>>> Based-on: <20231025093128.33116-18-akihiko.odaki@daynix.com>
>>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>>> ---
>>> v3
>>> - also g_intern_string the register name
>>> - make get_registers documentation a bit less verbose
>>> v2
>>> - use new get whole list api, and expose upwards
>>> vAJB:
>>> The main difference to Akikio's version is hiding the gdb register
>>> detail from the plugin for the reasons described above.
>>> ---
>>> include/qemu/qemu-plugin.h | 51 +++++++++++++++++-
>>> plugins/api.c | 102 +++++++++++++++++++++++++++++++++++
>>> plugins/qemu-plugins.symbols | 2 +
>>> 3 files changed, 153 insertions(+), 2 deletions(-)
>>> diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
>>> index 4daab6efd29..95380895f81 100644
>>> --- a/include/qemu/qemu-plugin.h
>>> +++ b/include/qemu/qemu-plugin.h
>>> @@ -11,6 +11,7 @@
>>> #ifndef QEMU_QEMU_PLUGIN_H
>>> #define QEMU_QEMU_PLUGIN_H
>>> +#include <glib.h>
>>> #include <inttypes.h>
>>> #include <stdbool.h>
>>> #include <stddef.h>
>>> @@ -227,8 +228,8 @@ struct qemu_plugin_insn;
>>> * @QEMU_PLUGIN_CB_R_REGS: callback reads the CPU's regs
>>> * @QEMU_PLUGIN_CB_RW_REGS: callback reads and writes the CPU's regs
>>> *
>>> - * Note: currently unused, plugins cannot read or change system
>>> - * register state.
>>> + * Note: currently QEMU_PLUGIN_CB_RW_REGS is unused, plugins cannot change
>>> + * system register state.
>>> */
>>> enum qemu_plugin_cb_flags {
>>> QEMU_PLUGIN_CB_NO_REGS,
>>> @@ -708,4 +709,50 @@ uint64_t qemu_plugin_end_code(void);
>>> QEMU_PLUGIN_API
>>> uint64_t qemu_plugin_entry_code(void);
>>> +/** struct qemu_plugin_register - Opaque handle for register
>>> access */
>>> +struct qemu_plugin_register;
>>
>> Just in case you missed my comment for the earlier version:
>>
>> What about identifying a register with an index in an array returned
>> by qemu_plugin_get_registers(). That saves troubles having the handle
>> member in qemu_plugin_reg_descriptor.
>
> The handle gets de-referenced internally in the plugin api and
> additional checking could be added there. If we pass an index then we'd
> end up having to track the index assigned during get_registers as well
> as account for a potential skew in the index value if the register
> layout varies between vCPUs (although I admit this is future proofing
> for potential heterogeneous models).
>
> The concept of opaque handle == pointer is fairly common in the QEMU
> code base. We are not making it hard for a plugin author to bypass this
> "protection", just making it clear if you do so your violating the
> principle of the API.
Now I get the idea. Indeed index values are not guaranteed to be stable
across CPUs.
Why don't you pass gdb_reg_num as is then? qemu_plugin_register has the
name member, but it's unused so gdb_reg_num is effectively the only
member we need. You can even cast gdb_reg_num to (struct
qemu_plugin_register *), but I don't think pointers are more opaque or
future-proof than integers.
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 40/43] contrib/plugins: extend execlog to track register changes
2024-01-03 17:33 ` [PATCH v2 40/43] contrib/plugins: extend execlog to track register changes Alex Bennée
@ 2024-01-05 10:40 ` Frédéric Pétrot
2024-01-11 12:24 ` Alex Bennée
0 siblings, 1 reply; 76+ messages in thread
From: Frédéric Pétrot @ 2024-01-05 10:40 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, Pierrick Bouvier, qemu-riscv,
Alistair Francis, Akihiko Odaki
Hello Alex,
just reporting below what might be a riscv only oddity (also applies to
patch 41 but easier to report here).
Le 03/01/2024 à 18:33, Alex Bennée a écrit :
> With the new plugin register API we can now track changes to register
> values. Currently the implementation is fairly dumb which will slow
> down if a large number of register values are being tracked. This
> could be improved by only instrumenting instructions which mention
> registers we are interested in tracking.
>
> Example usage:
>
> ./qemu-aarch64 -D plugin.log -d plugin \
> -cpu max,sve256=on \
> -plugin contrib/plugins/libexeclog.so,reg=sp,reg=z\* \
> ./tests/tcg/aarch64-linux-user/sha512-sve
>
> will display in the execlog any changes to the stack pointer (sp) and
> the SVE Z registers.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
> Based-On: <20231025093128.33116-19-akihiko.odaki@daynix.com>
> +static registers_init(int vcpu_index)
> +{
> + GPtrArray *registers = g_ptr_array_new();
> + g_autoptr(GArray) reg_list = qemu_plugin_get_registers(vcpu_index);
> +
> + if (reg_list && reg_list->len) {
> + /*
> + * Go through each register in the complete list and
> + * see if we want to track it.
> + */
> + for (int r = 0; r < reg_list->len; r++) {
> + qemu_plugin_reg_descriptor *rd = &g_array_index(
> + reg_list, qemu_plugin_reg_descriptor, r);
riscv csrs are not continously numbered and the dynamically generated gdb xml
seems to follow that scheme.
So the calls to Glib string functions output quite a few assertion
warnings because for the non existing csrs rd->name is NULL (and there
are a bit less than 4000 such cases for rv64g).
Checking for NULL and then continue is a simple way to solve the issue, but
I am not sure this is the proper way to proceed, as it might stand in the
generation of the riscv xml description for gdb.
Cheers,
Frédéric
> + for (int p = 0; p < rmatches->len; p++) {
> + g_autoptr(GPatternSpec) pat = g_pattern_spec_new(rmatches->pdata[p]);
> + if (g_pattern_match_string(pat, rd->name)) {
> + Register *reg = init_vcpu_register(vcpu_index, rd);
> + g_ptr_array_add(registers, reg);
> + }
> + }
> + }
> + }
> + cpus[num_cpus].registers = registers;
> +}
>
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 08/43] qtest: bump npcm7xx_pwn-test timeout to 5 minutes
2024-01-03 17:40 ` Philippe Mathieu-Daudé
@ 2024-01-08 10:50 ` Thomas Huth
0 siblings, 0 replies; 76+ messages in thread
From: Thomas Huth @ 2024-01-08 10:50 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Liu Zhiwei, Cleber Rosa, kvm,
Peter Maydell, Wainer dos Santos Moschetta, qemu-arm, Weiwei Li,
John Snow, Daniel Henrique Barboza, Nicholas Piggin,
Palmer Dabbelt, Marcel Apfelbaum, Ilya Leoshkevich,
Cédric Le Goater, Edgar E. Iglesias, Eduardo Habkost,
Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
On 03/01/2024 18.40, Philippe Mathieu-Daudé wrote:
> On 3/1/24 18:33, Alex Bennée wrote:
>> From: Daniel P. Berrangé <berrange@redhat.com>
>>
>> The npcm7xx_pwn-test takes 3 & 1/2 minutes in a --enable-debug build.
>> Bumping to 5 minutes will give more headroom.
>>
>> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
>> Reviewed-by: Thomas Huth <thuth@redhat.com>
>> Message-ID: <20230717182859.707658-5-berrange@redhat.com>
>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>> Message-Id: <20231215070357.10888-5-thuth@redhat.com>
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> ---
>> tests/qtest/meson.build | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
>> index 000ac54b7d6..84cec0a847d 100644
>> --- a/tests/qtest/meson.build
>> +++ b/tests/qtest/meson.build
>> @@ -1,7 +1,7 @@
>> slow_qtests = {
>> 'bios-tables-test' : 120,
>> 'migration-test' : 480,
>> - 'npcm7xx_pwm-test': 150,
>> + 'npcm7xx_pwm-test': 300,
>
> The tests seem parallelizable, maybe this file could be split?
I've submitted another patch that speeds it up by default quite a bit:
https://gitlab.com/qemu-project/qemu/-/commit/71dc6ca2a8fa0eca8ab8e87e
Let's see how that goes...
Thomas
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 08/43] qtest: bump npcm7xx_pwn-test timeout to 5 minutes
2024-01-03 17:33 ` [PATCH v2 08/43] qtest: bump npcm7xx_pwn-test timeout to 5 minutes Alex Bennée
2024-01-03 17:40 ` Philippe Mathieu-Daudé
@ 2024-01-08 12:26 ` Ilya Leoshkevich
1 sibling, 0 replies; 76+ messages in thread
From: Ilya Leoshkevich @ 2024-01-08 12:26 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
On Wed, 2024-01-03 at 17:33 +0000, Alex Bennée wrote:
> From: Daniel P. Berrangé <berrange@redhat.com>
>
> The npcm7xx_pwn-test takes 3 & 1/2 minutes in a --enable-debug build.
> Bumping to 5 minutes will give more headroom.
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> Message-ID: <20230717182859.707658-5-berrange@redhat.com>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> Message-Id: <20231215070357.10888-5-thuth@redhat.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> tests/qtest/meson.build | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
> index 000ac54b7d6..84cec0a847d 100644
> --- a/tests/qtest/meson.build
> +++ b/tests/qtest/meson.build
> @@ -1,7 +1,7 @@
> slow_qtests = {
> 'bios-tables-test' : 120,
> 'migration-test' : 480,
> - 'npcm7xx_pwm-test': 150,
> + 'npcm7xx_pwm-test': 300,
> 'qom-test' : 900,
> 'test-hmp' : 120,
> }
Nit: s/pwn/pwm/ in the commit subject and message.
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 23/43] target/riscv: Remove misa_mxl validation
2024-01-03 17:33 ` [PATCH v2 23/43] target/riscv: Remove misa_mxl validation Alex Bennée
@ 2024-01-08 15:42 ` Alex Bennée
2024-01-11 23:29 ` Alistair Francis
0 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-08 15:42 UTC (permalink / raw)
To: qemu-devel
Cc: Palmer Dabbelt, Alistair Francis, Bin Meng, Weiwei Li,
Daniel Henrique Barboza, Liu Zhiwei, qemu-riscv
Alex Bennée <alex.bennee@linaro.org> writes:
> From: Akihiko Odaki <akihiko.odaki@daynix.com>
>
> It is initialized with a simple assignment and there is little room for
> error. In fact, the validation is even more complex.
>
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> Acked-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
> Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> Acked-by: Alistair Francis <alistair.francis@wdc.com>
> Message-Id: <20231213-riscv-v7-2-a760156a337f@daynix.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
ping: along with this are the RiscV maintainers happy for me to take:
[PATCH v2 23/43] target/riscv: Remove misa_mxl validation
[PATCH v2 24/43] target/riscv: Move misa_mxl_max to class
[PATCH v2 25/43] target/riscv: Validate misa_mxl_max only once
through my next pull request?
<snip>
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 36/43] plugins: Use different helpers when reading registers
2024-01-03 17:33 ` [PATCH v2 36/43] plugins: Use different helpers when reading registers Alex Bennée
@ 2024-01-09 14:24 ` Pierrick Bouvier
0 siblings, 0 replies; 76+ messages in thread
From: Pierrick Bouvier @ 2024-01-09 14:24 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, qemu-riscv, Alistair Francis,
Akihiko Odaki
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
On 1/3/24 21:33, Alex Bennée wrote:
> From: Akihiko Odaki <akihiko.odaki@daynix.com>
>
> This avoids optimizations incompatible when reading registers.
>
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> Message-Id: <20231213-gdb-v17-12-777047380591@daynix.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> accel/tcg/plugin-helpers.h | 3 ++-
> include/qemu/plugin.h | 1 +
> accel/tcg/plugin-gen.c | 43 ++++++++++++++++++++++++++++++++++----
> plugins/api.c | 12 +++++++++--
> 4 files changed, 52 insertions(+), 7 deletions(-)
>
> diff --git a/accel/tcg/plugin-helpers.h b/accel/tcg/plugin-helpers.h
> index 8e685e06545..11796436f35 100644
> --- a/accel/tcg/plugin-helpers.h
> +++ b/accel/tcg/plugin-helpers.h
> @@ -1,4 +1,5 @@
> #ifdef CONFIG_PLUGIN
> -DEF_HELPER_FLAGS_2(plugin_vcpu_udata_cb, TCG_CALL_NO_RWG | TCG_CALL_PLUGIN, void, i32, ptr)
> +DEF_HELPER_FLAGS_2(plugin_vcpu_udata_cb_no_wg, TCG_CALL_NO_WG | TCG_CALL_PLUGIN, void, i32, ptr)
> +DEF_HELPER_FLAGS_2(plugin_vcpu_udata_cb_no_rwg, TCG_CALL_NO_RWG | TCG_CALL_PLUGIN, void, i32, ptr)
> DEF_HELPER_FLAGS_4(plugin_vcpu_mem_cb, TCG_CALL_NO_RWG | TCG_CALL_PLUGIN, void, i32, i32, i64, ptr)
> #endif
> diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h
> index 7fdc3a4849f..b0c5ac68293 100644
> --- a/include/qemu/plugin.h
> +++ b/include/qemu/plugin.h
> @@ -73,6 +73,7 @@ enum plugin_dyn_cb_type {
>
> enum plugin_dyn_cb_subtype {
> PLUGIN_CB_REGULAR,
> + PLUGIN_CB_REGULAR_R,
> PLUGIN_CB_INLINE,
> PLUGIN_N_CB_SUBTYPES,
> };
> diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
> index 78b331b2510..b37ce7683e6 100644
> --- a/accel/tcg/plugin-gen.c
> +++ b/accel/tcg/plugin-gen.c
> @@ -79,6 +79,7 @@ enum plugin_gen_from {
>
> enum plugin_gen_cb {
> PLUGIN_GEN_CB_UDATA,
> + PLUGIN_GEN_CB_UDATA_R,
> PLUGIN_GEN_CB_INLINE,
> PLUGIN_GEN_CB_MEM,
> PLUGIN_GEN_ENABLE_MEM_HELPER,
> @@ -90,7 +91,10 @@ enum plugin_gen_cb {
> * These helpers are stubs that get dynamically switched out for calls
> * direct to the plugin if they are subscribed to.
> */
> -void HELPER(plugin_vcpu_udata_cb)(uint32_t cpu_index, void *udata)
> +void HELPER(plugin_vcpu_udata_cb_no_wg)(uint32_t cpu_index, void *udata)
> +{ }
> +
> +void HELPER(plugin_vcpu_udata_cb_no_rwg)(uint32_t cpu_index, void *udata)
> { }
>
> void HELPER(plugin_vcpu_mem_cb)(unsigned int vcpu_index,
> @@ -98,7 +102,7 @@ void HELPER(plugin_vcpu_mem_cb)(unsigned int vcpu_index,
> void *userdata)
> { }
>
> -static void gen_empty_udata_cb(void)
> +static void gen_empty_udata_cb(void (*gen_helper)(TCGv_i32, TCGv_ptr))
> {
> TCGv_i32 cpu_index = tcg_temp_ebb_new_i32();
> TCGv_ptr udata = tcg_temp_ebb_new_ptr();
> @@ -106,12 +110,22 @@ static void gen_empty_udata_cb(void)
> tcg_gen_movi_ptr(udata, 0);
> tcg_gen_ld_i32(cpu_index, tcg_env,
> -offsetof(ArchCPU, env) + offsetof(CPUState, cpu_index));
> - gen_helper_plugin_vcpu_udata_cb(cpu_index, udata);
> + gen_helper(cpu_index, udata);
>
> tcg_temp_free_ptr(udata);
> tcg_temp_free_i32(cpu_index);
> }
>
> +static void gen_empty_udata_cb_no_wg(void)
> +{
> + gen_empty_udata_cb(gen_helper_plugin_vcpu_udata_cb_no_wg);
> +}
> +
> +static void gen_empty_udata_cb_no_rwg(void)
> +{
> + gen_empty_udata_cb(gen_helper_plugin_vcpu_udata_cb_no_rwg);
> +}
> +
> /*
> * For now we only support addi_i64.
> * When we support more ops, we can generate one empty inline cb for each.
> @@ -192,7 +206,8 @@ static void plugin_gen_empty_callback(enum plugin_gen_from from)
> gen_empty_mem_helper);
> /* fall through */
> case PLUGIN_GEN_FROM_TB:
> - gen_wrapped(from, PLUGIN_GEN_CB_UDATA, gen_empty_udata_cb);
> + gen_wrapped(from, PLUGIN_GEN_CB_UDATA, gen_empty_udata_cb_no_rwg);
> + gen_wrapped(from, PLUGIN_GEN_CB_UDATA_R, gen_empty_udata_cb_no_wg);
> gen_wrapped(from, PLUGIN_GEN_CB_INLINE, gen_empty_inline_cb);
> break;
> default:
> @@ -588,6 +603,12 @@ static void plugin_gen_tb_udata(const struct qemu_plugin_tb *ptb,
> inject_udata_cb(ptb->cbs[PLUGIN_CB_REGULAR], begin_op);
> }
>
> +static void plugin_gen_tb_udata_r(const struct qemu_plugin_tb *ptb,
> + TCGOp *begin_op)
> +{
> + inject_udata_cb(ptb->cbs[PLUGIN_CB_REGULAR_R], begin_op);
> +}
> +
> static void plugin_gen_tb_inline(const struct qemu_plugin_tb *ptb,
> TCGOp *begin_op)
> {
> @@ -602,6 +623,14 @@ static void plugin_gen_insn_udata(const struct qemu_plugin_tb *ptb,
> inject_udata_cb(insn->cbs[PLUGIN_CB_INSN][PLUGIN_CB_REGULAR], begin_op);
> }
>
> +static void plugin_gen_insn_udata_r(const struct qemu_plugin_tb *ptb,
> + TCGOp *begin_op, int insn_idx)
> +{
> + struct qemu_plugin_insn *insn = g_ptr_array_index(ptb->insns, insn_idx);
> +
> + inject_udata_cb(insn->cbs[PLUGIN_CB_INSN][PLUGIN_CB_REGULAR_R], begin_op);
> +}
> +
> static void plugin_gen_insn_inline(const struct qemu_plugin_tb *ptb,
> TCGOp *begin_op, int insn_idx)
> {
> @@ -721,6 +750,9 @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
> case PLUGIN_GEN_CB_UDATA:
> plugin_gen_tb_udata(plugin_tb, op);
> break;
> + case PLUGIN_GEN_CB_UDATA_R:
> + plugin_gen_tb_udata_r(plugin_tb, op);
> + break;
> case PLUGIN_GEN_CB_INLINE:
> plugin_gen_tb_inline(plugin_tb, op);
> break;
> @@ -737,6 +769,9 @@ static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
> case PLUGIN_GEN_CB_UDATA:
> plugin_gen_insn_udata(plugin_tb, op, insn_idx);
> break;
> + case PLUGIN_GEN_CB_UDATA_R:
> + plugin_gen_insn_udata_r(plugin_tb, op, insn_idx);
> + break;
> case PLUGIN_GEN_CB_INLINE:
> plugin_gen_insn_inline(plugin_tb, op, insn_idx);
> break;
> diff --git a/plugins/api.c b/plugins/api.c
> index 5521b0ad36c..ac39cdea0b3 100644
> --- a/plugins/api.c
> +++ b/plugins/api.c
> @@ -89,7 +89,11 @@ void qemu_plugin_register_vcpu_tb_exec_cb(struct qemu_plugin_tb *tb,
> void *udata)
> {
> if (!tb->mem_only) {
> - plugin_register_dyn_cb__udata(&tb->cbs[PLUGIN_CB_REGULAR],
> + int index = flags == QEMU_PLUGIN_CB_R_REGS ||
> + flags == QEMU_PLUGIN_CB_RW_REGS ?
> + PLUGIN_CB_REGULAR_R : PLUGIN_CB_REGULAR;
> +
> + plugin_register_dyn_cb__udata(&tb->cbs[index],
> cb, flags, udata);
> }
> }
> @@ -109,7 +113,11 @@ void qemu_plugin_register_vcpu_insn_exec_cb(struct qemu_plugin_insn *insn,
> void *udata)
> {
> if (!insn->mem_only) {
> - plugin_register_dyn_cb__udata(&insn->cbs[PLUGIN_CB_INSN][PLUGIN_CB_REGULAR],
> + int index = flags == QEMU_PLUGIN_CB_R_REGS ||
> + flags == QEMU_PLUGIN_CB_RW_REGS ?
> + PLUGIN_CB_REGULAR_R : PLUGIN_CB_REGULAR;
> +
> + plugin_register_dyn_cb__udata(&insn->cbs[PLUGIN_CB_INSN][index],
> cb, flags, udata);
> }
> }
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 42/43] docs/devel: lift example and plugin API sections up
2024-01-03 17:33 ` [PATCH v2 42/43] docs/devel: lift example and plugin API sections up Alex Bennée
@ 2024-01-09 14:25 ` Pierrick Bouvier
2024-01-11 14:01 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 76+ messages in thread
From: Pierrick Bouvier @ 2024-01-09 14:25 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, qemu-riscv, Alistair Francis
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
On 1/3/24 21:33, Alex Bennée wrote:
> This makes them a bit more visible in the TCG emulation menu rather
> than hiding them away bellow the ToC limit.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> docs/devel/tcg-plugins.rst | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/docs/devel/tcg-plugins.rst b/docs/devel/tcg-plugins.rst
> index fa7421279f5..535a74684c5 100644
> --- a/docs/devel/tcg-plugins.rst
> +++ b/docs/devel/tcg-plugins.rst
> @@ -143,7 +143,7 @@ requested. The plugin isn't completely uninstalled until the safe work
> has executed while all vCPUs are quiescent.
>
> Example Plugins
> ----------------
> +===============
>
> There are a number of plugins included with QEMU and you are
> encouraged to contribute your own plugins plugins upstream. There is a
> @@ -591,8 +591,8 @@ The plugin has a number of arguments, all of them are optional:
> configuration arguments implies ``l2=on``.
> (default: N = 2097152 (2MB), B = 64, A = 16)
>
> -API
> ----
> +Plugin API
> +==========
>
> The following API is generated from the inline documentation in
> ``include/qemu/qemu-plugin.h``. Please ensure any updates to the API
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 43/43] docs/devel: document some plugin assumptions
2024-01-03 17:33 ` [PATCH v2 43/43] docs/devel: document some plugin assumptions Alex Bennée
@ 2024-01-09 14:28 ` Pierrick Bouvier
0 siblings, 0 replies; 76+ messages in thread
From: Pierrick Bouvier @ 2024-01-09 14:28 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, qemu-riscv, Alistair Francis
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
On 1/3/24 21:33, Alex Bennée wrote:
> While we attempt to hide implementation details from the plugin we
> shouldn't be totally obtuse. Let the user know what they can and can't
> expect with the various instrumentation options.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> docs/devel/tcg-plugins.rst | 49 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 49 insertions(+)
>
> diff --git a/docs/devel/tcg-plugins.rst b/docs/devel/tcg-plugins.rst
> index 535a74684c5..9cc09d8c3da 100644
> --- a/docs/devel/tcg-plugins.rst
> +++ b/docs/devel/tcg-plugins.rst
> @@ -112,6 +112,55 @@ details are opaque to plugins. The plugin is able to query select
> details of instructions and system configuration only through the
> exported *qemu_plugin* functions.
>
> +However the following assumptions can be made:
> +
> +Translation Blocks
> +++++++++++++++++++
> +
> +All code will go through a translation phase although not all
> +translations will be necessarily be executed. You need to instrument
> +actual executions to track what is happening.
> +
> +It is quite normal to see the same address translated multiple times.
> +If you want to track the code in system emulation you should examine
> +the underlying physical address (``qemu_plugin_insn_haddr``) to take
> +into account the effects of virtual memory although if the system does
> +paging this will change too.
> +
> +Not all instructions in a block will always execute so if its
> +important to track individual instruction execution you need to
> +instrument them directly. However asynchronous interrupts will not
> +change control flow mid-block.
> +
> +Instructions
> +++++++++++++
> +
> +Instruction instrumentation runs before the instruction executes. You
> +can be can be sure the instruction will be dispatched, but you can't
> +be sure it will complete. Generally this will be because of a
> +synchronous exception (e.g. SIGILL) triggered by the instruction
> +attempting to execute. If you want to be sure you will need to
> +instrument the next instruction as well. See the ``execlog.c`` plugin
> +for examples of how to track this and finalise details after execution.
> +
> +Memory Accesses
> ++++++++++++++++
> +
> +Memory callbacks are called after a successful load or store.
> +Unsuccessful operations (i.e. faults) will not be visible to memory
> +instrumentation although the execution side effects can be observed
> +(e.g. entering a exception handler).
> +
> +System Idle and Resume States
> ++++++++++++++++++++++++++++++
> +
> +The ``qemu_plugin_register_vcpu_idle_cb`` and
> +``qemu_plugin_register_vcpu_resume_cb`` functions can be used to track
> +when CPUs go into and return from sleep states when waiting for
> +external I/O. Be aware though that these may occur less frequently
> +than in real HW due to the inefficiencies of emulation giving less
> +chance for the CPU to idle.
> +
> Internals
> ---------
>
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 38/43] plugins: add an API to read registers
2024-01-03 17:33 ` [PATCH v2 38/43] plugins: add an API to read registers Alex Bennée
2024-01-04 12:05 ` Akihiko Odaki
@ 2024-01-09 15:05 ` Pierrick Bouvier
2024-01-11 12:34 ` Alex Bennée
2024-01-12 3:49 ` Pierrick Bouvier
2 siblings, 1 reply; 76+ messages in thread
From: Pierrick Bouvier @ 2024-01-09 15:05 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, qemu-riscv, Alistair Francis,
Akihiko Odaki
On 1/3/24 21:33, Alex Bennée wrote:
> We can only request a list of registers once the vCPU has been
> initialised so the user needs to use either call the get function on
> vCPU initialisation or during the translation phase.
>
> We don't expose the reg number to the plugin instead hiding it behind
> an opaque handle. This allows for a bit of future proofing should the
> internals need to be changed while also being hashed against the
> CPUClass so we can handle different register sets per-vCPU in
> hetrogenous situations.
>
> Having an internal state within the plugins also allows us to expand
> the interface in future (for example providing callbacks on register
> change if the translator can track changes).
>
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1706
> Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
> Based-on: <20231025093128.33116-18-akihiko.odaki@daynix.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>
> ---
> v3
> - also g_intern_string the register name
> - make get_registers documentation a bit less verbose
> v2
> - use new get whole list api, and expose upwards
>
> vAJB:
>
> The main difference to Akikio's version is hiding the gdb register
> detail from the plugin for the reasons described above.
> ---
> include/qemu/qemu-plugin.h | 51 +++++++++++++++++-
> plugins/api.c | 102 +++++++++++++++++++++++++++++++++++
> plugins/qemu-plugins.symbols | 2 +
> 3 files changed, 153 insertions(+), 2 deletions(-)
>
> diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
> index 4daab6efd29..95380895f81 100644
> --- a/include/qemu/qemu-plugin.h
> +++ b/include/qemu/qemu-plugin.h
> @@ -11,6 +11,7 @@
> #ifndef QEMU_QEMU_PLUGIN_H
> #define QEMU_QEMU_PLUGIN_H
>
> +#include <glib.h>
> #include <inttypes.h>
> #include <stdbool.h>
> #include <stddef.h>
> @@ -227,8 +228,8 @@ struct qemu_plugin_insn;
> * @QEMU_PLUGIN_CB_R_REGS: callback reads the CPU's regs
> * @QEMU_PLUGIN_CB_RW_REGS: callback reads and writes the CPU's regs
> *
> - * Note: currently unused, plugins cannot read or change system
> - * register state.
> + * Note: currently QEMU_PLUGIN_CB_RW_REGS is unused, plugins cannot change
> + * system register state.
> */
> enum qemu_plugin_cb_flags {
> QEMU_PLUGIN_CB_NO_REGS,
> @@ -708,4 +709,50 @@ uint64_t qemu_plugin_end_code(void);
> QEMU_PLUGIN_API
> uint64_t qemu_plugin_entry_code(void);
>
> +/** struct qemu_plugin_register - Opaque handle for register access */
> +struct qemu_plugin_register;
> +
> +/**
> + * typedef qemu_plugin_reg_descriptor - register descriptions
> + *
> + * @handle: opaque handle for retrieving value with qemu_plugin_read_register
> + * @name: register name
> + * @feature: optional feature descriptor, can be NULL
> + */
> +typedef struct {
> + struct qemu_plugin_register *handle;
> + const char *name;
> + const char *feature;
> +} qemu_plugin_reg_descriptor;
> +
> +/**
> + * qemu_plugin_get_registers() - return register list for vCPU
> + * @vcpu_index: vcpu to query
> + *
> + * Returns a GArray of qemu_plugin_reg_descriptor or NULL. Caller
> + * frees the array (but not the const strings).
> + *
> + * Should be used from a qemu_plugin_register_vcpu_init_cb() callback
> + * after the vCPU is initialised.
> + */
> +GArray * qemu_plugin_get_registers(unsigned int vcpu_index);
> +
> +/**
> + * qemu_plugin_read_register() - read register
> + *
> + * @vcpu: vcpu index
> + * @handle: a @qemu_plugin_reg_handle handle
> + * @buf: A GByteArray for the data owned by the plugin
> + *
> + * This function is only available in a context that register read access is
> + * explicitly requested.
> + *
> + * Returns the size of the read register. The content of @buf is in target byte
> + * order. On failure returns -1
> + */
> +int qemu_plugin_read_register(unsigned int vcpu,
> + struct qemu_plugin_register *handle,
> + GByteArray *buf);
> +
> +
> #endif /* QEMU_QEMU_PLUGIN_H */
> diff --git a/plugins/api.c b/plugins/api.c
> index ac39cdea0b3..f8905325c43 100644
> --- a/plugins/api.c
> +++ b/plugins/api.c
> @@ -8,6 +8,7 @@
> *
> * qemu_plugin_tb
> * qemu_plugin_insn
> + * qemu_plugin_register
> *
> * Which can then be passed back into the API to do additional things.
> * As such all the public functions in here are exported in
> @@ -35,10 +36,12 @@
> */
>
> #include "qemu/osdep.h"
> +#include "qemu/main-loop.h"
> #include "qemu/plugin.h"
> #include "qemu/log.h"
> #include "tcg/tcg.h"
> #include "exec/exec-all.h"
> +#include "exec/gdbstub.h"
> #include "exec/ram_addr.h"
> #include "disas/disas.h"
> #include "plugin.h"
> @@ -435,3 +438,102 @@ uint64_t qemu_plugin_entry_code(void)
> #endif
> return entry;
> }
> +
> +/*
> + * Register handles
> + *
> + * The plugin infrastructure keeps hold of these internal data
> + * structures which are presented to plugins as opaque handles. They
> + * are global to the system and therefor additions to the hash table
> + * must be protected by the @reg_handle_lock.
> + *
> + * In order to future proof for up-coming heterogeneous work we want
> + * different entries for each CPU type while sharing them in the
> + * common case of multiple cores of the same type.
> + */
> +
> +static QemuMutex reg_handle_lock;
> +
> +struct qemu_plugin_register {
> + const char *name;
> + int gdb_reg_num;
> +};
> +
> +static GHashTable *reg_handles; /* hash table of PluginReg */
> +
> +/* Generate a stable key - would xxhash be overkill? */
> +static gpointer cpu_plus_reg_to_key(CPUState *cs, int gdb_regnum)
> +{
> + uintptr_t key = (uintptr_t) cs->cc;
> + key ^= gdb_regnum;
> + return GUINT_TO_POINTER(key);
> +}
> +
> +/*
> + * Create register handles.
> + *
> + * We need to create a handle for each register so the plugin
> + * infrastructure can call gdbstub to read a register. We also
> + * construct a result array with those handles and some ancillary data
> + * the plugin might find useful.
> + */
> +
> +static GArray * create_register_handles(CPUState *cs, GArray *gdbstub_regs) {
> + GArray *find_data = g_array_new(true, true, sizeof(qemu_plugin_reg_descriptor));
> +
> + WITH_QEMU_LOCK_GUARD(®_handle_lock) {
> +
> + if (!reg_handles) {
> + reg_handles = g_hash_table_new(g_direct_hash, g_direct_equal);
> + }
> +
> + for (int i=0; i < gdbstub_regs->len; i++) {
> + GDBRegDesc *grd = &g_array_index(gdbstub_regs, GDBRegDesc, i);
> + gpointer key = cpu_plus_reg_to_key(cs, grd->gdb_reg);
> + struct qemu_plugin_register *val = g_hash_table_lookup(reg_handles, key);
> +
> + /* Doesn't exist, create one */
> + if (!val) {
> + val = g_new0(struct qemu_plugin_register, 1);
> + val->gdb_reg_num = grd->gdb_reg;
> + val->name = g_intern_string(grd->name);
> +
> + g_hash_table_insert(reg_handles, key, val);
> + }
> +
> + /* Create a record for the plugin */
> + qemu_plugin_reg_descriptor desc = {
> + .handle = val,
> + .name = val->name,
> + .feature = g_intern_string(grd->feature_name)
> + };
> + g_array_append_val(find_data, desc);
> + }
> + }
> +
> + return find_data;
> +}
> +
> +GArray * qemu_plugin_get_registers(unsigned int vcpu)
> +{
> + CPUState *cs = qemu_get_cpu(vcpu);
> + if (cs) {
> + g_autoptr(GArray) regs = gdb_get_register_list(cs);
> + return regs->len ? create_register_handles(cs, regs) : NULL;
> + } else {
> + return NULL;
> + }
> +}
Would that be useful to cache the returned value on plugin runtime side
(per vcpu)? This way, a plugin could call qemu_plugin_get_registers as
many time as it wants without having to pay for the creation of the array.
In more, could we return a hashtable (indexed by regname string) instead
of an array?
With both changes, a plugin could simply perform a lookup in table
returned by qemu_plugin_get_registers without having to keep anything on
its side.
> +
> +int qemu_plugin_read_register(unsigned int vcpu, struct qemu_plugin_register *reg, GByteArray *buf)
> +{
> + CPUState *cs = qemu_get_cpu(vcpu);
> + /* assert with debugging on? */
> + return gdb_read_register(cs, buf, reg->gdb_reg_num);
> +}
> +
> +static void __attribute__((__constructor__)) qemu_api_init(void)
> +{
> + qemu_mutex_init(®_handle_lock);
> +
> +}
> diff --git a/plugins/qemu-plugins.symbols b/plugins/qemu-plugins.symbols
> index 71f6c90549d..6963585c1ea 100644
> --- a/plugins/qemu-plugins.symbols
> +++ b/plugins/qemu-plugins.symbols
> @@ -3,6 +3,7 @@
> qemu_plugin_end_code;
> qemu_plugin_entry_code;
> qemu_plugin_get_hwaddr;
> + qemu_plugin_get_registers;
> qemu_plugin_hwaddr_device_name;
> qemu_plugin_hwaddr_is_io;
> qemu_plugin_hwaddr_phys_addr;
> @@ -20,6 +21,7 @@
> qemu_plugin_n_vcpus;
> qemu_plugin_outs;
> qemu_plugin_path_to_binary;
> + qemu_plugin_read_register;
> qemu_plugin_register_atexit_cb;
> qemu_plugin_register_flush_cb;
> qemu_plugin_register_vcpu_exit_cb;
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 40/43] contrib/plugins: extend execlog to track register changes
2024-01-05 10:40 ` Frédéric Pétrot
@ 2024-01-11 12:24 ` Alex Bennée
2024-01-11 14:10 ` Frédéric Pétrot
0 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-11 12:24 UTC (permalink / raw)
To: Frédéric Pétrot
Cc: qemu-devel, qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, Pierrick Bouvier, qemu-riscv,
Alistair Francis, Akihiko Odaki
Frédéric Pétrot <frederic.petrot@univ-grenoble-alpes.fr> writes:
> Hello Alex,
>
> just reporting below what might be a riscv only oddity (also applies to
> patch 41 but easier to report here).
>
> Le 03/01/2024 à 18:33, Alex Bennée a écrit :
>> With the new plugin register API we can now track changes to register
>> values. Currently the implementation is fairly dumb which will slow
>> down if a large number of register values are being tracked. This
>> could be improved by only instrumenting instructions which mention
>> registers we are interested in tracking.
>> Example usage:
>> ./qemu-aarch64 -D plugin.log -d plugin \
>> -cpu max,sve256=on \
>> -plugin contrib/plugins/libexeclog.so,reg=sp,reg=z\* \
>> ./tests/tcg/aarch64-linux-user/sha512-sve
>> will display in the execlog any changes to the stack pointer (sp)
>> and
>> the SVE Z registers.
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
>> Based-On: <20231025093128.33116-19-akihiko.odaki@daynix.com>
>
>> +static registers_init(int vcpu_index)
>> +{
>> + GPtrArray *registers = g_ptr_array_new();
>> + g_autoptr(GArray) reg_list = qemu_plugin_get_registers(vcpu_index);
>> +
>> + if (reg_list && reg_list->len) {
>> + /*
>> + * Go through each register in the complete list and
>> + * see if we want to track it.
>> + */
>> + for (int r = 0; r < reg_list->len; r++) {
>> + qemu_plugin_reg_descriptor *rd = &g_array_index(
>> + reg_list, qemu_plugin_reg_descriptor, r);
>
> riscv csrs are not continously numbered and the dynamically generated gdb xml
> seems to follow that scheme.
> So the calls to Glib string functions output quite a few assertion
> warnings because for the non existing csrs rd->name is NULL (and there
> are a bit less than 4000 such cases for rv64g).
> Checking for NULL and then continue is a simple way to solve the issue, but
> I am not sure this is the proper way to proceed, as it might stand in the
> generation of the riscv xml description for gdb.
I think in this case it might be easier to not expose it to the plugin
user at all. Is the lack of names an omission? How does gdb see them?
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 38/43] plugins: add an API to read registers
2024-01-09 15:05 ` Pierrick Bouvier
@ 2024-01-11 12:34 ` Alex Bennée
0 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-11 12:34 UTC (permalink / raw)
To: Pierrick Bouvier
Cc: qemu-devel, qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, qemu-riscv, Alistair Francis,
Akihiko Odaki
Pierrick Bouvier <pierrick.bouvier@linaro.org> writes:
> On 1/3/24 21:33, Alex Bennée wrote:
>> We can only request a list of registers once the vCPU has been
>> initialised so the user needs to use either call the get function on
>> vCPU initialisation or during the translation phase.
>> We don't expose the reg number to the plugin instead hiding it
>> behind
>> an opaque handle. This allows for a bit of future proofing should the
>> internals need to be changed while also being hashed against the
>> CPUClass so we can handle different register sets per-vCPU in
>> hetrogenous situations.
>> Having an internal state within the plugins also allows us to expand
>> the interface in future (for example providing callbacks on register
>> change if the translator can track changes).
>> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1706
>> Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
>> Based-on: <20231025093128.33116-18-akihiko.odaki@daynix.com>
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> ---
>> v3
>> - also g_intern_string the register name
>> - make get_registers documentation a bit less verbose
>> v2
>> - use new get whole list api, and expose upwards
>> vAJB:
>> The main difference to Akikio's version is hiding the gdb register
>> detail from the plugin for the reasons described above.
>> ---
>> include/qemu/qemu-plugin.h | 51 +++++++++++++++++-
>> plugins/api.c | 102 +++++++++++++++++++++++++++++++++++
>> plugins/qemu-plugins.symbols | 2 +
>> 3 files changed, 153 insertions(+), 2 deletions(-)
>> diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
>> index 4daab6efd29..95380895f81 100644
>> --- a/include/qemu/qemu-plugin.h
>> +++ b/include/qemu/qemu-plugin.h
>> @@ -11,6 +11,7 @@
>> #ifndef QEMU_QEMU_PLUGIN_H
>> #define QEMU_QEMU_PLUGIN_H
>> +#include <glib.h>
>> #include <inttypes.h>
>> #include <stdbool.h>
>> #include <stddef.h>
>> @@ -227,8 +228,8 @@ struct qemu_plugin_insn;
>> * @QEMU_PLUGIN_CB_R_REGS: callback reads the CPU's regs
>> * @QEMU_PLUGIN_CB_RW_REGS: callback reads and writes the CPU's regs
>> *
>> - * Note: currently unused, plugins cannot read or change system
>> - * register state.
>> + * Note: currently QEMU_PLUGIN_CB_RW_REGS is unused, plugins cannot change
>> + * system register state.
>> */
>> enum qemu_plugin_cb_flags {
>> QEMU_PLUGIN_CB_NO_REGS,
>> @@ -708,4 +709,50 @@ uint64_t qemu_plugin_end_code(void);
>> QEMU_PLUGIN_API
>> uint64_t qemu_plugin_entry_code(void);
>> +/** struct qemu_plugin_register - Opaque handle for register
>> access */
>> +struct qemu_plugin_register;
>> +
>> +/**
>> + * typedef qemu_plugin_reg_descriptor - register descriptions
>> + *
>> + * @handle: opaque handle for retrieving value with qemu_plugin_read_register
>> + * @name: register name
>> + * @feature: optional feature descriptor, can be NULL
>> + */
>> +typedef struct {
>> + struct qemu_plugin_register *handle;
>> + const char *name;
>> + const char *feature;
>> +} qemu_plugin_reg_descriptor;
>> +
>> +/**
>> + * qemu_plugin_get_registers() - return register list for vCPU
>> + * @vcpu_index: vcpu to query
>> + *
>> + * Returns a GArray of qemu_plugin_reg_descriptor or NULL. Caller
>> + * frees the array (but not the const strings).
>> + *
>> + * Should be used from a qemu_plugin_register_vcpu_init_cb() callback
>> + * after the vCPU is initialised.
>> + */
>> +GArray * qemu_plugin_get_registers(unsigned int vcpu_index);
>> +
>> +/**
>> + * qemu_plugin_read_register() - read register
>> + *
>> + * @vcpu: vcpu index
>> + * @handle: a @qemu_plugin_reg_handle handle
>> + * @buf: A GByteArray for the data owned by the plugin
>> + *
>> + * This function is only available in a context that register read access is
>> + * explicitly requested.
>> + *
>> + * Returns the size of the read register. The content of @buf is in target byte
>> + * order. On failure returns -1
>> + */
>> +int qemu_plugin_read_register(unsigned int vcpu,
>> + struct qemu_plugin_register *handle,
>> + GByteArray *buf);
>> +
>> +
>> #endif /* QEMU_QEMU_PLUGIN_H */
>> diff --git a/plugins/api.c b/plugins/api.c
>> index ac39cdea0b3..f8905325c43 100644
>> --- a/plugins/api.c
>> +++ b/plugins/api.c
>> @@ -8,6 +8,7 @@
>> *
>> * qemu_plugin_tb
>> * qemu_plugin_insn
>> + * qemu_plugin_register
>> *
>> * Which can then be passed back into the API to do additional things.
>> * As such all the public functions in here are exported in
>> @@ -35,10 +36,12 @@
>> */
>> #include "qemu/osdep.h"
>> +#include "qemu/main-loop.h"
>> #include "qemu/plugin.h"
>> #include "qemu/log.h"
>> #include "tcg/tcg.h"
>> #include "exec/exec-all.h"
>> +#include "exec/gdbstub.h"
>> #include "exec/ram_addr.h"
>> #include "disas/disas.h"
>> #include "plugin.h"
>> @@ -435,3 +438,102 @@ uint64_t qemu_plugin_entry_code(void)
>> #endif
>> return entry;
>> }
>> +
>> +/*
>> + * Register handles
>> + *
>> + * The plugin infrastructure keeps hold of these internal data
>> + * structures which are presented to plugins as opaque handles. They
>> + * are global to the system and therefor additions to the hash table
>> + * must be protected by the @reg_handle_lock.
>> + *
>> + * In order to future proof for up-coming heterogeneous work we want
>> + * different entries for each CPU type while sharing them in the
>> + * common case of multiple cores of the same type.
>> + */
>> +
>> +static QemuMutex reg_handle_lock;
>> +
>> +struct qemu_plugin_register {
>> + const char *name;
>> + int gdb_reg_num;
>> +};
>> +
>> +static GHashTable *reg_handles; /* hash table of PluginReg */
>> +
>> +/* Generate a stable key - would xxhash be overkill? */
>> +static gpointer cpu_plus_reg_to_key(CPUState *cs, int gdb_regnum)
>> +{
>> + uintptr_t key = (uintptr_t) cs->cc;
>> + key ^= gdb_regnum;
>> + return GUINT_TO_POINTER(key);
>> +}
>> +
>> +/*
>> + * Create register handles.
>> + *
>> + * We need to create a handle for each register so the plugin
>> + * infrastructure can call gdbstub to read a register. We also
>> + * construct a result array with those handles and some ancillary data
>> + * the plugin might find useful.
>> + */
>> +
>> +static GArray * create_register_handles(CPUState *cs, GArray *gdbstub_regs) {
>> + GArray *find_data = g_array_new(true, true, sizeof(qemu_plugin_reg_descriptor));
>> +
>> + WITH_QEMU_LOCK_GUARD(®_handle_lock) {
>> +
>> + if (!reg_handles) {
>> + reg_handles = g_hash_table_new(g_direct_hash, g_direct_equal);
>> + }
>> +
>> + for (int i=0; i < gdbstub_regs->len; i++) {
>> + GDBRegDesc *grd = &g_array_index(gdbstub_regs, GDBRegDesc, i);
>> + gpointer key = cpu_plus_reg_to_key(cs, grd->gdb_reg);
>> + struct qemu_plugin_register *val = g_hash_table_lookup(reg_handles, key);
>> +
>> + /* Doesn't exist, create one */
>> + if (!val) {
>> + val = g_new0(struct qemu_plugin_register, 1);
>> + val->gdb_reg_num = grd->gdb_reg;
>> + val->name = g_intern_string(grd->name);
>> +
>> + g_hash_table_insert(reg_handles, key, val);
>> + }
>> +
>> + /* Create a record for the plugin */
>> + qemu_plugin_reg_descriptor desc = {
>> + .handle = val,
>> + .name = val->name,
>> + .feature = g_intern_string(grd->feature_name)
>> + };
>> + g_array_append_val(find_data, desc);
>> + }
>> + }
>> +
>> + return find_data;
>> +}
>> +
>> +GArray * qemu_plugin_get_registers(unsigned int vcpu)
>> +{
>> + CPUState *cs = qemu_get_cpu(vcpu);
>> + if (cs) {
>> + g_autoptr(GArray) regs = gdb_get_register_list(cs);
>> + return regs->len ? create_register_handles(cs, regs) : NULL;
>> + } else {
>> + return NULL;
>> + }
>> +}
>
> Would that be useful to cache the returned value on plugin runtime
> side (per vcpu)? This way, a plugin could call
> qemu_plugin_get_registers as many time as it wants without having to
> pay for the creation of the array.
I suspect plugins would still want to work out what it needed ahead of
time and the cpu list should be static from vcpu_init onwards.
> In more, could we return a hashtable (indexed by regname string)
> instead of an array?
Hmm maybe. Arrays do benefit from being easy to cleanup and we would
still need an internal hash table to track stuff we don't want to expose
to the plugin.
We can always change it later if there is a compelling use case.
> With both changes, a plugin could simply perform a lookup in table
> returned by qemu_plugin_get_registers without having to keep anything
> on its side.
>
>> +
>> +int qemu_plugin_read_register(unsigned int vcpu, struct qemu_plugin_register *reg, GByteArray *buf)
>> +{
>> + CPUState *cs = qemu_get_cpu(vcpu);
>> + /* assert with debugging on? */
>> + return gdb_read_register(cs, buf, reg->gdb_reg_num);
>> +}
>> +
>> +static void __attribute__((__constructor__)) qemu_api_init(void)
>> +{
>> + qemu_mutex_init(®_handle_lock);
>> +
>> +}
>> diff --git a/plugins/qemu-plugins.symbols b/plugins/qemu-plugins.symbols
>> index 71f6c90549d..6963585c1ea 100644
>> --- a/plugins/qemu-plugins.symbols
>> +++ b/plugins/qemu-plugins.symbols
>> @@ -3,6 +3,7 @@
>> qemu_plugin_end_code;
>> qemu_plugin_entry_code;
>> qemu_plugin_get_hwaddr;
>> + qemu_plugin_get_registers;
>> qemu_plugin_hwaddr_device_name;
>> qemu_plugin_hwaddr_is_io;
>> qemu_plugin_hwaddr_phys_addr;
>> @@ -20,6 +21,7 @@
>> qemu_plugin_n_vcpus;
>> qemu_plugin_outs;
>> qemu_plugin_path_to_binary;
>> + qemu_plugin_read_register;
>> qemu_plugin_register_atexit_cb;
>> qemu_plugin_register_flush_cb;
>> qemu_plugin_register_vcpu_exit_cb;
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR)
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
` (42 preceding siblings ...)
2024-01-03 17:33 ` [PATCH v2 43/43] docs/devel: document some plugin assumptions Alex Bennée
@ 2024-01-11 12:37 ` Alex Bennée
43 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-11 12:37 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, Pierrick Bouvier, qemu-riscv,
Alistair Francis
Alex Bennée <alex.bennee@linaro.org> writes:
> This brings in the first batch of testing updates for the next
> release. The main bulk of these is Daniel and Thomas' cleanups of the
> qtest timeouts and allowing meson control them. There are a few minor
> tweaks I've made to some avocado and gitlab tests.
>
> The big update is support for reading register values in TCG plugins.
> After feedback from Akihiko I've left all the smarts to the plugin and
> made the interface a simple "all the registers" dump. There is a
> follow on patch to make the register code a little more efficient by
> checking disassembly. However we can leave the door open for future
> API enhancements if the translator ever learns to reliably know when
> registers might be touched.
>
> v2
> --
>
> - Review feedback for register API
> - readthedocs update
> - add expectation docs for plugins
>
> The following still need review:
>
> docs/devel: document some plugin assumptions
> docs/devel: lift example and plugin API sections up
> contrib/plugins: optimise the register value tracking
> contrib/plugins: extend execlog to track register changes
> contrib/plugins: fix imatch
> plugins: add an API to read registers
> gdbstub: expose api to find registers
> readthodocs: fully specify a build environment
> gitlab: include microblazeel in testing
> tests/avocado: use snapshot=on in kvm_xen_guest
Ping for final review? I'd at least like to get the testing stuff
cleared out of my tree.
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 03/43] gitlab: include microblazeel in testing
2024-01-03 17:33 ` [PATCH v2 03/43] gitlab: include microblazeel in testing Alex Bennée
@ 2024-01-11 13:15 ` Thomas Huth
0 siblings, 0 replies; 76+ messages in thread
From: Thomas Huth @ 2024-01-11 13:15 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Liu Zhiwei, Cleber Rosa, kvm,
Peter Maydell, Wainer dos Santos Moschetta, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
On 03/01/2024 18.33, Alex Bennée wrote:
> This reverts aeb5f8f248e (gitlab: build the correct microblaze target)
> now we actually have a little-endian test in avocado thanks to this
> years advent calendar.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> .gitlab-ci.d/buildtest.yml | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/.gitlab-ci.d/buildtest.yml b/.gitlab-ci.d/buildtest.yml
> index 91663946de4..ef71dfe8665 100644
> --- a/.gitlab-ci.d/buildtest.yml
> +++ b/.gitlab-ci.d/buildtest.yml
> @@ -41,7 +41,7 @@ build-system-ubuntu:
> variables:
> IMAGE: ubuntu2204
> CONFIGURE_ARGS: --enable-docs
> - TARGETS: alpha-softmmu microblaze-softmmu mips64el-softmmu
> + TARGETS: alpha-softmmu microblazeel-softmmu mips64el-softmmu
> MAKE_CHECK_ARGS: check-build
>
> check-system-ubuntu:
> @@ -61,7 +61,7 @@ avocado-system-ubuntu:
> variables:
> IMAGE: ubuntu2204
> MAKE_CHECK_ARGS: check-avocado
> - AVOCADO_TAGS: arch:alpha arch:microblaze arch:mips64el
> + AVOCADO_TAGS: arch:alpha arch:microblazeel arch:mips64el
>
> build-system-debian:
> extends:
Reviewed-by: Thomas Huth <thuth@redhat.com>
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 02/43] tests/avocado: use snapshot=on in kvm_xen_guest
2024-01-03 17:33 ` [PATCH v2 02/43] tests/avocado: use snapshot=on in kvm_xen_guest Alex Bennée
@ 2024-01-11 13:30 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 76+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-01-11 13:30 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
On 3/1/24 18:33, Alex Bennée wrote:
> This ensures the rootfs is never permanently changed as we don't need
> persistence between tests anyway.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> tests/avocado/kvm_xen_guest.py | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 42/43] docs/devel: lift example and plugin API sections up
2024-01-03 17:33 ` [PATCH v2 42/43] docs/devel: lift example and plugin API sections up Alex Bennée
2024-01-09 14:25 ` Pierrick Bouvier
@ 2024-01-11 14:01 ` Philippe Mathieu-Daudé
1 sibling, 0 replies; 76+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-01-11 14:01 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
On 3/1/24 18:33, Alex Bennée wrote:
> This makes them a bit more visible in the TCG emulation menu rather
> than hiding them away bellow the ToC limit.
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> docs/devel/tcg-plugins.rst | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 40/43] contrib/plugins: extend execlog to track register changes
2024-01-11 12:24 ` Alex Bennée
@ 2024-01-11 14:10 ` Frédéric Pétrot
0 siblings, 0 replies; 76+ messages in thread
From: Frédéric Pétrot @ 2024-01-11 14:10 UTC (permalink / raw)
To: Alex Bennée
Cc: qemu-devel, qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, Pierrick Bouvier, qemu-riscv,
Alistair Francis, Akihiko Odaki
Le 11/01/2024 à 13:24, Alex Bennée a écrit :
> Frédéric Pétrot <frederic.petrot@univ-grenoble-alpes.fr> writes:
>
>> Hello Alex,
>>
>> just reporting below what might be a riscv only oddity (also applies to
>> patch 41 but easier to report here).
>>
>> Le 03/01/2024 à 18:33, Alex Bennée a écrit :
>>> With the new plugin register API we can now track changes to register
>>> values. Currently the implementation is fairly dumb which will slow
>>> down if a large number of register values are being tracked. This
>>> could be improved by only instrumenting instructions which mention
>>> registers we are interested in tracking.
>>> Example usage:
>>> ./qemu-aarch64 -D plugin.log -d plugin \
>>> -cpu max,sve256=on \
>>> -plugin contrib/plugins/libexeclog.so,reg=sp,reg=z\* \
>>> ./tests/tcg/aarch64-linux-user/sha512-sve
>>> will display in the execlog any changes to the stack pointer (sp)
>>> and
>>> the SVE Z registers.
>>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>>> Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
>>> Based-On: <20231025093128.33116-19-akihiko.odaki@daynix.com>
>>
>>> +static registers_init(int vcpu_index)
>>> +{
>>> + GPtrArray *registers = g_ptr_array_new();
>>> + g_autoptr(GArray) reg_list = qemu_plugin_get_registers(vcpu_index);
>>> +
>>> + if (reg_list && reg_list->len) {
>>> + /*
>>> + * Go through each register in the complete list and
>>> + * see if we want to track it.
>>> + */
>>> + for (int r = 0; r < reg_list->len; r++) {
>>> + qemu_plugin_reg_descriptor *rd = &g_array_index(
>>> + reg_list, qemu_plugin_reg_descriptor, r);
>>
>> riscv csrs are not continously numbered and the dynamically generated gdb xml
>> seems to follow that scheme.
>> So the calls to Glib string functions output quite a few assertion
>> warnings because for the non existing csrs rd->name is NULL (and there
>> are a bit less than 4000 such cases for rv64g).
>> Checking for NULL and then continue is a simple way to solve the issue, but
>> I am not sure this is the proper way to proceed, as it might stand in the
>> generation of the riscv xml description for gdb.
>
> I think in this case it might be easier to not expose it to the plugin
> user at all. Is the lack of names an omission? How does gdb see them?
Well, info all-registers in gdb dumps only the subset of cs registers
that are defined for the current parameters of the gdbarch.
Interestingly enough, riscv_print_registers_info, the function that dumps
register values for riscv in gdb, contains the following comment :
1385 /* Registers with no name are not valid on this ISA. */
and then a check on the "nullness" of the register name to avoid outputting
something.
I guess we could follow the same path in QEMU, as having access to the csrs
in the plugins is really very useful.
Thanks,
Frédéric
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 24/43] target/riscv: Move misa_mxl_max to class
2024-01-03 17:33 ` [PATCH v2 24/43] target/riscv: Move misa_mxl_max to class Alex Bennée
@ 2024-01-11 23:28 ` Alistair Francis
0 siblings, 0 replies; 76+ messages in thread
From: Alistair Francis @ 2024-01-11 23:28 UTC (permalink / raw)
To: Alex Bennée
Cc: qemu-devel, qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, Pierrick Bouvier, qemu-riscv,
Alistair Francis, Akihiko Odaki
On Thu, Jan 4, 2024 at 3:44 AM Alex Bennée <alex.bennee@linaro.org> wrote:
>
> From: Akihiko Odaki <akihiko.odaki@daynix.com>
>
> misa_mxl_max is common for all instances of a RISC-V CPU class so they
> are better put into class.
>
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> Message-Id: <20231213-riscv-v7-3-a760156a337f@daynix.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu.h | 4 +-
> target/riscv/cpu.c | 118 +++++++++++++++++++------------------
> target/riscv/gdbstub.c | 12 ++--
> target/riscv/kvm/kvm-cpu.c | 10 ++--
> target/riscv/machine.c | 7 +--
> target/riscv/tcg/tcg-cpu.c | 12 ++--
> target/riscv/translate.c | 3 +-
> 7 files changed, 87 insertions(+), 79 deletions(-)
>
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index d74b361be64..060b7f69a74 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -169,7 +169,6 @@ struct CPUArchState {
>
> /* RISCVMXL, but uint32_t for vmstate migration */
> uint32_t misa_mxl; /* current mxl */
> - uint32_t misa_mxl_max; /* max mxl for this cpu */
> uint32_t misa_ext; /* current extensions */
> uint32_t misa_ext_mask; /* max ext for this cpu */
> uint32_t xl; /* current xlen */
> @@ -450,6 +449,7 @@ struct RISCVCPUClass {
>
> DeviceRealize parent_realize;
> ResettablePhases parent_phases;
> + uint32_t misa_mxl_max; /* max mxl for this cpu */
> };
>
> static inline int riscv_has_ext(CPURISCVState *env, target_ulong ext)
> @@ -756,7 +756,7 @@ enum riscv_pmu_event_idx {
> /* used by tcg/tcg-cpu.c*/
> void isa_ext_update_enabled(RISCVCPU *cpu, uint32_t ext_offset, bool en);
> bool isa_ext_is_enabled(RISCVCPU *cpu, uint32_t ext_offset);
> -void riscv_cpu_set_misa(CPURISCVState *env, RISCVMXL mxl, uint32_t ext);
> +void riscv_cpu_set_misa_ext(CPURISCVState *env, uint32_t ext);
>
> typedef struct RISCVCPUMultiExtConfig {
> const char *name;
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index 83c7c0cf07b..2ab61df2217 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -274,9 +274,8 @@ const char *riscv_cpu_get_trap_name(target_ulong cause, bool async)
> }
> }
>
> -void riscv_cpu_set_misa(CPURISCVState *env, RISCVMXL mxl, uint32_t ext)
> +void riscv_cpu_set_misa_ext(CPURISCVState *env, uint32_t ext)
> {
> - env->misa_mxl_max = env->misa_mxl = mxl;
> env->misa_ext_mask = env->misa_ext = ext;
> }
>
> @@ -378,11 +377,7 @@ static void riscv_any_cpu_init(Object *obj)
> {
> RISCVCPU *cpu = RISCV_CPU(obj);
> CPURISCVState *env = &cpu->env;
> -#if defined(TARGET_RISCV32)
> - riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVD | RVC | RVU);
> -#elif defined(TARGET_RISCV64)
> - riscv_cpu_set_misa(env, MXL_RV64, RVI | RVM | RVA | RVF | RVD | RVC | RVU);
> -#endif
> + riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVU);
>
> #ifndef CONFIG_USER_ONLY
> set_satp_mode_max_supported(RISCV_CPU(obj),
> @@ -403,16 +398,14 @@ static void riscv_max_cpu_init(Object *obj)
> {
> RISCVCPU *cpu = RISCV_CPU(obj);
> CPURISCVState *env = &cpu->env;
> - RISCVMXL mlx = MXL_RV64;
>
> -#ifdef TARGET_RISCV32
> - mlx = MXL_RV32;
> -#endif
> - riscv_cpu_set_misa(env, mlx, 0);
> env->priv_ver = PRIV_VERSION_LATEST;
> #ifndef CONFIG_USER_ONLY
> - set_satp_mode_max_supported(RISCV_CPU(obj), mlx == MXL_RV32 ?
> - VM_1_10_SV32 : VM_1_10_SV57);
> +#ifdef TARGET_RISCV32
> + set_satp_mode_max_supported(cpu, VM_1_10_SV32);
> +#else
> + set_satp_mode_max_supported(cpu, VM_1_10_SV57);
> +#endif
> #endif
> }
>
> @@ -420,8 +413,6 @@ static void riscv_max_cpu_init(Object *obj)
> static void rv64_base_cpu_init(Object *obj)
> {
> CPURISCVState *env = &RISCV_CPU(obj)->env;
> - /* We set this in the realise function */
> - riscv_cpu_set_misa(env, MXL_RV64, 0);
> /* Set latest version of privileged specification */
> env->priv_ver = PRIV_VERSION_LATEST;
> #ifndef CONFIG_USER_ONLY
> @@ -433,8 +424,7 @@ static void rv64_sifive_u_cpu_init(Object *obj)
> {
> RISCVCPU *cpu = RISCV_CPU(obj);
> CPURISCVState *env = &cpu->env;
> - riscv_cpu_set_misa(env, MXL_RV64,
> - RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
> + riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
> env->priv_ver = PRIV_VERSION_1_10_0;
> #ifndef CONFIG_USER_ONLY
> set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV39);
> @@ -452,7 +442,7 @@ static void rv64_sifive_e_cpu_init(Object *obj)
> CPURISCVState *env = &RISCV_CPU(obj)->env;
> RISCVCPU *cpu = RISCV_CPU(obj);
>
> - riscv_cpu_set_misa(env, MXL_RV64, RVI | RVM | RVA | RVC | RVU);
> + riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVC | RVU);
> env->priv_ver = PRIV_VERSION_1_10_0;
> #ifndef CONFIG_USER_ONLY
> set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
> @@ -469,7 +459,7 @@ static void rv64_thead_c906_cpu_init(Object *obj)
> CPURISCVState *env = &RISCV_CPU(obj)->env;
> RISCVCPU *cpu = RISCV_CPU(obj);
>
> - riscv_cpu_set_misa(env, MXL_RV64, RVG | RVC | RVS | RVU);
> + riscv_cpu_set_misa_ext(env, RVG | RVC | RVS | RVU);
> env->priv_ver = PRIV_VERSION_1_11_0;
>
> cpu->cfg.ext_zfa = true;
> @@ -500,7 +490,7 @@ static void rv64_veyron_v1_cpu_init(Object *obj)
> CPURISCVState *env = &RISCV_CPU(obj)->env;
> RISCVCPU *cpu = RISCV_CPU(obj);
>
> - riscv_cpu_set_misa(env, MXL_RV64, RVG | RVC | RVS | RVU | RVH);
> + riscv_cpu_set_misa_ext(env, RVG | RVC | RVS | RVU | RVH);
> env->priv_ver = PRIV_VERSION_1_12_0;
>
> /* Enable ISA extensions */
> @@ -544,8 +534,6 @@ static void rv128_base_cpu_init(Object *obj)
> exit(EXIT_FAILURE);
> }
> CPURISCVState *env = &RISCV_CPU(obj)->env;
> - /* We set this in the realise function */
> - riscv_cpu_set_misa(env, MXL_RV128, 0);
> /* Set latest version of privileged specification */
> env->priv_ver = PRIV_VERSION_LATEST;
> #ifndef CONFIG_USER_ONLY
> @@ -556,8 +544,6 @@ static void rv128_base_cpu_init(Object *obj)
> static void rv32_base_cpu_init(Object *obj)
> {
> CPURISCVState *env = &RISCV_CPU(obj)->env;
> - /* We set this in the realise function */
> - riscv_cpu_set_misa(env, MXL_RV32, 0);
> /* Set latest version of privileged specification */
> env->priv_ver = PRIV_VERSION_LATEST;
> #ifndef CONFIG_USER_ONLY
> @@ -569,8 +555,7 @@ static void rv32_sifive_u_cpu_init(Object *obj)
> {
> RISCVCPU *cpu = RISCV_CPU(obj);
> CPURISCVState *env = &cpu->env;
> - riscv_cpu_set_misa(env, MXL_RV32,
> - RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
> + riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVD | RVC | RVS | RVU);
> env->priv_ver = PRIV_VERSION_1_10_0;
> #ifndef CONFIG_USER_ONLY
> set_satp_mode_max_supported(RISCV_CPU(obj), VM_1_10_SV32);
> @@ -588,7 +573,7 @@ static void rv32_sifive_e_cpu_init(Object *obj)
> CPURISCVState *env = &RISCV_CPU(obj)->env;
> RISCVCPU *cpu = RISCV_CPU(obj);
>
> - riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVA | RVC | RVU);
> + riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVC | RVU);
> env->priv_ver = PRIV_VERSION_1_10_0;
> #ifndef CONFIG_USER_ONLY
> set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
> @@ -605,7 +590,7 @@ static void rv32_ibex_cpu_init(Object *obj)
> CPURISCVState *env = &RISCV_CPU(obj)->env;
> RISCVCPU *cpu = RISCV_CPU(obj);
>
> - riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVC | RVU);
> + riscv_cpu_set_misa_ext(env, RVI | RVM | RVC | RVU);
> env->priv_ver = PRIV_VERSION_1_12_0;
> #ifndef CONFIG_USER_ONLY
> set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
> @@ -622,7 +607,7 @@ static void rv32_imafcu_nommu_cpu_init(Object *obj)
> CPURISCVState *env = &RISCV_CPU(obj)->env;
> RISCVCPU *cpu = RISCV_CPU(obj);
>
> - riscv_cpu_set_misa(env, MXL_RV32, RVI | RVM | RVA | RVF | RVC | RVU);
> + riscv_cpu_set_misa_ext(env, RVI | RVM | RVA | RVF | RVC | RVU);
> env->priv_ver = PRIV_VERSION_1_10_0;
> #ifndef CONFIG_USER_ONLY
> set_satp_mode_max_supported(cpu, VM_1_10_MBARE);
> @@ -845,7 +830,7 @@ static void riscv_cpu_reset_hold(Object *obj)
> mcc->parent_phases.hold(obj);
> }
> #ifndef CONFIG_USER_ONLY
> - env->misa_mxl = env->misa_mxl_max;
> + env->misa_mxl = mcc->misa_mxl_max;
> env->priv = PRV_M;
> env->mstatus &= ~(MSTATUS_MIE | MSTATUS_MPRV);
> if (env->misa_mxl > MXL_RV32) {
> @@ -1213,6 +1198,12 @@ static void riscv_cpu_post_init(Object *obj)
>
> static void riscv_cpu_init(Object *obj)
> {
> + RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(obj);
> + RISCVCPU *cpu = RISCV_CPU(obj);
> + CPURISCVState *env = &cpu->env;
> +
> + env->misa_mxl = mcc->misa_mxl_max;
> +
> #ifndef CONFIG_USER_ONLY
> qdev_init_gpio_in(DEVICE(obj), riscv_cpu_set_irq,
> IRQ_LOCAL_MAX + IRQ_LOCAL_GUEST_MAX);
> @@ -1657,7 +1648,7 @@ static void cpu_get_marchid(Object *obj, Visitor *v, const char *name,
> visit_type_bool(v, name, &value, errp);
> }
>
> -static void riscv_cpu_class_init(ObjectClass *c, void *data)
> +static void riscv_cpu_common_class_init(ObjectClass *c, void *data)
> {
> RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);
> CPUClass *cc = CPU_CLASS(c);
> @@ -1699,6 +1690,13 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
> device_class_set_props(dc, riscv_cpu_properties);
> }
>
> +static void riscv_cpu_class_init(ObjectClass *c, void *data)
> +{
> + RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);
> +
> + mcc->misa_mxl_max = (uint32_t)(uintptr_t)data;
> +}
> +
> static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str,
> int max_str_len)
> {
> @@ -1764,18 +1762,22 @@ void riscv_cpu_list(void)
> g_slist_free(list);
> }
>
> -#define DEFINE_CPU(type_name, initfn) \
> - { \
> - .name = type_name, \
> - .parent = TYPE_RISCV_CPU, \
> - .instance_init = initfn \
> +#define DEFINE_CPU(type_name, misa_mxl_max, initfn) \
> + { \
> + .name = (type_name), \
> + .parent = TYPE_RISCV_CPU, \
> + .instance_init = (initfn), \
> + .class_init = riscv_cpu_class_init, \
> + .class_data = (void *)(misa_mxl_max) \
> }
>
> -#define DEFINE_DYNAMIC_CPU(type_name, initfn) \
> - { \
> - .name = type_name, \
> - .parent = TYPE_RISCV_DYNAMIC_CPU, \
> - .instance_init = initfn \
> +#define DEFINE_DYNAMIC_CPU(type_name, misa_mxl_max, initfn) \
> + { \
> + .name = (type_name), \
> + .parent = TYPE_RISCV_DYNAMIC_CPU, \
> + .instance_init = (initfn), \
> + .class_init = riscv_cpu_class_init, \
> + .class_data = (void *)(misa_mxl_max) \
> }
>
> static const TypeInfo riscv_cpu_type_infos[] = {
> @@ -1788,29 +1790,31 @@ static const TypeInfo riscv_cpu_type_infos[] = {
> .instance_post_init = riscv_cpu_post_init,
> .abstract = true,
> .class_size = sizeof(RISCVCPUClass),
> - .class_init = riscv_cpu_class_init,
> + .class_init = riscv_cpu_common_class_init,
> },
> {
> .name = TYPE_RISCV_DYNAMIC_CPU,
> .parent = TYPE_RISCV_CPU,
> .abstract = true,
> },
> - DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, riscv_any_cpu_init),
> - DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, riscv_max_cpu_init),
> #if defined(TARGET_RISCV32)
> - DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE32, rv32_base_cpu_init),
> - DEFINE_CPU(TYPE_RISCV_CPU_IBEX, rv32_ibex_cpu_init),
> - DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E31, rv32_sifive_e_cpu_init),
> - DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E34, rv32_imafcu_nommu_cpu_init),
> - DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U34, rv32_sifive_u_cpu_init),
> + DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, MXL_RV32, riscv_any_cpu_init),
> + DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, MXL_RV32, riscv_max_cpu_init),
> + DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE32, MXL_RV32, rv32_base_cpu_init),
> + DEFINE_CPU(TYPE_RISCV_CPU_IBEX, MXL_RV32, rv32_ibex_cpu_init),
> + DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E31, MXL_RV32, rv32_sifive_e_cpu_init),
> + DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E34, MXL_RV32, rv32_imafcu_nommu_cpu_init),
> + DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U34, MXL_RV32, rv32_sifive_u_cpu_init),
> #elif defined(TARGET_RISCV64)
> - DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE64, rv64_base_cpu_init),
> - DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E51, rv64_sifive_e_cpu_init),
> - DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U54, rv64_sifive_u_cpu_init),
> - DEFINE_CPU(TYPE_RISCV_CPU_SHAKTI_C, rv64_sifive_u_cpu_init),
> - DEFINE_CPU(TYPE_RISCV_CPU_THEAD_C906, rv64_thead_c906_cpu_init),
> - DEFINE_CPU(TYPE_RISCV_CPU_VEYRON_V1, rv64_veyron_v1_cpu_init),
> - DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, rv128_base_cpu_init),
> + DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_ANY, MXL_RV64, riscv_any_cpu_init),
> + DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_MAX, MXL_RV64, riscv_max_cpu_init),
> + DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE64, MXL_RV64, rv64_base_cpu_init),
> + DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_E51, MXL_RV64, rv64_sifive_e_cpu_init),
> + DEFINE_CPU(TYPE_RISCV_CPU_SIFIVE_U54, MXL_RV64, rv64_sifive_u_cpu_init),
> + DEFINE_CPU(TYPE_RISCV_CPU_SHAKTI_C, MXL_RV64, rv64_sifive_u_cpu_init),
> + DEFINE_CPU(TYPE_RISCV_CPU_THEAD_C906, MXL_RV64, rv64_thead_c906_cpu_init),
> + DEFINE_CPU(TYPE_RISCV_CPU_VEYRON_V1, MXL_RV64, rv64_veyron_v1_cpu_init),
> + DEFINE_DYNAMIC_CPU(TYPE_RISCV_CPU_BASE128, MXL_RV128, rv128_base_cpu_init),
> #endif
> };
>
> diff --git a/target/riscv/gdbstub.c b/target/riscv/gdbstub.c
> index 58b3ace0fe9..365040228a1 100644
> --- a/target/riscv/gdbstub.c
> +++ b/target/riscv/gdbstub.c
> @@ -49,6 +49,7 @@ static const struct TypeSize vec_lanes[] = {
>
> int riscv_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
> {
> + RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);
> RISCVCPU *cpu = RISCV_CPU(cs);
> CPURISCVState *env = &cpu->env;
> target_ulong tmp;
> @@ -61,7 +62,7 @@ int riscv_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
> return 0;
> }
>
> - switch (env->misa_mxl_max) {
> + switch (mcc->misa_mxl_max) {
> case MXL_RV32:
> return gdb_get_reg32(mem_buf, tmp);
> case MXL_RV64:
> @@ -75,12 +76,13 @@ int riscv_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n)
>
> int riscv_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n)
> {
> + RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);
> RISCVCPU *cpu = RISCV_CPU(cs);
> CPURISCVState *env = &cpu->env;
> int length = 0;
> target_ulong tmp;
>
> - switch (env->misa_mxl_max) {
> + switch (mcc->misa_mxl_max) {
> case MXL_RV32:
> tmp = (int32_t)ldl_p(mem_buf);
> length = 4;
> @@ -214,11 +216,12 @@ static int riscv_gdb_set_virtual(CPURISCVState *cs, uint8_t *mem_buf, int n)
>
> static int riscv_gen_dynamic_csr_xml(CPUState *cs, int base_reg)
> {
> + RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);
> RISCVCPU *cpu = RISCV_CPU(cs);
> CPURISCVState *env = &cpu->env;
> GString *s = g_string_new(NULL);
> riscv_csr_predicate_fn predicate;
> - int bitsize = 16 << env->misa_mxl_max;
> + int bitsize = 16 << mcc->misa_mxl_max;
> int i;
>
> #if !defined(CONFIG_USER_ONLY)
> @@ -310,6 +313,7 @@ static int ricsv_gen_dynamic_vector_xml(CPUState *cs, int base_reg)
>
> void riscv_cpu_register_gdb_regs_for_features(CPUState *cs)
> {
> + RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);
> RISCVCPU *cpu = RISCV_CPU(cs);
> CPURISCVState *env = &cpu->env;
> if (env->misa_ext & RVD) {
> @@ -326,7 +330,7 @@ void riscv_cpu_register_gdb_regs_for_features(CPUState *cs)
> ricsv_gen_dynamic_vector_xml(cs, base_reg),
> "riscv-vector.xml", 0);
> }
> - switch (env->misa_mxl_max) {
> + switch (mcc->misa_mxl_max) {
> case MXL_RV32:
> gdb_register_coprocessor(cs, riscv_gdb_get_virtual,
> riscv_gdb_set_virtual,
> diff --git a/target/riscv/kvm/kvm-cpu.c b/target/riscv/kvm/kvm-cpu.c
> index 117e33cf90f..ed86f21b8f2 100644
> --- a/target/riscv/kvm/kvm-cpu.c
> +++ b/target/riscv/kvm/kvm-cpu.c
> @@ -1499,14 +1499,14 @@ static void kvm_cpu_accel_register_types(void)
> }
> type_init(kvm_cpu_accel_register_types);
>
> -static void riscv_host_cpu_init(Object *obj)
> +static void riscv_host_cpu_class_init(ObjectClass *c, void *data)
> {
> - CPURISCVState *env = &RISCV_CPU(obj)->env;
> + RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);
>
> #if defined(TARGET_RISCV32)
> - env->misa_mxl_max = env->misa_mxl = MXL_RV32;
> + mcc->misa_mxl_max = MXL_RV32;
> #elif defined(TARGET_RISCV64)
> - env->misa_mxl_max = env->misa_mxl = MXL_RV64;
> + mcc->misa_mxl_max = MXL_RV64;
> #endif
> }
>
> @@ -1514,7 +1514,7 @@ static const TypeInfo riscv_kvm_cpu_type_infos[] = {
> {
> .name = TYPE_RISCV_CPU_HOST,
> .parent = TYPE_RISCV_CPU,
> - .instance_init = riscv_host_cpu_init,
> + .class_init = riscv_host_cpu_class_init,
> }
> };
>
> diff --git a/target/riscv/machine.c b/target/riscv/machine.c
> index fdde243e040..4c8d9a66595 100644
> --- a/target/riscv/machine.c
> +++ b/target/riscv/machine.c
> @@ -178,10 +178,9 @@ static const VMStateDescription vmstate_pointermasking = {
>
> static bool rv128_needed(void *opaque)
> {
> - RISCVCPU *cpu = opaque;
> - CPURISCVState *env = &cpu->env;
> + RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(opaque);
>
> - return env->misa_mxl_max == MXL_RV128;
> + return mcc->misa_mxl_max == MXL_RV128;
> }
>
> static const VMStateDescription vmstate_rv128 = {
> @@ -372,7 +371,7 @@ const VMStateDescription vmstate_riscv_cpu = {
> VMSTATE_UINTTL(env.vext_ver, RISCVCPU),
> VMSTATE_UINT32(env.misa_mxl, RISCVCPU),
> VMSTATE_UINT32(env.misa_ext, RISCVCPU),
> - VMSTATE_UINT32(env.misa_mxl_max, RISCVCPU),
> + VMSTATE_UNUSED(4),
> VMSTATE_UINT32(env.misa_ext_mask, RISCVCPU),
> VMSTATE_UINTTL(env.priv, RISCVCPU),
> VMSTATE_BOOL(env.virt_enabled, RISCVCPU),
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index ee17f65afb6..7f6712c81a4 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -152,10 +152,9 @@ static void riscv_cpu_validate_misa_mxl(RISCVCPU *cpu)
> {
> RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu);
> CPUClass *cc = CPU_CLASS(mcc);
> - CPURISCVState *env = &cpu->env;
>
> /* Validate that MISA_MXL is set properly. */
> - switch (env->misa_mxl_max) {
> + switch (mcc->misa_mxl_max) {
> #ifdef TARGET_RISCV64
> case MXL_RV64:
> case MXL_RV128:
> @@ -274,6 +273,7 @@ static void riscv_cpu_disable_priv_spec_isa_exts(RISCVCPU *cpu)
> */
> void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
> {
> + RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu);
> CPURISCVState *env = &cpu->env;
> Error *local_err = NULL;
>
> @@ -454,7 +454,7 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
> cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcb), true);
> cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcmp), true);
> cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcmt), true);
> - if (riscv_has_ext(env, RVF) && env->misa_mxl_max == MXL_RV32) {
> + if (riscv_has_ext(env, RVF) && mcc->misa_mxl_max == MXL_RV32) {
> cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcf), true);
> }
> }
> @@ -462,7 +462,7 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
> /* zca, zcd and zcf has a PRIV 1.12.0 restriction */
> if (riscv_has_ext(env, RVC) && env->priv_ver >= PRIV_VERSION_1_12_0) {
> cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zca), true);
> - if (riscv_has_ext(env, RVF) && env->misa_mxl_max == MXL_RV32) {
> + if (riscv_has_ext(env, RVF) && mcc->misa_mxl_max == MXL_RV32) {
> cpu_cfg_ext_auto_update(cpu, CPU_CFG_OFFSET(ext_zcf), true);
> }
> if (riscv_has_ext(env, RVD)) {
> @@ -470,7 +470,7 @@ void riscv_cpu_validate_set_extensions(RISCVCPU *cpu, Error **errp)
> }
> }
>
> - if (env->misa_mxl_max != MXL_RV32 && cpu->cfg.ext_zcf) {
> + if (mcc->misa_mxl_max != MXL_RV32 && cpu->cfg.ext_zcf) {
> error_setg(errp, "Zcf extension is only relevant to RV32");
> return;
> }
> @@ -956,7 +956,7 @@ static void riscv_init_max_cpu_extensions(Object *obj)
> const RISCVCPUMultiExtConfig *prop;
>
> /* Enable RVG, RVJ and RVV that are disabled by default */
> - riscv_cpu_set_misa(env, env->misa_mxl, env->misa_ext | RVG | RVJ | RVV);
> + riscv_cpu_set_misa_ext(env, env->misa_ext | RVG | RVJ | RVV);
>
> for (prop = riscv_cpu_extensions; prop && prop->name; prop++) {
> isa_ext_update_enabled(cpu, prop->offset, true);
> diff --git a/target/riscv/translate.c b/target/riscv/translate.c
> index f0be79bb160..7e383c5eebf 100644
> --- a/target/riscv/translate.c
> +++ b/target/riscv/translate.c
> @@ -1167,6 +1167,7 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
> {
> DisasContext *ctx = container_of(dcbase, DisasContext, base);
> CPURISCVState *env = cpu_env(cs);
> + RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cs);
> RISCVCPU *cpu = RISCV_CPU(cs);
> uint32_t tb_flags = ctx->base.tb->flags;
>
> @@ -1188,7 +1189,7 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
> ctx->cfg_vta_all_1s = cpu->cfg.rvv_ta_all_1s;
> ctx->vstart_eq_zero = FIELD_EX32(tb_flags, TB_FLAGS, VSTART_EQ_ZERO);
> ctx->vl_eq_vlmax = FIELD_EX32(tb_flags, TB_FLAGS, VL_EQ_VLMAX);
> - ctx->misa_mxl_max = env->misa_mxl_max;
> + ctx->misa_mxl_max = mcc->misa_mxl_max;
> ctx->xl = FIELD_EX32(tb_flags, TB_FLAGS, XL);
> ctx->address_xl = FIELD_EX32(tb_flags, TB_FLAGS, AXL);
> ctx->cs = cs;
> --
> 2.39.2
>
>
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 25/43] target/riscv: Validate misa_mxl_max only once
2024-01-03 17:33 ` [PATCH v2 25/43] target/riscv: Validate misa_mxl_max only once Alex Bennée
@ 2024-01-11 23:29 ` Alistair Francis
0 siblings, 0 replies; 76+ messages in thread
From: Alistair Francis @ 2024-01-11 23:29 UTC (permalink / raw)
To: Alex Bennée
Cc: qemu-devel, qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, Pierrick Bouvier, qemu-riscv,
Alistair Francis, Akihiko Odaki
On Thu, Jan 4, 2024 at 5:04 AM Alex Bennée <alex.bennee@linaro.org> wrote:
>
> From: Akihiko Odaki <akihiko.odaki@daynix.com>
>
> misa_mxl_max is now a class member and initialized only once for each
> class. This also moves the initialization of gdb_core_xml_file which
> will be referenced before realization in the future.
>
> Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> Message-Id: <20231213-riscv-v7-4-a760156a337f@daynix.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu.c | 21 +++++++++++++++++++++
> target/riscv/tcg/tcg-cpu.c | 23 -----------------------
> 2 files changed, 21 insertions(+), 23 deletions(-)
>
> diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c
> index 2ab61df2217..b799f133604 100644
> --- a/target/riscv/cpu.c
> +++ b/target/riscv/cpu.c
> @@ -1247,6 +1247,26 @@ static const MISAExtInfo misa_ext_info_arr[] = {
> MISA_EXT_INFO(RVG, "g", "General purpose (IMAFD_Zicsr_Zifencei)"),
> };
>
> +static void riscv_cpu_validate_misa_mxl(RISCVCPUClass *mcc)
> +{
> + CPUClass *cc = CPU_CLASS(mcc);
> +
> + /* Validate that MISA_MXL is set properly. */
> + switch (mcc->misa_mxl_max) {
> +#ifdef TARGET_RISCV64
> + case MXL_RV64:
> + case MXL_RV128:
> + cc->gdb_core_xml_file = "riscv-64bit-cpu.xml";
> + break;
> +#endif
> + case MXL_RV32:
> + cc->gdb_core_xml_file = "riscv-32bit-cpu.xml";
> + break;
> + default:
> + g_assert_not_reached();
> + }
> +}
> +
> static int riscv_validate_misa_info_idx(uint32_t bit)
> {
> int idx;
> @@ -1695,6 +1715,7 @@ static void riscv_cpu_class_init(ObjectClass *c, void *data)
> RISCVCPUClass *mcc = RISCV_CPU_CLASS(c);
>
> mcc->misa_mxl_max = (uint32_t)(uintptr_t)data;
> + riscv_cpu_validate_misa_mxl(mcc);
> }
>
> static void riscv_isa_string_ext(RISCVCPU *cpu, char **isa_str,
> diff --git a/target/riscv/tcg/tcg-cpu.c b/target/riscv/tcg/tcg-cpu.c
> index 7f6712c81a4..eb243e011ca 100644
> --- a/target/riscv/tcg/tcg-cpu.c
> +++ b/target/riscv/tcg/tcg-cpu.c
> @@ -148,27 +148,6 @@ static void riscv_cpu_validate_misa_priv(CPURISCVState *env, Error **errp)
> }
> }
>
> -static void riscv_cpu_validate_misa_mxl(RISCVCPU *cpu)
> -{
> - RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(cpu);
> - CPUClass *cc = CPU_CLASS(mcc);
> -
> - /* Validate that MISA_MXL is set properly. */
> - switch (mcc->misa_mxl_max) {
> -#ifdef TARGET_RISCV64
> - case MXL_RV64:
> - case MXL_RV128:
> - cc->gdb_core_xml_file = "riscv-64bit-cpu.xml";
> - break;
> -#endif
> - case MXL_RV32:
> - cc->gdb_core_xml_file = "riscv-32bit-cpu.xml";
> - break;
> - default:
> - g_assert_not_reached();
> - }
> -}
> -
> static void riscv_cpu_validate_priv_spec(RISCVCPU *cpu, Error **errp)
> {
> CPURISCVState *env = &cpu->env;
> @@ -676,8 +655,6 @@ static bool tcg_cpu_realize(CPUState *cs, Error **errp)
> return false;
> }
>
> - riscv_cpu_validate_misa_mxl(cpu);
> -
> #ifndef CONFIG_USER_ONLY
> CPURISCVState *env = &cpu->env;
> Error *local_err = NULL;
> --
> 2.39.2
>
>
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 23/43] target/riscv: Remove misa_mxl validation
2024-01-08 15:42 ` Alex Bennée
@ 2024-01-11 23:29 ` Alistair Francis
2024-01-12 13:56 ` Alex Bennée
0 siblings, 1 reply; 76+ messages in thread
From: Alistair Francis @ 2024-01-11 23:29 UTC (permalink / raw)
To: Alex Bennée
Cc: qemu-devel, Palmer Dabbelt, Alistair Francis, Bin Meng, Weiwei Li,
Daniel Henrique Barboza, Liu Zhiwei, qemu-riscv
On Tue, Jan 9, 2024 at 1:43 AM Alex Bennée <alex.bennee@linaro.org> wrote:
>
> Alex Bennée <alex.bennee@linaro.org> writes:
>
> > From: Akihiko Odaki <akihiko.odaki@daynix.com>
> >
> > It is initialized with a simple assignment and there is little room for
> > error. In fact, the validation is even more complex.
> >
> > Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
> > Acked-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
> > Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
> > Acked-by: Alistair Francis <alistair.francis@wdc.com>
> > Message-Id: <20231213-riscv-v7-2-a760156a337f@daynix.com>
> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>
> ping: along with this are the RiscV maintainers happy for me to take:
>
> [PATCH v2 23/43] target/riscv: Remove misa_mxl validation
> [PATCH v2 24/43] target/riscv: Move misa_mxl_max to class
> [PATCH v2 25/43] target/riscv: Validate misa_mxl_max only once
>
> through my next pull request?
Yep! Go for it
Alistair
>
> <snip>
>
> --
> Alex Bennée
> Virtualisation Tech Lead @ Linaro
>
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 38/43] plugins: add an API to read registers
2024-01-03 17:33 ` [PATCH v2 38/43] plugins: add an API to read registers Alex Bennée
2024-01-04 12:05 ` Akihiko Odaki
2024-01-09 15:05 ` Pierrick Bouvier
@ 2024-01-12 3:49 ` Pierrick Bouvier
2 siblings, 0 replies; 76+ messages in thread
From: Pierrick Bouvier @ 2024-01-12 3:49 UTC (permalink / raw)
To: Alex Bennée, qemu-devel
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Thomas Huth, Liu Zhiwei,
Cleber Rosa, kvm, Peter Maydell, Wainer dos Santos Moschetta,
qemu-arm, Weiwei Li, Philippe Mathieu-Daudé, John Snow,
Daniel Henrique Barboza, Nicholas Piggin, Palmer Dabbelt,
Marcel Apfelbaum, Ilya Leoshkevich, Cédric Le Goater,
Edgar E. Iglesias, Eduardo Habkost, qemu-riscv, Alistair Francis,
Akihiko Odaki
On 1/3/24 21:33, Alex Bennée wrote:
> We can only request a list of registers once the vCPU has been
> initialised so the user needs to use either call the get function on
> vCPU initialisation or during the translation phase.
>
> We don't expose the reg number to the plugin instead hiding it behind
> an opaque handle. This allows for a bit of future proofing should the
> internals need to be changed while also being hashed against the
> CPUClass so we can handle different register sets per-vCPU in
> hetrogenous situations.
>
> Having an internal state within the plugins also allows us to expand
> the interface in future (for example providing callbacks on register
> change if the translator can track changes).
>
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1706
> Cc: Akihiko Odaki <akihiko.odaki@daynix.com>
> Based-on: <20231025093128.33116-18-akihiko.odaki@daynix.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>
> ---
> v3
> - also g_intern_string the register name
> - make get_registers documentation a bit less verbose
> v2
> - use new get whole list api, and expose upwards
>
> vAJB:
>
> The main difference to Akikio's version is hiding the gdb register
> detail from the plugin for the reasons described above.
> ---
> include/qemu/qemu-plugin.h | 51 +++++++++++++++++-
> plugins/api.c | 102 +++++++++++++++++++++++++++++++++++
> plugins/qemu-plugins.symbols | 2 +
> 3 files changed, 153 insertions(+), 2 deletions(-)
>
> diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
> index 4daab6efd29..95380895f81 100644
> --- a/include/qemu/qemu-plugin.h
> +++ b/include/qemu/qemu-plugin.h
> @@ -11,6 +11,7 @@
> #ifndef QEMU_QEMU_PLUGIN_H
> #define QEMU_QEMU_PLUGIN_H
>
> +#include <glib.h>
> #include <inttypes.h>
> #include <stdbool.h>
> #include <stddef.h>
> @@ -227,8 +228,8 @@ struct qemu_plugin_insn;
> * @QEMU_PLUGIN_CB_R_REGS: callback reads the CPU's regs
> * @QEMU_PLUGIN_CB_RW_REGS: callback reads and writes the CPU's regs
> *
> - * Note: currently unused, plugins cannot read or change system
> - * register state.
> + * Note: currently QEMU_PLUGIN_CB_RW_REGS is unused, plugins cannot change
> + * system register state.
> */
> enum qemu_plugin_cb_flags {
> QEMU_PLUGIN_CB_NO_REGS,
> @@ -708,4 +709,50 @@ uint64_t qemu_plugin_end_code(void);
> QEMU_PLUGIN_API
> uint64_t qemu_plugin_entry_code(void);
>
> +/** struct qemu_plugin_register - Opaque handle for register access */
> +struct qemu_plugin_register;
> +
> +/**
> + * typedef qemu_plugin_reg_descriptor - register descriptions
> + *
> + * @handle: opaque handle for retrieving value with qemu_plugin_read_register
> + * @name: register name
> + * @feature: optional feature descriptor, can be NULL
> + */
> +typedef struct {
> + struct qemu_plugin_register *handle;
> + const char *name;
> + const char *feature;
> +} qemu_plugin_reg_descriptor;
> +
> +/**
> + * qemu_plugin_get_registers() - return register list for vCPU
> + * @vcpu_index: vcpu to query
> + *
> + * Returns a GArray of qemu_plugin_reg_descriptor or NULL. Caller
> + * frees the array (but not the const strings).
> + *
> + * Should be used from a qemu_plugin_register_vcpu_init_cb() callback
> + * after the vCPU is initialised.
> + */
> +GArray * qemu_plugin_get_registers(unsigned int vcpu_index);
> +
> +/**
> + * qemu_plugin_read_register() - read register
> + *
> + * @vcpu: vcpu index
> + * @handle: a @qemu_plugin_reg_handle handle
> + * @buf: A GByteArray for the data owned by the plugin
> + *
> + * This function is only available in a context that register read access is
> + * explicitly requested.
> + *
> + * Returns the size of the read register. The content of @buf is in target byte
> + * order. On failure returns -1
> + */
> +int qemu_plugin_read_register(unsigned int vcpu,
> + struct qemu_plugin_register *handle,
> + GByteArray *buf);
> +
> +
> #endif /* QEMU_QEMU_PLUGIN_H */
> diff --git a/plugins/api.c b/plugins/api.c
> index ac39cdea0b3..f8905325c43 100644
> --- a/plugins/api.c
> +++ b/plugins/api.c
> @@ -8,6 +8,7 @@
> *
> * qemu_plugin_tb
> * qemu_plugin_insn
> + * qemu_plugin_register
> *
> * Which can then be passed back into the API to do additional things.
> * As such all the public functions in here are exported in
> @@ -35,10 +36,12 @@
> */
>
> #include "qemu/osdep.h"
> +#include "qemu/main-loop.h"
> #include "qemu/plugin.h"
> #include "qemu/log.h"
> #include "tcg/tcg.h"
> #include "exec/exec-all.h"
> +#include "exec/gdbstub.h"
> #include "exec/ram_addr.h"
> #include "disas/disas.h"
> #include "plugin.h"
> @@ -435,3 +438,102 @@ uint64_t qemu_plugin_entry_code(void)
> #endif
> return entry;
> }
> +
> +/*
> + * Register handles
> + *
> + * The plugin infrastructure keeps hold of these internal data
> + * structures which are presented to plugins as opaque handles. They
> + * are global to the system and therefor additions to the hash table
> + * must be protected by the @reg_handle_lock.
> + *
> + * In order to future proof for up-coming heterogeneous work we want
> + * different entries for each CPU type while sharing them in the
> + * common case of multiple cores of the same type.
> + */
> +
> +static QemuMutex reg_handle_lock;
> +
> +struct qemu_plugin_register {
> + const char *name;
> + int gdb_reg_num;
> +};
> +
> +static GHashTable *reg_handles; /* hash table of PluginReg */
> +
> +/* Generate a stable key - would xxhash be overkill? */
> +static gpointer cpu_plus_reg_to_key(CPUState *cs, int gdb_regnum)
> +{
> + uintptr_t key = (uintptr_t) cs->cc;
> + key ^= gdb_regnum;
> + return GUINT_TO_POINTER(key);
> +}
> +
> +/*
> + * Create register handles.
> + *
> + * We need to create a handle for each register so the plugin
> + * infrastructure can call gdbstub to read a register. We also
> + * construct a result array with those handles and some ancillary data
> + * the plugin might find useful.
> + */
> +
> +static GArray * create_register_handles(CPUState *cs, GArray *gdbstub_regs) {
> + GArray *find_data = g_array_new(true, true, sizeof(qemu_plugin_reg_descriptor));
> +
> + WITH_QEMU_LOCK_GUARD(®_handle_lock) {
> +
> + if (!reg_handles) {
> + reg_handles = g_hash_table_new(g_direct_hash, g_direct_equal);
> + }
> +
> + for (int i=0; i < gdbstub_regs->len; i++) {
> + GDBRegDesc *grd = &g_array_index(gdbstub_regs, GDBRegDesc, i);
> + gpointer key = cpu_plus_reg_to_key(cs, grd->gdb_reg);
> + struct qemu_plugin_register *val = g_hash_table_lookup(reg_handles, key);
> +
> + /* Doesn't exist, create one */
> + if (!val) {
> + val = g_new0(struct qemu_plugin_register, 1);
> + val->gdb_reg_num = grd->gdb_reg;
> + val->name = g_intern_string(grd->name);
> +
> + g_hash_table_insert(reg_handles, key, val);
> + }
> +
> + /* Create a record for the plugin */
> + qemu_plugin_reg_descriptor desc = {
> + .handle = val,
> + .name = val->name,
> + .feature = g_intern_string(grd->feature_name)
> + };
> + g_array_append_val(find_data, desc);
> + }
> + }
> +
> + return find_data;
> +}
> +
> +GArray * qemu_plugin_get_registers(unsigned int vcpu)
> +{
> + CPUState *cs = qemu_get_cpu(vcpu);
> + if (cs) {
> + g_autoptr(GArray) regs = gdb_get_register_list(cs);
> + return regs->len ? create_register_handles(cs, regs) : NULL;
> + } else {
> + return NULL;
> + }
> +}
> +
> +int qemu_plugin_read_register(unsigned int vcpu, struct qemu_plugin_register *reg, GByteArray *buf)
> +{
> + CPUState *cs = qemu_get_cpu(vcpu);
> + /* assert with debugging on? */
> + return gdb_read_register(cs, buf, reg->gdb_reg_num);
> +}
> +
> +static void __attribute__((__constructor__)) qemu_api_init(void)
> +{
> + qemu_mutex_init(®_handle_lock);
> +
> +}
> diff --git a/plugins/qemu-plugins.symbols b/plugins/qemu-plugins.symbols
> index 71f6c90549d..6963585c1ea 100644
> --- a/plugins/qemu-plugins.symbols
> +++ b/plugins/qemu-plugins.symbols
> @@ -3,6 +3,7 @@
> qemu_plugin_end_code;
> qemu_plugin_entry_code;
> qemu_plugin_get_hwaddr;
> + qemu_plugin_get_registers;
> qemu_plugin_hwaddr_device_name;
> qemu_plugin_hwaddr_is_io;
> qemu_plugin_hwaddr_phys_addr;
> @@ -20,6 +21,7 @@
> qemu_plugin_n_vcpus;
> qemu_plugin_outs;
> qemu_plugin_path_to_binary;
> + qemu_plugin_read_register;
> qemu_plugin_register_atexit_cb;
> qemu_plugin_register_flush_cb;
> qemu_plugin_register_vcpu_exit_cb;
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 23/43] target/riscv: Remove misa_mxl validation
2024-01-11 23:29 ` Alistair Francis
@ 2024-01-12 13:56 ` Alex Bennée
2024-01-15 11:51 ` Alex Bennée
0 siblings, 1 reply; 76+ messages in thread
From: Alex Bennée @ 2024-01-12 13:56 UTC (permalink / raw)
To: Alistair Francis
Cc: qemu-devel, Palmer Dabbelt, Alistair Francis, Bin Meng, Weiwei Li,
Daniel Henrique Barboza, Liu Zhiwei, qemu-riscv, Akihiko Odaki
Alistair Francis <alistair23@gmail.com> writes:
> On Tue, Jan 9, 2024 at 1:43 AM Alex Bennée <alex.bennee@linaro.org> wrote:
>>
>> Alex Bennée <alex.bennee@linaro.org> writes:
>>
>> > From: Akihiko Odaki <akihiko.odaki@daynix.com>
>> >
>> > It is initialized with a simple assignment and there is little room for
>> > error. In fact, the validation is even more complex.
>> >
>> > Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
>> > Acked-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
>> > Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
>> > Acked-by: Alistair Francis <alistair.francis@wdc.com>
>> > Message-Id: <20231213-riscv-v7-2-a760156a337f@daynix.com>
>> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>>
>> ping: along with this are the RiscV maintainers happy for me to take:
>>
>> [PATCH v2 23/43] target/riscv: Remove misa_mxl validation
>> [PATCH v2 24/43] target/riscv: Move misa_mxl_max to class
>> [PATCH v2 25/43] target/riscv: Validate misa_mxl_max only once
>>
>> through my next pull request?
>
> Yep! Go for it
Sadly some of the recent changes that went through have created a merge
conflict.
Akihiko,
Any chance you could re-spin just the MISA_MXL patches?
>
> Alistair
>
>>
>> <snip>
>>
>> --
>> Alex Bennée
>> Virtualisation Tech Lead @ Linaro
>>
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 12/43] qtest: bump boot-serial-test timeout to 3 minutes
2024-01-03 17:33 ` [PATCH v2 12/43] qtest: bump boot-serial-test timeout to 3 minutes Alex Bennée
@ 2024-01-12 15:13 ` Thomas Huth
2024-01-12 15:44 ` Daniel P. Berrangé
2024-01-12 16:46 ` Alex Bennée
0 siblings, 2 replies; 76+ messages in thread
From: Thomas Huth @ 2024-01-12 15:13 UTC (permalink / raw)
To: Alex Bennée, qemu-devel, Peter Maydell
Cc: qemu-s390x, qemu-ppc, Richard Henderson, Song Gao,
Marc-André Lureau, David Hildenbrand, Aurelien Jarno,
Yoshinori Sato, Yanan Wang, Bin Meng, Laurent Vivier,
Michael Rolnik, Alexandre Iooss, David Woodhouse, Laurent Vivier,
Paolo Bonzini, Brian Cain, Daniel Henrique Barboza, Beraldo Leal,
Paul Durrant, Mahmoud Mandour, Liu Zhiwei, Cleber Rosa, kvm,
Wainer dos Santos Moschetta, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
On 03/01/2024 18.33, Alex Bennée wrote:
> From: Daniel P. Berrangé <berrange@redhat.com>
>
> The boot-serial-test takes about 1 + 1/2 minutes in a --enable-debug
> build. Bumping to 3 minutes will give more headroom.
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> Message-ID: <20230717182859.707658-9-berrange@redhat.com>
> Signed-off-by: Thomas Huth <thuth@redhat.com>
> Message-Id: <20231215070357.10888-9-thuth@redhat.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> tests/qtest/meson.build | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
> index c7944e8dbe9..dc1e6da5c7b 100644
> --- a/tests/qtest/meson.build
> +++ b/tests/qtest/meson.build
> @@ -6,6 +6,7 @@ slow_qtests = {
> 'test-hmp' : 240,
> 'pxe-test': 600,
> 'prom-env-test': 360,
> + 'boot-serial-test': 180,
> }
>
> qtests_generic = [
3 minutes was obviously not enough:
https://gitlab.com/qemu-project/qemu/-/jobs/5918818492#L4984
And in older runs, we can see that the boot-serial-test might take longer
than 180s when run with TCI :
https://gitlab.com/qemu-project/qemu/-/jobs/5890481086#L4772
So I think we should bump the timeout to 240s here. Alex, are you going to
respin your pull request? If so, could you modify your patch? Otherwise I
can also send a new version of this patch here, just let me know.
Thomas
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 12/43] qtest: bump boot-serial-test timeout to 3 minutes
2024-01-12 15:13 ` Thomas Huth
@ 2024-01-12 15:44 ` Daniel P. Berrangé
2024-01-12 16:46 ` Alex Bennée
1 sibling, 0 replies; 76+ messages in thread
From: Daniel P. Berrangé @ 2024-01-12 15:44 UTC (permalink / raw)
To: Thomas Huth
Cc: Alex Bennée, qemu-devel, Peter Maydell, qemu-s390x, qemu-ppc,
Richard Henderson, Song Gao, Marc-André Lureau,
David Hildenbrand, Aurelien Jarno, Yoshinori Sato, Yanan Wang,
Bin Meng, Laurent Vivier, Michael Rolnik, Alexandre Iooss,
David Woodhouse, Laurent Vivier, Paolo Bonzini, Brian Cain,
Daniel Henrique Barboza, Beraldo Leal, Paul Durrant,
Mahmoud Mandour, Liu Zhiwei, Cleber Rosa, kvm,
Wainer dos Santos Moschetta, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis
On Fri, Jan 12, 2024 at 04:13:16PM +0100, Thomas Huth wrote:
> On 03/01/2024 18.33, Alex Bennée wrote:
> > From: Daniel P. Berrangé <berrange@redhat.com>
> >
> > The boot-serial-test takes about 1 + 1/2 minutes in a --enable-debug
> > build. Bumping to 3 minutes will give more headroom.
> >
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > Reviewed-by: Thomas Huth <thuth@redhat.com>
> > Message-ID: <20230717182859.707658-9-berrange@redhat.com>
> > Signed-off-by: Thomas Huth <thuth@redhat.com>
> > Message-Id: <20231215070357.10888-9-thuth@redhat.com>
> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> > ---
> > tests/qtest/meson.build | 1 +
> > 1 file changed, 1 insertion(+)
> >
> > diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
> > index c7944e8dbe9..dc1e6da5c7b 100644
> > --- a/tests/qtest/meson.build
> > +++ b/tests/qtest/meson.build
> > @@ -6,6 +6,7 @@ slow_qtests = {
> > 'test-hmp' : 240,
> > 'pxe-test': 600,
> > 'prom-env-test': 360,
> > + 'boot-serial-test': 180,
> > }
> > qtests_generic = [
>
> 3 minutes was obviously not enough:
>
> https://gitlab.com/qemu-project/qemu/-/jobs/5918818492#L4984
>
> And in older runs, we can see that the boot-serial-test might take longer
> than 180s when run with TCI :
>
> https://gitlab.com/qemu-project/qemu/-/jobs/5890481086#L4772
>
> So I think we should bump the timeout to 240s here. Alex, are you going to
> respin your pull request? If so, could you modify your patch? Otherwise I
> can also send a new version of this patch here, just let me know.
Agreed, 240s seems a good next attempt
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 12/43] qtest: bump boot-serial-test timeout to 3 minutes
2024-01-12 15:13 ` Thomas Huth
2024-01-12 15:44 ` Daniel P. Berrangé
@ 2024-01-12 16:46 ` Alex Bennée
1 sibling, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-12 16:46 UTC (permalink / raw)
To: Thomas Huth
Cc: qemu-devel, Peter Maydell, qemu-s390x, qemu-ppc,
Richard Henderson, Song Gao, Marc-André Lureau,
David Hildenbrand, Aurelien Jarno, Yoshinori Sato, Yanan Wang,
Bin Meng, Laurent Vivier, Michael Rolnik, Alexandre Iooss,
David Woodhouse, Laurent Vivier, Paolo Bonzini, Brian Cain,
Daniel Henrique Barboza, Beraldo Leal, Paul Durrant,
Mahmoud Mandour, Liu Zhiwei, Cleber Rosa, kvm,
Wainer dos Santos Moschetta, qemu-arm, Weiwei Li,
Philippe Mathieu-Daudé, John Snow, Daniel Henrique Barboza,
Nicholas Piggin, Palmer Dabbelt, Marcel Apfelbaum,
Ilya Leoshkevich, Cédric Le Goater, Edgar E. Iglesias,
Eduardo Habkost, Pierrick Bouvier, qemu-riscv, Alistair Francis,
Daniel P. Berrangé
Thomas Huth <thuth@redhat.com> writes:
> On 03/01/2024 18.33, Alex Bennée wrote:
>> From: Daniel P. Berrangé <berrange@redhat.com>
>> The boot-serial-test takes about 1 + 1/2 minutes in a --enable-debug
>> build. Bumping to 3 minutes will give more headroom.
>> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
>> Reviewed-by: Thomas Huth <thuth@redhat.com>
>> Message-ID: <20230717182859.707658-9-berrange@redhat.com>
>> Signed-off-by: Thomas Huth <thuth@redhat.com>
>> Message-Id: <20231215070357.10888-9-thuth@redhat.com>
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> ---
>> tests/qtest/meson.build | 1 +
>> 1 file changed, 1 insertion(+)
>> diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
>> index c7944e8dbe9..dc1e6da5c7b 100644
>> --- a/tests/qtest/meson.build
>> +++ b/tests/qtest/meson.build
>> @@ -6,6 +6,7 @@ slow_qtests = {
>> 'test-hmp' : 240,
>> 'pxe-test': 600,
>> 'prom-env-test': 360,
>> + 'boot-serial-test': 180,
>> }
>> qtests_generic = [
>
> 3 minutes was obviously not enough:
>
> https://gitlab.com/qemu-project/qemu/-/jobs/5918818492#L4984
>
> And in older runs, we can see that the boot-serial-test might take
> longer than 180s when run with TCI :
>
> https://gitlab.com/qemu-project/qemu/-/jobs/5890481086#L4772
>
> So I think we should bump the timeout to 240s here. Alex, are you
> going to respin your pull request? If so, could you modify your patch?
> Otherwise I can also send a new version of this patch here, just let
> me know.
I'm travelling now so its tricky to respin. If you could send a new
version that would be great.
>
> Thomas
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 76+ messages in thread
* Re: [PATCH v2 23/43] target/riscv: Remove misa_mxl validation
2024-01-12 13:56 ` Alex Bennée
@ 2024-01-15 11:51 ` Alex Bennée
0 siblings, 0 replies; 76+ messages in thread
From: Alex Bennée @ 2024-01-15 11:51 UTC (permalink / raw)
To: Alistair Francis
Cc: qemu-devel, Palmer Dabbelt, Alistair Francis, Bin Meng, Weiwei Li,
Daniel Henrique Barboza, Liu Zhiwei, qemu-riscv, Akihiko Odaki
Alex Bennée <alex.bennee@linaro.org> writes:
> Alistair Francis <alistair23@gmail.com> writes:
>
>> On Tue, Jan 9, 2024 at 1:43 AM Alex Bennée <alex.bennee@linaro.org> wrote:
>>>
>>> Alex Bennée <alex.bennee@linaro.org> writes:
>>>
>>> > From: Akihiko Odaki <akihiko.odaki@daynix.com>
>>> >
>>> > It is initialized with a simple assignment and there is little room for
>>> > error. In fact, the validation is even more complex.
>>> >
>>> > Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
>>> > Acked-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
>>> > Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
>>> > Acked-by: Alistair Francis <alistair.francis@wdc.com>
>>> > Message-Id: <20231213-riscv-v7-2-a760156a337f@daynix.com>
>>> > Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>>>
>>> ping: along with this are the RiscV maintainers happy for me to take:
>>>
>>> [PATCH v2 23/43] target/riscv: Remove misa_mxl validation
>>> [PATCH v2 24/43] target/riscv: Move misa_mxl_max to class
>>> [PATCH v2 25/43] target/riscv: Validate misa_mxl_max only once
>>>
>>> through my next pull request?
>>
>> Yep! Go for it
>
> Sadly some of the recent changes that went through have created a merge
> conflict.
>
> Akihiko,
>
> Any chance you could re-spin just the MISA_MXL patches?
Never mind, I think I got it figured out.
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
^ permalink raw reply [flat|nested] 76+ messages in thread
end of thread, other threads:[~2024-01-15 11:52 UTC | newest]
Thread overview: 76+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-03 17:33 [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
2024-01-03 17:33 ` [PATCH v2 01/43] tests/avocado: Add a test for a little-endian microblaze machine Alex Bennée
2024-01-03 17:33 ` [PATCH v2 02/43] tests/avocado: use snapshot=on in kvm_xen_guest Alex Bennée
2024-01-11 13:30 ` Philippe Mathieu-Daudé
2024-01-03 17:33 ` [PATCH v2 03/43] gitlab: include microblazeel in testing Alex Bennée
2024-01-11 13:15 ` Thomas Huth
2024-01-03 17:33 ` [PATCH v2 04/43] chardev: use bool for fe_is_open Alex Bennée
2024-01-03 17:33 ` [PATCH v2 05/43] qtest: bump min meson timeout to 60 seconds Alex Bennée
2024-01-03 17:33 ` [PATCH v2 06/43] qtest: bump migration-test timeout to 8 minutes Alex Bennée
2024-01-03 17:33 ` [PATCH v2 07/43] qtest: bump qom-test timeout to 15 minutes Alex Bennée
2024-01-03 17:33 ` [PATCH v2 08/43] qtest: bump npcm7xx_pwn-test timeout to 5 minutes Alex Bennée
2024-01-03 17:40 ` Philippe Mathieu-Daudé
2024-01-08 10:50 ` Thomas Huth
2024-01-08 12:26 ` Ilya Leoshkevich
2024-01-03 17:33 ` [PATCH v2 09/43] qtest: bump test-hmp timeout to 4 minutes Alex Bennée
2024-01-03 17:33 ` [PATCH v2 10/43] qtest: bump pxe-test timeout to 10 minutes Alex Bennée
2024-01-03 17:43 ` Philippe Mathieu-Daudé
2024-01-04 9:31 ` Daniel P. Berrangé
2024-01-03 17:33 ` [PATCH v2 11/43] qtest: bump prom-env-test timeout to 6 minutes Alex Bennée
2024-01-03 17:33 ` [PATCH v2 12/43] qtest: bump boot-serial-test timeout to 3 minutes Alex Bennée
2024-01-12 15:13 ` Thomas Huth
2024-01-12 15:44 ` Daniel P. Berrangé
2024-01-12 16:46 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 13/43] qtest: bump qos-test timeout to 2 minutes Alex Bennée
2024-01-03 17:33 ` [PATCH v2 14/43] qtest: bump aspeed_smc-test timeout to 6 minutes Alex Bennée
2024-01-03 17:33 ` [PATCH v2 15/43] qtest: bump bios-table-test timeout to 9 minutes Alex Bennée
2024-01-03 17:33 ` [PATCH v2 16/43] tests/qtest: Bump the device-introspect-test timeout to 12 minutes Alex Bennée
2024-01-03 17:33 ` [PATCH v2 17/43] tests/unit: Bump test-aio-multithread test timeout to 2 minutes Alex Bennée
2024-01-03 17:33 ` [PATCH v2 18/43] tests/unit: Bump test-crypto-block test timeout to 5 minutes Alex Bennée
2024-01-03 17:33 ` [PATCH v2 19/43] tests/fp: Bump fp-test-mulAdd test timeout to 3 minutes Alex Bennée
2024-01-03 17:33 ` [PATCH v2 20/43] mtest2make: stop disabling meson test timeouts Alex Bennée
2024-01-03 17:33 ` [PATCH v2 21/43] readthodocs: fully specify a build environment Alex Bennée
2024-01-03 17:33 ` [PATCH v2 22/43] hw/riscv: Use misa_mxl instead of misa_mxl_max Alex Bennée
2024-01-03 17:33 ` [PATCH v2 23/43] target/riscv: Remove misa_mxl validation Alex Bennée
2024-01-08 15:42 ` Alex Bennée
2024-01-11 23:29 ` Alistair Francis
2024-01-12 13:56 ` Alex Bennée
2024-01-15 11:51 ` Alex Bennée
2024-01-03 17:33 ` [PATCH v2 24/43] target/riscv: Move misa_mxl_max to class Alex Bennée
2024-01-11 23:28 ` Alistair Francis
2024-01-03 17:33 ` [PATCH v2 25/43] target/riscv: Validate misa_mxl_max only once Alex Bennée
2024-01-11 23:29 ` Alistair Francis
2024-01-03 17:33 ` [PATCH v2 26/43] target/arm: Use GDBFeature for dynamic XML Alex Bennée
2024-01-03 17:33 ` [PATCH v2 27/43] target/ppc: " Alex Bennée
2024-01-03 17:33 ` [PATCH v2 28/43] target/riscv: " Alex Bennée
2024-01-03 17:33 ` [PATCH v2 29/43] gdbstub: Use GDBFeature for gdb_register_coprocessor Alex Bennée
2024-01-03 17:33 ` [PATCH v2 30/43] gdbstub: Use GDBFeature for GDBRegisterState Alex Bennée
2024-01-03 17:50 ` Philippe Mathieu-Daudé
2024-01-03 17:33 ` [PATCH v2 31/43] gdbstub: Change gdb_get_reg_cb and gdb_set_reg_cb Alex Bennée
2024-01-03 17:33 ` [PATCH v2 32/43] gdbstub: Simplify XML lookup Alex Bennée
2024-01-03 17:33 ` [PATCH v2 33/43] gdbstub: Infer number of core registers from XML Alex Bennée
2024-01-03 17:33 ` [PATCH v2 34/43] hw/core/cpu: Remove gdb_get_dynamic_xml member Alex Bennée
2024-01-03 17:33 ` [PATCH v2 35/43] gdbstub: Add members to identify registers to GDBFeature Alex Bennée
2024-01-03 17:33 ` [PATCH v2 36/43] plugins: Use different helpers when reading registers Alex Bennée
2024-01-09 14:24 ` Pierrick Bouvier
2024-01-03 17:33 ` [PATCH v2 37/43] gdbstub: expose api to find registers Alex Bennée
2024-01-03 17:33 ` [PATCH v2 38/43] plugins: add an API to read registers Alex Bennée
2024-01-04 12:05 ` Akihiko Odaki
2024-01-04 12:22 ` Alex Bennée
2024-01-04 13:22 ` Akihiko Odaki
2024-01-09 15:05 ` Pierrick Bouvier
2024-01-11 12:34 ` Alex Bennée
2024-01-12 3:49 ` Pierrick Bouvier
2024-01-03 17:33 ` [PATCH v2 39/43] contrib/plugins: fix imatch Alex Bennée
2024-01-03 17:47 ` Philippe Mathieu-Daudé
2024-01-03 17:33 ` [PATCH v2 40/43] contrib/plugins: extend execlog to track register changes Alex Bennée
2024-01-05 10:40 ` Frédéric Pétrot
2024-01-11 12:24 ` Alex Bennée
2024-01-11 14:10 ` Frédéric Pétrot
2024-01-03 17:33 ` [PATCH v2 41/43] contrib/plugins: optimise the register value tracking Alex Bennée
2024-01-03 17:33 ` [PATCH v2 42/43] docs/devel: lift example and plugin API sections up Alex Bennée
2024-01-09 14:25 ` Pierrick Bouvier
2024-01-11 14:01 ` Philippe Mathieu-Daudé
2024-01-03 17:33 ` [PATCH v2 43/43] docs/devel: document some plugin assumptions Alex Bennée
2024-01-09 14:28 ` Pierrick Bouvier
2024-01-11 12:37 ` [PATCH v2 00/43] testing and plugin updates for 9.0 (pre-PR) Alex Bennée
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).