[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5 08/17] common-user: Adjust system call return on FreeBSD
From: |
Richard Henderson |
Subject: |
[PATCH v5 08/17] common-user: Adjust system call return on FreeBSD |
Date: |
Wed, 17 Nov 2021 17:04:03 +0100 |
From: Warner Losh <imp@bsdimp.com>
FreeBSD system calls return positive errno. On the 4 hosts for
which we have support, error is indicated by the C bit set or clear.
Signed-off-by: Warner Losh <imp@bsdimp.com>
[rth: Rebase on new safe_syscall_base api; add #error check.]
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
common-user/host/aarch64/safe-syscall.inc.S | 12 +++++++++++-
common-user/host/arm/safe-syscall.inc.S | 11 +++++++++++
common-user/host/i386/safe-syscall.inc.S | 10 ++++++++++
common-user/host/x86_64/safe-syscall.inc.S | 10 ++++++++++
4 files changed, 42 insertions(+), 1 deletion(-)
diff --git a/common-user/host/aarch64/safe-syscall.inc.S
b/common-user/host/aarch64/safe-syscall.inc.S
index 95c60d8609..d3f065cdef 100644
--- a/common-user/host/aarch64/safe-syscall.inc.S
+++ b/common-user/host/aarch64/safe-syscall.inc.S
@@ -65,12 +65,22 @@ safe_syscall_start:
safe_syscall_end:
/* code path for having successfully executed the syscall */
- cmn x0, #4095
+#if defined(__linux__)
+ /* Linux kernel returns (small) negative errno. */
+ cmn x0, #4096
+ b.hi 0f
+#elif defined(__FreeBSD__)
+ /* FreeBSD kernel returns positive errno and C bit set. */
b.cs 1f
+#else
+#error "unsupported os"
+#endif
ret
/* code path setting errno */
+#ifdef __linux__
0: neg w0, w0 /* create positive errno */
+#endif
1: str w0, [x11] /* store errno */
mov x0, #-1
ret
diff --git a/common-user/host/arm/safe-syscall.inc.S
b/common-user/host/arm/safe-syscall.inc.S
index 17839c6486..328299021d 100644
--- a/common-user/host/arm/safe-syscall.inc.S
+++ b/common-user/host/arm/safe-syscall.inc.S
@@ -82,12 +82,23 @@ safe_syscall_start:
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#if defined(__linux__)
+ /* Linux kernel returns (small) negative errno. */
cmp r0, #-4096
bhi 0f
+#elif defined(__FreeBSD__)
+ /* FreeBSD kernel returns positive errno and C bit set. */
+ bcs 1f
+#else
+#error "unsupported os"
+#endif
+
9: pop { r4, r5, r6, r7, r8, r9, r10, pc }
/* code path setting errno */
+#ifdef __linux__
0: neg r0, r0 /* create positive errno */
+#endif
1: str r0, [r9] /* store errno */
mov r0, #-1
b 9b
diff --git a/common-user/host/i386/safe-syscall.inc.S
b/common-user/host/i386/safe-syscall.inc.S
index ad89521783..c27207492a 100644
--- a/common-user/host/i386/safe-syscall.inc.S
+++ b/common-user/host/i386/safe-syscall.inc.S
@@ -76,8 +76,16 @@ safe_syscall_start:
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#if defined(__linux__)
+ /* Linux kernel returns (small) negative errno. */
cmp $-4095, %eax
jae 0f
+#elif defined(__FreeBSD__)
+ /* FreeBSD kernel returns positive errno and C bit set. */
+ jc 1f
+#else
+#error "unsupported os"
+#endif
9: pop %ebx
.cfi_remember_state
@@ -97,7 +105,9 @@ safe_syscall_end:
.cfi_restore_state
/* code path setting errno */
+#ifdef __linux__
0: neg %eax /* create positive errno */
+#endif
1: mov 8+16(%esp), %ebx /* load errno pointer */
mov %eax, (%ebx) /* store errno */
mov $-1, %eax
diff --git a/common-user/host/x86_64/safe-syscall.inc.S
b/common-user/host/x86_64/safe-syscall.inc.S
index 9a0c4c93b4..e3f920fa5c 100644
--- a/common-user/host/x86_64/safe-syscall.inc.S
+++ b/common-user/host/x86_64/safe-syscall.inc.S
@@ -75,8 +75,16 @@ safe_syscall_start:
safe_syscall_end:
/* code path for having successfully executed the syscall */
+#if defined(__linux__)
+ /* Linux kernel returns (small) negative errno. */
cmp $-4095, %rax
jae 0f
+#elif defined(__FreeBSD__)
+ /* FreeBSD kernel returns positive errno and C bit set. */
+ jc 1f
+#else
+#error "unsupported os"
+#endif
9: pop %rbp
.cfi_remember_state
@@ -86,7 +94,9 @@ safe_syscall_end:
.cfi_restore_state
/* code path setting errno */
+#ifdef __linux__
0: neg %eax /* create positive errno */
+#endif
1: mov %eax, (%rbp) /* store errno */
mov $-1, %rax
jmp 9b
--
2.25.1
- Re: [PATCH v5 03/17] linux-user/safe-syscall.inc.S: Move to common-user, (continued)
- [PATCH v5 07/17] linux-user: Remove HAVE_SAFE_SYSCALL and hostdep.h, Richard Henderson, 2021/11/17
- [PATCH v5 08/17] common-user: Adjust system call return on FreeBSD,
Richard Henderson <=
- [PATCH v5 09/17] *-user: Rename TARGET_ERESTARTSYS to QEMU_ERESTARTSYS, Richard Henderson, 2021/11/17
- [PATCH v5 11/17] bsd-user: Create special-errno.h, Richard Henderson, 2021/11/17
- [PATCH v5 12/17] linux-user: Create special-errno.h, Richard Henderson, 2021/11/17
- [PATCH v5 14/17] common-user: Move safe-syscall.* from linux-user, Richard Henderson, 2021/11/17