LoongArch: Modify some member names in mcontext_t and ucontext_t structs to align them with the kernel.

Message ID 20230403025143.2882449-1-caiyinyu@loongson.cn
State Superseded
Headers
Series LoongArch: Modify some member names in mcontext_t and ucontext_t structs to align them with the kernel. |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent
dj/TryBot-32bit success Build for i686

Commit Message

caiyinyu April 3, 2023, 2:51 a.m. UTC
  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 have
decided to modify some member names.

This patch will be backported to glibc versions 2.36 and 2.37.

Reference: 4fa9b3bfe6759c82beb4b043a54a3598ca467289
---
 .../unix/sysv/linux/loongarch/makecontext.c   | 26 +++++++++----------
 .../sysv/linux/loongarch/sigcontextinfo.h     |  2 +-
 .../unix/sysv/linux/loongarch/sys/ucontext.h  | 19 ++++++++++----
 .../unix/sysv/linux/loongarch/ucontext_i.sym  |  6 ++---
 4 files changed, 31 insertions(+), 22 deletions(-)
  

Comments

Adhemerval Zanella Netto April 3, 2023, 12:29 p.m. UTC | #1
On 02/04/23 23:51, caiyinyu wrote:
> 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 have
> decided to modify some member names.
> 
> This patch will be backported to glibc versions 2.36 and 2.37.

You can't do it without breaking the API and I don't think we should allow
the precedence.  Afaik loongarch is not yet on musl, so why can't you mimic
what loongarch already defined in glibc on musl?
  
caiyinyu April 3, 2023, 12:33 p.m. UTC | #2
在 2023/4/3 下午8:29, Adhemerval Zanella Netto 写道:
>
> On 02/04/23 23:51, caiyinyu wrote:
>> 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 have
>> decided to modify some member names.
>>
>> This patch will be backported to glibc versions 2.36 and 2.37.
> You can't do it without breaking the API and I don't think we should allow
> the precedence.  Afaik loongarch is not yet on musl, so why can't you mimic
> what loongarch already defined in glibc on musl?

The latest patch:

https://sourceware.org/pipermail/libc-alpha/2023-April/146897.html

The latest emails:

https://sourceware.org/pipermail/libc-alpha/2023-April/thread.html (bottom)
  

Patch

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..ecc68c8378 100644
--- a/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/loongarch/sys/ucontext.h
@@ -43,22 +43,31 @@  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)));
+  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)));
 } 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)