Cygwin: dirent.h: fix a comment
[newlib-cygwin.git] / libgloss / xtensa / sim-vectors.S
blob73eea7b182dcfa217beac7e5c78281c12b652267
1 /*
2  * Copyright (c) 2015-2019 Cadence Design Systems, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files (the
6  * "Software"), to deal in the Software without restriction, including
7  * without limitation the rights to use, copy, modify, merge, publish,
8  * distribute, sublicense, and/or sell copies of the Software, and to
9  * permit persons to whom the Software is furnished to do so, subject to
10  * the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included
13  * in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
24 #include <xtensa/config/core-isa.h>
25 #include <syscalls.h>
27 //#define PS_OWB_SHIFT 8
28 //#define PS_OWB_BITS 4
29 //#define EXCCAUSE_ALLOCA                       5       /* Stack Extension Assist (MOVSP instruction) for alloca */
31 #if XCHAL_HAVE_L32R
32     .section .rodata
33 _sim_panic_msg:
34     .ascii "PANIC: Unhandled exception!\n"
35         _sim_panic_msg_len = . - _sim_panic_msg
37     .section .text
38     .literal .Lpanic_msg, _sim_panic_msg
39     .literal .Lpanic_msg_len, _sim_panic_msg_len
40     .align      4
41 _xt_unhandled_exc:
42     movi a2, SYS_write
43     movi a3, 2
44     l32r a4, .Lpanic_msg
45     l32r a5, .Lpanic_msg_len
46     simcall
47 #else
48 _xt_unhandled_exc:
49 #endif
50     movi a2, SYS_exit
51     movi a3, 1
52     simcall
55 --------------------------------------------------------------------------------
56 Handle alloca exception generated by interruptee executing 'movsp'.
57 This uses space between the window vectors, so is essentially "free".
58 All interruptee's regs are intact except a0 which is saved in EXCSAVE_1,
59 and PS.EXCM has been set by the exception hardware (can't be interrupted).
60 The fact the alloca exception was taken means the registers associated with
61 the base-save area have been spilled and will be restored by the underflow
62 handler, so those 4 registers are available for scratch.
63 The code is optimized to avoid unaligned branches and minimize cache misses.
64 --------------------------------------------------------------------------------
67     #if XCHAL_HAVE_WINDOWED
68     .section .text
69     .global _xt_alloca_exc
70     .align  4
71 _xt_alloca_exc:
73     rsr     a0, WINDOWBASE  /* grab WINDOWBASE before rotw changes it */
74     rotw    -1              /* WINDOWBASE goes to a4, new a0-a3 are scratch */
75     rsr     a2, PS
76     extui   a3, a2, 8/*PS_OWB_BITS*/, 4/*PS_OWB_BITS*/
77     xor     a3, a3, a4      /* bits changed from old to current windowbase */
78     rsr     a4, EXCSAVE1   /* restore original a0 (now in a4) */
79     slli    a3, a3, 8
80     xor     a2, a2, a3      /* flip changed bits in old window base */
81     wsr     a2, PS          /* update PS.OWB to new window base */
82     rsync
84     bbci.l a4, 31, _WindowUnderflow4
85     rotw    -1              /* original a0 goes to a8 */
86     bbci.l a8, 30, _WindowUnderflow8
87     rotw    -1
88     j               _WindowUnderflow12
89     #endif
93 --------------------------------------------------------------------------------
94   User exception handler.
95 --------------------------------------------------------------------------------
98     #if XCHAL_HAVE_WINDOWED
99     .section .text
100     .align      4
101 _xt_to_alloca_exc:
102     j   _xt_alloca_exc                  /* in window vectors section */
103     #endif
105     .type       _xt_user_exc,@function
106     .align      4
107 _xt_user_exc:
109     rsr     a0, EXCCAUSE
110     /* Handle alloca and syscall exceptions */
111     #if XCHAL_HAVE_WINDOWED
112     beqi    a0, 5/*EXCCAUSE_ALLOCA*/,  _xt_to_alloca_exc
113     #endif
114     j _xt_unhandled_exc
118 --------------------------------------------------------------------------------
119 NMI Exception
120 --------------------------------------------------------------------------------
123     .begin      literal_prefix .NMIExceptionVector
124     .section    .NMIExceptionVector.text, "ax"
125     .global     NMIExceptionVector
126     .type       NMIExceptionVector,@function
127     .align      4
129 NMIExceptionVector:
130     j   _xt_unhandled_exc
132     .end        literal_prefix
135 --------------------------------------------------------------------------------
136 Kernel Exception
137 --------------------------------------------------------------------------------
140     .begin      literal_prefix .KernelExceptionVector
141     .section    .KernelExceptionVector.text, "ax"
142     .global     KernelExceptionVector
143     .type       KernelExceptionVector,@function
144     .align      4
146 KernelExceptionVector:
147     j   _xt_unhandled_exc
149     .end        literal_prefix
152 --------------------------------------------------------------------------------
153 User Exception
154 --------------------------------------------------------------------------------
157     .begin      literal_prefix .UserExceptionVector
158     .section    .UserExceptionVector.text, "ax"
159     .global     _UserExceptionVector
160     .type       _UserExceptionVector,@function
161     .align      4
163 _UserExceptionVector:
165     wsr     a0, EXCSAVE1                   /* preserve a0 */
166     j   _xt_user_exc                    /* user exception handler */
167     /* never returns here - call0 is used as a jump (see note at top) */
169     .end        literal_prefix
172 --------------------------------------------------------------------------------
173 Double Exception
174 --------------------------------------------------------------------------------
177     .begin      literal_prefix .DoubleExceptionVector
178     .section    .DoubleExceptionVector.text, "ax"
179     .global     DoubleExceptionVector
180     .type       DoubleExceptionVector,@function
181     .align      4
183 DoubleExceptionVector:
184     j   _xt_unhandled_exc
186     .end        literal_prefix