mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-28 14:00:44 +00:00
a3310c0397
The current api from safe_syscall_base() is to return -errno, which is the interface provided by *some* linux kernel abis. The wrapper macro, safe_syscall(), detects error, stores into errno, and returns -1, to match the api of the system syscall(). For those kernel abis that do not return -errno natively, this leads to double syscall error detection. E.g. Linux ppc64, which sets the SO flag for error. Simplify the usage from C by moving the error detection into assembly, and usage from assembly by providing a C helper with which to set errno. Reviewed-by: Warner Losh <imp@bsdimp.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
29 lines
769 B
C
29 lines
769 B
C
/*
|
|
* safe-syscall-error.c: errno setting fragment
|
|
* This is intended to be invoked by safe-syscall.S
|
|
*
|
|
* Written by Richard Henderson <rth@twiddle.net>
|
|
* Copyright (C) 2021 Red Hat, Inc.
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*/
|
|
|
|
#include "qemu/osdep.h"
|
|
#include "hostdep.h"
|
|
#include "safe-syscall.h"
|
|
|
|
#ifdef HAVE_SAFE_SYSCALL
|
|
/*
|
|
* This is intended to be invoked via tail-call on the error path
|
|
* from the assembly in host/arch/safe-syscall.inc.S. This takes
|
|
* care of the host specific addressing of errno.
|
|
* Return -1 to finalize the return value for safe_syscall_base.
|
|
*/
|
|
long safe_syscall_set_errno_tail(int value)
|
|
{
|
|
errno = value;
|
|
return -1;
|
|
}
|
|
#endif
|