From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S269442AbUIYXqt (ORCPT ); Sat, 25 Sep 2004 19:46:49 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S269443AbUIYXqt (ORCPT ); Sat, 25 Sep 2004 19:46:49 -0400 Received: from gate.crashing.org ([63.228.1.57]:62082 "EHLO gate.crashing.org") by vger.kernel.org with ESMTP id S269442AbUIYXqq (ORCPT ); Sat, 25 Sep 2004 19:46:46 -0400 Subject: [PATCH] ppc64: Fix 32 bits conversion of SI_TIMER signals From: Benjamin Herrenschmidt To: Andrew Morton Cc: Linus Torvalds , Linux Kernel list , Olaf Hering Content-Type: text/plain Message-Id: <1096155773.575.46.camel@gaston> Mime-Version: 1.0 X-Mailer: Ximian Evolution 1.4.6 Date: Sun, 26 Sep 2004 09:45:40 +1000 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Hi ! The current 32 bits translation of the SI_TIMER is wrong on ppc64, causing the tst-timer4 testcase of glibc to fail in 32 bits. This patch fixes it. Signed-off-by: Olaf Hering Signed-ogg-by: Benjamin Herrenschmidt ===== arch/ppc64/kernel/signal32.c 1.57 vs edited ===== --- 1.57/arch/ppc64/kernel/signal32.c 2004-09-14 10:23:15 +10:00 +++ edited/arch/ppc64/kernel/signal32.c 2004-09-26 09:37:48 +10:00 @@ -472,9 +472,13 @@ &d->si_addr); break; case __SI_POLL >> 16: - case __SI_TIMER >> 16: err |= __put_user(s->si_band, &d->si_band); err |= __put_user(s->si_fd, &d->si_fd); + break; + case __SI_TIMER >> 16: + err |= __put_user(s->si_tid, &d->si_tid); + err |= __put_user(s->si_overrun, &d->si_overrun); + err |= __put_user((u32)(u64)s->si_ptr, &d->si_ptr); break; case __SI_RT >> 16: /* This is not generated by the kernel as of now. */ case __SI_MESGQ >> 16: ===== include/asm-ppc64/ppc32.h 1.16 vs edited ===== --- 1.16/include/asm-ppc64/ppc32.h 2004-09-17 16:58:38 +10:00 +++ edited/include/asm-ppc64/ppc32.h 2004-09-26 09:37:49 +10:00 @@ -32,8 +32,10 @@ /* POSIX.1b timers */ struct { - unsigned int _timer1; - unsigned int _timer2; + timer_t _tid; /* timer id */ + int _overrun; /* overrun count */ + compat_sigval_t _sigval; /* same as below */ + int _sys_private; /* not to be passed to user */ } _timer; /* POSIX.1b signals */ -- Benjamin Herrenschmidt