]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
mips: Fix conditional inclusion of <asm/sgidefs.h>
authorAndreas K. Hüttel <dilfridge@gentoo.org>
Fri, 20 Mar 2026 12:52:17 +0000 (13:52 +0100)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Sun, 22 Mar 2026 19:02:13 +0000 (20:02 +0100)
systemd now has a system call wrapper that does a long series of #ifdef's to
differentiate between architectures and ABIs. This wrapper has two problems.

1. On mips, it needs to differentiate between O32, N32, N64 ABI. It does that
via a code block in src/include/override/sys/generate-syscall.py (and derived
files):

     76 #  elif defined(_MIPS_SIM)
     77 #    if _MIPS_SIM == _MIPS_SIM_ABI32
     78 #      define systemd_NR_{syscall} {nr_mipso32}
     79 #    elif _MIPS_SIM == _MIPS_SIM_NABI32
     80 #      define systemd_NR_{syscall} {nr_mips64n32}
     81 #    elif _MIPS_SIM == _MIPS_SIM_ABI64
     82 #      define systemd_NR_{syscall} {nr_mips64}
     83 #    else
     84 #      error "Unknown MIPS ABI"
     85 #    endif
     86 #  elif defined(__hppa__)

Now the _MIPS_SIM* constants stem from a vendor-specific header file sgidefs.h,
which is included with glibc, but not with musl. It is however always present
in the Linux kernel headers as asm/sgidefs.h ...

2. To work around this, the syscall wrapper already has a block

     47 #ifdef ARCH_MIPS
     48 #include <asm/sgidefs.h>
     49 #endif

Turns out, ARCH_MIPS is defined nowhere in Gentoo, neither on glibc nor on musl.
As a result the code (by accident, probably sgidefs.h is included transitively
somehow) works on glibc, but not on musl.

The simplest fix is to replace line 47 in the generator and the derived file
with

     47 #ifdef __mips__

Two other source code files require a similar fix since they rely on the
constants.

Bug: https://github.com/systemd/systemd/issues/41239
Bug: https://bugs.gentoo.org/971376
Signed-off-by: Andreas K. Hüttel <dilfridge@gentoo.org>
src/include/override/sys/generate-syscall.py
src/include/override/sys/syscall.h
src/shared/base-filesystem.c
src/shared/seccomp-util.c

index 6f449f9dc13308449731af6e7409fa6393a7ac61..1c90ad0e384029075dc98a5848d631504fdd0be1 100755 (executable)
@@ -44,7 +44,7 @@ HEADER = '''\
 
 #include_next <sys/syscall.h>   /* IWYU pragma: export */
 
-#ifdef ARCH_MIPS
+#ifdef __mips__
 #include <asm/sgidefs.h>
 #endif
 
index da2f780bed39ca954a2f033fd381f0e983482ab6..0233f254b421c71ad8564e9f3ad759b4dd8ab4d5 100644 (file)
@@ -11,7 +11,7 @@
 
 #include_next <sys/syscall.h>   /* IWYU pragma: export */
 
-#ifdef ARCH_MIPS
+#ifdef __mips__
 #include <asm/sgidefs.h>
 #endif
 
index bad3b46f3ad3a76f43314634dd6a01a9af7f94e8..9e8856ba48ce670895f4827034f0ddddb212d9da 100644 (file)
@@ -5,7 +5,7 @@
 #include <syslog.h>
 #include <unistd.h>
 
-#ifdef ARCH_MIPS
+#ifdef __mips__
 #include <asm/sgidefs.h>
 #endif
 
index d2f7612a53de584b3ca4aba0d1e754bf04d0fe70..9785fc45d78f393607ad18367f4fba964247ca26 100644 (file)
@@ -12,7 +12,7 @@
 #include <sys/shm.h>
 #include <sys/stat.h>
 
-#ifdef ARCH_MIPS
+#ifdef __mips__
 #include <asm/sgidefs.h>
 #endif