From 731525c27607bbe392abe3b8be2bce3ab65ae4f5 Mon Sep 17 00:00:00 2001 From: Ziyang Zhang Date: Thu, 18 Jun 2026 16:24:26 +0800 Subject: [PATCH] plugins: use int64_t for the syscall filter return value The syscall return value passed back through the syscall filter callback is semantically signed: negative values encode errno codes. Declaring the sysret pointer as uint64_t * is therefore misleading and forces callers to launder the value through an unsigned temporary. Change the sysret pointer to int64_t * across the public plugin API typedef (qemu_plugin_vcpu_syscall_filter_cb_t), the internal qemu_plugin_vcpu_syscall_filter() prototypes and stub, its implementation in plugins/core.c, the linux-user caller, and the in-tree example plugins. Signed-off-by: Ziyang Zhang Reviewed-by: Pierrick Bouvier Link: https://lore.kernel.org/qemu-devel/20260618082426.790315-2-functioner@sjtu.edu.cn Signed-off-by: Pierrick Bouvier --- include/plugins/qemu-plugin.h | 2 +- include/qemu/plugin.h | 4 ++-- linux-user/syscall.c | 2 +- plugins/core.c | 2 +- tests/tcg/plugins/setpc.c | 2 +- tests/tcg/plugins/syscall.c | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h index d8d4b37384..3e913cd89c 100644 --- a/include/plugins/qemu-plugin.h +++ b/include/plugins/qemu-plugin.h @@ -871,7 +871,7 @@ typedef bool int64_t num, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6, uint64_t a7, uint64_t a8, - uint64_t *sysret, + int64_t *sysret, void *userdata); /** diff --git a/include/qemu/plugin.h b/include/qemu/plugin.h index 9356ee836a..9c2ec8ceae 100644 --- a/include/qemu/plugin.h +++ b/include/qemu/plugin.h @@ -172,7 +172,7 @@ bool qemu_plugin_vcpu_syscall_filter(CPUState *cpu, int64_t num, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6, uint64_t a7, - uint64_t a8, uint64_t *sysret); + uint64_t a8, int64_t *sysret); void qemu_plugin_vcpu_mem_cb(CPUState *cpu, uint64_t vaddr, uint64_t value_low, @@ -288,7 +288,7 @@ static inline bool qemu_plugin_vcpu_syscall_filter(CPUState *cpu, int64_t num, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6, uint64_t a7, - uint64_t a8, uint64_t *sysret) + uint64_t a8, int64_t *sysret) { return false; } diff --git a/linux-user/syscall.c b/linux-user/syscall.c index fbe357b7e0..d257fb9ca9 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -14619,7 +14619,7 @@ static bool send_through_syscall_filters(CPUState *cpu, int num, abi_long arg7, abi_long arg8, abi_long *sysret) { - uint64_t sysret64 = 0; + int64_t sysret64 = 0; bool filtered = qemu_plugin_vcpu_syscall_filter(cpu, num, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, &sysret64); diff --git a/plugins/core.c b/plugins/core.c index 4b55aacd2d..1113bfe567 100644 --- a/plugins/core.c +++ b/plugins/core.c @@ -573,7 +573,7 @@ bool qemu_plugin_vcpu_syscall_filter(CPUState *cpu, int64_t num, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6, uint64_t a7, - uint64_t a8, uint64_t *sysret) + uint64_t a8, int64_t *sysret) { struct qemu_plugin_cb *cb, *next; enum qemu_plugin_event ev = QEMU_PLUGIN_EV_VCPU_SYSCALL_FILTER; diff --git a/tests/tcg/plugins/setpc.c b/tests/tcg/plugins/setpc.c index 7c78f182f0..76b2efc61b 100644 --- a/tests/tcg/plugins/setpc.c +++ b/tests/tcg/plugins/setpc.c @@ -27,7 +27,7 @@ static bool vcpu_syscall_filter(unsigned int vcpu_index, int64_t num, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6, uint64_t a7, uint64_t a8, - uint64_t *sysret, void *userdata) + int64_t *sysret, void *userdata) { if (num == MAGIC_SYSCALL) { if (a1 == SETPC) { diff --git a/tests/tcg/plugins/syscall.c b/tests/tcg/plugins/syscall.c index a28d108784..debec9f09b 100644 --- a/tests/tcg/plugins/syscall.c +++ b/tests/tcg/plugins/syscall.c @@ -176,7 +176,7 @@ static bool vcpu_syscall_filter(unsigned int vcpu_index, int64_t num, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6, uint64_t a7, uint64_t a8, - uint64_t *sysret, void *userdata) + int64_t *sysret, void *userdata) { /* Special syscall to test the filter functionality. */ if (num == 4096 && a1 == 0x66CCFF) {