diff options
author | joseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d> | 2012-06-25 21:30:45 +0000 |
---|---|---|
committer | joseph <joseph@7b3dc134-2b1b-0410-93df-9e9f96275f8d> | 2012-06-25 21:30:45 +0000 |
commit | 5043a6ad2450235873e1a14c1b0a10ba779304d1 (patch) | |
tree | f9be4e84a0936ee1c62f8ce8be8ff1799fdbc806 /libc/sysdeps/unix | |
parent | e86ff722e7f38c0ad5dce27190e18f5e8741b626 (diff) | |
download | eglibc2-5043a6ad2450235873e1a14c1b0a10ba779304d1.tar.gz |
Merge changes between r19234 and r19292 from /fsf/trunk.
git-svn-id: svn://svn.eglibc.org/trunk@19293 7b3dc134-2b1b-0410-93df-9e9f96275f8d
Diffstat (limited to 'libc/sysdeps/unix')
-rw-r--r-- | libc/sysdeps/unix/sysv/linux/sh/Makefile | 4 | ||||
-rw-r--r-- | libc/sysdeps/unix/sysv/linux/sh/Versions | 3 | ||||
-rw-r--r-- | libc/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S | 122 | ||||
-rw-r--r-- | libc/sysdeps/unix/sysv/linux/sh/bits/atomic.h | 187 | ||||
-rw-r--r-- | libc/sysdeps/unix/sysv/linux/sh/makecontext.S | 83 | ||||
-rw-r--r-- | libc/sysdeps/unix/sysv/linux/sh/nptl/libc.abilist | 1 | ||||
-rw-r--r-- | libc/sysdeps/unix/sysv/linux/sh/sigaltstack-offsets.sym | 13 | ||||
-rw-r--r-- | libc/sysdeps/unix/sysv/linux/sh/syscalls.list | 2 | ||||
-rw-r--r-- | libc/sysdeps/unix/sysv/linux/sh/sysdep.h | 11 |
9 files changed, 297 insertions, 129 deletions
diff --git a/libc/sysdeps/unix/sysv/linux/sh/Makefile b/libc/sysdeps/unix/sysv/linux/sh/Makefile index 1ead8f2ae..dd3b382ac 100644 --- a/libc/sysdeps/unix/sysv/linux/sh/Makefile +++ b/libc/sysdeps/unix/sysv/linux/sh/Makefile @@ -6,6 +6,10 @@ ifeq ($(subdir),stdlib) gen-as-const-headers += ucontext_i.sym endif +ifeq ($(subdir),misc) +gen-as-const-headers += sigaltstack-offsets.sym +endif + ifeq ($(subdir),math) # The libm.so link can't find __fpscr_values libm.so-no-z-defs = yes diff --git a/libc/sysdeps/unix/sysv/linux/sh/Versions b/libc/sysdeps/unix/sysv/linux/sh/Versions index 9fb83456f..ca1d7da33 100644 --- a/libc/sysdeps/unix/sysv/linux/sh/Versions +++ b/libc/sysdeps/unix/sysv/linux/sh/Versions @@ -28,4 +28,7 @@ libc { GLIBC_2.11 { fallocate64; } + GLIBC_2.16 { + fanotify_mark; + } } diff --git a/libc/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S b/libc/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S new file mode 100644 index 000000000..d74caa21b --- /dev/null +++ b/libc/sysdeps/unix/sysv/linux/sh/____longjmp_chk.S @@ -0,0 +1,122 @@ +/* Copyright (C) 2009-2012 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + +#include <sigaltstack-offsets.h> + + .section .rodata.str1.1,"aMS",@progbits,1 + .type longjmp_msg,@object +longjmp_msg: + .string "longjmp causes uninitialized stack frame" + .size longjmp_msg, .-longjmp_msg + .text + +#define __longjmp ____longjmp_chk + +#ifdef PIC +# define CALL_FAIL \ + mov.l .Lfail, r1; \ + mov.l .Lstr, r4; \ + mov.l r12, @-r15; \ + cfi_remember_state; \ + cfi_adjust_cfa_offset (4); \ + cfi_rel_offset (r12, 0); \ + mova .Lgot, r0; \ + mov.l .Lgot, r12; \ + add r0, r12; \ + sts.l pr, @-r15; \ + cfi_adjust_cfa_offset (4); \ + cfi_rel_offset (pr, 0); \ + bsrf r1; \ + add r12, r4; \ +.Lfail0: \ + /* Unreachable. */ \ + .align 2; \ +.Lgot: \ + .long _GLOBAL_OFFSET_TABLE_; \ +.Lstr: \ + .long longjmp_msg@GOTOFF; \ +.Lfail: \ + .long __GI___fortify_fail@PLT-(.Lfail0-.); \ + cfi_restore_state; +#else +# define CALL_FAIL \ + mov.l .Lfail, r1; \ + mov.l .Lstr, r4; \ + sts.l pr, @-r15; \ + cfi_remember_state; \ + cfi_adjust_cfa_offset (4); \ + cfi_rel_offset (pr, 0); \ + jsr @r1; \ + nop; \ + /* Unreachable. */ \ + .align 2; \ +.Lstr: \ + .long longjmp_msg; \ +.Lfail: \ + .long __fortify_fail; \ + cfi_restore_state; +#endif + +#define CHECK_SP(reg) \ + /* Jumping to a higher-address frame is always allowed. */ \ + cmp/hs r15, reg; \ + bt .Lok; \ + \ + mov.l r0, @-r15; /* The return value is already in here. */ \ + cfi_adjust_cfa_offset (4); \ + mov.l r1, @-r15; /* PTR_DEMANGLE helper. */ \ + cfi_adjust_cfa_offset (4); \ + mov.l r2, @-r15; /* The new SP value is already in here. */ \ + cfi_adjust_cfa_offset (4); \ + mov.l r4, @-r15; /* We'll still need this one. */ \ + cfi_adjust_cfa_offset (4); \ + add #-sizeSS, r15; \ + cfi_adjust_cfa_offset (sizeSS); \ + mov #0, r4; \ + mov r15, r5; \ + DO_CALL (sigaltstack, 2); \ + /* Without working sigaltstack we cannot perform the test. */ \ + tst r0, r0; \ + bf .Lok2; \ + mov.l @(oSS_FLAGS, r15), r0; \ + tst #SS_ONSTACK, r0; \ + bt .Lcall_fail; \ + mov.l @(oSS_SIZE, r15), r2; \ + mov.l @(oSS_SP, r15), r1; \ + add r2, r1; \ + sub r8, r1; \ + cmp/hi r1, r2; \ + bf .Lok2; \ +.Lcall_fail: \ + CALL_FAIL \ + \ +.Lok2: \ + add #sizeSS, r15; \ + cfi_adjust_cfa_offset (-sizeSS); \ + mov.l @r15+, r4; \ + cfi_adjust_cfa_offset (-4); \ + mov.l @r15+, r2; \ + cfi_adjust_cfa_offset (-4); \ + mov.l @r15+, r1; \ + cfi_adjust_cfa_offset (-4); \ + mov.l @r15+, r0; \ + cfi_adjust_cfa_offset (-4); \ +.Lok: + +#include <__longjmp.S> diff --git a/libc/sysdeps/unix/sysv/linux/sh/bits/atomic.h b/libc/sysdeps/unix/sysv/linux/sh/bits/atomic.h index c8f07e55a..05e492202 100644 --- a/libc/sysdeps/unix/sysv/linux/sh/bits/atomic.h +++ b/libc/sysdeps/unix/sysv/linux/sh/bits/atomic.h @@ -1,5 +1,5 @@ /* Atomic operations used inside libc. Linux/SH version. - Copyright (C) 2003, 2011 Free Software Foundation, Inc. + Copyright (C) 2003-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -73,11 +73,10 @@ typedef uintmax_t uatomic_max_t; #define __arch_compare_and_exchange_val_8_acq(mem, newval, oldval) \ ({ __typeof (*(mem)) __result; \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ - nop\n\ + .align 2\n\ mov r15,r1\n\ - mov #-8,r15\n\ + mov #(0f-1f),r15\n\ 0: mov.b @%1,%0\n\ cmp/eq %0,%3\n\ bf 1f\n\ @@ -90,10 +89,10 @@ typedef uintmax_t uatomic_max_t; #define __arch_compare_and_exchange_val_16_acq(mem, newval, oldval) \ ({ __typeof (*(mem)) __result; \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ - nop\n\ mov r15,r1\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ mov #-8,r15\n\ 0: mov.w @%1,%0\n\ cmp/eq %0,%3\n\ @@ -107,11 +106,10 @@ typedef uintmax_t uatomic_max_t; #define __arch_compare_and_exchange_val_32_acq(mem, newval, oldval) \ ({ __typeof (*(mem)) __result; \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ - nop\n\ + .align 2\n\ mov r15,r1\n\ - mov #-8,r15\n\ + mov #(0f-1f),r15\n\ 0: mov.l @%1,%0\n\ cmp/eq %0,%3\n\ bf 1f\n\ @@ -133,40 +131,43 @@ typedef uintmax_t uatomic_max_t; ({ __typeof (*(mem)) __result, __tmp, __value = (value); \ if (sizeof (*(mem)) == 1) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ + .align 2\n\ mov r15,r1\n\ - mov #-6,r15\n\ + mov #(0f-1f),r15\n\ 0: mov.b @%2,%0\n\ - add %0,%1\n\ - mov.b %1,@%2\n\ + mov %1,r2\n\ + add %0,r2\n\ + mov.b r2,@%2\n\ 1: mov r1,r15"\ : "=&r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \ - : "r0", "r1", "memory"); \ + : "r0", "r1", "r2", "memory"); \ else if (sizeof (*(mem)) == 2) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ + .align 2\n\ mov r15,r1\n\ - mov #-6,r15\n\ + mov #(0f-1f),r15\n\ 0: mov.w @%2,%0\n\ - add %0,%1\n\ - mov.w %1,@%2\n\ + mov %1,r2\n\ + add %0,r2\n\ + mov.w r2,@%2\n\ 1: mov r1,r15"\ : "=&r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \ - : "r0", "r1", "memory"); \ + : "r0", "r1", "r2", "memory"); \ else if (sizeof (*(mem)) == 4) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ + .align 2\n\ mov r15,r1\n\ - mov #-6,r15\n\ + mov #(0f-1f),r15\n\ 0: mov.l @%2,%0\n\ - add %0,%1\n\ - mov.l %1,@%2\n\ + mov %1,r2\n\ + add %0,r2\n\ + mov.l r2,@%2\n\ 1: mov r1,r15"\ : "=&r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \ - : "r0", "r1", "memory"); \ + : "r0", "r1", "r2", "memory"); \ else \ { \ __typeof (mem) memp = (mem); \ @@ -182,37 +183,37 @@ typedef uintmax_t uatomic_max_t; (void) ({ __typeof (*(mem)) __tmp, __value = (value); \ if (sizeof (*(mem)) == 1) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ 0: mov.b @%1,r2\n\ - add r2,%0\n\ - mov.b %0,@%1\n\ + add %0,r2\n\ + mov.b r2,@%1\n\ 1: mov r1,r15"\ : "=&r" (__tmp) : rNOSP (mem), "0" (__value) \ : "r0", "r1", "r2", "memory"); \ else if (sizeof (*(mem)) == 2) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ 0: mov.w @%1,r2\n\ - add r2,%0\n\ - mov.w %0,@%1\n\ + add %0,r2\n\ + mov.w r2,@%1\n\ 1: mov r1,r15"\ : "=&r" (__tmp) : rNOSP (mem), "0" (__value) \ : "r0", "r1", "r2", "memory"); \ else if (sizeof (*(mem)) == 4) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ 0: mov.l @%1,r2\n\ - add r2,%0\n\ - mov.l %0,@%1\n\ + add %0,r2\n\ + mov.l r2,@%1\n\ 1: mov r1,r15"\ : "=&r" (__tmp) : rNOSP (mem), "0" (__value) \ : "r0", "r1", "r2", "memory"); \ @@ -233,43 +234,43 @@ typedef uintmax_t uatomic_max_t; __typeof (*(mem)) __tmp, __value = (value); \ if (sizeof (*(mem)) == 1) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ 0: mov.b @%2,r2\n\ - add r2,%1\n\ - mov.b %1,@%2\n\ + add %1,r2\n\ + mov.b r2,@%2\n\ 1: mov r1,r15\n\ - shal %1\n\ + shal r2\n\ movt %0"\ : "=r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \ : "r0", "r1", "r2", "t", "memory"); \ else if (sizeof (*(mem)) == 2) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ 0: mov.w @%2,r2\n\ - add r2,%1\n\ - mov.w %1,@%2\n\ + add %1,r2\n\ + mov.w r2,@%2\n\ 1: mov r1,r15\n\ - shal %1\n\ + shal r2\n\ movt %0"\ : "=r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \ : "r0", "r1", "r2", "t", "memory"); \ else if (sizeof (*(mem)) == 4) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ 0: mov.l @%2,r2\n\ - add r2,%1\n\ - mov.l %1,@%2\n\ + add %1,r2\n\ + mov.l r2,@%2\n\ 1: mov r1,r15\n\ - shal %1\n\ + shal r2\n\ movt %0"\ : "=r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \ : "r0", "r1", "r2", "t", "memory"); \ @@ -282,43 +283,43 @@ typedef uintmax_t uatomic_max_t; __typeof (*(mem)) __tmp, __value = (value); \ if (sizeof (*(mem)) == 1) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ 0: mov.b @%2,r2\n\ - add r2,%1\n\ - mov.b %1,@%2\n\ + add %1,r2\n\ + mov.b r2,@%2\n\ 1: mov r1,r15\n\ - tst %1,%1\n\ + tst r2,r2\n\ movt %0"\ : "=r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \ : "r0", "r1", "r2", "t", "memory"); \ else if (sizeof (*(mem)) == 2) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ 0: mov.w @%2,r2\n\ - add r2,%1\n\ - mov.w %1,@%2\n\ + add %1,r2\n\ + mov.w r2,@%2\n\ 1: mov r1,r15\n\ - tst %1,%1\n\ + tst r2,r2\n\ movt %0"\ : "=r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \ : "r0", "r1", "r2", "t", "memory"); \ else if (sizeof (*(mem)) == 4) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ 0: mov.l @%2,r2\n\ - add r2,%1\n\ - mov.l %1,@%2\n\ + add %1,r2\n\ + mov.l r2,@%2\n\ 1: mov r1,r15\n\ - tst %1,%1\n\ + tst r2,r2\n\ movt %0"\ : "=r" (__result), "=&r" (__tmp) : rNOSP (mem), "1" (__value) \ : "r0", "r1", "r2", "t", "memory"); \ @@ -333,10 +334,10 @@ typedef uintmax_t uatomic_max_t; (void) ({ unsigned int __mask = 1 << (bit); \ if (sizeof (*(mem)) == 1) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ 0: mov.b @%0,r2\n\ or %1,r2\n\ mov.b r2,@%0\n\ @@ -345,10 +346,10 @@ typedef uintmax_t uatomic_max_t; : "r0", "r1", "r2", "memory"); \ else if (sizeof (*(mem)) == 2) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ 0: mov.w @%0,r2\n\ or %1,r2\n\ mov.w r2,@%0\n\ @@ -357,10 +358,10 @@ typedef uintmax_t uatomic_max_t; : "r0", "r1", "r2", "memory"); \ else if (sizeof (*(mem)) == 4) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ mov r15,r1\n\ - mov #-6,r15\n\ + .align 2\n\ + mov #(0f-1f),r15\n\ 0: mov.l @%0,r2\n\ or %1,r2\n\ mov.l r2,@%0\n\ @@ -376,49 +377,49 @@ typedef uintmax_t uatomic_max_t; unsigned int __result = __mask; \ if (sizeof (*(mem)) == 1) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ - nop\n\ + .align 2\n\ mov r15,r1\n\ - mov #-8,r15\n\ + mov #(0f-1f),r15\n\ 0: mov.b @%2,r2\n\ - or r2,%1\n\ - and r2,%0\n\ - mov.b %1,@%2\n\ - 1: mov r1,r15"\ + mov r2,r3\n\ + or %1,r2\n\ + mov.b r2,@%2\n\ + 1: mov r1,r15\n\ + and r3,%0"\ : "=&r" (__result), "=&r" (__mask) \ : rNOSP (mem), "0" (__result), "1" (__mask) \ - : "r0", "r1", "r2", "memory"); \ + : "r0", "r1", "r2", "r3", "memory"); \ else if (sizeof (*(mem)) == 2) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ - nop\n\ + .align 2\n\ mov r15,r1\n\ - mov #-8,r15\n\ + mov #(0f-1f),r15\n\ 0: mov.w @%2,r2\n\ - or r2,%1\n\ - and r2,%0\n\ + mov r2,r3\n\ + or %1,r2\n\ mov.w %1,@%2\n\ - 1: mov r1,r15"\ + 1: mov r1,r15\n\ + and r3,%0"\ : "=&r" (__result), "=&r" (__mask) \ : rNOSP (mem), "0" (__result), "1" (__mask) \ - : "r0", "r1", "r2", "memory"); \ + : "r0", "r1", "r2", "r3", "memory"); \ else if (sizeof (*(mem)) == 4) \ __asm __volatile ("\ - .align 2\n\ mova 1f,r0\n\ - nop\n\ + .align 2\n\ mov r15,r1\n\ - mov #-8,r15\n\ + mov #(0f-1f),r15\n\ 0: mov.l @%2,r2\n\ + mov r2,r3\n\ or r2,%1\n\ - and r2,%0\n\ mov.l %1,@%2\n\ - 1: mov r1,r15"\ + 1: mov r1,r15\n\ + and r3,%0"\ : "=&r" (__result), "=&r" (__mask) \ : rNOSP (mem), "0" (__result), "1" (__mask) \ - : "r0", "r1", "r2", "memory"); \ + : "r0", "r1", "r2", "r3", "memory"); \ else \ abort (); \ __result; }) diff --git a/libc/sysdeps/unix/sysv/linux/sh/makecontext.S b/libc/sysdeps/unix/sysv/linux/sh/makecontext.S index 0a9e07954..a04bc9f63 100644 --- a/libc/sysdeps/unix/sysv/linux/sh/makecontext.S +++ b/libc/sysdeps/unix/sysv/linux/sh/makecontext.S @@ -1,5 +1,5 @@ /* Create new context. - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -17,6 +17,7 @@ <http://www.gnu.org/licenses/>. */ #include <sysdep.h> +#include <abort-instr.h> #include "ucontext_i.h" @@ -33,44 +34,44 @@ .align 5 ENTRY(__makecontext) mov #4, r3 - mov.l @(oSS_SP,r4), r1 - mov.l @(oSS_SIZE,r4), r2 - add r1, r2 - cmp/gt r6, r3 + mov.l @(oSS_SP,r4), r1 /* r1 <- ucb->stack_base */ + mov.l @(oSS_SIZE,r4), r2 /* r2 <- ucb->stack_size */ + add r1, r2 /* r2 <- stack_top */ + cmp/gt r3, r6 /* argc > 4? */ bf/s 1f - shlr2 r2 + shlr2 r2 /* r2 <- stack_top / 4 */ sub r6, r2 add r3, r2 1: - shll2 r2 + shll2 r2 /* r2 <- stack_top - ((argc > 4) ? 4 * (argc - 4) : 0 */ mov #oR15, r0 mov.l @(oLINK,r4), r1 - mov.l r2, @(r0,r4) - mov.l r1, @(oR8,r4) + mov.l r2, @(r0,r4) /* ucp->r15 <- r2 */ + mov.l r1, @(oR8,r4) /* ucp->r8 <- ucp->uc_link */ mov #oPC, r0 - mov.l r5, @(r0,r4) + mov.l r5, @(r0,r4) /* ucp->PC <- func */ - cmp/pl r6 + cmp/pl r6 /* argc > 0? */ bf/s .L1 dt r6 - mov.l r7, @(oR4,r4) - cmp/pl r6 + mov.l r7, @(oR4,r4) /* ucp->r4 <- argv[0] */ + cmp/pl r6 /* argc > 1? */ bf/s .L1 dt r6 mov.l @(0,r15), r1 - mov.l r1, @(oR5,r4) - cmp/pl r6 + mov.l r1, @(oR5,r4) /* ucp->r5 <- argv[1] */ + cmp/pl r6 /* argc > 2? */ bf/s .L1 dt r6 mov.l @(4,r15), r1 - mov.l r1, @(oR6,r4) - cmp/pl r6 + mov.l r1, @(oR6,r4) /* ucp->r6 <- argv[2] */ + cmp/pl r6 /* argc > 3? */ bf/s .L1 dt r6 mov.l @(8,r15), r1 - mov.l r1, @(oR7,r4) + mov.l r1, @(oR7,r4) /* ucp->r7 <- argv[3] */ mov #12,r0 -.L0: +.L0: /* Save remaining argv[] on the stack. */ cmp/pl r6 bf/s .L1 dt r6 @@ -87,7 +88,7 @@ ENTRY(__makecontext) #endif add #oPR, r4 rts - mov.l r0, @r4 + mov.l r0, @r4 /* ucp->pr <- exitcode */ #ifndef PIC .align 2 .L2: @@ -96,49 +97,63 @@ ENTRY(__makecontext) cfi_endproc .align 5 + cfi_startproc .Lexitcode: - tst r8, r8 - bt/s 2f - mov r8, r4 #ifdef PIC + mov.l r12, @-r15 + cfi_adjust_cfa_offset (4) + cfi_rel_offset (r12, 0) mova .Lgot, r0 mov.l .Lgot, r12 add r0, r12 - mov.l .L3, r1 +#endif + tst r8, r8 /* ucb->uc_link == NULL? */ + bt/s 2f + mov r8, r4 /* r4 <- ucb->uc_link */ + mov.l .Lsetcontext, r1 + sts.l pr, @-r15 + cfi_adjust_cfa_offset (4) + cfi_rel_offset (pr, 0) +#ifdef PIC bsrf r1 .LPCS0: nop #else - mov.l .L3, r1 jsr @r1 nop #endif + /* Restore to keep CFI/CFA balanced. */ + lds.l @r15+, pr + cfi_adjust_cfa_offset (-4) + cfi_restore (pr) + /* If this returns (which can happen if the syscall fails) we'll exit + the program with the return error value (-1). */ + 2: - mov.l .L4, r1 + mov.l .Lexit, r1 #ifdef PIC add r12, r1 #endif jsr @r1 mov r0, r4 -0: - bra 0b - nop + /* The 'exit' call should never return. In case it does cause the + process to terminate. */ + ABORT_INSTRUCTION_ASM .align 2 #ifdef PIC .Lgot: .long _GLOBAL_OFFSET_TABLE_ -.L3: +.Lsetcontext: .long __setcontext@PLT-(.LPCS0+2-(.)) -.L4: +.Lexit: .long HIDDEN_JUMPTARGET(exit)@GOTOFF #else -.L3: +.Lsetcontext: .long __setcontext -.L4: +.Lexit: .long HIDDEN_JUMPTARGET(exit) #endif - cfi_startproc PSEUDO_END(__makecontext) weak_alias (__makecontext, makecontext) diff --git a/libc/sysdeps/unix/sysv/linux/sh/nptl/libc.abilist b/libc/sysdeps/unix/sysv/linux/sh/nptl/libc.abilist index 7c1425f89..c474f415c 100644 --- a/libc/sysdeps/unix/sysv/linux/sh/nptl/libc.abilist +++ b/libc/sysdeps/unix/sysv/linux/sh/nptl/libc.abilist @@ -79,6 +79,7 @@ GLIBC_2.16 aligned_alloc F c16rtomb F c32rtomb F + fanotify_mark F getauxval F mbrtoc16 F mbrtoc32 F diff --git a/libc/sysdeps/unix/sysv/linux/sh/sigaltstack-offsets.sym b/libc/sysdeps/unix/sysv/linux/sh/sigaltstack-offsets.sym new file mode 100644 index 000000000..f73446941 --- /dev/null +++ b/libc/sysdeps/unix/sysv/linux/sh/sigaltstack-offsets.sym @@ -0,0 +1,13 @@ +#include <stddef.h> +#include <signal.h> + +-- + +#define sigaltstack(member) offsetof (stack_t, member) + +sizeSS sizeof (stack_t) +oSS_SP sigaltstack (ss_sp) +oSS_FLAGS sigaltstack (ss_flags) +oSS_SIZE sigaltstack (ss_size) + +SS_ONSTACK diff --git a/libc/sysdeps/unix/sysv/linux/sh/syscalls.list b/libc/sysdeps/unix/sysv/linux/sh/syscalls.list index be9ffed22..faffe377e 100644 --- a/libc/sysdeps/unix/sysv/linux/sh/syscalls.list +++ b/libc/sysdeps/unix/sysv/linux/sh/syscalls.list @@ -3,3 +3,5 @@ waitpid - waitpid Ci:ipi __waitpid waitpid __libc_waitpid prlimit64 EXTRA prlimit64 i:iipp prlimit64 + +fanotify_mark EXTRA fanotify_mark i:iiiiis __fanotify_mark fanotify_mark@@GLIBC_2.16 diff --git a/libc/sysdeps/unix/sysv/linux/sh/sysdep.h b/libc/sysdeps/unix/sysv/linux/sh/sysdep.h index 5215a845d..ce72c66a7 100644 --- a/libc/sysdeps/unix/sysv/linux/sh/sysdep.h +++ b/libc/sysdeps/unix/sysv/linux/sh/sysdep.h @@ -1,5 +1,4 @@ -/* Copyright (C) 1992,1993,1995-2000,2002-2006,2009,2011 - Free Software Foundation, Inc. +/* Copyright (C) 1992-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995. Changed by Kaz Kojima, <kkojima@rr.iij4u.or.jp>. @@ -100,11 +99,15 @@ # if RTLD_PRIVATE_ERRNO # define SYSCALL_ERROR_HANDLER \ neg r0,r1; \ + mov r12,r2; \ + cfi_register (r12, r2); \ mov.l 0f,r12; \ mova 0f,r0; \ add r0,r12; \ mov.l 1f,r0; \ mov.l r1,@(r0,r12); \ + mov r2,r12; \ + cfi_restore (r12); \ bra .Lpseudo_end; \ mov _IMM1,r0; \ .align 2; \ @@ -121,6 +124,7 @@ # define SYSCALL_ERROR_HANDLER \ neg r0,r1; \ mov r12,r2; \ + cfi_register (r12, r2); \ mov.l 0f,r12; \ mova 0f,r0; \ add r0,r12; \ @@ -128,6 +132,7 @@ stc gbr, r4; \ mov.l @(r0,r12),r0; \ mov r2,r12; \ + cfi_restore (r12); \ add r4,r0; \ mov.l r1,@r0; \ bra .Lpseudo_end; \ @@ -140,12 +145,14 @@ # define SYSCALL_ERROR_HANDLER \ neg r0,r1; \ mov r12,r2; \ + cfi_register (r12, r2); \ mov.l 0f,r12; \ mova 0f,r0; \ add r0,r12; \ mov.l 1f,r0; \ mov.l @(r0,r12),r0; \ mov r2,r12; \ + cfi_restore (r12); \ mov.l r1,@r0; \ bra .Lpseudo_end; \ mov _IMM1,r0; \ |