Message ID | 20210104144723.32148-1-wangshuo47@huawei.com |
---|---|
State | Superseded |
Headers |
Return-Path: <libc-alpha-bounces@sourceware.org> X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 06C6D3836C15; Mon, 4 Jan 2021 14:47:36 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from szxga06-in.huawei.com (szxga06-in.huawei.com [45.249.212.32]) by sourceware.org (Postfix) with ESMTPS id 2BB453854817 for <libc-alpha@sourceware.org>; Mon, 4 Jan 2021 14:47:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 2BB453854817 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=wangshuo47@huawei.com Received: from DGGEMS404-HUB.china.huawei.com (unknown [172.30.72.60]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4D8dkH2tBbzj2Fv; Mon, 4 Jan 2021 22:46:47 +0800 (CST) Received: from huawei.com (10.174.176.87) by DGGEMS404-HUB.china.huawei.com (10.3.19.204) with Microsoft SMTP Server id 14.3.498.0; Mon, 4 Jan 2021 22:47:23 +0800 From: Shuo Wang <wangshuo47@huawei.com> To: <libc-alpha@sourceware.org>, <szabolcs.nagy@arm.com>, <carlos@redhat.com> Subject: [PATCH] aarch64: push the set of rules before falling into slow path Date: Mon, 4 Jan 2021 22:47:23 +0800 Message-ID: <20210104144723.32148-1-wangshuo47@huawei.com> X-Mailer: git-send-email 2.19.0.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.174.176.87] X-CFilter-Loop: Reflected X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list <libc-alpha.sourceware.org> List-Unsubscribe: <https://sourceware.org/mailman/options/libc-alpha>, <mailto:libc-alpha-request@sourceware.org?subject=unsubscribe> List-Archive: <https://sourceware.org/pipermail/libc-alpha/> List-Post: <mailto:libc-alpha@sourceware.org> List-Help: <mailto:libc-alpha-request@sourceware.org?subject=help> List-Subscribe: <https://sourceware.org/mailman/listinfo/libc-alpha>, <mailto:libc-alpha-request@sourceware.org?subject=subscribe> Cc: hushiyuan@huawei.com Errors-To: libc-alpha-bounces@sourceware.org Sender: "Libc-alpha" <libc-alpha-bounces@sourceware.org> |
Series |
aarch64: push the set of rules before falling into slow path
|
|
Commit Message
Shuo Wang
Jan. 4, 2021, 2:47 p.m. UTC
It is supposed to save the rules for the instructions before falling into slow path. Tested in glibc-2.28 before fixing: Thread 2 "xxxxxxx" hit Breakpoint 1, _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:149 149 stp x1, x2, [sp, #-32]! Missing separate debuginfos, use: dnf debuginfo-install libgcc-7.3.0-20190804.h24.aarch64 (gdb) ni _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:150 150 stp x3, x4, [sp, #16] (gdb) _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:157 157 mrs x4, tpidr_el0 (gdb) 158 ldr PTR_REG (1), [x0,#TLSDESC_ARG] (gdb) 159 ldr PTR_REG (0), [x4,#TCBHEAD_DTV] (gdb) 160 ldr PTR_REG (3), [x1,#TLSDESC_GEN_COUNT] (gdb) 161 ldr PTR_REG (2), [x0,#DTV_COUNTER] (gdb) 162 cmp PTR_REG (3), PTR_REG (2) (gdb) 163 b.hi 2f (gdb) 165 ldp PTR_REG (2), PTR_REG (3), [x1,#TLSDESC_MODID] (gdb) 166 add PTR_REG (0), PTR_REG (0), PTR_REG (2), lsl #(PTR_LOG_SIZE + 1) (gdb) 167 ldr PTR_REG (0), [x0] /* Load val member of DTV entry. */ (gdb) 168 cmp PTR_REG (0), #TLS_DTV_UNALLOCATED (gdb) 169 b.eq 2f (gdb) bt #0 _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:169 #1 0x0000ffffbe4fbb44 in OurFunction (threadId=4294967295) at /home/test/test_function.c:30 #2 0x0000000000400c08 in initaaa () at thread.c:58 #3 0x0000000000400c50 in thread_proc (param=0x0) at thread.c:71 #4 0x0000ffffbf6918bc in start_thread (arg=0xfffffffff29f) at pthread_create.c:486 #5 0x0000ffffbf5669ec in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:78 (gdb) ni _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:184 184 stp x29, x30, [sp,#-16*NSAVEXREGPAIRS]! (gdb) bt #0 _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:184 #1 0x0000ffffbe4fbb44 in OurFunction (threadId=4294967295) at /home/test/test_function.c:30 #2 0x0000000000000000 in ?? () Backtrace stopped: previous frame identical to this frame (corrupt stack?) Signed-off-by: liqingqing <liqingqing3@huawei.com> Signed-off-by: Shuo Wang <wangshuo47@huawei.com> --- sysdeps/aarch64/dl-tlsdesc.S | 2 ++ 1 file changed, 2 insertions(+)
Comments
The 01/04/2021 22:47, Shuo Wang wrote: > It is supposed to save the rules for the instructions before falling into slow path. ... > (gdb) bt > #0 _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:169 > #1 0x0000ffffbe4fbb44 in OurFunction (threadId=4294967295) > at /home/test/test_function.c:30 > #2 0x0000000000400c08 in initaaa () at thread.c:58 > #3 0x0000000000400c50 in thread_proc (param=0x0) at thread.c:71 > #4 0x0000ffffbf6918bc in start_thread (arg=0xfffffffff29f) at pthread_create.c:486 > #5 0x0000ffffbf5669ec in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:78 > (gdb) ni > _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:184 > 184 stp x29, x30, [sp,#-16*NSAVEXREGPAIRS]! > (gdb) bt > #0 _dl_tlsdesc_dynamic () at ../sysdeps/aarch64/dl-tlsdesc.S:184 > #1 0x0000ffffbe4fbb44 in OurFunction (threadId=4294967295) > at /home/test/test_function.c:30 > #2 0x0000000000000000 in ?? () > Backtrace stopped: previous frame identical to this frame (corrupt stack?) > > Signed-off-by: liqingqing <liqingqing3@huawei.com> > Signed-off-by: Shuo Wang <wangshuo47@huawei.com> > --- > sysdeps/aarch64/dl-tlsdesc.S | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/sysdeps/aarch64/dl-tlsdesc.S b/sysdeps/aarch64/dl-tlsdesc.S > index 425e45a50f..aee63cc561 100644 > --- a/sysdeps/aarch64/dl-tlsdesc.S > +++ b/sysdeps/aarch64/dl-tlsdesc.S > @@ -170,6 +170,7 @@ _dl_tlsdesc_dynamic: > ldr PTR_REG (0), [x0] /* Load val member of DTV entry. */ > cmp PTR_REG (0), #TLS_DTV_UNALLOCATED > b.eq 2f > + cfi_remember_state > sub PTR_REG (3), PTR_REG (3), PTR_REG (4) > add PTR_REG (0), PTR_REG (0), PTR_REG (3) > 1: > @@ -188,6 +189,7 @@ _dl_tlsdesc_dynamic: > cfi_window_save > # endif > # define NSAVEXREGPAIRS 8 > + cfi_restore_state this should be before the cfi_window_save otherwise the PAC signing state is restored which we dont want. just move this cfi above the PAC bits. the patch looks good otherwise. note that we dont use Signed-off-by: in glibc (which linux uses for copyright purposes). if you have coauthors then use Co-authored-by: > stp x29, x30, [sp,#-16*NSAVEXREGPAIRS]! > cfi_adjust_cfa_offset (16*NSAVEXREGPAIRS) > cfi_rel_offset (x29, 0) > -- > 2.23.0 >
diff --git a/sysdeps/aarch64/dl-tlsdesc.S b/sysdeps/aarch64/dl-tlsdesc.S index 425e45a50f..aee63cc561 100644 --- a/sysdeps/aarch64/dl-tlsdesc.S +++ b/sysdeps/aarch64/dl-tlsdesc.S @@ -170,6 +170,7 @@ _dl_tlsdesc_dynamic: ldr PTR_REG (0), [x0] /* Load val member of DTV entry. */ cmp PTR_REG (0), #TLS_DTV_UNALLOCATED b.eq 2f + cfi_remember_state sub PTR_REG (3), PTR_REG (3), PTR_REG (4) add PTR_REG (0), PTR_REG (0), PTR_REG (3) 1: @@ -188,6 +189,7 @@ _dl_tlsdesc_dynamic: cfi_window_save # endif # define NSAVEXREGPAIRS 8 + cfi_restore_state stp x29, x30, [sp,#-16*NSAVEXREGPAIRS]! cfi_adjust_cfa_offset (16*NSAVEXREGPAIRS) cfi_rel_offset (x29, 0)