From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 32344 invoked by alias); 18 Apr 2004 23:02:53 -0000 Mailing-List: contact libc-hacker-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-hacker-owner@sources.redhat.com Received: (qmail 32317 invoked from network); 18 Apr 2004 23:02:52 -0000 Received: from unknown (HELO sunsite.ms.mff.cuni.cz) (195.113.15.26) by sources.redhat.com with SMTP; 18 Apr 2004 23:02:52 -0000 Received: from sunsite.ms.mff.cuni.cz (sunsite.mff.cuni.cz [127.0.0.1]) by sunsite.ms.mff.cuni.cz (8.12.8/8.12.8) with ESMTP id i3IKpJHS005146; Sun, 18 Apr 2004 22:51:19 +0200 Received: (from jakub@localhost) by sunsite.ms.mff.cuni.cz (8.12.8/8.12.8/Submit) id i3IIep8t031524; Sun, 18 Apr 2004 20:40:51 +0200 Date: Sun, 18 Apr 2004 23:02:00 -0000 From: Jakub Jelinek To: Ulrich Drepper , Martin Schwidefsky Cc: Glibc hackers Subject: [PATCH] Fix s390{,x} linuxthreads Message-ID: <20040418184050.GO514@sunsite.ms.mff.cuni.cz> Reply-To: Jakub Jelinek Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4i X-SW-Source: 2004-04/txt/msg00057.txt.bz2 Hi! Seems last patch was not enough, although linuxthreads now build on s390{,x}, librt-2.3.3.so is DT_TEXTREL. The following patch could cure it, unfortunately I don't have access to any s390{,x} running kernels with latest mq support in it to see if it actually works. The librt PSEUDO_CANCEL is like libc/libpthread, but saves %r11..%r15 instead of %r12..%r15 (and restores) plus loads _GLOBAL_OFFSET_TABLE_ into %r12 (hope it is enough to do it once) and adds @PLT to __librt_{enable,disable}_asynccancel. 2004-04-18 Jakub Jelinek * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h (PSEUDO_CANCEL): Define. (PSEUDO): Use it. * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h (CENABLE, CDISABLE): For librt, append @PLT. --- libc/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h.jj 2003-06-18 00:22:57.000000000 +0200 +++ libc/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h 2004-04-18 22:34:37.247666665 +0200 @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek , 2003. @@ -25,9 +25,9 @@ #if !defined NOT_IN_libc || defined IS_IN_libpthread || defined IS_IN_librt -# undef PSEUDO -# define PSEUDO(name, syscall_name, args) \ - .text; \ +# if !defined NOT_IN_libc || defined IS_IN_libpthread + +# define PSEUDO_CANCEL(name, syscall_name, args) \ L(pseudo_cancel): \ STM_##args \ stm %r12,%r15,48(%r15); \ @@ -48,7 +48,42 @@ L(pseudo_cancel): \ lm %r12,%r15,48+96(%r15); \ j L(pseudo_check); \ 1: .long CENABLE-0b; \ -2: .long CDISABLE-0b; \ +2: .long CDISABLE-0b; + +# else /* !libc.so && !libpthread.so */ + +# define PSEUDO_CANCEL(name, syscall_name, args) \ +L(pseudo_cancel): \ + STM_##args \ + stm %r11,%r15,44(%r15); \ + lr %r14,%r15; \ + ahi %r15,-96; \ + st %r14,0(%r15); \ + basr %r13,0; \ +0: l %r12,3f-0b(%r13); \ + l %r1,1f-0b(%r13); \ + la %r12,0(%r12,%r13); \ + bas %r14,0(%r1,%r13); \ + lr %r0,%r2; \ + LM_##args \ + DO_CALL(syscall_name, args); \ + l %r1,2f-0b(%r13); \ + lr %r11,%r2; \ + lr %r2,%r0; \ + bas %r14,0(%r1,%r13); \ + lr %r2,%r11; \ + lm %r11,%r15,44+96(%r15); \ + j L(pseudo_check); \ +1: .long CENABLE@PLT-0b; \ +2: .long CDISABLE@PLT-0b; \ +3: .long _GLOBAL_OFFSET_TABLE_-0b; + +# endif + +# undef PSEUDO +# define PSEUDO(name, syscall_name, args) \ + .text; \ +PSEUDO_CANCEL(name, syscall_name, args) \ ENTRY(name) \ SINGLE_THREAD_P(%r1) \ jne L(pseudo_cancel); \ --- libc/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h.jj 2003-06-18 00:22:57.000000000 +0200 +++ libc/linuxthreads/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h 2004-04-18 22:39:07.708196616 +0200 @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek , 2003. @@ -63,8 +63,8 @@ L(pseudo_end): # define CDISABLE __libc_disable_asynccancel # define __local_multiple_threads __libc_multiple_threads # else -# define CENABLE __librt_enable_asynccancel -# define CDISABLE __librt_disable_asynccancel +# define CENABLE __librt_enable_asynccancel@PLT +# define CDISABLE __librt_disable_asynccancel@PLT # endif #define STM_0 /* Nothing */ Jakub