Cygwin: access: Fix X_OK behaviour for backup operators and admins
[newlib-cygwin.git] / newlib / libc / machine / rl78 / setjmp.S
blob552f8e18e345fca5c3adea8bfb69d864385c2d0b
1 /*
3 Copyright (c) 2011 Red Hat Incorporated.
4 All rights reserved.
6 Redistribution and use in source and binary forms, with or without 
7 modification, are permitted provided that the following conditions are met: 
9     Redistributions of source code must retain the above copyright 
10     notice, this list of conditions and the following disclaimer.
12     Redistributions in binary form must reproduce the above copyright
13     notice, this list of conditions and the following disclaimer in the
14     documentation and/or other materials provided with the distribution.
16     The name of Red Hat Incorporated may not be used to endorse 
17     or promote products derived from this software without specific 
18     prior written permission.
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 DISCLAIMED.  IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY
24 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
27 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
33 #ifdef __RL78_G10__
34 ; clobberable
35 r8      =       0xffec8
36 r9      =       0xffec9
37 r10     =       0xffeca
38 r11     =       0xffecb
39 r12     =       0xffecc
40 r13     =       0xffecd
41 r14     =       0xffece
42 r15     =       0xffecf
43 ; preserved
44 r16     =       0xffed0
45 r17     =       0xffed1
46 r18     =       0xffed2
47 r19     =       0xffed3
48 r20     =       0xffed4
49 r21     =       0xffed5
50 r22     =       0xffed6
51 r23     =       0xffed7
52 #else
53 ; clobberable
54 r8      =       0xffef0
55 r9      =       0xffef1
56 r10     =       0xffef2
57 r11     =       0xffef3
58 r12     =       0xffef4
59 r13     =       0xffef5
60 r14     =       0xffef6
61 r15     =       0xffef7
62 ; preserved
63 r16     =       0xffee8
64 r17     =       0xffee9
65 r18     =       0xffeea
66 r19     =       0xffeeb
67 r20     =       0xffeec
68 r21     =       0xffeed
69 r22     =       0xffeee
70 r23     =       0xffeef
71 #endif
73 /* The jump buffer has the following structure:
74         R0 .. R23  3*8 bytes
75         SP         2 bytes
76         ES         1 byte
77         CS         1 byte
78         PC         4 bytes
81         .macro  _saveb  ofs,reg
82         mov     a,\reg
83         mov     [hl+\ofs],a
84         .endm
85         .macro  _save   ofs,reg
86         movw    ax,\reg
87         movw    [hl+\ofs],ax
88         .endm
90         .global _setjmp
91         .type   _setjmp, @function
92 _setjmp:
93         ;; R8 = setjmp (jmp_buf *[sp+4].w)
94         ;; must return zero !!
95         push    ax
96         push    hl
97         push    ax
98         movw    ax, [sp+10]
99         movw    hl, ax
100         pop     ax
101         movw    [hl], ax
102         _save   2, bc
103         _save   4, de
104         pop     ax
105         movw    [hl+6], ax
106         _save   8, r8
107         _save   10, r10
108         _save   12, r12
109         _save   14, r14
110         _save   16, r16
111         _save   18, r18
112         _save   20, r20
113         _save   22, r22
115         ;; The sp we have now includes one more pushed reg, plus $PC
116         movw    ax, sp
117         addw    ax, #6
118         movw    [hl+24], ax
120         _saveb  26, es
121         _saveb  27, cs
122         _save   28, [sp+2]
123         _save   30, [sp+4]
125         clrw    ax
126         movw    r8, ax
127         pop     ax
128         ret
130         .size   _setjmp, . - _setjmp
132         .macro  _loadb  ofs,reg
133         mov     a,[hl+\ofs]
134         mov     \reg,a
135         .endm
136         .macro  _load   ofs,reg
137         movw    ax,[hl+\ofs]
138         movw    \reg,ax
139         .endm
140         .macro  _push   ofs
141         movw    ax,[hl+\ofs]
142         push    ax
143         .endm
145         .global _longjmp
146         .type _longjmp, @function
147 _longjmp:
148         ;; noreturn longjmp (jmp_buf *[sp+4].w, int [sp+6].w)
149         movw    ax, [sp+6]
150         cmpw    ax,#0
151         sknz
152         onew    ax
153         movw    r8, ax
155         movw    ax, [sp+4]
156         movw    hl, ax
157         movw    ax, [hl+24]
158         movw    sp, ax          ; this is the *new* stack
160         _push   30              ; high half of PC
161         _push   28              ; low half of PC
162         _push   6               ; HL
163         _push   0               ; AX
165         _load   2, bc
166         _load   4, de
168         _load   10, r10
169         _load   12, r12
170         _load   14, r14
171         _load   16, r16
172         _load   18, r18
173         _load   20, r20
174         _load   22, r22
176         _loadb  26, es
177         _loadb  27, cs
179         pop     ax
180         pop     hl
183         ret     ; pops PC (4 bytes)
185         .size   _longjmp, . - _longjmp