[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#766605: glibc patch for hppa architecture



Source: glibc
Version: 2.19-11
Severity: important
Tags: patch

Dear debian glibc maintainers,

Can you please apply this hppa-arch-specific patch to debian glibc and keep it until you upgrade to sources of glibc 2.21 ?

Main reason for this patch is to make it possible to use systemd on hppa.
Without this patch people who will by mistake install systemd (e.g. because of dependencies) will render their machines unbootable.
The patch breaks the ABI on hppa, but in a way which will not affect people, because it changes the signals which are usually not used. This has been tested by installing and booting mixtures of glibc and kernel with corresponding patches.
I'll send in a bug report with patch for debian kernel shortly too.

Upstream Linux kernel commit is 1f25df2eff5b25f52c139d3ff31bc883eee9a0ab
http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=1f25df2eff5b25f52c139d3ff31bc883eee9a0ab&utm_source=anzwix

Upstream glibc commit is:
https://sourceware.org/git/?p=glibc.git;a=commit;h=13d845549e41823e6658122dcf268154bcbbcfde

I've adjusted the attached patch (only changes path names) so that it applies to debian's glibc 2.19

To better understand what we fix here, the glibc changelog description of Carlos is probably best (copied in here):

This is a conscious ABI break for hppa.

We find ourselves unable to run systemd because it expects
SIGRTMIN+29 signals to be available and with hppa starting
at 37 that exceeds the 64 signals available. It is arguable
that the systemd code could compact their signal usage (the
have a gap and don't check SIGRTMAX to see if they are over).
However, that would require pursuing this upstream with systemd.
The least work option is to make hppa more like other arches.

The best option is to free up 3 signals for use with SIGXCPU,
SIGXFSZ and SIGSTKFLT, and move those below 31. We make SIGSYS
equal to SIGUNUSED as is expected. We remove SIGEMT and SIGLOST
as HPUX signal we won't ever use. With that change we match all
other machines.

Given that these signals are so esoteric, testing by other users
building minimal systems from scratch showed no problems. In fact
Tcl fails to build if you make SIGEMT == SIGABRT, so we just removed
SIGEMT (they use a large switch statement in C to handle signals, and
I don't think it's valid to assume they will all have distinct values
to fit into a switch).

Committed as the only solution we possibly have here.

Signed-off-by: Carlos O'Donell <carlos@systemhalted.org>
Signed-off-by: Helge Deller <deller@gmx.de>

>From 13d845549e41823e6658122dcf268154bcbbcfde Mon Sep 17 00:00:00 2001
From: Carlos O'Donell <carlos@redhat.com>
Date: Thu, 23 Oct 2014 23:14:12 -0400
Subject: [PATCH] hppa: Make __SIGRTMIN 32 (ABI break).

In the Linux kernel version 3.17 the signal numbers were rearranged in
order to make hppa like every other arch. Previously we started
__SIGRTMIN at 37, and that meant several pieces of important software,
including systemd, would fail to build. To support systemd we removed
SIGEMT and SIGLOST, and rearranged the others according to expected
values. This is technically an ABI incompatible change, but because
zero applications use SIGSTKFLT, SIGXCPU, SIGXFSZ and SIGSYS nothing
broke.  Nothing uses SIGEMT and SIGLOST, and they were present for
HPUX compatibility which is no longer supported. Thus because nothing
breaks we don't do any compatibility work here.

Upstream kernel commit is 1f25df2eff5b25f52c139d3ff31bc883eee9a0ab.

Signed-off-by: Carlos O'Donell <carlos@systemhalted.org>
Signed-off-by: Helge Deller <deller@gmx.de>

2014-10-23  Carlos O'Donell  <carlos@systemhalted.org>
	    Helge Deller <deller@gmx.de>

	[BZ #17508]
	* sysdeps/unix/sysv/linux/hppa/bits/signum.h: Remove SIGEMT.
	Define SIGSTKFLT as 7. Define SIGSYS as 31. Define SIGXCPU as 12.
	Remove SIGLOST. Define SIGXFSZ as 30. Define __SIGRTMIN as 32.
---


diff -up ./ports/sysdeps/unix/sysv/linux/hppa/bits/signum.h.org ./ports/sysdeps/unix/sysv/linux/hppa/bits/signum.h
--- ./ports/sysdeps/unix/sysv/linux/hppa/bits/signum.h.org	2014-10-24 12:47:51.039590372 +0200
+++ ./ports/sysdeps/unix/sysv/linux/hppa/bits/signum.h	2014-10-24 12:47:59.707589170 +0200
@@ -36,12 +36,12 @@
 #define	SIGTRAP		5	/* Trace trap (POSIX).  */
 #define	SIGABRT		6	/* Abort (ANSI).  */
 #define	SIGIOT		6	/* IOT trap (4.2 BSD).  */
-#define	SIGEMT		7
+#define	SIGSTKFLT	7	/* Stack fault.  */
 #define	SIGFPE		8	/* Floating-point exception (ANSI).  */
 #define	SIGKILL		9	/* Kill, unblockable (POSIX).  */
 #define	SIGBUS		10	/* BUS error (4.2 BSD).  */
 #define	SIGSEGV		11	/* Segmentation violation (ANSI).  */
-#define SIGSYS		12	/* Bad system call.  */
+#define	SIGXCPU		12	/* CPU limit exceeded (4.2 BSD).  */
 #define	SIGPIPE		13	/* Broken pipe (POSIX).  */
 #define	SIGALRM		14	/* Alarm clock (POSIX).  */
 #define	SIGTERM		15	/* Termination (ANSI).  */
@@ -61,11 +61,9 @@
 #define	SIGTTIN		27	/* Background read from tty (POSIX).  */
 #define	SIGTTOU		28	/* Background write to tty (POSIX).  */
 #define	SIGURG		29	/* Urgent condition on socket (4.2 BSD).  */
-#define SIGLOST		30	/* Operating System Has Lost (HP/UX). */
+#define	SIGXFSZ		30	/* File size limit exceeded (4.2 BSD).  */
+#define SIGSYS		31	/* Bad system call.  */
 #define SIGUNUSED	31
-#define	SIGXCPU		33	/* CPU limit exceeded (4.2 BSD).  */
-#define	SIGXFSZ		34	/* File size limit exceeded (4.2 BSD).  */
-#define	SIGSTKFLT	36	/* Stack fault.  */
 
 #define	_NSIG		65	/* Biggest signal number + 1
 				   (including real-time signals).  */
@@ -75,7 +73,17 @@
 
 /* These are the hard limits of the kernel.  These values should not be
    used directly at user level.  */
-#define __SIGRTMIN	37
+/* In the Linux kernel version 3.17, and glibc 2.21, the signal numbers
+   were rearranged in order to make hppa like every other arch. Previously
+   we started __SIGRTMIN at 37, and that meant several pieces of important
+   software, including systemd, would fail to build. To support systemd we
+   removed SIGEMT and SIGLOST, and rearranged the others according to
+   expected values. This is technically an ABI incompatible change, but
+   because zero applications use SIGSTKFLT, SIGXCPU, SIGXFSZ and SIGSYS
+   nothing broke.  Nothing uses SIGEMT and SIGLOST, and they were present
+   for HPUX compatibility which is no longer supported.  Thus because
+   nothing breaks we don't do any compatibility work here.  */
+#define __SIGRTMIN	32	/* Kernel > 3.17.  */
 #define __SIGRTMAX	(_NSIG - 1)
 
 #endif	/* <signal.h> included.  */

Reply to: