From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 96272 invoked by alias); 24 Jan 2020 16:19:57 -0000 Mailing-List: contact glibc-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: , Sender: glibc-cvs-owner@sourceware.org List-Subscribe: Received: (qmail 96255 invoked by uid 94); 24 Jan 2020 16:19:57 -0000 Date: Fri, 24 Jan 2020 16:19:00 -0000 Message-ID: <20200124161957.96254.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Stan Shebs To: glibc-cvs@sourceware.org Subject: [glibc/google/grte/v5-2.27/master] Add workaround for infinite looping in ppc vsyscall for sched_getcpu. X-Act-Checkin: glibc X-Git-Author: Stan Shebs X-Git-Refname: refs/heads/google/grte/v5-2.27/master X-Git-Oldrev: ebbaef10f856962fc062d8f7d7b32fee96887513 X-Git-Newrev: 973a510a9408ec58d5c3216ce411757ba6c6e489 X-SW-Source: 2020-q1/txt/msg00201.txt https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=973a510a9408ec58d5c3216ce411757ba6c6e489 commit 973a510a9408ec58d5c3216ce411757ba6c6e489 Author: Stan Shebs Date: Fri Jan 24 08:17:38 2020 -0800 Add workaround for infinite looping in ppc vsyscall for sched_getcpu. Diff: --- sysdeps/unix/sysv/linux/sched_getcpu.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/sysdeps/unix/sysv/linux/sched_getcpu.c b/sysdeps/unix/sysv/linux/sched_getcpu.c index b69eeda..2279026 100644 --- a/sysdeps/unix/sysv/linux/sched_getcpu.c +++ b/sysdeps/unix/sysv/linux/sched_getcpu.c @@ -24,11 +24,28 @@ #endif #include +#if defined __clang__ && defined __powerpc64__ +/* On ppc, sched_getcpu's body eventually expands into asm code + that does a bctrl, but clang does not recognize the need to save + the link register, so calls loop infinitely instead of returning. + As workaround, make a dummy function call that forces a link + register save. */ +volatile int sched_getcpu_dummy_glob; + +void __attribute__((noinline)) sched_getcpu_dummy () +{ + sched_getcpu_dummy_glob = 45; +} +#endif + int sched_getcpu (void) { #ifdef __NR_getcpu unsigned int cpu; +#if defined __clang__ && defined __powerpc64__ + sched_getcpu_dummy (); +#endif int r = INLINE_VSYSCALL (getcpu, 3, &cpu, NULL, NULL); return r == -1 ? r : cpu;