From owner-svn-src-all@freebsd.org Sun Nov 24 13:04:50 2019 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 8DA581AEE92; Sun, 24 Nov 2019 13:04:50 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from kib.kiev.ua (kib.kiev.ua [IPv6:2001:470:d5e7:1::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 47LVkV1KQrz41NT; Sun, 24 Nov 2019 13:04:49 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from tom.home (kib@localhost [127.0.0.1]) by kib.kiev.ua (8.15.2/8.15.2) with ESMTPS id xAOD4f6X033334 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Sun, 24 Nov 2019 15:04:44 +0200 (EET) (envelope-from kostikbel@gmail.com) DKIM-Filter: OpenDKIM Filter v2.10.3 kib.kiev.ua xAOD4f6X033334 Received: (from kostik@localhost) by tom.home (8.15.2/8.15.2/Submit) id xAOD4fe1033333; Sun, 24 Nov 2019 15:04:41 +0200 (EET) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: tom.home: kostik set sender to kostikbel@gmail.com using -f Date: Sun, 24 Nov 2019 15:04:41 +0200 From: Konstantin Belousov To: Justin Hibbits Cc: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r355045 - head/libexec/rtld-elf/powerpc Message-ID: <20191124130441.GA2707@kib.kiev.ua> References: <201911240435.xAO4ZTgw070233@repo.freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201911240435.xAO4ZTgw070233@repo.freebsd.org> User-Agent: Mutt/1.12.2 (2019-09-21) X-Spam-Status: No, score=-1.0 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_ADSP_CUSTOM_MED,FORGED_GMAIL_RCVD,FREEMAIL_FROM, NML_ADSP_CUSTOM_MED autolearn=no autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on tom.home X-Rspamd-Queue-Id: 47LVkV1KQrz41NT X-Spamd-Bar: ----- Authentication-Results: mx1.freebsd.org; none X-Spamd-Result: default: False [-5.99 / 15.00]; NEURAL_HAM_MEDIUM(-0.99)[-0.991,0]; NEURAL_HAM_LONG(-0.99)[-0.994,0]; REPLY(-4.00)[] X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 24 Nov 2019 13:04:50 -0000 On Sun, Nov 24, 2019 at 04:35:29AM +0000, Justin Hibbits wrote: > Author: jhibbits > Date: Sun Nov 24 04:35:29 2019 > New Revision: 355045 > URL: https://svnweb.freebsd.org/changeset/base/355045 > > Log: > rtld/powerpc: Fix _rtld_bind_start for powerpcspe > > Summary: > We need to save off the full 64-bit register, not just the low 32 bits, > of all registers getting saved off in _rtld_bind_start. Additionally, > we need to save off the other SPE registers (SPEFSCR and accumulator), > so that their program state is not affected by the PLT resolver. Why do you need to save these registers ? Why would rtld touch them ? > > Reviewed by: bdragon > Differential Revision: https://reviews.freebsd.org/D22520 > > Modified: > head/libexec/rtld-elf/powerpc/rtld_start.S > > Modified: head/libexec/rtld-elf/powerpc/rtld_start.S > ============================================================================== > --- head/libexec/rtld-elf/powerpc/rtld_start.S Sun Nov 24 02:27:50 2019 (r355044) > +++ head/libexec/rtld-elf/powerpc/rtld_start.S Sun Nov 24 04:35:29 2019 (r355045) > @@ -30,6 +30,7 @@ > */ > > #include > +#include /* For SPR_SPEFSCR if needed. */ > > .extern _GLOBAL_OFFSET_TABLE_ > .extern _DYNAMIC > @@ -101,6 +102,20 @@ _ENTRY(.rtld_start) > li %r0,1 /* _exit() */ > sc > > +#ifdef __SPE__ > +/* stack space for 30 GPRs + SPEFSCR/ACC/lr/cr */ > +#define NREGS 31 > +#define GPRWIDTH 8 > +#define FUDGE 4 /* Fudge factor for alignment */ > +#else > +/* stack space for 30 GPRs + lr/cr */ > +#define NREGS 30 > +#define GPRWIDTH 4 > +#define FUDGE 0 > +#endif > +/* Stack frame needs the 12-byte ABI frame plus fudge factor. */ > +#define STACK_SIZE (NREGS * GPRWIDTH + 4 * 2 + 12 + FUDGE) > + > /* > * _rtld_bind_secureplt_start() > * > @@ -110,8 +125,12 @@ _ENTRY(.rtld_start) > * So for bss-plt, we multiply the index by 12 to get the offset. > */ > _ENTRY(_rtld_bind_secureplt_start) > - stwu %r1,-160(%r1) # stack space for 29 regs + r0/lr/cr > + stwu %r1,-STACK_SIZE(%r1) > +#ifdef __SPE__ > + evstdd %r0,24(%r1) > +#else > stw %r0,20(%r1) # save r0 > +#endif > > /* > * Instead of division which is costly we will use multiplicative > @@ -137,28 +156,113 @@ _ENTRY(_rtld_bind_secureplt_start) > .globl _rtld_bind > > _ENTRY(_rtld_bind_start) > - stwu %r1,-160(%r1) # stack space for 29 regs + r0/lr/cr > + stwu %r1,-STACK_SIZE(%r1) > +#ifdef __SPE__ > + evstdd %r0,24(%r1) > +#else > stw %r0,20(%r1) # save r0 > +#endif > 1: > mflr %r0 > stw %r0,16(%r1) # save lr > mfcr %r0 > stw %r0,12(%r1) # save cr > +#ifdef __SPE__ > + evstdd %r3, 32(%r1) > + evstdd %r4, 40(%r1) > + evstdd %r5, 48(%r1) > + evstdd %r6, 56(%r1) > + evstdd %r7, 64(%r1) > + evstdd %r8, 72(%r1) > + evstdd %r9, 80(%r1) > + evstdd %r10, 88(%r1) > + evstdd %r11, 96(%r1) > + evstdd %r12, 104(%r1) > + evstdd %r13, 112(%r1) > + evstdd %r14, 120(%r1) > + evstdd %r15, 128(%r1) > + evstdd %r16, 136(%r1) > + evstdd %r17, 144(%r1) > + evstdd %r18, 152(%r1) > + evstdd %r19, 160(%r1) > + evstdd %r20, 168(%r1) > + evstdd %r21, 176(%r1) > + evstdd %r22, 184(%r1) > + evstdd %r23, 192(%r1) > + evstdd %r24, 200(%r1) > + evstdd %r25, 208(%r1) > + evstdd %r26, 216(%r1) > + evstdd %r27, 224(%r1) > + evstdd %r28, 232(%r1) > + evstdd %r29, 240(%r1) > + evstdd %r30, 248(%r1) > + li %r3, 256 > + evstddx %r31, %r1, %r3 > + evxor %r0, %r0, %r0 > + li %r3, 264 > + evmwumiaa %r0, %r0, %r0 > + evstddx %r0, %r1, %r3 > + mfspr %r3, SPR_SPEFSCR > + stw %r3, 20(%r1) > +#else > stmw %r3,24(%r1) # save r3-r31 > +#endif > > mr %r3,%r12 # obj > mulli %r4,%r11,12 # rela index * sizeof(Elf_Rela) > bl _rtld_bind # target addr = _rtld_bind(obj, reloff) > mtctr %r3 # move absolute target addr into ctr > > +#ifdef __SPE__ > + lwz %r3, 20(%r1) > + mtspr SPR_SPEFSCR, %r3 > + li %r3, 264 > + evlddx %r0, %r3, %r1 > + evmra %r0, %r0 > + evldd %r3, 32(%r1) > + evldd %r4, 40(%r1) > + evldd %r5, 48(%r1) > + evldd %r6, 56(%r1) > + evldd %r7, 64(%r1) > + evldd %r8, 72(%r1) > + evldd %r9, 80(%r1) > + evldd %r10, 88(%r1) > + evldd %r11, 96(%r1) > + evldd %r12, 104(%r1) > + evldd %r13, 112(%r1) > + evldd %r14, 120(%r1) > + evldd %r15, 128(%r1) > + evldd %r16, 136(%r1) > + evldd %r17, 144(%r1) > + evldd %r18, 152(%r1) > + evldd %r19, 160(%r1) > + evldd %r20, 168(%r1) > + evldd %r21, 176(%r1) > + evldd %r22, 184(%r1) > + evldd %r23, 192(%r1) > + evldd %r24, 200(%r1) > + evldd %r25, 208(%r1) > + evldd %r26, 216(%r1) > + evldd %r27, 224(%r1) > + evldd %r28, 232(%r1) > + evldd %r29, 240(%r1) > + evldd %r30, 248(%r1) > + li %r0, 256 > + evlddx %r31, %r1, %r0 > +#else > lmw %r3,24(%r1) # restore r3-r31 > +#endif > lwz %r0,12(%r1) # restore cr > mtcr %r0 > lwz %r0,16(%r1) # restore lr > mtlr %r0 > +#ifdef __SPE__ > + evldd %r0,24(%r1) > +#else > lwz %r0,20(%r1) # restore r0 > +#endif > > - addi %r1,%r1,160 # restore stack > + addi %r1,%r1,STACK_SIZE # restore stack > bctr # jump to target > >