From patchwork Wed Jul 25 22:10:38 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 173299 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id CCB572C0099 for ; Thu, 26 Jul 2012 08:39:40 +1000 (EST) Received: from localhost ([::1]:52343 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Su9nr-0001DJ-So for incoming@patchwork.ozlabs.org; Wed, 25 Jul 2012 18:11:35 -0400 Received: from eggs.gnu.org ([208.118.235.92]:42453) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Su9nG-00080S-Mc for qemu-devel@nongnu.org; Wed, 25 Jul 2012 18:10:59 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Su9nE-00014E-LG for qemu-devel@nongnu.org; Wed, 25 Jul 2012 18:10:58 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:44694) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Su9nE-00010i-FL for qemu-devel@nongnu.org; Wed, 25 Jul 2012 18:10:56 -0400 Received: by mail-pb0-f45.google.com with SMTP id ro12so2018027pbb.4 for ; Wed, 25 Jul 2012 15:10:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=9NCuYxCMS0R6EVddxu3sgNkyH1UecEcvLAwRH/SIWA0=; b=i2u20lmrGRGLGnb2QxpVPG3qUZ+r9HbWZ4ylJr72t2xfUxhpFJhM2J+mrg33eVHxc4 wHM6Ry/RFYrKLr6BRUrISMwDdxMFSIJQ7EdNcP7RhcOq+vOuggpTdcpszfK+Hv01o9Bh njFs6dL2YwQnhWP0nsu/2AnfoOAz+mpnJG/FkHOmqL4mJwfRe2suX4YhUlfj5j3eecN2 Mn50p73ZtXkqYsksulHAwdB8wD07VvlVh7+L9Y8baQTh9GGRzRQvQT188UUkzIrGiuB6 KtTb+xYUWJXRWkbxl1w9tRnyVOMlsfsm+8LgsS3nGsqvP2NcO43+37S3x2KA6XoHWm/a K03g== Received: by 10.68.138.169 with SMTP id qr9mr56818099pbb.27.1343254256200; Wed, 25 Jul 2012 15:10:56 -0700 (PDT) Received: from anchor.twiddle.home.com ([173.160.232.49]) by mx.google.com with ESMTPS id oo6sm15136761pbc.22.2012.07.25.15.10.55 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 25 Jul 2012 15:10:55 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Wed, 25 Jul 2012 15:10:38 -0700 Message-Id: <1343254238-4727-11-git-send-email-rth@twiddle.net> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1343254238-4727-1-git-send-email-rth@twiddle.net> References: <1343254238-4727-1-git-send-email-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.160.45 Cc: riku.voipio@iki.fi Subject: [Qemu-devel] [PATCH 10/10] alpha-linux-user: Fix the getpriority syscall X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- 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 2e1c1c0..b487635 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));