[PATCH v7 0/8] Enable PC diversion via the plugin API

Florian Hofhammer posted 8 patches 4 weeks, 1 day ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20260305-setpc-v5-v7-0-4c3adba52403@epfl.ch
Maintainers: Laurent Vivier <laurent@vivier.eu>, Pierrick Bouvier <pierrick.bouvier@linaro.org>, Brian Cain <brian.cain@oss.qualcomm.com>, "Alex Bennée" <alex.bennee@linaro.org>, Alexandre Iooss <erdnaxe@crans.org>, Mahmoud Mandour <ma.mandourr@gmail.com>, John Snow <jsnow@redhat.com>, Cleber Rosa <crosa@redhat.com>, Peter Maydell <peter.maydell@linaro.org>
MAINTAINERS                                        |   1 +
include/plugins/qemu-plugin.h                      |  19 +++
linux-user/aarch64/cpu_loop.c                      |   2 +-
linux-user/alpha/cpu_loop.c                        |   2 +-
linux-user/arm/cpu_loop.c                          |   2 +-
linux-user/hexagon/cpu_loop.c                      |   2 +-
linux-user/hppa/cpu_loop.c                         |   1 +
linux-user/i386/cpu_loop.c                         |   8 +-
linux-user/include/special-errno.h                 |   8 ++
linux-user/loongarch64/cpu_loop.c                  |   5 +-
linux-user/m68k/cpu_loop.c                         |   2 +-
linux-user/microblaze/cpu_loop.c                   |   2 +-
linux-user/mips/cpu_loop.c                         |   9 +-
linux-user/or1k/cpu_loop.c                         |   2 +-
linux-user/ppc/cpu_loop.c                          |  10 +-
linux-user/riscv/cpu_loop.c                        |   2 +-
linux-user/s390x/cpu_loop.c                        |   2 +-
linux-user/sh4/cpu_loop.c                          |   2 +-
linux-user/sparc/cpu_loop.c                        |   4 +-
linux-user/syscall.c                               |  16 +++
linux-user/xtensa/cpu_loop.c                       |   1 +
plugins/api.c                                      |  42 ++++++-
plugins/core.c                                     |  50 ++++++--
scripts/qemu-plugin-symbols.py                     |   9 +-
tests/tcg/arm/Makefile.target                      |   6 +
tests/tcg/hexagon/Makefile.target                  |   8 ++
tests/tcg/multiarch/Makefile.target                |  17 ++-
.../multiarch/{ => plugin}/check-plugin-output.sh  |   0
.../{ => plugin}/test-plugin-mem-access.c          |   0
tests/tcg/multiarch/plugin/test-plugin-set-pc.c    | 134 +++++++++++++++++++++
tests/tcg/plugins/meson.build                      |   2 +
tests/tcg/plugins/registers.c                      |  79 ++++++++++++
tests/tcg/plugins/setpc.c                          | 109 +++++++++++++++++
33 files changed, 514 insertions(+), 44 deletions(-)
[PATCH v7 0/8] Enable PC diversion via the plugin API
Posted by Florian Hofhammer 4 weeks, 1 day ago
Hi,

This patch series builds on top of the discussion from the thread at
https://lore.kernel.org/qemu-devel/e9bcd7c7-2d67-469e-b2f3-d1a68e456b2b@epfl.ch/
and adds a plugin API function to set the program counter of the guest,
as just writing to it via qemu_plugin_write_register() has no direct
effect.

This version v7 of the patch series addresses the requested changes from
the previous v6 submission (details below).

Note: checkpatch.pl still reports a warning about line length violations
in patch nr. 7/8 but I did not fix this, as the line was already > 80
characters long previously, the change added only a single character,
and I think the readability of the code is better as it is now. Please
let me know if you disagree and would like me to fix this!

@Pierrick: you already reviewed patch 3/7 (now 4/8) previously, but I
had to change the regex in scripts/qemu-plugin-symbols.py to account for
attributes, so please re-review!

Best regards,
Florian 

Changes:
v7:
- Add Pierrick's patch to clamp 32-bit registers to prevent accidental
  sign extension
- Fix documentation build by using __attribute__((__noreturn__)) instead
  of G_NORETURN (required adjusting scripts/qemu-plugin-symbols.py).
- Rework test-plugin-set-pc test to get rid of volatile guard and make
  control flow more linear
- Link to v6: https://lore.kernel.org/qemu-devel/20260303-setpc-v5-v6-0-15c77cfe184e@epfl.ch
v6:
- update commit message for patch 4/7
v5:
- make QEMU abort via asserts instead of just returning an error from
  the plugin API if preconditions are violated
- extend tests for qemu_plugin_set_pc() to different contexts
- fix issues highlighted by checkpatch.pl
v4:
- switch strcmp out in favor of g_strcmp0 
- split the patch introducing the qemu_plugin_set_pc() API into three
  patches, two for preparing the plugin infrastructure and the syscall
  handling code and a third introducing the actual plugin API
