~ubuntu-branches/ubuntu/natty/eglibc/natty-security

« back to all changes in this revision

Viewing changes to ports/sysdeps/arm/eabi/setjmp.S

  • Committer: Bazaar Package Importer
  • Author(s): Aurelien Jarno
  • Date: 2009-05-05 09:54:14 UTC
  • Revision ID: james.westby@ubuntu.com-20090505095414-c45qsg9ixjheohru
ImportĀ upstreamĀ versionĀ 2.9

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* setjmp for ARM.
 
2
   Copyright (C) 1997, 1998, 2005, 2006, 2008 Free Software Foundation, Inc.
 
3
   This file is part of the GNU C Library.
 
4
 
 
5
   The GNU C Library is free software; you can redistribute it and/or
 
6
   modify it under the terms of the GNU Lesser General Public
 
7
   License as published by the Free Software Foundation; either
 
8
   version 2.1 of the License, or (at your option) any later version.
 
9
 
 
10
   The GNU C Library is distributed in the hope that it will be useful,
 
11
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
13
   Lesser General Public License for more details.
 
14
 
 
15
   You should have received a copy of the GNU General Public License
 
16
   along with GCC; see the file COPYING.  If not, write to the Free
 
17
   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 
18
   02110-1301, USA.  */
 
19
 
 
20
#include <sysdep.h>
 
21
#define _SETJMP_H
 
22
#define _ASM
 
23
#include <bits/setjmp.h>
 
24
#include <rtld-global-offsets.h>
 
25
 
 
26
ENTRY (__sigsetjmp)
 
27
        mov     ip, r0
 
28
 
 
29
        /* Save registers */
 
30
        stmia   ip!, {v1-v6, sl, fp, sp, lr}
 
31
 
 
32
        /* Check if we have a VFP unit.  */
 
33
#ifdef IS_IN_rtld
 
34
        ldr     a3, 1f
 
35
        ldr     a4, Lrtld_local_ro
 
36
0:      add     a3, pc, a3
 
37
        add     a3, a3, a4
 
38
        ldr     a3, [a3, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET]
 
39
#else
 
40
#ifdef PIC
 
41
        ldr     a3, 1f
 
42
        ldr     a4, Lrtld_global_ro
 
43
0:      add     a3, pc, a3
 
44
        ldr     a3, [a3, a4]
 
45
        ldr     a3, [a3, #RTLD_GLOBAL_RO_DL_HWCAP_OFFSET]
 
46
#else
 
47
        ldr     a3, Lhwcap
 
48
        ldr     a3, [a3, #0]
 
49
#endif
 
50
#endif
 
51
 
 
52
        tst     a3, #HWCAP_ARM_VFP
 
53
        beq     Lno_vfp
 
54
 
 
55
        /* Store the VFP registers.  */
 
56
        /* Following instruction is fstmiax ip!, {d8-d15}.  */
 
57
        stc     p11, cr8, [r12], #68
 
58
        /* Store the floating-point status register.  */
 
59
        /* Following instruction is fmrx r2, fpscr.  */
 
60
        mrc     p10, 7, r2, cr1, cr0, 0
 
61
        str     r2, [ip], #4
 
62
Lno_vfp:
 
63
 
 
64
        tst     a3, #HWCAP_ARM_IWMMXT
 
65
        beq     Lno_iwmmxt
 
66
 
 
67
        /* Save the call-preserved iWMMXt registers.  */
 
68
        /* Following instructions are wstrd wr10, [ip], #8 (etc.)  */
 
69
        stcl    p1, cr10, [r12], #8
 
70
        stcl    p1, cr11, [r12], #8
 
71
        stcl    p1, cr12, [r12], #8
 
72
        stcl    p1, cr13, [r12], #8
 
73
        stcl    p1, cr14, [r12], #8
 
74
        stcl    p1, cr15, [r12], #8
 
75
Lno_iwmmxt:
 
76
 
 
77
        /* Make a tail call to __sigjmp_save; it takes the same args.  */
 
78
        B       PLTJMP(C_SYMBOL_NAME(__sigjmp_save))
 
79
 
 
80
#ifdef IS_IN_rtld
 
81
1:      .long   _GLOBAL_OFFSET_TABLE_ - 0b - 8
 
82
Lrtld_local_ro:
 
83
        .long   C_SYMBOL_NAME(_rtld_local_ro)(GOTOFF)
 
84
#else
 
85
#ifdef PIC
 
86
1:      .long   _GLOBAL_OFFSET_TABLE_ - 0b - 8
 
87
Lrtld_global_ro:
 
88
        .long   C_SYMBOL_NAME(_rtld_global_ro)(GOT)
 
89
#else
 
90
Lhwcap:
 
91
        .long   C_SYMBOL_NAME(_dl_hwcap)
 
92
#endif
 
93
#endif
 
94
 
 
95
END (__sigsetjmp)
 
96
 
 
97
hidden_def (__sigsetjmp)