diff options
Diffstat (limited to 'libc/sysdeps/linux/sh/syscall_error.S')
-rw-r--r-- | libc/sysdeps/linux/sh/syscall_error.S | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/sh/syscall_error.S b/libc/sysdeps/linux/sh/syscall_error.S new file mode 100644 index 000000000..7115120db --- /dev/null +++ b/libc/sysdeps/linux/sh/syscall_error.S @@ -0,0 +1,37 @@ + .align 4 +__syscall_error: + /* Call errno_location, store '-r4' in errno and return -1 */ + mov.l r12, @-r15 + sts.l pr, @-r15 +#if defined __HAVE_ELF__ && defined __HAVE_SHARED__ + mova .LG, r0 + mov.l .LG, r12 + add r0, r12 + mov.l 1f, r0 + mov.l @(r0,r12),r0 + jsr @r0 + neg r4, r12 +#else + mov.l 1f, r0 + bsrf r0 + neg r4, r12 +.jmp_loc: +#endif + mov.l r12, @r0 + lds.l @r15+, pr + mov.l @r15+,r12 + + /* And just kick back a -1. */ + rts + mov #-1, r0 + + .align 4 + +#if defined __HAVE_ELF__ && defined __HAVE_SHARED__ +1: .long __errno_location@GOT +.LG: .long _GLOBAL_OFFSET_TABLE_ +#else +1: .long __errno_location - .jmp_loc +#endif + + |