v3:
- make PC registers read-only across architectures
- add tests for read-only registers
- adjust test structure for qemu_plugin_set_pc() by moving
   architecture-specific tests into corresponding directories
v2:
- add setjmp() in syscall handling path to allow PC redirection from
   syscall callbacks (via longjmp(), the cpu_loop()'s setjmp() for
   exiting a TB would not be live anymore in syscall handlers)
- add flags to ensure the qemu_plugin_set_pc() API is only called from
   contexts where the CPU is live
- add test for qemu_plugin_set_pc() API
v1:
- initial version

---
Florian Hofhammer (7):
      plugins: add flag to specify whether PC is rw
      linux-user: make syscall emulation interruptible
      plugins: add PC diversion API function
      tests/tcg: add tests for qemu_plugin_set_pc API
      plugins: add read-only property for registers
      plugins: prohibit writing to read-only registers
      tests/tcg/plugins: test register accesses

Pierrick Bouvier (1):
      plugins/core: clamp syscall arguments if target is 32-bit

 MAINTAINERS                                        |   1 +
 include/plugins/qemu-plugin.h                      |  19 +++
 linux-user/aarch64/cpu_loop.c                      |   2 +-
 linux-user/alpha/cpu_loop.c                        |   2 +-
 linux-user/arm/cpu_loop.c                          |   2 +-
 linux-user/hexagon/cpu_loop.c                      |   2 +-
 linux-user/hppa/cpu_loop.c                         |   1 +
 linux-user/i386/cpu_loop.c                         |   8 +-
 linux-user/include/special-errno.h                 |   8 ++
 linux-user/loongarch64/cpu_loop.c                  |   5 +-
 linux-user/m68k/cpu_loop.c                         |   2 +-
 linux-user/microblaze/cpu_loop.c                   |   2 +-
 linux-user/mips/cpu_loop.c                         |   9 +-
 linux-user/or1k/cpu_loop.c                         |   2 +-
 linux-user/ppc/cpu_loop.c                          |  10 +-
 linux-user/riscv/cpu_loop.c                        |   2 +-
 linux-user/s390x/cpu_loop.c                        |   2 +-
 linux-user/sh4/cpu_loop.c                          |   2 +-
 linux-user/sparc/cpu_loop.c                        |   4 +-
 linux-user/syscall.c                               |  16 +++
 linux-user/xtensa/cpu_loop.c                       |   1 +
 plugins/api.c                                      |  42 ++++++-
 plugins/core.c                                     |  50 ++++++--
 scripts/qemu-plugin-symbols.py                     |   9 +-
 tests/tcg/arm/Makefile.target                      |   6 +
 tests/tcg/hexagon/Makefile.target                  |   8 ++
 tests/tcg/multiarch/Makefile.target                |  17 ++-
 .../multiarch/{ => plugin}/check-plugin-output.sh  |   0
 .../{ => plugin}/test-plugin-mem-access.c          |   0
 tests/tcg/multiarch/plugin/test-plugin-set-pc.c    | 134 +++++++++++++++++++++
 tests/tcg/plugins/meson.build                      |   2 +
 tests/tcg/plugins/registers.c                      |  79 ++++++++++++
 tests/tcg/plugins/setpc.c                          | 109 +++++++++++++++++
 33 files changed, 514 insertions(+), 44 deletions(-)
