diff mbox series

[v2,1/2] RISC-V: remove riscv-specific sigcontext.h

Message ID 20220118043159.27521-2-vincent.chen@sifive.com
State New
Headers show
Series RISC-V: Add vector ISA support | expand

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

Vincent Chen Jan. 18, 2022, 4:31 a.m. UTC
Remove riscv-specific sigcontext.h so that Glibc can directly use
sigcontext.h provided by the kernel to reduce synchronization work
when new extension support is introduced.
---
 .../unix/sysv/linux/riscv/bits/sigcontext.h   | 31 -------------------
 1 file changed, 31 deletions(-)
 delete mode 100644 sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h

Comments

Palmer Dabbelt Jan. 20, 2022, 2:36 a.m. UTC | #1
On Mon, 17 Jan 2022 20:31:58 PST (-0800), vincent.chen@sifive.com wrote:
> Remove riscv-specific sigcontext.h so that Glibc can directly use
> sigcontext.h provided by the kernel to reduce synchronization work
> when new extension support is introduced.
> ---
>  .../unix/sysv/linux/riscv/bits/sigcontext.h   | 31 -------------------
>  1 file changed, 31 deletions(-)
>  delete mode 100644 sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
>
> diff --git a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h b/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> deleted file mode 100644
> index b6e15b5f62..0000000000
> --- a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> +++ /dev/null
> @@ -1,31 +0,0 @@
> -/* Machine-dependent signal context structure for Linux.  RISC-V version.
> -   Copyright (C) 1996-2022 Free Software Foundation, Inc.  This file is part of the GNU C Library.
> -
> -   The GNU C Library is free software; you can redistribute it and/or
> -   modify it under the terms of the GNU Lesser General Public
> -   License as published by the Free Software Foundation; either
> -   version 2.1 of the License, or (at your option) any later version.
> -
> -   The GNU C Library is distributed in the hope that it will be useful,
> -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -   Lesser General Public License for more details.
> -
> -   You should have received a copy of the GNU Lesser General Public
> -   License along with the GNU C Library.  If not, see
> -   <https://www.gnu.org/licenses/>.  */
> -
> -#ifndef _BITS_SIGCONTEXT_H
> -#define _BITS_SIGCONTEXT_H 1
> -
> -#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
> -# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
> -#endif
> -
> -struct sigcontext {
> -  /* gregs[0] holds the program counter.  */
> -  unsigned long int gregs[32];
> -  unsigned long long int fpregs[66] __attribute__ ((__aligned__ (16)));
> -};
> -
> -#endif

This will definitely break API compatibility (the fields have 
different names) but should be fine for ABI compatibility.  IIUC that's 
within the rules, but I'm not sure it's a desirable outcome.  Probably 
would have been better to get this right the first time around, but I'm 
not sure it's worth fixing -- essentially we're making a bunch of users 
change things so we don't have to.  That said, it's pretty ugly to have 
two different definitions of a structure with the same name and layout.

Maybe there's some sort of macro-related trick we can use?  ie, provide 
the current definition unless users opt into the Linux one (presumably 
so they can talk about the V state).  There's going to be some hoops to 
jump through there to maintain ABI compatibility either way, so it's 
possible we could tie these two together?
Kito Cheng Jan. 20, 2022, 2:47 a.m. UTC | #2
Just provide a tricky workaround from GCC side:

+#ifdef _ASM_RISCV_SIGCONTEXT_H
+#define SIGCONTEXT_PC(SC) (SC)->sc_regs.pc
+#else
+#define SIGCONTEXT_PC(SC) (SC)->gregs[0]
+#endif

https://gcc.gnu.org/pipermail/gcc-patches/2022-January/588682.html


