HPPA issues inline error handling for auto-generated syscall,
the __syscall_error is used solely on clone implementation and
it differs from generic implementation by passing positive errno
numbers.
Also, inline error handling does not really produce the most
compat code.
--- sizes-hppa-linux-gnu.outline
+++ sizes-hppa-linux-gnu.inline
text data bss dec hex filename
-1576515 22028 9424 1607967 18891f libc.so
- 174755 15524 448 190727 2e907 elf/ld.so
- 132799 1296 8364 142459 22c7b nptl/libpthread.so
- 30993 788 236 32017 7d11 rt/librt.so
+1579367 22028 9424 1610819 189443 libc.so
+ 174835 15524 448 190807 2e957 elf/ld.so
+ 133055 1296 8364 142715 22d7b nptl/libpthread.so
+ 31297 788 236 32321 7e41 rt/librt.so
Checked on hppa-linux-gnu.
---
sysdeps/unix/sysv/linux/hppa/clone.S | 6 ++++--
sysdeps/unix/sysv/linux/hppa/sysdep.c | 27 ---------------------------
sysdeps/unix/sysv/linux/hppa/sysdep.h | 2 ++
3 files changed, 6 insertions(+), 29 deletions(-)
delete mode 100644 sysdeps/unix/sysv/linux/hppa/sysdep.c
@@ -124,7 +124,8 @@ ENTRY(__clone)
.LerrorRest:
/* Something bad happened -- no child created */
bl __syscall_error, %rp
- sub %r0, %ret0, %arg0
+ copy %ret0, %arg0
+
ldw -84(%sp), %rp
/* Return after setting errno, ret0 is set to -1 by __syscall_error. */
bv %r0(%rp)
@@ -133,7 +134,8 @@ ENTRY(__clone)
.LerrorSanity:
/* Sanity checks failed, return -1, and set errno to EINVAL. */
bl __syscall_error, %rp
- ldi EINVAL, %arg0
+ ldi -EINVAL, %arg0
+
ldw -84(%sp), %rp
bv %r0(%rp)
ldwm -64(%sp), %r4
deleted file mode 100644
@@ -1,27 +0,0 @@
-/* Copyright (C) 1997-2020 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library. If not, see
- <https://www.gnu.org/licenses/>. */
-
-#include <errno.h>
-
-/* This routine is jumped to by all the syscall handlers, to stash
- an error number into errno. */
-int
-__syscall_error (int err_no)
-{
- __set_errno (err_no);
- return -1;
-}
@@ -21,6 +21,8 @@
#ifndef _LINUX_HPPA_SYSDEP_H
#define _LINUX_HPPA_SYSDEP_H 1
+#define SYSCALL_ERROR_FUNC
+
#include <sysdeps/unix/sysdep.h>
#include <sysdeps/unix/sysv/linux/sysdep.h>
#include <sysdeps/hppa/sysdep.h>