Mercurial > ecos
annotate packages/hal/mn10300/arch/current/src/vectors.S @ 64:c38311975d4f ecos-sw-2000-01-28
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
| author | jlarmour |
|---|---|
| date | Fri, 28 Jan 2000 04:59:39 +0000 |
| parents | 641b639be825 |
| children | bf00f99aec69 |
| rev | line source |
|---|---|
| 0 | 1 ##============================================================================= |
| 2 ## | |
| 3 ## vectors.S | |
| 4 ## | |
| 5 ## MN10300 exception vectors | |
| 6 ## | |
| 7 ##============================================================================= | |
| 8 #####COPYRIGHTBEGIN#### | |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
9 # |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
10 # ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
11 # The contents of this file are subject to the Red Hat eCos Public License |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
12 # Version 1.0 (the "License"); you may not use this file except in |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
13 # compliance with the License. You may obtain a copy of the License at |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
14 # http://sourceware.cygnus.com/ecos |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
15 # |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
16 # Software distributed under the License is distributed on an |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
17 # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
18 # License for the specific language governing rights and limitations under |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
19 # the License. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
20 # |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
21 # The Original Code is eCos - Embedded Configurable Operating System, |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
22 # released September 30, 1998. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
23 # |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
24 # The Initial Developer of the Original Code is Red Hat. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
25 # Portions created by Red Hat are |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
26 # Copyright (C) 1998, 1999, 2000 Red Hat, Inc. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
27 # All Rights Reserved. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
28 # ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
30
diff
changeset
|
29 # |
| 0 | 30 #####COPYRIGHTEND#### |
| 31 ##============================================================================= | |
| 32 #######DESCRIPTIONBEGIN#### | |
| 33 ## | |
| 34 ## Author(s): nickg | |
| 35 ## Contributors: nickg | |
| 36 ## Date: 1997-10-16 | |
| 37 ## Purpose: MN10300 exception vectors | |
| 38 ## Description: This file defines the code placed into the exception | |
| 39 ## vectors. It also contains the first level default VSRs | |
| 40 ## that save and restore state for both exceptions and | |
| 41 ## interrupts. | |
| 42 ## | |
| 43 ######DESCRIPTIONEND#### | |
| 44 ## | |
| 45 ##============================================================================= | |
| 46 | |
| 47 #include <pkgconf/hal.h> | |
| 48 | |
| 49 #ifdef CYGPKG_KERNEL | |
| 50 | |
| 51 #include <pkgconf/kernel.h> | |
| 52 | |
| 53 #endif | |
| 54 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
55 #include <cyg/hal/arch.inc> |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
56 |
| 0 | 57 |
| 58 ##----------------------------------------------------------------------------- | |
| 59 | |
| 60 .file "vectors.S" | |
| 61 | |
| 62 ##----------------------------------------------------------------------------- | |
| 63 | |
| 64 .section ".vectors","ax" | |
| 65 | |
| 66 .globl reset_vector | |
| 67 | |
| 68 reset_vector: | |
| 69 # Reset vector | |
| 70 jmp _start | |
| 71 | |
| 72 .p2align 3 | |
| 73 | |
| 74 # NMI vector | |
| 75 jmp __nmi | |
| 76 | |
| 77 .p2align 3 | |
| 78 | |
| 79 # Trap vector | |
| 80 jmp __trap | |
| 81 | |
| 82 ##----------------------------------------------------------------------------- | |
| 83 ## NMI vector | |
| 84 | |
| 85 .globl __nmi | |
| 86 __nmi: | |
| 87 add -4,sp # space for SP | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
88 hal_cpu_save_all # push all registers |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
89 mov (_hal_vsr_table+28),a0 |
| 0 | 90 jmp (a0) |
| 91 | |
| 92 ##----------------------------------------------------------------------------- | |
| 93 ## Trap vector | |
| 94 | |
| 95 .globl __trap | |
| 96 __trap: | |
| 97 add -8,sp # space for SP and PSW | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
98 hal_cpu_save_all # push all registers |
| 0 | 99 mov (_hal_vsr_table+32),a0 |
| 100 jmp (a0) | |
| 101 | |
| 102 ##----------------------------------------------------------------------------- | |
| 103 ## Macro to define a hardware VSR | |
| 104 | |
| 105 .macro hardware_vector name | |
| 106 .globl __hardware_vector_\name | |
| 107 __hardware_vector_\name: | |
| 108 add -4,sp # space for SP | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
109 hal_cpu_save_all |
| 0 | 110 mov \name,d0 # d0 = vector id |
| 111 mov d0,(0,sp) # save in dummy stack loc | |
| 112 mov _hal_vsr_table,a0 # a0 = vsr table | |
| 113 add \name<<2,a0 # a0 = &required vsr | |
| 114 mov (a0),a0 # a0 = required vsr | |
| 115 jmp (a0) # go there | |
| 116 .endm | |
| 117 | |
| 118 ##----------------------------------------------------------------------------- | |
| 119 ## Hardware Vectors. These are pointed to by the registers in | |
| 120 ## mn10300_interrupt_vectors and must be in the range 0x4000XXXX. | |
| 121 | |
| 122 hardware_vector 0 | |
| 123 hardware_vector 1 | |
| 124 hardware_vector 2 | |
| 125 hardware_vector 3 | |
| 126 hardware_vector 4 | |
| 127 hardware_vector 5 | |
| 128 hardware_vector 6 | |
| 129 | |
| 130 ##----------------------------------------------------------------------------- | |
| 131 ## Startup code | |
| 132 | |
| 133 .text | |
| 134 | |
| 135 .globl _start | |
| 136 _start: | |
| 137 | |
| 138 # set up stack | |
| 139 | |
| 140 mov __interrupt_stack,a0 | |
| 141 sub 8,a0 | |
| 142 mov a0,sp | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
143 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
144 # Initialize hardware |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
145 hal_cpu_init |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
146 hal_mmu_init |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
147 hal_memc_init |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
148 hal_diag_init |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
149 hal_intc_init |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
150 hal_cache_init |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
151 hal_timer_init |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
152 hal_mon_init |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
153 |
| 0 | 154 #ifdef CYG_HAL_STARTUP_ROM |
| 155 | |
| 156 # Copy data from ROM to RAM | |
| 157 | |
| 158 mov __rom_data_start,a0 | |
| 159 mov __ram_data_end,a1 | |
| 160 mov __ram_data_start,a2 | |
| 161 | |
| 162 cmp a2,a1 | |
| 163 beq 8f | |
| 164 1: | |
| 165 movbu (a0),d0 | |
| 166 movbu d0,(a2) | |
| 167 inc a0 | |
| 168 inc a2 | |
| 169 cmp a2,a1 | |
| 170 bne 1b | |
| 171 8: | |
| 172 | |
| 173 #endif | |
| 174 | |
| 175 # Clear BSS | |
| 176 mov __bss_start,a0 | |
| 2 | 177 mov __bss_end,a1 |
| 0 | 178 |
| 179 cmp a0,a1 | |
| 180 beq 8f | |
| 181 clr d0 | |
| 182 1: | |
| 183 movbu d0,(a0) | |
| 184 inc a0 | |
| 185 cmp a0,a1 | |
| 186 bne 1b | |
| 187 8: | |
| 188 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
189 # Call variant and platform HAL |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
190 # initialization routines. |
| 0 | 191 |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
192 .extern _hal_variant_init |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
193 call _hal_variant_init,[],0 |
| 0 | 194 |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
195 .extern _hal_platform_init |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
196 call _hal_platform_init,[],0 |
| 0 | 197 |
| 198 # Call constructors | |
| 199 | |
| 200 .extern _cyg_hal_invoke_constructors | |
| 201 call _cyg_hal_invoke_constructors,[],0 | |
| 202 | |
| 2 | 203 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS |
| 204 .extern _initialize_stub | |
| 205 call _initialize_stub,[],0 | |
| 206 #endif | |
| 207 | |
| 208 # Call cyg_start | |
| 0 | 209 clr d0 |
| 210 mov d0,(4,sp) | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
211 |
| 0 | 212 .extern _cyg_start |
| 213 call _cyg_start,[],0 | |
| 214 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
215 9: |
| 0 | 216 bra 9b # Loop if we return |
| 217 | |
| 218 ##----------------------------------------------------------------------------- | |
| 219 ## The following macros are defined depending on whether the HAL is configured | |
| 220 ## to support the kernel or not. | |
| 221 | |
| 222 #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT | |
| 223 | |
| 2 | 224 .extern cyg_scheduler_sched_lock |
| 225 | |
| 0 | 226 # Increment the scheduler lock |
| 227 | |
| 228 .macro increment_sched_lock reg=d0 | |
| 2 | 229 mov (cyg_scheduler_sched_lock),\reg |
| 0 | 230 inc \reg |
| 2 | 231 mov \reg,(cyg_scheduler_sched_lock) |
| 0 | 232 .endm |
| 233 | |
| 234 #else | |
| 235 | |
| 236 .macro increment_sched_lock reg=d0 | |
| 237 .endm | |
| 238 | |
| 239 #endif | |
| 240 | |
| 241 ##----------------------------------------------------------------------------- | |
| 242 ## Default interrupt VSR | |
| 243 | |
| 244 .text | |
| 245 .globl __default_interrupt_vsr | |
| 246 __default_interrupt_vsr: | |
| 247 | |
| 248 # We come here with all the registers pushed | |
| 249 # onto the stack. | |
| 250 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
251 hal_diag_intr_start |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
252 |
| 0 | 253 increment_sched_lock |
| 254 | |
| 255 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
| 256 # Increment interrupt nesting counter | |
| 257 mov __interrupt_stack,a0 # A0 = interrupt stack top | |
| 258 mov sp,a2 # A2 = SP | |
| 259 cmp __interrupt_stack_base,a2 # compare with base of stack | |
| 260 blt 1f # if lt switch to int stack | |
| 261 cmp a0,a2 # compare sp with stack top | |
| 262 ble 8f # if le already on istack | |
| 263 1: | |
| 264 mov a0,sp # switch to new SP | |
| 265 8: | |
| 266 movm [a2],(sp) # save old SP | |
| 267 | |
| 268 #else | |
| 269 mov sp,a2 # A2 = saved thread state | |
| 270 #endif | |
| 271 | |
| 272 # Here A2 -> saved thread state on the threads own | |
| 273 # stack. We will be executing either on the same stack | |
| 274 # or on the interrupt stack, depending on config options. | |
| 275 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
276 hal_intc_decode d3,a3,d0 |
| 0 | 277 |
| 278 # Here D3 contains the table byte offset of the vector to | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
279 # call. |
| 2 | 280 |
| 0 | 281 #if defined(CYGPKG_KERNEL_INSTRUMENT) && defined(CYGDBG_KERNEL_INSTRUMENT_INTR) |
| 282 | |
| 283 # Call cyg_instrument to record that this interrupt is being raised. | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
284 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
285 .extern _cyg_instrument |
| 0 | 286 add -16,sp # make space for return link + args |
| 287 mov 0x0301,d0 # d0 = type = INTR,RAISE | |
| 288 mov (0,a2),d1 # d1 = arg1 = vector | |
| 289 mov d3,(12,sp) # (12,sp) = arg2 = table offset | |
| 290 calls _cyg_instrument # call instrumentation | |
| 291 add 16,sp # pop space | |
| 292 | |
| 293 #endif | |
| 2 | 294 |
| 295 #ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT | |
| 296 .extern _cyg_hal_gdb_isr | |
| 297 add -16,sp # make space for return link + args | |
| 298 mov (0,a2),d0 # d0 = vector | |
| 299 mov (56,a2),d1 # d1 = pc | |
| 300 calls _cyg_hal_gdb_isr # call GDB isr function | |
| 301 cmp 0x00,d0 # Call ISR proper? | |
| 302 beq 2f # (d0 is 0 when skipping | |
| 303 # to avoid DSR call) | |
| 304 add 16,sp # pop space | |
| 305 #endif | |
| 0 | 306 |
| 307 #ifdef CYGSEM_HAL_COMMON_INTERRUPTS_ALLOW_NESTING | |
| 308 | |
| 309 # To allow nested interrupts, we set the IE bit. We do | |
| 310 # not touch the IPL bits, so only higher priority interrupts | |
| 311 # will be nested on top of us. Also, new interrupts will not | |
| 312 # be delivered until the ISR calls | |
| 313 # Cyg_Interrupt::acknowledge_interrupt(). At some future point | |
| 314 # we may want to do the ack stuff here to allow immediate nesting. | |
| 315 | |
| 316 or 0x0800,psw | |
| 317 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
318 #endif |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
319 #if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
320 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
321 # If we have Ctrl-C support enabled, save a pointer to the |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
322 # saved CPU state here so we can plant a breakpoint there if |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
323 # this is a ^C. |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
324 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
325 .extern _hal_saved_interrupt_state |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
326 mov a2,(_hal_saved_interrupt_state) |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
327 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
328 #endif |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
329 |
| 0 | 330 mov _hal_interrupt_handlers,a0 # a0 = isr table |
| 331 mov (d3,a0),a0 # a0 = isr | |
| 332 | |
| 333 mov _hal_interrupt_data,a1 # a1 = data table | |
| 334 mov (d3,a1),d1 # d1 = isr data | |
| 335 | |
| 336 mov (0,a2),d0 # d0 = vector. (d3 is... | |
| 337 # ...adjusted for table reads) | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
338 |
| 0 | 339 add -16,sp # make space for return link |
| 340 | |
| 341 calls (a0) # call isr | |
| 342 | |
| 343 # on return d0 bit 1 will indicate whether a DSR is | |
| 344 # to be posted. Pass this together with a pointer to | |
| 345 # the interrupt object we have just used to the | |
| 346 # interrupt tidy up routine. | |
| 347 | |
| 348 # D3 is defined to be saved across procedure calls, and | |
| 349 # should still contain the vector byte index. Similarly, | |
| 350 # A2 should still point to the saved machine state. | |
| 351 | |
| 2 | 352 #ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT |
| 353 # If interrupt was caused by GDB, the ISR call above | |
| 354 # is skipped by jumping here. | |
| 355 2: | |
| 356 #endif | |
| 357 | |
| 0 | 358 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
| 359 | |
| 360 # If we are returning from the last nested interrupt, move back | |
| 361 # to the thread stack. interrupt_end() must be called on the | |
| 362 # thread stack since it potentially causes a context switch. | |
| 363 | |
| 364 add 16,sp # pop call frame from int stack | |
| 365 movm (sp),[a3] # pop old sp | |
| 366 mov a3,sp # put in SP | |
| 367 | |
| 368 add -16,sp # make call frame for call | |
| 369 | |
| 370 #endif | |
| 371 | |
| 372 #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT | |
| 373 | |
| 374 # We only need to call _interrupt_end() when there is a kernel | |
| 375 # present to do any tidying up. | |
| 376 | |
| 377 # Using the vector offset in D3, get the interrupt object pointer | |
| 378 # into D1. | |
| 379 mov _hal_interrupt_objects,a0 # a0 = object table | |
| 380 mov (d3,a0),d1 # d1 = object | |
| 381 | |
| 382 # Even when this is not the last nested interrupt, we must call | |
| 383 # _interrupt_end() to post the DSR and decrement the scheduler | |
| 384 # lock. | |
| 385 | |
| 386 mov a2,(12,sp) # arg3 = saved state. | |
| 387 | |
| 388 calls _interrupt_end # call interrupt end fn | |
| 389 #endif | |
| 390 | |
| 391 add 16,sp # pop return link | |
| 392 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
393 # show_interrupts |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
394 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
395 hal_diag_restore |
| 0 | 396 |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
397 hal_cpu_load_all |
| 0 | 398 add 4,sp |
| 399 rti # and return | |
| 400 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
401 ##----------------------------------------------------------------------------- |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
402 ## Execute pending DSRs on the interrupt stack with interrupts enabled. |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
403 ## Note: this can only be called from code running on a thread stack |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
404 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
405 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
406 .extern _cyg_interrupt_call_pending_DSRs |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
407 .global _hal_interrupt_stack_call_pending_DSRs |
| 0 | 408 |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
409 _hal_interrupt_stack_call_pending_DSRs: |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
410 movm [d2,a2],(sp) # save some work regs |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
411 mov __interrupt_stack,a0 # interrupt stack pointer |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
412 mov sp,a2 # save current SP |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
413 mov a0,sp # set SP to interrupt stack |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
414 hal_cpu_get_psw d2 # save PSW |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
415 hal_cpu_int_enable # enable interrupts |
| 0 | 416 |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
417 # Call kernel code to invoke DSRs. |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
418 calls _cyg_interrupt_call_pending_DSRs |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
419 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
420 # On return the old SP in a2 and the old PSW in d2 will |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
421 # have been preserved by the calling conventions. |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
422 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
423 hal_cpu_int_merge d2 # Restore previous PSW |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
424 mov a2,sp # restore old SP |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
425 movm (sp),[d2,a2] # Retrieve old work regs |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
426 ret [],0 # and return |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
427 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
428 #endif |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
429 |
| 0 | 430 ##----------------------------------------------------------------------------- |
| 431 ## Default NMI VSR | |
| 432 | |
| 2 | 433 .globl _cyg_hal_exception_handler |
| 0 | 434 |
| 435 .text | |
| 436 .globl __default_nmi_vsr | |
| 437 __default_nmi_vsr: | |
| 438 | |
| 439 # We come here with all the registers saved | |
| 440 # on the stack. | |
| 441 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
442 hal_diag_excpt_start |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
443 |
| 2 | 444 # Decode the cause of the NMI and cancel all the bits in all |
| 445 # the registers. We need to clear any bits set in the ISR and | |
| 446 # then clear any bits set in the NMICR. Note that we can only | |
| 447 # access the ISR if the DCR:DE bit is set. | |
| 448 | |
| 449 movhu (NMICR),d0 # D0 = NMI Control register | |
| 450 | |
| 451 movhu (DCR),d1 # D1 = Debug Control Register | |
| 452 mov d1,d2 # D2 = copy of DCR | |
| 453 movhu (ISR),d3 # D3 = Interrupt Status Register | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
454 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
455 or DCR_DE,d1 # Set DE bit |
| 2 | 456 movhu d1,(DCR) |
| 457 | |
| 458 movhu d3,(ISR) # clear ISR bits | |
| 459 | |
| 460 movhu d2,(DCR) # restore DCR to original value | |
| 461 | |
| 462 movhu d0,(NMICR) # clear NMI bits | |
| 463 and 0x7,d0 # LS 3 bits only | |
| 464 | |
| 465 mov hal_lsbit_table,a0 | |
| 466 movbu (d0,a0),d1 # D1 = NMI code | |
| 467 ## 0 = NMI | |
| 468 ## 1 = Watchdog | |
| 469 ## 2 = System Error | |
| 470 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
471 add 9,d1 # offset into exception number space |
| 2 | 472 |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
473 hal_cpu_clear_nmid |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
474 |
| 0 | 475 mov sp,a1 # a1 = saved state |
| 476 mov a1,d0 # d0 = arg1 = saved state | |
| 477 | |
| 478 add -16,sp # return link + args | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
479 mov d1,(16,sp) # save initial vector in spare save slot |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
480 mov d3,d1 # d1 = arg2 = ISR value |
| 0 | 481 |
| 2 | 482 calls _cyg_hal_exception_handler # call C code |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
483 |
| 0 | 484 add 16,sp # pop args |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
485 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
486 hal_cpu_load_all |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
487 |
| 0 | 488 add 4,sp |
| 489 rti | |
| 2 | 490 |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
491 .globl hal_lsbit_table |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
492 hal_lsbit_table: |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
493 .byte 0, 0, 1, 0 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
494 .byte 2, 0, 1, 0 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
495 .byte 3, 0, 1, 0 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
496 .byte 2, 0, 1, 0 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
497 |
| 0 | 498 ##----------------------------------------------------------------------------- |
| 499 ## Default TRAP VSR | |
| 500 | |
| 501 .text | |
| 502 .globl __default_trap_vsr | |
| 503 __default_trap_vsr: | |
| 504 | |
| 505 # We come here with all the registers saved | |
| 506 # on the stack. | |
| 507 | |
| 508 add -8,sp # return link + arg | |
| 509 mov 3,d1 # 3 == TRAP trap | |
| 510 mov d1,(0,sp) # save in spare save slot | |
| 2 | 511 calls _cyg_hal_exception_handler # call C code |
| 0 | 512 add 8,sp # pop args |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
513 hal_cpu_load_all |
| 0 | 514 add 4,sp |
| 515 rets | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
516 |
| 0 | 517 ##----------------------------------------------------------------------------- |
| 518 ## VSR table. The VSRs pointed to by this table are called from the stubs | |
| 519 ## connected to the hardware. | |
| 520 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
521 #ifndef CYG_HAL_MN10300_VSR_TABLE_DEFINED |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
522 |
| 0 | 523 .data |
| 524 | |
| 525 .globl _hal_vsr_table | |
| 526 _hal_vsr_table: | |
| 527 .long __default_interrupt_vsr | |
| 528 .long __default_interrupt_vsr | |
| 529 .long __default_interrupt_vsr | |
| 530 .long __default_interrupt_vsr | |
| 531 .long __default_interrupt_vsr | |
| 532 .long __default_interrupt_vsr | |
| 533 .long __default_interrupt_vsr | |
| 534 .long __default_nmi_vsr | |
| 535 .long __default_trap_vsr | |
| 536 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
537 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
538 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
539 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
540 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
541 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
542 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
543 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
544 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
545 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
546 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
547 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
548 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
549 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
550 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
551 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
552 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
553 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
554 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
555 .long __default_nmi_vsr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
556 .long __default_nmi_vsr |
| 0 | 557 #endif |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
558 |
| 0 | 559 ##----------------------------------------------------------------------------- |
| 560 ## Interrupt tables | |
| 561 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
562 .data |
| 0 | 563 |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
564 .extern _hal_default_isr |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
565 |
| 0 | 566 .globl _hal_interrupt_handlers |
| 567 _hal_interrupt_handlers: | |
| 568 .rept CYG_ISR_TABLE_SIZE | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
569 .long _hal_default_isr |
| 0 | 570 .endr |
| 571 | |
| 572 .globl _hal_interrupt_data | |
| 573 _hal_interrupt_data: | |
| 574 .rept CYG_ISR_TABLE_SIZE | |
| 575 .long 0 | |
| 576 .endr | |
| 577 | |
| 578 .globl _hal_interrupt_objects | |
| 579 _hal_interrupt_objects: | |
| 580 .rept CYG_ISR_TABLE_SIZE | |
| 581 .long 0 | |
| 582 .endr | |
| 583 | |
| 584 | |
| 585 ##----------------------------------------------------------------------------- | |
| 586 ## Temporary interrupt stack | |
| 587 | |
| 588 .section ".bss" | |
| 589 | |
| 590 .balign 16 | |
|
8
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
591 .global _cyg_interrupt_stack_base |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
592 _cyg_interrupt_stack_base: |
| 0 | 593 __interrupt_stack_base: |
| 594 .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE | |
| 595 .byte 0 | |
| 596 .endr | |
| 597 .balign 16 | |
|
8
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
598 .global _cyg_interrupt_stack |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
599 _cyg_interrupt_stack: |
| 0 | 600 __interrupt_stack: |
| 601 | |
| 602 .long 0,0,0,0,0,0,0,0 | |
| 603 | |
| 604 ##----------------------------------------------------------------------------- | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
605 |
| 0 | 606 .data |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
8
diff
changeset
|
607 hal_diag_data |
| 0 | 608 |
| 609 ##----------------------------------------------------------------------------- | |
| 610 ## end of vectors.S | |
| 611 |
