From patchwork Mon Apr 3 12:01:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: caiyinyu X-Patchwork-Id: 1764411 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PqqJP3BNqz1yYb for ; Mon, 3 Apr 2023 22:02:13 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3AF433858434 for ; Mon, 3 Apr 2023 12:02:11 +0000 (GMT) X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id 711983858D39 for ; Mon, 3 Apr 2023 12:02:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 711983858D39 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from loongson.cn (unknown [10.2.5.5]) by gateway (Coremail) with SMTP id _____8BxYU80wCpkBgwWAA--.34081S3; Mon, 03 Apr 2023 20:01:58 +0800 (CST) Received: from 5.5.5 (unknown [10.2.5.5]) by localhost.localdomain (Coremail) with SMTP id AQAAf8Axmr00wCpkjWoUAA--.16402S2; Mon, 03 Apr 2023 20:01:56 +0800 (CST) From: caiyinyu To: libc-alpha@sourceware.org Cc: caiyinyu , Xi Ruoyao Subject: [PATCH] LoongArch: Ensure consistency with kernel by using union for struct members in mcontext_t and ucontext_t. Date: Mon, 3 Apr 2023 20:01:53 +0800 Message-Id: <20230403120153.3332463-1-caiyinyu@loongson.cn> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 X-CM-TRANSID: AQAAf8Axmr00wCpkjWoUAA--.16402S2 X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Coremail-Antispam: 1Uk129KBjvJXoW3Gr18CF17AryDAr43Kw4rXwb_yoWxXFy3pF 4Y93W8AF4UWF15CF90k3WYqr1fGr18tr1Du3sak34UAry3JFZ7Wa4ayanIyF1j9348JFs0 yrs5tan8GF4Yy37anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUj1kv1TuYvTs0mT0YCTnIWj qI5I8CrVACY4xI64kE6c02F40Ex7xfYxn0WfASr-VFAUDa7-sFnT9fnUUIcSsGvfJTRUUU b28YFVCjjxCrM7AC8VAFwI0_Jr0_Gr1l1xkIjI8I6I8E6xAIw20EY4v20xvaj40_Wr0E3s 1l1IIY67AEw4v_Jr0_Jr4l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M28EF7xv wVC0I7IYx2IY67AKxVWUCVW8JwA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVWUJVW8JwA2z4 x0Y4vEx4A2jsIE14v26r4UJVWxJr1l84ACjcxK6I8E87Iv6xkF7I0E14v26r4UJVWxJr1l e2I262IYc4CY6c8Ij28IcVAaY2xG8wAqjxCEc2xF0cIa020Ex4CE44I27wAqx4xG64xvF2 IEw4CE5I8CrVC2j2WlYx0E2Ix0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4U McvjeVCFs4IE7xkEbVWUJVW8JwACjcxG0xvY0x0EwIxGrwCF04k20xvY0x0EwIxGrwCFx2 IqxVCFs4IE7xkEbVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v2 6r106r1rMI8E67AF67kF1VAFwI0_Jrv_JF1lIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67 AKxVWUJVWUCwCI42IY6xIIjxv20xvEc7CjxVAFwI0_Jr0_Gr1lIxAIcVCF04k26cxKx2IY s7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r4j6F4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr 0_Gr1UYxBIdaVFxhVjvjDU0xZFpf9x07UE-erUUUUU= X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org Sender: "Libc-alpha" During the construction of the LoongArch Alpine system, we found that there is an inconsistency in the member names of mcontext_t and ucontext_t between musl and glibc, which can cause compilation errors. After testing, we decided to use union to keep these member names consistency. Reference: 4fa9b3bfe6759c82beb4b043a54a3598ca467289 Co-authored-by: Xi Ruoyao --- .../unix/sysv/linux/loongarch/makecontext.c | 26 ++++++++-------- .../sysv/linux/loongarch/sigcontextinfo.h | 2 +- .../unix/sysv/linux/loongarch/sys/ucontext.h | 31 ++++++++++++++++--- .../unix/sysv/linux/loongarch/ucontext_i.sym | 6 ++-- 4 files changed, 43 insertions(+), 22 deletions(-) diff --git a/sysdeps/unix/sysv/linux/loongarch/makecontext.c b/sysdeps/unix/sysv/linux/loongarch/makecontext.c index a17f6ccc51..153be5a680 100644 --- a/sysdeps/unix/sysv/linux/loongarch/makecontext.c +++ b/sysdeps/unix/sysv/linux/loongarch/makecontext.c @@ -41,19 +41,19 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, long int a0, ra = s0 = 0, terminating the stack for backtracing purposes. s1 = the function we must call. s2 = the subsequent context to run. */ - ucp->uc_mcontext.__gregs[LARCH_REG_RA] = (uintptr_t) 0; - ucp->uc_mcontext.__gregs[LARCH_REG_S0] = (uintptr_t) 0; - ucp->uc_mcontext.__gregs[LARCH_REG_S1] = (uintptr_t) func; - ucp->uc_mcontext.__gregs[LARCH_REG_S2] = (uintptr_t) ucp->uc_link; - ucp->uc_mcontext.__gregs[LARCH_REG_SP] = (uintptr_t) sp; - ucp->uc_mcontext.__pc = (uintptr_t) &__start_context; + ucp->uc_mcontext.sc_regs[LARCH_REG_RA] = (uintptr_t) 0; + ucp->uc_mcontext.sc_regs[LARCH_REG_S0] = (uintptr_t) 0; + ucp->uc_mcontext.sc_regs[LARCH_REG_S1] = (uintptr_t) func; + ucp->uc_mcontext.sc_regs[LARCH_REG_S2] = (uintptr_t) ucp->uc_link; + ucp->uc_mcontext.sc_regs[LARCH_REG_SP] = (uintptr_t) sp; + ucp->uc_mcontext.sc_pc = (uintptr_t) &__start_context; /* Put args in a0-a7, then put any remaining args on the stack. */ - ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 0] = (uintptr_t) a0; - ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 1] = (uintptr_t) a1; - ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 2] = (uintptr_t) a2; - ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 3] = (uintptr_t) a3; - ucp->uc_mcontext.__gregs[LARCH_REG_A0 + 4] = (uintptr_t) a4; + ucp->uc_mcontext.sc_regs[LARCH_REG_A0 + 0] = (uintptr_t) a0; + ucp->uc_mcontext.sc_regs[LARCH_REG_A0 + 1] = (uintptr_t) a1; + ucp->uc_mcontext.sc_regs[LARCH_REG_A0 + 2] = (uintptr_t) a2; + ucp->uc_mcontext.sc_regs[LARCH_REG_A0 + 3] = (uintptr_t) a3; + ucp->uc_mcontext.sc_regs[LARCH_REG_A0 + 4] = (uintptr_t) a4; if (__glibc_unlikely (argc > 5)) { @@ -62,14 +62,14 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc, long int a0, long int reg_args = argc < LARCH_REG_NARGS ? argc : LARCH_REG_NARGS; for (long int i = 5; i < reg_args; i++) - ucp->uc_mcontext.__gregs[LARCH_REG_A0 + i] = va_arg (vl, unsigned long int); + ucp->uc_mcontext.sc_regs[LARCH_REG_A0 + i] = va_arg (vl, unsigned long int); long int stack_args = argc - reg_args; if (stack_args > 0) { sp = (unsigned long int *) (((uintptr_t) sp - stack_args * sizeof (long int)) & ALMASK); - ucp->uc_mcontext.__gregs[LARCH_REG_SP] = (uintptr_t) sp; + ucp->uc_mcontext.sc_regs[LARCH_REG_SP] = (uintptr_t) sp; for (long int i = 0; i < stack_args; i++) sp[i] = va_arg (vl, unsigned long int); } diff --git a/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h b/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h index 4cfb87da76..3d6fe08e57 100644 --- a/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h +++ b/sysdeps/unix/sysv/linux/loongarch/sigcontextinfo.h @@ -26,7 +26,7 @@ static inline uintptr_t sigcontext_get_pc (const ucontext_t *ctx) { - return ctx->uc_mcontext.__pc; + return ctx->uc_mcontext.sc_pc; } #endif diff --git a/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h b/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h index 8790265e74..6dad539ee2 100644 --- a/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h +++ b/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h @@ -43,22 +43,43 @@ typedef unsigned long int greg_t; typedef greg_t gregset_t[32]; #endif +#ifdef __USE_MISC +# define __ctx(fld) fld +#else +# define __ctx(fld) __ ## fld +#endif + typedef struct mcontext_t { - unsigned long long __pc; - unsigned long long __gregs[32]; - unsigned int __flags; - unsigned long long __extcontext[0] __attribute__((__aligned__(16))); + union + { + struct + { + unsigned long long __ctx(sc_pc); + unsigned long long __ctx(sc_regs)[32]; + unsigned int __ctx(sc_flags); + unsigned long long __ctx(sc_extcontext)[0] __attribute__((__aligned__(16))); + }; + struct + { + unsigned long long __pc; + unsigned long long __gregs[32]; + unsigned int __flags; + unsigned long long __extcontext[0] __attribute__((__aligned__(16))); + }; + }; } mcontext_t; /* Userlevel context. */ typedef struct ucontext_t { - unsigned long int __uc_flags; + unsigned long int __ctx(uc_flags); struct ucontext_t *uc_link; stack_t uc_stack; sigset_t uc_sigmask; mcontext_t uc_mcontext; } ucontext_t; +#undef __ctx + #endif /* sys/ucontext.h */ diff --git a/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym b/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym index f27afad56f..dfe5199542 100644 --- a/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym +++ b/sysdeps/unix/sysv/linux/loongarch/ucontext_i.sym @@ -15,7 +15,7 @@ _NSIG8 (_NSIG / 8) #define stack(member) ucontext (uc_stack.member) #define mcontext(member) ucontext (uc_mcontext.member) -UCONTEXT_FLAGS ucontext (__uc_flags) +UCONTEXT_FLAGS ucontext (uc_flags) UCONTEXT_LINK ucontext (uc_link) UCONTEXT_STACK ucontext (uc_stack) UCONTEXT_MCONTEXT ucontext (uc_mcontext) @@ -25,7 +25,7 @@ STACK_SP stack (ss_sp) STACK_SIZE stack (ss_size) STACK_FLAGS stack (ss_flags) -MCONTEXT_PC mcontext (__pc) -MCONTEXT_GREGS mcontext (__gregs) +MCONTEXT_PC mcontext (sc_pc) +MCONTEXT_GREGS mcontext (sc_regs) UCONTEXT_SIZE sizeof (ucontext_t)