[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 10/10] alpha-linux-user: Fix the getpriority syscall
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH 10/10] alpha-linux-user: Fix the getpriority syscall |
Date: |
Fri, 3 Aug 2012 15:40:57 -0700 |
Alpha uses unbiased priority values in the syscall, with the a3
return value signaling error conditions. Therefore, properly
interpret the libc getpriority as needed for the guest rather
than passing the host value through unchanged.
Signed-off-by: Richard Henderson <address@hidden>
---
linux-user/syscall.c | 20 +++++++++++++++-----
1 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 0d3fff5..527bc58 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -218,7 +218,6 @@ _syscall3(int, sys_getdents, uint, fd, struct linux_dirent
*, dirp, uint, count)
#if defined(TARGET_NR_getdents64) && defined(__NR_getdents64)
_syscall3(int, sys_getdents64, uint, fd, struct linux_dirent64 *, dirp, uint,
count);
#endif
-_syscall2(int, sys_getpriority, int, which, int, who);
#if defined(TARGET_NR__llseek) && defined(__NR_llseek)
_syscall5(int, _llseek, uint, fd, ulong, hi, ulong, lo,
loff_t *, res, uint, wh);
@@ -6445,10 +6444,21 @@ abi_long do_syscall(void *cpu_env, int num, abi_long
arg1,
break;
#endif
case TARGET_NR_getpriority:
- /* libc does special remapping of the return value of
- * sys_getpriority() so it's just easiest to call
- * sys_getpriority() directly rather than through libc. */
- ret = get_errno(sys_getpriority(arg1, arg2));
+ /* Note that negative values are valid for getpriority, so we must
+ differentiate based on errno settings. */
+ errno = 0;
+ ret = getpriority(arg1, arg2);
+ if (ret == -1 && errno != 0) {
+ ret = get_errno(errno);
+ break;
+ }
+#ifdef TARGET_ALPHA
+ /* Return value is the unbiased priority. Signal no error. */
+ ((CPUAlphaState *)cpu_env)->ir[IR_V0] = 0;
+#else
+ /* Return value is a biased priority to avoid negative numbers. */
+ ret = 20 - ret;
+#endif
break;
case TARGET_NR_setpriority:
ret = get_errno(setpriority(arg1, arg2, arg3));
--
1.7.7.6
- [Qemu-devel] [PATCH v5 00/10] {alpha-}linux user improvements, Richard Henderson, 2012/08/03
- [Qemu-devel] [PATCH 01/10] alpha-linux-user: Fix signal handling, Richard Henderson, 2012/08/03
- [Qemu-devel] [PATCH 02/10] alpha-linux-user: Work around hosted mmap allocation problems, Richard Henderson, 2012/08/03
- [Qemu-devel] [PATCH 03/10] alpha-linux-user: Handle TARGET_SSI_IEEE_RAISE_EXCEPTION properly, Richard Henderson, 2012/08/03
- [Qemu-devel] [PATCH 05/10] linux-user: Handle O_SYNC, O_NOATIME, O_CLOEXEC, O_PATH, Richard Henderson, 2012/08/03
- [Qemu-devel] [PATCH 04/10] linux-user: Sync fcntl.h bits with the kernel, Richard Henderson, 2012/08/03
- [Qemu-devel] [PATCH 06/10] linux-user: Allocate the right amount of space for non-fixed file maps, Richard Henderson, 2012/08/03
- [Qemu-devel] [PATCH 08/10] alpha-linux-user: Fix a3 error return with v0 error bypass., Richard Henderson, 2012/08/03
- [Qemu-devel] [PATCH 07/10] linux-user: Translate pipe2 flags; add to strace, Richard Henderson, 2012/08/03
- [Qemu-devel] [PATCH 09/10] alpha-linux-user: Properly handle the non-rt sigprocmask syscall., Richard Henderson, 2012/08/03
- [Qemu-devel] [PATCH 10/10] alpha-linux-user: Fix the getpriority syscall,
Richard Henderson <=
- Re: [Qemu-devel] [PATCH v5 00/10] {alpha-}linux user improvements, Blue Swirl, 2012/08/04