---
base-commit: 3fb456e9a0e9eef6a71d9b49bfff596a0f0046e9
change-id: 20260303-setpc-v5-c1df30bad07f
Re: [PATCH v7 0/8] Enable PC diversion via the plugin API
Posted by Pierrick Bouvier 3 weeks, 6 days ago
On 3/5/26 2:05 AM, Florian Hofhammer wrote:
> Hi,
> 
> This patch series builds on top of the discussion from the thread at
> https://lore.kernel.org/qemu-devel/e9bcd7c7-2d67-469e-b2f3-d1a68e456b2b@epfl.ch/
> and adds a plugin API function to set the program counter of the guest,
> as just writing to it via qemu_plugin_write_register() has no direct
> effect.
> 
> This version v7 of the patch series addresses the requested changes from
> the previous v6 submission (details below).
> 
> Note: checkpatch.pl still reports a warning about line length violations
> in patch nr. 7/8 but I did not fix this, as the line was already > 80
> characters long previously, the change added only a single character,
> and I think the readability of the code is better as it is now. Please
> let me know if you disagree and would like me to fix this!
> 
> @Pierrick: you already reviewed patch 3/7 (now 4/8) previously, but I
> had to change the regex in scripts/qemu-plugin-symbols.py to account for
> attributes, so please re-review!
> 
> Best regards,
> Florian
> 
> Changes:
> v7:
> - Add Pierrick's patch to clamp 32-bit registers to prevent accidental
>    sign extension
> - Fix documentation build by using __attribute__((__noreturn__)) instead
>    of G_NORETURN (required adjusting scripts/qemu-plugin-symbols.py).
> - Rework test-plugin-set-pc test to get rid of volatile guard and make
>    control flow more linear
> - Link to v6: https://lore.kernel.org/qemu-devel/20260303-setpc-v5-v6-0-15c77cfe184e@epfl.ch
> v6:
> - update commit message for patch 4/7
> v5:
> - make QEMU abort via asserts instead of just returning an error from
>    the plugin API if preconditions are violated
> - extend tests for qemu_plugin_set_pc() to different contexts
> - fix issues highlighted by checkpatch.pl
> v4:
> - switch strcmp out in favor of g_strcmp0
> - split the patch introducing the qemu_plugin_set_pc() API into three
>    patches, two for preparing the plugin infrastructure and the syscall
>    handling code and a third introducing the actual plugin API
> v3:
> - make PC registers read-only across architectures
> - add tests for read-only registers
> - adjust test structure for qemu_plugin_set_pc() by moving
>     architecture-specific tests into corresponding directories
> v2:
> - add setjmp() in syscall handling path to allow PC redirection from
>     syscall callbacks (via longjmp(), the cpu_loop()'s setjmp() for
>     exiting a TB would not be live anymore in syscall handlers)
> - add flags to ensure the qemu_plugin_set_pc() API is only called from
>     contexts where the CPU is live
> - add test for qemu_plugin_set_pc() API
> v1:
> - initial version
> 
> ---
> Florian Hofhammer (7):
>        plugins: add flag to specify whether PC is rw
>        linux-user: make syscall emulation interruptible
>        plugins: add PC diversion API function
>        tests/tcg: add tests for qemu_plugin_set_pc API
>        plugins: add read-only property for registers
>        plugins: prohibit writing to read-only registers
>        tests/tcg/plugins: test register accesses
> 
> Pierrick Bouvier (1):
>        plugins/core: clamp syscall arguments if target is 32-bit
> 
>   MAINTAINERS                                        |   1 +
>   include/plugins/qemu-plugin.h                      |  19 +++
>   linux-user/aarch64/cpu_loop.c                      |   2 +-
>   linux-user/alpha/cpu_loop.c                        |   2 +-
>   linux-user/arm/cpu_loop.c                          |   2 +-
>   linux-user/hexagon/cpu_loop.c                      |   2 +-
>   linux-user/hppa/cpu_loop.c                         |   1 +
>   linux-user/i386/cpu_loop.c                         |   8 +-
>   linux-user/include/special-errno.h                 |   8 ++
>   linux-user/loongarch64/cpu_loop.c                  |   5 +-
>   linux-user/m68k/cpu_loop.c                         |   2 +-
>   linux-user/microblaze/cpu_loop.c                   |   2 +-
>   linux-user/mips/cpu_loop.c                         |   9 +-
>   linux-user/or1k/cpu_loop.c                         |   2 +-
>   linux-user/ppc/cpu_loop.c                          |  10 +-
>   linux-user/riscv/cpu_loop.c                        |   2 +-
>   linux-user/s390x/cpu_loop.c                        |   2 +-
>   linux-user/sh4/cpu_loop.c                          |   2 +-
>   linux-user/sparc/cpu_loop.c                        |   4 +-
>   linux-user/syscall.c                               |  16 +++
>   linux-user/xtensa/cpu_loop.c                       |   1 +
>   plugins/api.c                                      |  42 ++++++-
>   plugins/core.c                                     |  50 ++++++--
>   scripts/qemu-plugin-symbols.py                     |   9 +-
>   tests/tcg/arm/Makefile.target                      |   6 +
>   tests/tcg/hexagon/Makefile.target                  |   8 ++
>   tests/tcg/multiarch/Makefile.target                |  17 ++-
>   .../multiarch/{ => plugin}/check-plugin-output.sh  |   0
>   .../{ => plugin}/test-plugin-mem-access.c          |   0
>   tests/tcg/multiarch/plugin/test-plugin-set-pc.c    | 134 +++++++++++++++++++++
>   tests/tcg/plugins/meson.build                      |   2 +
>   tests/tcg/plugins/registers.c                      |  79 ++++++++++++
>   tests/tcg/plugins/setpc.c                          | 109 +++++++++++++++++
>   33 files changed, 514 insertions(+), 44 deletions(-)
> ---
> base-commit: 3fb456e9a0e9eef6a71d9b49bfff596a0f0046e9
> change-id: 20260303-setpc-v5-c1df30bad07f

This was merged into master (2d3f78269a14a389aefecba28decd16dd5151802).
Thank you for your contribution!

Regards,
Pierrick