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 <functioner@sjtu.edu.cn>
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
Link: https://lore.kernel.org/qemu-devel/20260618082426.790315-2-functioner@sjtu.edu.cn
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
This commit is contained in:
Ziyang Zhang
2026-06-18 16:24:26 +08:00
committed by Pierrick Bouvier
parent 3b50303f95
commit 731525c276
6 changed files with 7 additions and 7 deletions

View File

@@ -871,7 +871,7 @@ typedef bool
int64_t num, uint64_t a1, uint64_t a2, int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a3, uint64_t a4, uint64_t a5,
uint64_t a6, uint64_t a7, uint64_t a8, uint64_t a6, uint64_t a7, uint64_t a8,
uint64_t *sysret, int64_t *sysret,
void *userdata); void *userdata);
/** /**

View File

@@ -172,7 +172,7 @@ bool
qemu_plugin_vcpu_syscall_filter(CPUState *cpu, int64_t num, uint64_t a1, qemu_plugin_vcpu_syscall_filter(CPUState *cpu, int64_t num, uint64_t a1,
uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a2, uint64_t a3, uint64_t a4,
uint64_t a5, uint64_t a6, uint64_t a7, 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, void qemu_plugin_vcpu_mem_cb(CPUState *cpu, uint64_t vaddr,
uint64_t value_low, uint64_t value_low,
@@ -288,7 +288,7 @@ static inline bool
qemu_plugin_vcpu_syscall_filter(CPUState *cpu, int64_t num, uint64_t a1, qemu_plugin_vcpu_syscall_filter(CPUState *cpu, int64_t num, uint64_t a1,
uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a2, uint64_t a3, uint64_t a4,
uint64_t a5, uint64_t a6, uint64_t a7, uint64_t a5, uint64_t a6, uint64_t a7,
uint64_t a8, uint64_t *sysret) uint64_t a8, int64_t *sysret)
{ {
return false; return false;
} }

View File

@@ -14619,7 +14619,7 @@ static bool send_through_syscall_filters(CPUState *cpu, int num,
abi_long arg7, abi_long arg8, abi_long arg7, abi_long arg8,
abi_long *sysret) abi_long *sysret)
{ {
uint64_t sysret64 = 0; int64_t sysret64 = 0;
bool filtered = qemu_plugin_vcpu_syscall_filter(cpu, num, arg1, arg2, bool filtered = qemu_plugin_vcpu_syscall_filter(cpu, num, arg1, arg2,
arg3, arg4, arg5, arg6, arg3, arg4, arg5, arg6,
arg7, arg8, &sysret64); arg7, arg8, &sysret64);

View File

@@ -573,7 +573,7 @@ bool
qemu_plugin_vcpu_syscall_filter(CPUState *cpu, int64_t num, uint64_t a1, qemu_plugin_vcpu_syscall_filter(CPUState *cpu, int64_t num, uint64_t a1,
uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a2, uint64_t a3, uint64_t a4,
uint64_t a5, uint64_t a6, uint64_t a7, 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; struct qemu_plugin_cb *cb, *next;
enum qemu_plugin_event ev = QEMU_PLUGIN_EV_VCPU_SYSCALL_FILTER; enum qemu_plugin_event ev = QEMU_PLUGIN_EV_VCPU_SYSCALL_FILTER;

View File

@@ -27,7 +27,7 @@ static bool vcpu_syscall_filter(unsigned int vcpu_index,
int64_t num, uint64_t a1, uint64_t a2, int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a3, uint64_t a4, uint64_t a5,
uint64_t a6, uint64_t a7, uint64_t a8, uint64_t a6, uint64_t a7, uint64_t a8,
uint64_t *sysret, void *userdata) int64_t *sysret, void *userdata)
{ {
if (num == MAGIC_SYSCALL) { if (num == MAGIC_SYSCALL) {
if (a1 == SETPC) { if (a1 == SETPC) {

View File

@@ -176,7 +176,7 @@ static bool vcpu_syscall_filter(unsigned int vcpu_index,
int64_t num, uint64_t a1, uint64_t a2, int64_t num, uint64_t a1, uint64_t a2,
uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a3, uint64_t a4, uint64_t a5,
uint64_t a6, uint64_t a7, uint64_t a8, 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. */ /* Special syscall to test the filter functionality. */
if (num == 4096 && a1 == 0x66CCFF) { if (num == 4096 && a1 == 0x66CCFF) {