summaryrefslogtreecommitdiff
path: root/ports/sysdeps/microblaze/setjmp.S
blob: 4a2bd22ed33b371be9b292587830797dd99fbe67 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/* Copyright (C) 1997-2013 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>

/* This source produces 3 functions:
   __sigsetjmp (jmpbuf,savemask)
   setjmp (jmpbuf) - equivalent to __sigsetjump (jmpbuf, 1)
   _setjmp (jmpbuf) - equivalent to __sigsetjump (jmpbuf, 0)
*/

#ifndef setjmp_name
# define setjmp_name __sigsetjmp
# define SET_MASK_ARG
#else
# define SET_MASK_ARG    addik r6,r0,SAVEMASK
#endif

ENTRY (setjmp_name)
    swi   r1,r5,0
    swi   r2,r5,4
    swi   r13,r5,8
    swi   r14,r5,12
    swi   r15,r5,16
    swi   r16,r5,20
    swi   r17,r5,24
    swi   r18,r5,28
    swi   r19,r5,32
    swi   r20,r5,36
    swi   r21,r5,40
    swi   r22,r5,44
    swi   r23,r5,48
    swi   r24,r5,52
    swi   r25,r5,56
    swi   r26,r5,60
    swi   r27,r5,64
    swi   r28,r5,68
    swi   r29,r5,72
    swi   r30,r5,76
    swi   r31,r5,80

    SET_MASK_ARG

    /* Make a tail call to __sigjmp_save; it takes the same args.  */
#ifdef	PIC
    /* We cannot use the PLT, because it requires that r20 be set, but
       we can't save and restore our caller's value.  Instead, we do an
       indirect jump through the GOT, using the temporary register
       %ecx, which is call-clobbered.  */
    mfs   r12,rpc
    addik r12,r12,_GLOBAL_OFFSET_TABLE_+8
    lwi   r12,r12,__sigjmp_save@GOT
    brad  r12
#else
    brid  __sigjmp_save
#endif
    nop
END (setjmp_name)

libc_hidden_def (setjmp_name)