summaryrefslogtreecommitdiff
path: root/src/thread/sh
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2015-06-16 15:25:02 +0000
committerRich Felker <dalias@aerifal.cx>2015-06-16 15:25:02 +0000
commit10d0268ccfab9152250eeeed3952ce3fed44131a (patch)
treee5584cc6b44eb7405530d7c558c59e3ca495c6c3 /src/thread/sh
parent3366a99b17847b58f2d8cc52cbb5d65deb824f8a (diff)
downloadmusl-10d0268ccfab9152250eeeed3952ce3fed44131a.tar.gz
switch to using trap number 31 for syscalls on sh
nominally the low bits of the trap number on sh are the number of syscall arguments, but they have never been used by the kernel, and some code making syscalls does not even know the number of arguments and needs to pass an arbitrary high number anyway. sh3/sh4 traditionally used the trap range 16-31 for syscalls, but part of this range overlapped with hardware exceptions/interrupts on sh2 hardware, so an incompatible range 32-47 was chosen for sh2. using trap number 31 everywhere, since it's in the existing sh3/sh4 range and does not conflict with sh2 hardware, is a proposed unification of the kernel syscall convention that will allow binaries to be shared between sh2 and sh3/sh4. if this is not accepted into the kernel, we can refit the sh2 target with runtime selection mechanisms for the trap number, but doing so would be invasive and would entail non-trivial overhead.
Diffstat (limited to 'src/thread/sh')
-rw-r--r--src/thread/sh/__unmapself.s4
-rw-r--r--src/thread/sh/clone.s4
-rw-r--r--src/thread/sh/syscall_cp.s2
3 files changed, 5 insertions, 5 deletions
diff --git a/src/thread/sh/__unmapself.s b/src/thread/sh/__unmapself.s
index cad91bf6..0161d53d 100644
--- a/src/thread/sh/__unmapself.s
+++ b/src/thread/sh/__unmapself.s
@@ -3,7 +3,7 @@
.type __unmapself_sh_mmu, @function
__unmapself_sh_mmu:
mov #91, r3 ! SYS_munmap
- trapa #18
+ trapa #31
or r0, r0
or r0, r0
@@ -13,7 +13,7 @@ __unmapself_sh_mmu:
mov #1, r3 ! SYS_exit
mov #0, r4
- trapa #17
+ trapa #31
or r0, r0
or r0, r0
diff --git a/src/thread/sh/clone.s b/src/thread/sh/clone.s
index d6c9184d..f8ad8451 100644
--- a/src/thread/sh/clone.s
+++ b/src/thread/sh/clone.s
@@ -17,7 +17,7 @@ __clone:
mov.l @r15, r6 ! r6 = ptid
mov.l @(8,r15), r7 ! r7 = ctid
mov.l @(4,r15), r0 ! r0 = tls
- trapa #21
+ trapa #31
or r0, r0
or r0, r0
@@ -38,7 +38,7 @@ __clone:
mov #1, r3 ! __NR_exit
mov r0, r4
- trapa #17
+ trapa #31
or r0, r0
or r0, r0
diff --git a/src/thread/sh/syscall_cp.s b/src/thread/sh/syscall_cp.s
index 6b28ddf0..c3caface 100644
--- a/src/thread/sh/syscall_cp.s
+++ b/src/thread/sh/syscall_cp.s
@@ -31,7 +31,7 @@ L1: .long __cancel@PLT-(1b-.)
mov.l @(4,r15), r7
mov.l @(8,r15), r0
mov.l @(12,r15), r1
- trapa #22
+ trapa #31
__cp_end:
! work around hardware bug