OpenCores
URL https://opencores.org/ocsvn/or1k_old/or1k_old/trunk

Subversion Repositories or1k_old

[/] [or1k_old/] [trunk/] [linux/] [uClibc/] [libc/] [sysdeps/] [linux/] [sparc/] [__longjmp.S] - Blame information for rev 1782

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1325 phoenix
/* Copyright (C) 1991, 93, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
2
   This file is part of the GNU C Library.
3
 
4
   The GNU C Library is free software; you can redistribute it and/or
5
   modify it under the terms of the GNU Lesser General Public
6
   License as published by the Free Software Foundation; either
7
   version 2.1 of the License, or (at your option) any later version.
8
 
9
   The GNU C Library is distributed in the hope that it will be useful,
10
   but WITHOUT ANY WARRANTY; without even the implied warranty of
11
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
   Lesser General Public License for more details.
13
 
14
   You should have received a copy of the GNU Lesser General Public
15
   License along with the GNU C Library; if not, write to the Free
16
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17
   02111-1307 USA.  */
18
 
19
#include 
20
 
21
#define _ASM 1
22
#define _SETJMP_H
23
#include 
24
#define ENV(base,reg) [%base + (reg * 4)]
25
#define ST_FLUSH_WINDOWS 3
26
#define RW_FP [%fp + 0x48]
27
 
28
.global   __longjmp;
29
.align 4;
30
__longjmp: ;
31
.type __longjmp ,@function;
32
 
33
        /* Store our arguments in global registers so we can still
34
           use them while unwinding frames and their register windows.  */
35
 
36
        ld ENV(o0,JB_FP), %g3   /* Cache target FP in register %g3.  */
37
        mov %o0, %g1            /* ENV in %g1 */
38
        orcc %o1, %g0, %g2      /* VAL in %g2 */
39
        be,a 0f                 /* Branch if zero; else skip delay slot.  */
40
         mov 1, %g2             /* Delay slot only hit if zero: VAL = 1.  */
41
0:
42
        xor %fp, %g3, %o0
43
        add %fp, 512, %o1
44
        andncc %o0, 4095, %o0
45
        bne .Lthread
46
         cmp %o1, %g3
47
        bl .Lthread
48
 
49
        /* Now we will loop, unwinding the register windows up the stack
50
           until the restored %fp value matches the target value in %g3.  */
51
 
52
.Lloop:
53
        cmp %fp, %g3            /* Have we reached the target frame? */
54
        bl,a .Lloop             /* Loop while current fp is below target.  */
55
         restore                /* Unwind register window in delay slot.  */
56
        be,a .Lfound            /* Better have hit it exactly.  */
57
         ld ENV(g1,JB_SP), %o0  /* Delay slot: extract target SP.  */
58
 
59
.Lthread:
60
        /*
61
         * Do a "flush register windows trap".  The trap handler in the
62
         * kernel writes all the register windows to their stack slots, and
63
         * marks them all as invalid (needing to be sucked up from the
64
         * stack when used).  This ensures that all information needed to
65
         * unwind to these callers is in memory, not in the register
66
         * windows.
67
         */
68
        ta      ST_FLUSH_WINDOWS
69
        ld      ENV(g1,JB_PC), %o7 /* Set return PC. */
70
        ld      ENV(g1,JB_SP), %fp /* Set saved SP on restore below. */
71
        sub     %fp, 64, %sp    /* Allocate a register frame. */
72
        st      %g3, RW_FP      /* Set saved FP on restore below. */
73
        retl
74
         restore %g2, 0, %o0    /* Restore values from above register frame. */
75
 
76
.Lfound:
77
        /* We have unwound register windows so %fp matches the target.  */
78
        mov %o0, %sp            /* OK, install new SP.  */
79
 
80
.Lsp_ok:
81
        ld ENV(g1,JB_PC), %o0   /* Extract target return PC.  */
82
        jmp %o0 + 8             /* Return there.  */
83
         mov %g2, %o0           /* Delay slot: set return value.  */
84
 
85
.size  __longjmp , . -  __longjmp

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.