Fix RISC-V vfork build with Linux 5.3 kernel headers
diff mbox series

Message ID alpine.DEB.2.21.1909172214410.3323@digraph.polyomino.org.uk
State New
Headers show
Series
  • Fix RISC-V vfork build with Linux 5.3 kernel headers
Related show

Commit Message

Joseph Myers Sept. 17, 2019, 10:15 p.m. UTC
Building glibc for RISC-V with Linux 5.3 kernel headers fails because
<linux/sched.h>, included in vfork.S for CLONE_* constants, contains a
structure definition not safe for inclusion in assembly code.

All other architectures already avoid use of that header in vfork.S,
either defining the CLONE_* constants locally or embedding the
required values directly in the relevant instruction, where they
implement vfork using the clone syscall (see the implementations for
aarch64, ia64, mips and nios2).  This patch makes the RISC-V version
define the constants locally like the other architectures.

Tested build for all three RISC-V configurations in
build-many-glibcs.py with Linux 5.3 headers.

2019-09-17  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/unix/sysv/linux/riscv/vfork.S: Do not include
	<linux/sched.h>.
	(CLONE_VM): New macro.
	(CLONE_VFORK): Likewise.

Comments

Alistair Francis Sept. 17, 2019, 10:29 p.m. UTC | #1
On Tue, Sep 17, 2019 at 3:15 PM Joseph Myers <joseph@codesourcery.com> wrote:
>
> Building glibc for RISC-V with Linux 5.3 kernel headers fails because
> <linux/sched.h>, included in vfork.S for CLONE_* constants, contains a
> structure definition not safe for inclusion in assembly code.
>
> All other architectures already avoid use of that header in vfork.S,
> either defining the CLONE_* constants locally or embedding the
> required values directly in the relevant instruction, where they
> implement vfork using the clone syscall (see the implementations for
> aarch64, ia64, mips and nios2).  This patch makes the RISC-V version
> define the constants locally like the other architectures.
>
> Tested build for all three RISC-V configurations in
> build-many-glibcs.py with Linux 5.3 headers.

LGTM.

I was confused why I haven't seen this, but I'm using the 5.2 headers
which is why I haven't hit this.

Alistair

>
> 2019-09-17  Joseph Myers  <joseph@codesourcery.com>
>
>         * sysdeps/unix/sysv/linux/riscv/vfork.S: Do not include
>         <linux/sched.h>.
>         (CLONE_VM): New macro.
>         (CLONE_VFORK): Likewise.
>
> diff --git a/sysdeps/unix/sysv/linux/riscv/vfork.S b/sysdeps/unix/sysv/linux/riscv/vfork.S
> index e68dbc7d5d..062a562e72 100644
> --- a/sysdeps/unix/sysv/linux/riscv/vfork.S
> +++ b/sysdeps/unix/sysv/linux/riscv/vfork.S
> @@ -21,9 +21,12 @@
>  #include <sys/asm.h>
>  #include <sysdep.h>
>  #define __ASSEMBLY__
> -#include <linux/sched.h>
>  #include <asm/signal.h>
>
> +#define CLONE_VM      0x00000100 /* Set if VM shared between processes.  */
> +#define CLONE_VFORK   0x00004000 /* Set if the parent wants the child to
> +                                   wake it up on mm_release.  */
> +
>         .text
>  LEAF (__libc_vfork)
>
>
> --
> Joseph S. Myers
> joseph@codesourcery.com
Palmer Dabbelt Sept. 20, 2019, 10:45 p.m. UTC | #2
On Tue, 17 Sep 2019 15:15:09 PDT (-0700), joseph@codesourcery.com wrote:
> Building glibc for RISC-V with Linux 5.3 kernel headers fails because
> <linux/sched.h>, included in vfork.S for CLONE_* constants, contains a
> structure definition not safe for inclusion in assembly code.
>
> All other architectures already avoid use of that header in vfork.S,
> either defining the CLONE_* constants locally or embedding the
> required values directly in the relevant instruction, where they
> implement vfork using the clone syscall (see the implementations for
> aarch64, ia64, mips and nios2).  This patch makes the RISC-V version
> define the constants locally like the other architectures.
>
> Tested build for all three RISC-V configurations in
> build-many-glibcs.py with Linux 5.3 headers.
>
> 2019-09-17  Joseph Myers  <joseph@codesourcery.com>
>
> 	* sysdeps/unix/sysv/linux/riscv/vfork.S: Do not include
> 	<linux/sched.h>.
> 	(CLONE_VM): New macro.
> 	(CLONE_VFORK): Likewise.
>
> diff --git a/sysdeps/unix/sysv/linux/riscv/vfork.S b/sysdeps/unix/sysv/linux/riscv/vfork.S
> index e68dbc7d5d..062a562e72 100644
> --- a/sysdeps/unix/sysv/linux/riscv/vfork.S
> +++ b/sysdeps/unix/sysv/linux/riscv/vfork.S
> @@ -21,9 +21,12 @@
>  #include <sys/asm.h>
>  #include <sysdep.h>
>  #define __ASSEMBLY__
> -#include <linux/sched.h>
>  #include <asm/signal.h>
>
> +#define CLONE_VM      0x00000100 /* Set if VM shared between processes.  */
> +#define CLONE_VFORK   0x00004000 /* Set if the parent wants the child to
> +				    wake it up on mm_release.  */
> +
>  	.text
>  LEAF (__libc_vfork)

Reviewed-by: Palmer Dabbelt <palmer@sifive.com>

I'm assuming you're going to commit this.

Thanks!

Patch
diff mbox series

diff --git a/sysdeps/unix/sysv/linux/riscv/vfork.S b/sysdeps/unix/sysv/linux/riscv/vfork.S
index e68dbc7d5d..062a562e72 100644
--- a/sysdeps/unix/sysv/linux/riscv/vfork.S
+++ b/sysdeps/unix/sysv/linux/riscv/vfork.S
@@ -21,9 +21,12 @@ 
 #include <sys/asm.h>
 #include <sysdep.h>
 #define __ASSEMBLY__
-#include <linux/sched.h>
 #include <asm/signal.h>
 
+#define CLONE_VM      0x00000100 /* Set if VM shared between processes.  */
+#define CLONE_VFORK   0x00004000 /* Set if the parent wants the child to
+				    wake it up on mm_release.  */
+
 	.text
 LEAF (__libc_vfork)