[PATCH] Remove is_negated_errno() for archs which use negated syscall errno semantics
Dmitry V. Levin
ldv at altlinux.org
Thu Jul 13 23:04:51 UTC 2017
Hi Lazar,
On Mon, Jul 10, 2017 at 04:20:28PM +0200, Lazar Trsic wrote:
> On architectures that use negated errno semantics,
> function is_negated_errno() is never being called.
Just the otherwise, is_negated_errno() is not used on those architectures
that have a dedicated register to signal a syscall error and therefore
don't follow the negated errno semantics.
> Use ARCH_USE_NEGATED_ERRNO macro to guard this function from
> compiling for architectures: alpha, mips, nios2, powerpc and sparc.
>
> The issue was raised when compiling with clang, which is more
> strict regarding semantics of unused static inline functions
> defined in C files and will issue a -Wunused-function warrning
> if they are not used anywhere.
>
> * linux/alpha/arch_regs.h: Define ARCH_USE_NEGATED_ERRNO.
> * linux/mips/arch_regs.h: Likewise.
> * linux/nios2/arch_regs.h: Likewise.
> * linux/powerpc/arch_regs.h: Likewise.
> * linux/sparc/arch_regs.h: Likewise.
> * syscall.c: Use ARCH_USE_NEGATED_ERRNO around is_negated_errno().
I'd prefer a bit different approach: move is_negated_errno to a separate
header file, e.g. negated_errno.h, and include it in those get_error.c
files that call is_negated_errno.
> Change-Id: I00dd74c87b93eeb0de7b794b4542f160f9554e89
I don't think this belongs to the main repository.
> ---
> linux/alpha/arch_regs.h | 2 ++
> linux/mips/arch_regs.h | 3 +++
> linux/nios2/arch_regs.h | 2 ++
> linux/powerpc/arch_regs.h | 2 ++
> linux/sparc/arch_regs.h | 2 ++
> syscall.c | 2 ++
> 6 files changed, 13 insertions(+)
>
> diff --git a/linux/alpha/arch_regs.h b/linux/alpha/arch_regs.h
> index 66277fd..06f1569 100644
> --- a/linux/alpha/arch_regs.h
> +++ b/linux/alpha/arch_regs.h
> @@ -3,3 +3,5 @@
> #define REG_A3 19
> #define REG_FP 30
> #define REG_PC 64
> +
> +#define ARCH_USE_NEGATED_ERRNO
> diff --git a/linux/mips/arch_regs.h b/linux/mips/arch_regs.h
> index 6372bad..d4ae308 100644
> --- a/linux/mips/arch_regs.h
> +++ b/linux/mips/arch_regs.h
> @@ -1,3 +1,4 @@
> +
> struct mips_regs {
> uint64_t uregs[38];
> };
> @@ -16,3 +17,5 @@ extern struct mips_regs mips_regs;
> #define mips_REG_A5 mips_regs.uregs[REG_A0 + 5]
> #define mips_REG_SP mips_regs.uregs[29]
> #define mips_REG_EPC mips_regs.uregs[34]
> +
> +#define ARCH_USE_NEGATED_ERRNO
> diff --git a/linux/nios2/arch_regs.h b/linux/nios2/arch_regs.h
> index c4230ed..5eaa035 100644
> --- a/linux/nios2/arch_regs.h
> +++ b/linux/nios2/arch_regs.h
> @@ -1 +1,3 @@
> extern unsigned int *const nios2_sp_ptr;
> +
> +#define ARCH_USE_NEGATED_ERRNO
> diff --git a/linux/powerpc/arch_regs.h b/linux/powerpc/arch_regs.h
> index 1296e83..256ff46 100644
> --- a/linux/powerpc/arch_regs.h
> +++ b/linux/powerpc/arch_regs.h
> @@ -1 +1,3 @@
> extern struct pt_regs ppc_regs;
> +
> +#define ARCH_USE_NEGATED_ERRNO
> diff --git a/linux/sparc/arch_regs.h b/linux/sparc/arch_regs.h
> index ac11a1d..db78e7d 100644
> --- a/linux/sparc/arch_regs.h
> +++ b/linux/sparc/arch_regs.h
> @@ -5,3 +5,5 @@ extern struct pt_regs sparc_regs;
> #define U_REG_O0 7
> #define U_REG_O1 8
> #define U_REG_FP 13
> +
> +#define ARCH_USE_NEGATED_ERRNO
> diff --git a/syscall.c b/syscall.c
> index 02626c7..f455f60 100644
> --- a/syscall.c
> +++ b/syscall.c
> @@ -1047,6 +1047,7 @@ restore_cleared_syserror(struct tcb *tcp)
> tcp->u_error = saved_u_error;
> }
>
> +#ifndef ARCH_USE_NEGATED_ERRNO
> /*
> * Check the syscall return value register value for whether it is
> * a negated errno code indicating an error, or a success return value.
> @@ -1066,6 +1067,7 @@ is_negated_errno(kernel_ulong_t val)
>
> return val >= max;
> }
> +#endif
>
> #include "arch_regs.c"
--
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20170714/a4ea037e/attachment.bin>
More information about the Strace-devel
mailing list