diff options
author | Rich Felker <dalias@aerifal.cx> | 2015-06-16 14:55:06 +0000 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2015-06-16 14:55:06 +0000 |
commit | 3366a99b17847b58f2d8cc52cbb5d65deb824f8a (patch) | |
tree | 67a75d809c6fb732da4bc1efb8ffd26bcc109620 /arch/sh | |
parent | f9d84554bae0fa17c9a1d724549c4408022228a5 (diff) | |
download | musl-3366a99b17847b58f2d8cc52cbb5d65deb824f8a.tar.gz musl-3366a99b17847b58f2d8cc52cbb5d65deb824f8a.tar.xz musl-3366a99b17847b58f2d8cc52cbb5d65deb824f8a.zip |
switch sh port's __unmapself to generic version when running on sh2/nommu
due to the way the interrupt and syscall trap mechanism works, userspace on sh2 must never set the stack pointer to an invalid value. thus, the approach used on most archs, where __unmapself executes with no stack for the interval between SYS_munmap and SYS_exit, is not viable on sh2. in order not to pessimize sh3/sh4, the sh asm version of __unmapself is not removed. instead it's renamed and redirected through code that calls either the generic (safe) __unmapself or the sh3/sh4 asm, depending on compile-time and run-time conditions.
Diffstat (limited to 'arch/sh')
-rw-r--r-- | arch/sh/src/__unmapself.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/arch/sh/src/__unmapself.c b/arch/sh/src/__unmapself.c new file mode 100644 index 00000000..4df9e7bf --- /dev/null +++ b/arch/sh/src/__unmapself.c @@ -0,0 +1,19 @@ +#include "pthread_impl.h" + +void __unmapself_sh_mmu(void *, size_t); +void __unmapself_sh_nommu(void *, size_t); + +#if !defined(__SH3__) && !defined(__SH4__) +#define __unmapself __unmapself_sh_nommu +#include "../../../src/thread/__unmapself.c" +#undef __unmapself +extern __attribute__((__visibility__("hidden"))) unsigned __sh_nommu; +#else +#define __sh_nommu 0 +#endif + +void __unmapself(void *base, size_t size) +{ + if (__sh_nommu) __unmapself_sh_nommu(base, size); + else __unmapself_sh_mmu(base, size); +} |