On Thu, Jan 20, 2022 at 10:36 AM Palmer Dabbelt <palmer@dabbelt.com> wrote:
>
> On Mon, 17 Jan 2022 20:31:58 PST (-0800), vincent.chen@sifive.com wrote:
> > Remove riscv-specific sigcontext.h so that Glibc can directly use
> > sigcontext.h provided by the kernel to reduce synchronization work
> > when new extension support is introduced.
> > ---
> >  .../unix/sysv/linux/riscv/bits/sigcontext.h   | 31 -------------------
> >  1 file changed, 31 deletions(-)
> >  delete mode 100644 sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> >
> > diff --git a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h b/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> > deleted file mode 100644
> > index b6e15b5f62..0000000000
> > --- a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> > +++ /dev/null
> > @@ -1,31 +0,0 @@
> > -/* Machine-dependent signal context structure for Linux.  RISC-V version.
> > -   Copyright (C) 1996-2022 Free Software Foundation, Inc.  This file is part of the GNU C Library.
> > -
> > -   The GNU C Library is free software; you can redistribute it and/or
> > -   modify it under the terms of the GNU Lesser General Public
> > -   License as published by the Free Software Foundation; either
> > -   version 2.1 of the License, or (at your option) any later version.
> > -
> > -   The GNU C Library is distributed in the hope that it will be useful,
> > -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> > -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > -   Lesser General Public License for more details.
> > -
> > -   You should have received a copy of the GNU Lesser General Public
> > -   License along with the GNU C Library.  If not, see
> > -   <https://www.gnu.org/licenses/>.  */
> > -
> > -#ifndef _BITS_SIGCONTEXT_H
> > -#define _BITS_SIGCONTEXT_H 1
> > -
> > -#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
> > -# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
> > -#endif
> > -
> > -struct sigcontext {
> > -  /* gregs[0] holds the program counter.  */
> > -  unsigned long int gregs[32];
> > -  unsigned long long int fpregs[66] __attribute__ ((__aligned__ (16)));
> > -};
> > -
> > -#endif
>
> This will definitely break API compatibility (the fields have
> different names) but should be fine for ABI compatibility.  IIUC that's
> within the rules, but I'm not sure it's a desirable outcome.  Probably
> would have been better to get this right the first time around, but I'm
> not sure it's worth fixing -- essentially we're making a bunch of users
> change things so we don't have to.  That said, it's pretty ugly to have
> two different definitions of a structure with the same name and layout.
>
> Maybe there's some sort of macro-related trick we can use?  ie, provide
> the current definition unless users opt into the Linux one (presumably
> so they can talk about the V state).  There's going to be some hoops to
> jump through there to maintain ABI compatibility either way, so it's
> possible we could tie these two together?
Vincent Chen Jan. 21, 2022, 1:29 a.m. UTC | #3
On Thu, Jan 20, 2022 at 10:47 AM Kito Cheng <kito.cheng@sifive.com> wrote:
>
> Just provide a tricky workaround from GCC side:
>
> +#ifdef _ASM_RISCV_SIGCONTEXT_H
> +#define SIGCONTEXT_PC(SC) (SC)->sc_regs.pc
> +#else
> +#define SIGCONTEXT_PC(SC) (SC)->gregs[0]
> +#endif
>
> https://gcc.gnu.org/pipermail/gcc-patches/2022-January/588682.html
>
>
> On Thu, Jan 20, 2022 at 10:36 AM Palmer Dabbelt <palmer@dabbelt.com> wrote:
> >
> > On Mon, 17 Jan 2022 20:31:58 PST (-0800), vincent.chen@sifive.com wrote:
> > > Remove riscv-specific sigcontext.h so that Glibc can directly use
> > > sigcontext.h provided by the kernel to reduce synchronization work
> > > when new extension support is introduced.
> > > ---
> > >  .../unix/sysv/linux/riscv/bits/sigcontext.h   | 31 -------------------
> > >  1 file changed, 31 deletions(-)
> > >  delete mode 100644 sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> > >
> > > diff --git a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h b/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> > > deleted file mode 100644
> > > index b6e15b5f62..0000000000
> > > --- a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> > > +++ /dev/null
> > > @@ -1,31 +0,0 @@
> > > -/* Machine-dependent signal context structure for Linux.  RISC-V version.
> > > -   Copyright (C) 1996-2022 Free Software Foundation, Inc.  This file is part of the GNU C Library.
> > > -
> > > -   The GNU C Library is free software; you can redistribute it and/or
> > > -   modify it under the terms of the GNU Lesser General Public
> > > -   License as published by the Free Software Foundation; either
> > > -   version 2.1 of the License, or (at your option) any later version.
> > > -
> > > -   The GNU C Library is distributed in the hope that it will be useful,
> > > -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> > > -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > > -   Lesser General Public License for more details.
> > > -
> > > -   You should have received a copy of the GNU Lesser General Public
> > > -   License along with the GNU C Library.  If not, see
> > > -   <https://www.gnu.org/licenses/>.  */
> > > -
> > > -#ifndef _BITS_SIGCONTEXT_H
> > > -#define _BITS_SIGCONTEXT_H 1
> > > -
> > > -#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
> > > -# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
> > > -#endif
> > > -
> > > -struct sigcontext {
> > > -  /* gregs[0] holds the program counter.  */
> > > -  unsigned long int gregs[32];
> > > -  unsigned long long int fpregs[66] __attribute__ ((__aligned__ (16)));
> > > -};
> > > -
> > > -#endif
> >
> > This will definitely break API compatibility (the fields have
> > different names) but should be fine for ABI compatibility.  IIUC that's
> > within the rules, but I'm not sure it's a desirable outcome.  Probably
> > would have been better to get this right the first time around, but I'm
> > not sure it's worth fixing -- essentially we're making a bunch of users
> > change things so we don't have to.  That said, it's pretty ugly to have
> > two different definitions of a structure with the same name and layout.
> >
> > Maybe there's some sort of macro-related trick we can use?  ie, provide
> > the current definition unless users opt into the Linux one (presumably
> > so they can talk about the V state).  There's going to be some hoops to
> > jump through there to maintain ABI compatibility either way, so it's
> > possible we could tie these two together?

