aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2015-03-17 23:12:48 -0400
committerRich Felker <dalias@aerifal.cx>2015-03-18 00:31:37 -0400
commitd5a5045382315e36588ca225889baa36ed0ed38f (patch)
treeb727e3ec85f49384a50f09568c62c0bb9410b6bd
parent76fd01177a32d602bc5ee7bd7ba65316adbae611 (diff)
downloadmusl-d5a5045382315e36588ca225889baa36ed0ed38f.zip
musl-d5a5045382315e36588ca225889baa36ed0ed38f.tar.gz
musl-d5a5045382315e36588ca225889baa36ed0ed38f.tar.bz2
fix MINSIGSTKSZ values for archs with large signal contexts
the previous values (2k min and 8k default) were too small for some archs. aarch64 reserves 4k in the signal context for future extensions and requires about 4.5k total, and powerpc reportedly uses over 2k. the new minimums are chosen to fit the saved context and also allow a minimal signal handler to run. since the default (SIGSTKSZ) has always been 6k larger than the minimum, it is also increased to maintain the 6k usable by the signal handler. this happens to be able to store one pathname buffer and should be sufficient for calling any function in libc that doesn't involve conversion between floating point and decimal representations. x86 (both 32-bit and 64-bit variants) may also need a larger minimum (around 2.5k) in the future to support avx-512, but the values on these archs are left alone for now pending further analysis. the value for PTHREAD_STACK_MIN is not increased to match MINSIGSTKSZ at this time. this is so as not to preclude applications from using extremely small thread stacks when they know they will not be handling signals. unfortunately cancellation and multi-threaded set*id() use signals as an implementation detail and therefore require a stack large enough for a signal context, so applications which use extremely small thread stacks may still need to avoid using these features.
-rw-r--r--arch/aarch64/bits/signal.h5
-rw-r--r--arch/arm/bits/signal.h5
-rw-r--r--arch/i386/bits/signal.h5
-rw-r--r--arch/microblaze/bits/signal.h5
-rw-r--r--arch/mips/bits/signal.h5
-rw-r--r--arch/or1k/bits/signal.h5
-rw-r--r--arch/powerpc/bits/signal.h5
-rw-r--r--arch/sh/bits/signal.h5
-rw-r--r--arch/x32/bits/signal.h5
-rw-r--r--arch/x86_64/bits/signal.h5
-rw-r--r--include/signal.h2
11 files changed, 50 insertions, 2 deletions
diff --git a/arch/aarch64/bits/signal.h b/arch/aarch64/bits/signal.h
index 430da95..ef07cc9 100644
--- a/arch/aarch64/bits/signal.h
+++ b/arch/aarch64/bits/signal.h
@@ -1,6 +1,11 @@
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 6144
+#define SIGSTKSZ 12288
+#endif
+
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
typedef unsigned long greg_t;
typedef unsigned long gregset_t[34];
diff --git a/arch/arm/bits/signal.h b/arch/arm/bits/signal.h
index 048635f..9d19eeb 100644
--- a/arch/arm/bits/signal.h
+++ b/arch/arm/bits/signal.h
@@ -1,6 +1,11 @@
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
typedef int greg_t, gregset_t[18];
typedef struct sigcontext
diff --git a/arch/i386/bits/signal.h b/arch/i386/bits/signal.h
index adf0c07..1f9085a 100644
--- a/arch/i386/bits/signal.h
+++ b/arch/i386/bits/signal.h
@@ -1,6 +1,11 @@
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
#ifdef _GNU_SOURCE
#define REG_GS 0
#define REG_FS 1
diff --git a/arch/microblaze/bits/signal.h b/arch/microblaze/bits/signal.h
index 01fa7bf..4aa231a 100644
--- a/arch/microblaze/bits/signal.h
+++ b/arch/microblaze/bits/signal.h
@@ -1,6 +1,11 @@
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
typedef unsigned long greg_t, gregset_t[38];
typedef struct sigcontext
diff --git a/arch/mips/bits/signal.h b/arch/mips/bits/signal.h
index 48bd110..e221842 100644
--- a/arch/mips/bits/signal.h
+++ b/arch/mips/bits/signal.h
@@ -1,6 +1,11 @@
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
typedef unsigned long long greg_t, gregset_t[32];
typedef struct {
diff --git a/arch/or1k/bits/signal.h b/arch/or1k/bits/signal.h
index c5e9c0c..be576d1 100644
--- a/arch/or1k/bits/signal.h
+++ b/arch/or1k/bits/signal.h
@@ -1,6 +1,11 @@
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
typedef unsigned long greg_t, gregset_t[34];
typedef struct sigcontext {
diff --git a/arch/powerpc/bits/signal.h b/arch/powerpc/bits/signal.h
index 3f9f810..17a7354 100644
--- a/arch/powerpc/bits/signal.h
+++ b/arch/powerpc/bits/signal.h
@@ -1,6 +1,11 @@
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 4096
+#define SIGSTKSZ 10240
+#endif
+
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
typedef unsigned long greg_t, gregset_t[48];
diff --git a/arch/sh/bits/signal.h b/arch/sh/bits/signal.h
index 41b9437..160311f 100644
--- a/arch/sh/bits/signal.h
+++ b/arch/sh/bits/signal.h
@@ -1,6 +1,11 @@
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
typedef int greg_t, gregset_t[16];
typedef int freg_t, fpregset_t[16];
diff --git a/arch/x32/bits/signal.h b/arch/x32/bits/signal.h
index 2379f1c..4c4adf3 100644
--- a/arch/x32/bits/signal.h
+++ b/arch/x32/bits/signal.h
@@ -1,6 +1,11 @@
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
#ifdef _GNU_SOURCE
#define REG_R8 0
#define REG_R9 1
diff --git a/arch/x86_64/bits/signal.h b/arch/x86_64/bits/signal.h
index b3a7616..e3c3141 100644
--- a/arch/x86_64/bits/signal.h
+++ b/arch/x86_64/bits/signal.h
@@ -1,6 +1,11 @@
#if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
|| defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
+#define MINSIGSTKSZ 2048
+#define SIGSTKSZ 8192
+#endif
+
#ifdef _GNU_SOURCE
#define REG_R8 0
#define REG_R9 1
diff --git a/include/signal.h b/include/signal.h
index b38241a..559362f 100644
--- a/include/signal.h
+++ b/include/signal.h
@@ -222,8 +222,6 @@ void (*sigset(int, void (*)(int)))(int);
#define POLL_HUP 6
#define SS_ONSTACK 1
#define SS_DISABLE 2
-#define MINSIGSTKSZ 2048
-#define SIGSTKSZ 8192
#endif
#if defined(_BSD_SOURCE) || defined(_GNU_SOURCE)