path: root/arch/sh/crt_arch.h
diff options
authorRich Felker <>2015-09-22 20:51:59 +0000
committerRich Felker <>2015-09-22 20:51:59 +0000
commite9e770dfd6224a5ff7932b6115a35005dce7be29 (patch)
treec80fdd991fffe322502d01440b005f1c1faeb444 /arch/sh/crt_arch.h
parentc87a52103399135d2f57a91a8bcc749d8cb2ca83 (diff)
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/crt_arch.h')
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"