about summary refs log tree commit diff
path: root/arch/sh
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2015-09-22 20:51:59 +0000
committerRich Felker <dalias@aerifal.cx>2015-09-22 20:51:59 +0000
commite9e770dfd6224a5ff7932b6115a35005dce7be29 (patch)
treec80fdd991fffe322502d01440b005f1c1faeb444 /arch/sh
parentc87a52103399135d2f57a91a8bcc749d8cb2ca83 (diff)
downloadmusl-e9e770dfd6224a5ff7932b6115a35005dce7be29.tar.gz
musl-e9e770dfd6224a5ff7932b6115a35005dce7be29.tar.xz
musl-e9e770dfd6224a5ff7932b6115a35005dce7be29.zip
have sh/fdpic entry point set fdpic personality if needed
the entry point code supports being loaded by a loader which is not
fdpic-aware (in practice, either kernel with mmu or qemu without fdpic
support). this mostly just works, but signal handling will wrongly use
a function descriptor address as a code address if the personality is
not adjusted to fdpic.

ideally this code could be placed with sigaction so that it's not
needed except if/when a signal handler is installed. however,
personality is incorrectly maintained per-thread by the kernel, rather
than per-process, so it's necessary to correct the personality before
any threads are started. also, in order to skip the personality
syscall when an fdpic-aware loader is used, we need to be able to
detect how the program was loaded, and this information is only
readily available at the entry point.
Diffstat (limited to 'arch/sh')
-rw-r--r--arch/sh/crt_arch.h12
1 files changed, 12 insertions, 0 deletions
diff --git a/arch/sh/crt_arch.h b/arch/sh/crt_arch.h
index d63ce0d1..948bcb79 100644
--- a/arch/sh/crt_arch.h
+++ b/arch/sh/crt_arch.h
@@ -4,6 +4,18 @@ __asm__(
 ".text \n"
 ".global " START " \n"
 START ": \n"
+"	tst r8, r8 \n"
+"	bf 1f \n"
+"	mov #68, r3 \n"
+"	add r3, r3 \n"
+"	mov #8, r4 \n"
+"	swap.w r4, r4 \n"
+"	trapa #31 \n"
+"	nop \n"
+"	nop \n"
+"	nop \n"
+"	nop \n"
+"1:	nop \n"
 #ifndef SHARED
 "	mov r8, r4 \n"
 "	mova 1f, r0 \n"