[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 9/9] alpha-linux-user: Fix the getpriority syscall
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH 9/9] alpha-linux-user: Fix the getpriority syscall |
Date: |
Thu, 7 Jun 2012 15:24:31 -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 bc77b79..bc65c32 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);
@@ -6447,10 +6446,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
- Re: [Qemu-devel] [PATCH 2/9] alpha-linux-user: Work around hosted mmap allocation problems, (continued)
[Qemu-devel] [PATCH 3/9] alpha-linux-user: Handle TARGET_SSI_IEEE_RAISE_EXCEPTION properly, Richard Henderson, 2012/06/07
[Qemu-devel] [PATCH 6/9] linux-user: Translate pipe2 flags; add to strace, Richard Henderson, 2012/06/07
[Qemu-devel] [PATCH 5/9] linux-user: Allocate the right amount of space for non-fixed file maps, Richard Henderson, 2012/06/07
[Qemu-devel] [PATCH 4/9] linux-user: Handle O_SYNC, O_NOATIME, O_CLOEXEC, O_PATH, Richard Henderson, 2012/06/07
[Qemu-devel] [PATCH 7/9] alpha-linux-user: Fix a3 error return with v0 error bypass., Richard Henderson, 2012/06/07
[Qemu-devel] [PATCH 9/9] alpha-linux-user: Fix the getpriority syscall,
Richard Henderson <=
[Qemu-devel] [PATCH 8/9] alpha-linux-user: Properly handle the non-rt sigprocmask syscall., Richard Henderson, 2012/06/07
Re: [Qemu-devel] [PATCH v3 0/9] {alpha-}linux user improvements, Richard Henderson, 2012/06/12