I can understand what you are worried about. Therefore, I also tried
to build multiple Yocto images, such as core-image-full-cmdline,
core-image-x11, core-image-sato, and core-image-base, to evaluate the
impact. After applying Kito's solution to GCC, I didn't get any build
errors. According to the results, maybe we can have a quick conclusion
about the impact of this patch.

The new version Glibc is not compatible with the old version GCC (The
old Glibc is still compatible with the new version GCC due to Kito's
patch)
Some public programs that use struct sigcontext are not covered by
this test. (If someone can tell me which program I'm missing, I'm
willing to fix it)
Some in-house programs use struct sigcontext_t to access signal stack.

IMO, the impact seems not severe at this moment. Directly using the
kernel's sigcontext can get us away from the pain if we need to add
new registers to the signal context for a new extension or vendor
customized extension.

In addition, I was keeping to find a suitable solution to solve it as
you described. But if I still cannot come up with a solution, do you
mind that bits/sigcontext.h has a duplicate data struct related to V
extension? Thank you
Vincent Chen Jan. 24, 2022, 9:42 a.m. UTC | #4
On Fri, Jan 21, 2022 at 9:29 AM Vincent Chen <vincent.chen@sifive.com> wrote:
>
> On Thu, Jan 20, 2022 at 10:47 AM Kito Cheng <kito.cheng@sifive.com> wrote:
> >
> > Just provide a tricky workaround from GCC side:
> >
> > +#ifdef _ASM_RISCV_SIGCONTEXT_H
> > +#define SIGCONTEXT_PC(SC) (SC)->sc_regs.pc
> > +#else
> > +#define SIGCONTEXT_PC(SC) (SC)->gregs[0]
> > +#endif
> >
> > https://gcc.gnu.org/pipermail/gcc-patches/2022-January/588682.html
> >
> >
> > On Thu, Jan 20, 2022 at 10:36 AM Palmer Dabbelt <palmer@dabbelt.com> wrote:
> > >
> > > On Mon, 17 Jan 2022 20:31:58 PST (-0800), vincent.chen@sifive.com wrote:
> > > > Remove riscv-specific sigcontext.h so that Glibc can directly use
> > > > sigcontext.h provided by the kernel to reduce synchronization work
> > > > when new extension support is introduced.
> > > > ---
> > > >  .../unix/sysv/linux/riscv/bits/sigcontext.h   | 31 -------------------
> > > >  1 file changed, 31 deletions(-)
> > > >  delete mode 100644 sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> > > >
> > > > diff --git a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h b/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> > > > deleted file mode 100644
> > > > index b6e15b5f62..0000000000
> > > > --- a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> > > > +++ /dev/null
> > > > @@ -1,31 +0,0 @@
> > > > -/* Machine-dependent signal context structure for Linux.  RISC-V version.
> > > > -   Copyright (C) 1996-2022 Free Software Foundation, Inc.  This file is part of the GNU C Library.
> > > > -
> > > > -   The GNU C Library is free software; you can redistribute it and/or
> > > > -   modify it under the terms of the GNU Lesser General Public
> > > > -   License as published by the Free Software Foundation; either
> > > > -   version 2.1 of the License, or (at your option) any later version.
> > > > -
> > > > -   The GNU C Library is distributed in the hope that it will be useful,
> > > > -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> > > > -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> > > > -   Lesser General Public License for more details.
> > > > -
> > > > -   You should have received a copy of the GNU Lesser General Public
> > > > -   License along with the GNU C Library.  If not, see
> > > > -   <https://www.gnu.org/licenses/>.  */
> > > > -
> > > > -#ifndef _BITS_SIGCONTEXT_H
> > > > -#define _BITS_SIGCONTEXT_H 1
> > > > -
> > > > -#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
> > > > -# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
> > > > -#endif
> > > > -
> > > > -struct sigcontext {
> > > > -  /* gregs[0] holds the program counter.  */
> > > > -  unsigned long int gregs[32];
> > > > -  unsigned long long int fpregs[66] __attribute__ ((__aligned__ (16)));
> > > > -};
> > > > -
> > > > -#endif
> > >
> > > This will definitely break API compatibility (the fields have
> > > different names) but should be fine for ABI compatibility.  IIUC that's
> > > within the rules, but I'm not sure it's a desirable outcome.  Probably
> > > would have been better to get this right the first time around, but I'm
> > > not sure it's worth fixing -- essentially we're making a bunch of users
> > > change things so we don't have to.  That said, it's pretty ugly to have
> > > two different definitions of a structure with the same name and layout.
> > >
> > > Maybe there's some sort of macro-related trick we can use?  ie, provide
> > > the current definition unless users opt into the Linux one (presumably
> > > so they can talk about the V state).  There's going to be some hoops to
> > > jump through there to maintain ABI compatibility either way, so it's
> > > possible we could tie these two together?
>
> I can understand what you are worried about. Therefore, I also tried
> to build multiple Yocto images, such as core-image-full-cmdline,
> core-image-x11, core-image-sato, and core-image-base, to evaluate the
> impact. After applying Kito's solution to GCC, I didn't get any build
> errors. According to the results, maybe we can have a quick conclusion
> about the impact of this patch.
>
> The new version Glibc is not compatible with the old version GCC (The
> old Glibc is still compatible with the new version GCC due to Kito's
> patch)
> Some public programs that use struct sigcontext are not covered by
> this test. (If someone can tell me which program I'm missing, I'm
> willing to fix it)
> Some in-house programs use struct sigcontext_t to access signal stack.
>
> IMO, the impact seems not severe at this moment. Directly using the
> kernel's sigcontext can get us away from the pain if we need to add
> new registers to the signal context for a new extension or vendor
> customized extension.
>
> In addition, I was keeping to find a suitable solution to solve it as
> you described. But if I still cannot come up with a solution, do you
> mind that bits/sigcontext.h has a duplicate data struct related to V
> extension? Thank you


