aboutsummaryrefslogtreecommitdiff
path: root/lib/chibios/os/common/ports/e200/compilers/CW/ivor.s
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chibios/os/common/ports/e200/compilers/CW/ivor.s')
-rw-r--r--lib/chibios/os/common/ports/e200/compilers/CW/ivor.s205
1 files changed, 205 insertions, 0 deletions
diff --git a/lib/chibios/os/common/ports/e200/compilers/CW/ivor.s b/lib/chibios/os/common/ports/e200/compilers/CW/ivor.s
new file mode 100644
index 000000000..7c546f28f
--- /dev/null
+++ b/lib/chibios/os/common/ports/e200/compilers/CW/ivor.s
@@ -0,0 +1,205 @@
1/*
2 ChibiOS - Copyright (C) 2006,2007,2008,2009,2010,2011,2012,2013,2014,
3 2015,2016,2017,2018,2019,2020,2021 Giovanni Di Sirio.
4
5 This file is part of ChibiOS.
6
7 ChibiOS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation version 3 of the License.
10
11 ChibiOS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20/**
21 * @file ivor.s
22 * @brief Kernel ISRs.
23 *
24 * @addtogroup PPC_CORE
25 * @{
26 */
27
28/*===========================================================================*/
29/* Module constants. */
30/*===========================================================================*/
31
32#if !defined(FALSE) || defined(__DOXYGEN__)
33#define FALSE 0
34#endif
35
36#if !defined(TRUE) || defined(__DOXYGEN__)
37#define TRUE 1
38#endif
39
40/*===========================================================================*/
41/* Code section. */
42/*===========================================================================*/
43
44/*
45 * Imports the PPC configuration headers.
46 */
47#define _FROM_ASM_
48#include "chlicense.h"
49#include "chconf.h"
50#include "chcore.h"
51
52#if !defined(__DOXYGEN__)
53
54 .extern _stats_start_measure_crit_thd
55 .extern _stats_stop_measure_crit_thd
56 .extern _dbg_check_lock
57 .extern _dbg_check_unlock
58 .extern chSchIsPreemptionRequired
59 .extern chSchDoReschedule
60 .extern chSysTimerHandlerI
61
62 .section .handlers, text_vle
63
64#if PPC_USE_VLE == TRUE
65
66#if PPC_SUPPORTS_DECREMENTER
67 /*
68 * _IVOR10 handler (Book-E decrementer).
69 */
70 .align 16
71 .globl _IVOR10
72 .type _IVOR10, @function
73_IVOR10:
74 /* Saving the external context (port_extctx structure).*/
75 e_stwu r1, -80(r1)
76 e_stmvsrrw 8(r1) /* Saves PC, MSR. */
77 e_stmvsprw 16(r1) /* Saves CR, LR, CTR, XER. */
78 e_stmvgprw 32(r1) /* Saves GPR0, GPR3...GPR12. */
79
80 /* Increasing the SPGR0 register.*/
81 mfspr r0, 272
82 se_addi r0, 1
83 mtspr 272, r0
84
85 /* Reset DIE bit in TSR register.*/
86 e_lis r3, 0x0800 /* DIS bit mask. */
87 mtspr 336, r3 /* TSR register. */
88
89 /* Restoring pre-IRQ MSR register value.*/
90 mfSRR1 r0
91#if !PPC_USE_IRQ_PREEMPTION
92 /* No preemption, keeping EE disabled.*/
93 se_bclri r0, 16 /* EE = bit 16. */
94#endif
95 mtMSR r0
96
97#if CH_DBG_SYSTEM_STATE_CHECK
98 bl _dbg_check_enter_isr
99 bl _dbg_check_lock_from_isr
100#endif
101 /* System tick handler invocation.*/
102 e_bl chSysTimerHandlerI
103#if CH_DBG_SYSTEM_STATE_CHECK
104 bl _dbg_check_unlock_from_isr
105 bl _dbg_check_leave_isr
106#endif
107
108#if PPC_USE_IRQ_PREEMPTION
109 /* Prevents preemption again.*/
110 wrteei 0
111#endif
112
113 /* Jumps to the common IVOR epilogue code.*/
114 se_b _ivor_exit
115#endif /* PPC_SUPPORTS_DECREMENTER */
116
117 /*
118 * _IVOR4 handler (Book-E external interrupt).
119 */
120 .align 16
121 .globl _IVOR4
122 .type _IVOR4, @function
123_IVOR4:
124 /* Saving the external context (port_extctx structure).*/
125 e_stwu r1, -80(r1)
126 e_stmvsrrw 8(r1) /* Saves PC, MSR. */
127 e_stmvsprw 16(r1) /* Saves CR, LR, CTR, XER. */
128 e_stmvgprw 32(r1) /* Saves GPR0, GPR3...GPR12. */
129
130 /* Increasing the SPGR0 register.*/
131 mfspr r0, 272
132 se_addi r0, 1
133 mtspr 272, r0
134
135 /* Software vector address from the INTC register.*/
136 e_lis r3, INTC_IACKR_ADDR@h
137 e_or2i r3, INTC_IACKR_ADDR@l /* IACKR register address. */
138 se_lwz r3, 0(r3) /* IACKR register value. */
139 se_lwz r3, 0(r3)
140 mtCTR r3 /* Software handler address. */
141
142 /* Restoring pre-IRQ MSR register value.*/
143 mfSRR1 r0
144#if !PPC_USE_IRQ_PREEMPTION
145 /* No preemption, keeping EE disabled.*/
146 se_bclri r0, 16 /* EE = bit 16. */
147#endif
148 mtMSR r0
149
150 /* Exectes the software handler.*/
151 se_bctrl
152
153#if PPC_USE_IRQ_PREEMPTION
154 /* Prevents preemption again.*/
155 wrteei 0
156#endif
157
158 /* Informs the INTC that the interrupt has been served.*/
159 mbar 0
160 e_lis r3, INTC_EOIR_ADDR@h
161 e_or2i r3, INTC_EOIR_ADDR@l
162 se_stw r3, 0(r3) /* Writing any value should do. */
163
164 /* Common IVOR epilogue code, context restore.*/
165 .globl _ivor_exit
166_ivor_exit:
167 /* Decreasing the SPGR0 register.*/
168 mfspr r0, 272
169 se_subi r0, 1
170 mtspr 272, r0
171
172#if CH_DBG_STATISTICS
173 e_bl _stats_start_measure_crit_thd
174#endif
175#if CH_DBG_SYSTEM_STATE_CHECK
176 e_bl _dbg_check_lock
177#endif
178 e_bl chSchIsPreemptionRequired
179 e_cmpli cr0, r3, 0
180 se_beq .noresch
181 e_bl chSchDoReschedule
182.noresch:
183#if CH_DBG_SYSTEM_STATE_CHECK
184 e_bl _dbg_check_unlock
185#endif
186#if CH_DBG_STATISTICS
187 e_bl _stats_stop_measure_crit_thd
188#endif
189
190 /* Restoring the external context.*/
191 e_lmvgprw 32(r1) /* Restores GPR0, GPR3...GPR12. */
192 e_lmvsprw 16(r1) /* Restores CR, LR, CTR, XER. */
193 e_lmvsrrw 8(r1) /* Restores PC, MSR. */
194 e_addi r1, r1, 80 /* Back to the previous frame. */
195 se_rfi
196
197#else /* PPC_USE_VLE == FALSE */
198
199#error "non-VLE mode not yet implemented"
200
201#endif /* PPC_USE_VLE == FALSE */
202
203#endif /* !defined(__DOXYGEN__) */
204
205/** @} */