source: trunk/libs/newlib/src/newlib/libc/machine/rl78/setjmp.S @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 3.5 KB
RevLine 
[444]1/*
2
3Copyright (c) 2011 Red Hat Incorporated.
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8
9    Redistributions of source code must retain the above copyright
10    notice, this list of conditions and the following disclaimer.
11
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.
15
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.
19
20THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23DISCLAIMED.  IN NO EVENT SHALL RED HAT INCORPORATED BE LIABLE FOR ANY
24DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27ON 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
29SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31*/
32
33#ifdef __RL78_G10__
34; clobberable
35r8      =       0xffec8
36r9      =       0xffec9
37r10     =       0xffeca
38r11     =       0xffecb
39r12     =       0xffecc
40r13     =       0xffecd
41r14     =       0xffece
42r15     =       0xffecf
43; preserved
44r16     =       0xffed0
45r17     =       0xffed1
46r18     =       0xffed2
47r19     =       0xffed3
48r20     =       0xffed4
49r21     =       0xffed5
50r22     =       0xffed6
51r23     =       0xffed7
52#else
53; clobberable
54r8      =       0xffef0
55r9      =       0xffef1
56r10     =       0xffef2
57r11     =       0xffef3
58r12     =       0xffef4
59r13     =       0xffef5
60r14     =       0xffef6
61r15     =       0xffef7
62; preserved
63r16     =       0xffee8
64r17     =       0xffee9
65r18     =       0xffeea
66r19     =       0xffeeb
67r20     =       0xffeec
68r21     =       0xffeed
69r22     =       0xffeee
70r23     =       0xffeef
71#endif
72
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
79*/
80
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
89
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
114
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
119
120        _saveb  26, es
121        _saveb  27, cs
122        _save   28, [sp+2]
123        _save   30, [sp+4]
124
125        clrw    ax
126        movw    r8, ax
127        pop     ax
128        ret
129
130        .size   _setjmp, . - _setjmp
131
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
144
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
154
155        movw    ax, [sp+4]
156        movw    hl, ax
157        movw    ax, [hl+24]
158        movw    sp, ax          ; this is the *new* stack
159
160        _push   30              ; high half of PC
161        _push   28              ; low half of PC
162        _push   6               ; HL
163        _push   0               ; AX
164
165        _load   2, bc
166        _load   4, de
167
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
175
176        _loadb  26, es
177        _loadb  27, cs
178
179        pop     ax
180        pop     hl
181
182
183        ret     ; pops PC (4 bytes)
184
185        .size   _longjmp, . - _longjmp
186
Note: See TracBrowser for help on using the repository browser.