I have some findings these days. Please allow me to update some descriptions.

For the evaluation of deprecating the Glibc self-defined sigcontext.h
(riscv/bits/sigcontext.h), thanks to David Abdurachmanov's suggestion,
I used "world" instead of a particular image. It makes me able to
build every single package available in all the layers. It effectively
extends the test coverage. Fortunately, I didn't encounter any compile
errors due to sigcontext.h deprecation.

In addition, I found using "anonymous union" may suffice to avoid API
breakage. According to Greentime's vector
patch(https://lore.kernel.org/lkml/202111112102.qLSAjr3Q-lkp@intel.com/T/),
the following is associated modification in Glibc
sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h

--- a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
+++ b/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
@@ -22,10 +22,22 @@
 # error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
 #endif

+#define sigcontext kernel_sigcontext
+#include <asm/sigcontext.h>
+#undef sigcontext
+
 struct sigcontext {
   /* gregs[0] holds the program counter.  */
-  unsigned long int gregs[32];
-  unsigned long long int fpregs[66] __attribute__ ((__aligned__ (16)));
+  __extension__ union {
+       unsigned long int gregs[32];
+       struct user_regs_struct sc_regs;
+  };
+  __extension__ union {
+       unsigned long long int fpregs[66] __attribute__ ((__aligned__ (16)));
+       union __riscv_fp_state sc_fpregs;
+  };
+   __u8 __reserved[4224] __attribute__((__aligned__(16)));
 };
 #endif

In this modification, users do not need to specify which sigcontext.h
he wants to choose. Through the anonymous union, the current member of
struct sigcontext, gregs and fpregs, declared in
riscv/bits/sigcontext.h is still available. Besides, by redefining
struct sigcontext as struct kernel_sigcontext before including
asm/sigcontext.h,  riscv/bits/sigcontext.h can directly include
asm/sigcontext.h to introduce the register data structure of new
extension without duplicating the same definitions in Glibc. The
modifications can pass the Glibc test suite without additional errors.

By the way, I found that the definition of struct sigcontext in
riscv/bits/sigcontext.h and asm/sigcontext.h is a bit different now.
The memory size of fpregs[66] in riscv/bits/sigcontext.h equals to
__riscv_fp_state sc_fpregs in asm/sigcontext.h, but their memory
layout is different. Users cannot always use fpregs[x] to get the
associated x-th FPU registers from the signal stack in all situations.
It may be a minus case, but it points out the potential
synchronization issue. Therefore, if possible, I still hope to
deprecate the riscv/bits/sigcontext.h.
Palmer Dabbelt Feb. 24, 2022, 8:56 p.m. UTC | #5
On Thu, 20 Jan 2022 17:29:20 PST (-0800), vincent.chen@sifive.com wrote:
> On Thu, Jan 20, 2022 at 10:47 AM Kito Cheng <kito.cheng@sifive.com> wrote:
>>
>> Just provide a tricky workaround from GCC side:
>>
>> +#ifdef _ASM_RISCV_SIGCONTEXT_H
>> +#define SIGCONTEXT_PC(SC) (SC)->sc_regs.pc
>> +#else
>> +#define SIGCONTEXT_PC(SC) (SC)->gregs[0]
>> +#endif
>>
>> https://gcc.gnu.org/pipermail/gcc-patches/2022-January/588682.html
>>
>>
>> On Thu, Jan 20, 2022 at 10:36 AM Palmer Dabbelt <palmer@dabbelt.com> wrote:
>> >
>> > On Mon, 17 Jan 2022 20:31:58 PST (-0800), vincent.chen@sifive.com wrote:
>> > > Remove riscv-specific sigcontext.h so that Glibc can directly use
>> > > sigcontext.h provided by the kernel to reduce synchronization work
>> > > when new extension support is introduced.
>> > > ---
>> > >  .../unix/sysv/linux/riscv/bits/sigcontext.h   | 31 -------------------
>> > >  1 file changed, 31 deletions(-)
>> > >  delete mode 100644 sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
>> > >
>> > > diff --git a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h b/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
>> > > deleted file mode 100644
>> > > index b6e15b5f62..0000000000
>> > > --- a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
>> > > +++ /dev/null
>> > > @@ -1,31 +0,0 @@
>> > > -/* Machine-dependent signal context structure for Linux.  RISC-V version.
>> > > -   Copyright (C) 1996-2022 Free Software Foundation, Inc.  This file is part of the GNU C Library.
>> > > -
>> > > -   The GNU C Library is free software; you can redistribute it and/or
>> > > -   modify it under the terms of the GNU Lesser General Public
>> > > -   License as published by the Free Software Foundation; either
>> > > -   version 2.1 of the License, or (at your option) any later version.
>> > > -
>> > > -   The GNU C Library is distributed in the hope that it will be useful,
>> > > -   but WITHOUT ANY WARRANTY; without even the implied warranty of
>> > > -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
>> > > -   Lesser General Public License for more details.
>> > > -
>> > > -   You should have received a copy of the GNU Lesser General Public
>> > > -   License along with the GNU C Library.  If not, see
>> > > -   <https://www.gnu.org/licenses/>.  */
>> > > -
>> > > -#ifndef _BITS_SIGCONTEXT_H
>> > > -#define _BITS_SIGCONTEXT_H 1
>> > > -
>> > > -#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
>> > > -# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
>> > > -#endif
>> > > -
>> > > -struct sigcontext {
>> > > -  /* gregs[0] holds the program counter.  */
>> > > -  unsigned long int gregs[32];
>> > > -  unsigned long long int fpregs[66] __attribute__ ((__aligned__ (16)));
>> > > -};
>> > > -
>> > > -#endif
>> >
>> > This will definitely break API compatibility (the fields have
>> > different names) but should be fine for ABI compatibility.  IIUC that's
>> > within the rules, but I'm not sure it's a desirable outcome.  Probably
>> > would have been better to get this right the first time around, but I'm
>> > not sure it's worth fixing -- essentially we're making a bunch of users
>> > change things so we don't have to.  That said, it's pretty ugly to have
>> > two different definitions of a structure with the same name and layout.
>> >
>> > Maybe there's some sort of macro-related trick we can use?  ie, provide
>> > the current definition unless users opt into the Linux one (presumably
>> > so they can talk about the V state).  There's going to be some hoops to
>> > jump through there to maintain ABI compatibility either way, so it's
>> > possible we could tie these two together?
>
> I can understand what you are worried about. Therefore, I also tried
> to build multiple Yocto images, such as core-image-full-cmdline,
> core-image-x11, core-image-sato, and core-image-base, to evaluate the
> impact. After applying Kito's solution to GCC, I didn't get any build
> errors. According to the results, maybe we can have a quick conclusion
> about the impact of this patch.
>
> The new version Glibc is not compatible with the old version GCC (The
> old Glibc is still compatible with the new version GCC due to Kito's
> patch)
> Some public programs that use struct sigcontext are not covered by
> this test. (If someone can tell me which program I'm missing, I'm
> willing to fix it)
> Some in-house programs use struct sigcontext_t to access signal stack.
>
> IMO, the impact seems not severe at this moment. Directly using the
> kernel's sigcontext can get us away from the pain if we need to add
> new registers to the signal context for a new extension or vendor
> customized extension.
>
> In addition, I was keeping to find a suitable solution to solve it as
> you described. But if I still cannot come up with a solution, do you
> mind that bits/sigcontext.h has a duplicate data struct related to V
> extension? Thank you

I was talking about putting the macros into glibc, so we don't force 
users into picking up the kernel's sigcontext but instead give them the 
option of moving over.  So something like this:

    diff --git a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h b/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
    index b6e15b5f62..d07d690d1b 100644
    --- a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
    +++ b/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
    @@ -22,10 +22,18 @@
     # error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
     #endif
    
    +#ifdef __USE_KERNEL_SIGCONTEXT
    +# include <asm/sigcontext.h>
    +
    +/* The Linux kernel headers redefine NULL wrongly, so cleanup afterwards.  */
    +# define __need_NULL
    +# include <stddef.h>
    +#else
     struct sigcontext {
       /* gregs[0] holds the program counter.  */
       unsigned long int gregs[32];
       unsigned long long int fpregs[66] __attribute__ ((__aligned__ (16)));
     };
    +#endif
    
     #endif
Vincent Chen Feb. 25, 2022, 12:32 a.m. UTC | #6
On Fri, Feb 25, 2022 at 4:56 AM Palmer Dabbelt <palmer@dabbelt.com> wrote:
>
> On Thu, 20 Jan 2022 17:29:20 PST (-0800), vincent.chen@sifive.com wrote:
> > On Thu, Jan 20, 2022 at 10:47 AM Kito Cheng <kito.cheng@sifive.com> wrote:
> >>
> >> Just provide a tricky workaround from GCC side:
> >>
> >> +#ifdef _ASM_RISCV_SIGCONTEXT_H
> >> +#define SIGCONTEXT_PC(SC) (SC)->sc_regs.pc
> >> +#else
> >> +#define SIGCONTEXT_PC(SC) (SC)->gregs[0]
> >> +#endif
> >>
> >> https://gcc.gnu.org/pipermail/gcc-patches/2022-January/588682.html
> >>
> >>
> >> On Thu, Jan 20, 2022 at 10:36 AM Palmer Dabbelt <palmer@dabbelt.com> wrote:
> >> >
> >> > On Mon, 17 Jan 2022 20:31:58 PST (-0800), vincent.chen@sifive.com wrote:
> >> > > Remove riscv-specific sigcontext.h so that Glibc can directly use
> >> > > sigcontext.h provided by the kernel to reduce synchronization work
> >> > > when new extension support is introduced.
> >> > > ---
> >> > >  .../unix/sysv/linux/riscv/bits/sigcontext.h   | 31 -------------------
> >> > >  1 file changed, 31 deletions(-)
> >> > >  delete mode 100644 sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> >> > >
> >> > > diff --git a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h b/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> >> > > deleted file mode 100644
> >> > > index b6e15b5f62..0000000000
> >> > > --- a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
> >> > > +++ /dev/null
> >> > > @@ -1,31 +0,0 @@
> >> > > -/* Machine-dependent signal context structure for Linux.  RISC-V version.
> >> > > -   Copyright (C) 1996-2022 Free Software Foundation, Inc.  This file is part of the GNU C Library.
> >> > > -
> >> > > -   The GNU C Library is free software; you can redistribute it and/or
> >> > > -   modify it under the terms of the GNU Lesser General Public
> >> > > -   License as published by the Free Software Foundation; either
> >> > > -   version 2.1 of the License, or (at your option) any later version.
> >> > > -
> >> > > -   The GNU C Library is distributed in the hope that it will be useful,
> >> > > -   but WITHOUT ANY WARRANTY; without even the implied warranty of
> >> > > -   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> >> > > -   Lesser General Public License for more details.
> >> > > -
> >> > > -   You should have received a copy of the GNU Lesser General Public
> >> > > -   License along with the GNU C Library.  If not, see
> >> > > -   <https://www.gnu.org/licenses/>.  */
> >> > > -
> >> > > -#ifndef _BITS_SIGCONTEXT_H
> >> > > -#define _BITS_SIGCONTEXT_H 1
> >> > > -
> >> > > -#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
> >> > > -# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
> >> > > -#endif
> >> > > -
> >> > > -struct sigcontext {
> >> > > -  /* gregs[0] holds the program counter.  */
> >> > > -  unsigned long int gregs[32];
> >> > > -  unsigned long long int fpregs[66] __attribute__ ((__aligned__ (16)));
> >> > > -};
> >> > > -
> >> > > -#endif
> >> >
> >> > This will definitely break API compatibility (the fields have
> >> > different names) but should be fine for ABI compatibility.  IIUC that's
> >> > within the rules, but I'm not sure it's a desirable outcome.  Probably
> >> > would have been better to get this right the first time around, but I'm
> >> > not sure it's worth fixing -- essentially we're making a bunch of users
> >> > change things so we don't have to.  That said, it's pretty ugly to have
> >> > two different definitions of a structure with the same name and layout.
> >> >
> >> > Maybe there's some sort of macro-related trick we can use?  ie, provide
> >> > the current definition unless users opt into the Linux one (presumably
> >> > so they can talk about the V state).  There's going to be some hoops to
> >> > jump through there to maintain ABI compatibility either way, so it's
> >> > possible we could tie these two together?
> >
> > I can understand what you are worried about. Therefore, I also tried
> > to build multiple Yocto images, such as core-image-full-cmdline,
> > core-image-x11, core-image-sato, and core-image-base, to evaluate the
> > impact. After applying Kito's solution to GCC, I didn't get any build
> > errors. According to the results, maybe we can have a quick conclusion
> > about the impact of this patch.
> >
> > The new version Glibc is not compatible with the old version GCC (The
> > old Glibc is still compatible with the new version GCC due to Kito's
> > patch)
> > Some public programs that use struct sigcontext are not covered by
> > this test. (If someone can tell me which program I'm missing, I'm
> > willing to fix it)
> > Some in-house programs use struct sigcontext_t to access signal stack.
> >
> > IMO, the impact seems not severe at this moment. Directly using the
> > kernel's sigcontext can get us away from the pain if we need to add
> > new registers to the signal context for a new extension or vendor
> > customized extension.
> >
> > In addition, I was keeping to find a suitable solution to solve it as
> > you described. But if I still cannot come up with a solution, do you
> > mind that bits/sigcontext.h has a duplicate data struct related to V
> > extension? Thank you
>
> I was talking about putting the macros into glibc, so we don't force
> users into picking up the kernel's sigcontext but instead give them the
> option of moving over.  So something like this:
>
>     diff --git a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h b/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
>     index b6e15b5f62..d07d690d1b 100644
>     --- a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
>     +++ b/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
>     @@ -22,10 +22,18 @@
>      # error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
>      #endif
>
>     +#ifdef __USE_KERNEL_SIGCONTEXT
>     +# include <asm/sigcontext.h>
>     +
>     +/* The Linux kernel headers redefine NULL wrongly, so cleanup afterwards.  */
>     +# define __need_NULL
>     +# include <stddef.h>
>     +#else
>      struct sigcontext {
>        /* gregs[0] holds the program counter.  */
>        unsigned long int gregs[32];
>        unsigned long long int fpregs[66] __attribute__ ((__aligned__ (16)));
>      };
>     +#endif
>
>      #endif

Hi Palmer,

Thank you for your explanation.

In my latest reply to this thread( or you also can find it in
https://sourceware.org/pipermail/libc-alpha/2022-January/135610.html),
I purposed a new solution. This solution allows users to transparently
use the kernel sigcontext.h without breaking API compatibility. Could
you help me review it and give me some suggestions? Thank you.

Best regards,
Vincent
diff mbox series

Patch

diff --git a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h b/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
deleted file mode 100644
index b6e15b5f62..0000000000
--- a/sysdeps/unix/sysv/linux/riscv/bits/sigcontext.h
+++ /dev/null
@@ -1,31 +0,0 @@ 
-/* Machine-dependent signal context structure for Linux.  RISC-V version.
-   Copyright (C) 1996-2022 Free Software Foundation, Inc.  This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library.  If not, see
-   <https://www.gnu.org/licenses/>.  */
-
-#ifndef _BITS_SIGCONTEXT_H
-#define _BITS_SIGCONTEXT_H 1
-
-#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
-# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
-#endif
-
-struct sigcontext {
-  /* gregs[0] holds the program counter.  */
-  unsigned long int gregs[32];
-  unsigned long long int fpregs[66] __attribute__ ((__aligned__ (16)));
-};
-
-#endif