source: rtems/cpukit/score/cpu/or1k/or1k-exception-handler-low.S

Last change on this file was 2ec78aaf, checked in by Joel Sherrill <joel@…>, on 02/16/22 at 23:04:21

score/cpu/or1k: Change license to BSD-2

  • Property mode set to 100644
File size: 5.8 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @addtogroup RTEMSScoreCPU
7 *
8 * @brief OR1K exception support implementation.
9 */
10
11/*
12 *  COPYRIGHT (c) 2014 Hesham ALMatary <heshamelmatary@gmail.com>
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 * 1. Redistributions of source code must retain the above copyright
18 *    notice, this list of conditions and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 *    notice, this list of conditions and the following disclaimer in the
21 *    documentation and/or other materials provided with the distribution.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 *
35 */
36
37#ifdef HAVE_CONFIG_H
38#include "config.h"
39#endif
40
41#include <rtems/asm.h>
42#include <rtems/score/percpu.h>
43#include "rtems/score/or1k-utility.h"
44
45.align 4
46.text
47PUBLIC(_ISR_Handler)
48.type    _ISR_Handler,@function
49
50 SYM(_ISR_Handler):
51
52  l.addi  r1, r1, -140
53
54  l.sw  8(r1),r2
55  /* r3 is saved by BSP exception handler */
56  l.sw  16(r1),r4
57  l.sw  20(r1),r5
58  l.sw  24(r1),r6
59  l.sw  28(r1),r7
60  l.sw  32(r1),r8
61  l.sw  36(r1),r9
62  l.sw  40(r1),r10
63  l.sw  44(r1),r11
64  l.sw  48(r1),r12
65  l.sw  52(r1),r13
66  l.sw  56(r1),r14
67  l.sw  60(r1),r15
68  l.sw  64(r1),r16
69  l.sw  68(r1),r17
70  l.sw  72(r1),r18
71  l.sw  76(r1),r19
72  l.sw  80(r1),r20
73  l.sw  84(r1),r21
74  l.sw  88(r1),r22
75  l.sw  92(r1),r23
76  l.sw  96(r1),r24
77  l.sw  100(r1),r25
78  l.sw  104(r1),r26
79  l.sw  108(r1),r27
80  l.sw  112(r1),r28
81  l.sw  116(r1),r29
82  l.sw  120(r1),r30
83  l.sw  124(r1),r31
84
85  /* Exception level related registers */
86
87  /* EPCR */
88  l.mfspr r13, r0, CPU_OR1K_SPR_EPCR0
89  l.sw  128(r1), r13 /* epcr */
90
91  /* EEAR */
92  l.mfspr r13, r0, CPU_OR1K_SPR_EEAR0
93  l.sw  132(r1), r13 /* eear */
94
95  /* ESR */
96  l.mfspr r13, r0, CPU_OR1K_SPR_ESR0
97  l.sw  136(r1), r13  /* esr */
98
99  /* Increment nesting level */
100  l.movhi r6, hi(ISR_NEST_LEVEL)
101  l.ori   r6, r6, lo(ISR_NEST_LEVEL)
102
103  /* Disable multitasking */
104  l.movhi r8, hi(THREAD_DISPATCH_DISABLE_LEVEL)
105  l.ori   r8, r8, lo(THREAD_DISPATCH_DISABLE_LEVEL)
106
107  l.lwz   r5, 0(r6)
108  l.lwz   r7, 0(r8)
109  l.addi  r5, r5, 1
110  l.addi  r7, r7, 1
111  l.sw    0(r6), r5
112  l.sw    0(r8), r7
113
114  /* Save interrupted task stack pointer */
115  l.addi r4, r1, 340
116  l.sw   4(r1), r4
117
118  /* Save interrupted task r3 (first arg) value */
119  l.addi r4, r1, 140
120  l.lwz  r4, 0(r4)
121  l.sw  12(r1), r4
122
123  /* Keep r1 (Exception frame address) in r14 */
124  l.add   r14, r1, r0
125
126  /* Call the exception handler from vector table */
127
128  /* First function arg for C handler is vector number,
129   * and the second is a pointer to exception frame.
130   */
131  l.add  r13, r3, r0
132  l.add  r4, r1, r0
133  l.slli r13, r13, 2
134  l.addi r13, r13, lo(bsp_start_vector_table_begin)
135  l.lwz  r13, 0(r13)
136
137  /* Do not switch stacks if we are in a nested interrupt. At
138   * this point r5 should be holding ISR_NEST_LEVEL value.
139   */
140  l.sfgtui r5, 1
141  l.bf jump_to_c_handler
142  l.nop
143
144   /* Switch to RTEMS dedicated interrupt stack */
145  l.movhi r1, hi(INTERRUPT_STACK_HIGH)
146  l.ori   r1, r1, lo(INTERRUPT_STACK_HIGH)
147  l.lwz   r1, 0(r1)
148
149jump_to_c_handler:
150  l.jalr r13
151  l.nop
152
153  /* Switch back to the interrupted task stack */
154  l.add r1, r14, r0
155
156  /* Decrement nesting level */
157  l.movhi r6, hi(ISR_NEST_LEVEL)
158  l.ori   r6, r6, lo(ISR_NEST_LEVEL)
159
160  /* Enable multitasking */
161  l.movhi r8, hi(THREAD_DISPATCH_DISABLE_LEVEL)
162  l.ori   r8, r8, lo(THREAD_DISPATCH_DISABLE_LEVEL)
163
164  l.lwz   r5, 0(r6)
165  l.lwz   r7, 0(r8)
166  l.addi  r5, r5, -1
167  l.addi  r7, r7, -1
168  l.sw    0(r6), r5
169  l.sw    0(r8), r7
170
171  /* Check if _ISR_Nest_level > 0 */
172  l.sfgtui r5, 0
173  l.bf exception_frame_restore
174  l.nop
175
176  /* Check if _Thread_Dispatch_disable_level > 0 */
177  l.sfgtui r7, 0
178  l.bf exception_frame_restore
179  l.nop
180
181  /* Check if dispatch needed */
182  l.movhi r31, hi(DISPATCH_NEEDED)
183  l.ori   r31, r31, lo(DISPATCH_NEEDED)
184  l.lwz   r31, 0(r31)
185  l.sfeq  r31, r0
186  l.bf    exception_frame_restore
187  l.nop
188
189  l.movhi r13, hi(_Thread_Dispatch)
190  l.ori   r13, r13, lo(_Thread_Dispatch)
191  l.jalr  r13
192  l.nop
193
194 SYM(exception_frame_restore):
195
196  /* Exception level related registers */
197
198  /* EPCR */
199  l.lwz  r13,  128(r1)
200  l.mtspr r0, r13, CPU_OR1K_SPR_EPCR0
201
202  /* EEAR */
203  l.lwz  r13,  132(r1)
204  l.mtspr r0, r13, CPU_OR1K_SPR_EEAR0
205
206  /* ESR */
207  l.lwz  r13,  136(r1)
208  l.mtspr r0, r13, CPU_OR1K_SPR_ESR0
209
210  l.lwz  r2,  8(r1)
211  l.lwz  r3,  12(r1)
212  l.lwz  r4,  16(r1)
213  l.lwz  r5,  20(r1)
214  l.lwz  r6,  24(r1)
215  l.lwz  r7,  28(r1)
216  l.lwz  r8,  32(r1)
217  l.lwz  r9,  36(r1)
218  l.lwz  r10, 40(r1)
219  l.lwz  r11, 44(r1)
220  l.lwz  r12, 48(r1)
221  l.lwz  r13, 52(r1)
222  l.lwz  r14, 56(r1)
223  l.lwz  r15, 60(r1)
224  l.lwz  r16, 64(r1)
225  l.lwz  r17, 68(r1)
226  l.lwz  r18, 72(r1)
227  l.lwz  r19, 76(r1)
228  l.lwz  r20, 80(r1)
229  l.lwz  r21, 84(r1)
230  l.lwz  r22, 88(r1)
231  l.lwz  r23, 92(r1)
232  l.lwz  r24, 96(r1)
233  l.lwz  r25, 100(r1)
234  l.lwz  r26, 104(r1)
235  l.lwz  r27, 108(r1)
236  l.lwz  r28, 112(r1)
237  l.lwz  r29, 116(r1)
238  l.lwz  r30, 120(r1)
239  l.lwz  r31, 124(r1)
240
241  /* Unwind exception frame */
242  l.addi r1, r1, 140
243
244  /* Red-zone */
245  l.addi r1, r1, 200
246
247  l.rfe
248  l.nop
Note: See TracBrowser for help on using the repository browser.