Mercurial > ecos-v2_0-branch
annotate packages/hal/powerpc/arch/current/src/vectors.S @ 68:f74b2666b30d ecos-sw-2000-02-04
Merge from eCos master repository on 2000-02-04-07:47:04-GMT
| author | jlarmour |
|---|---|
| date | Fri, 04 Feb 2000 15:01:01 +0000 |
| parents | bf00f99aec69 |
| children | c5536bad4c24 |
| rev | line source |
|---|---|
| 2 | 1 ##========================================================================== |
| 0 | 2 ## |
| 3 ## vectors.S | |
| 4 ## | |
| 5 ## PowerPC exception vectors | |
| 6 ## | |
| 2 | 7 ##========================================================================== |
| 0 | 8 #####COPYRIGHTBEGIN#### |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
38
diff
changeset
|
9 # |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
38
diff
changeset
|
10 # ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
38
diff
changeset
|
11 # The contents of this file are subject to the Red Hat eCos Public License |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
12 # Version 1.1 (the "License"); you may not use this file except in |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
38
diff
changeset
|
13 # compliance with the License. You may obtain a copy of the License at |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
14 # http://www.redhat.com/ |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
38
diff
changeset
|
15 # |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
16 # Software distributed under the License is distributed on an "AS IS" |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
38
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:
38
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:
38
diff
changeset
|
19 # the License. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
38
diff
changeset
|
20 # |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
38
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:
38
diff
changeset
|
22 # released September 30, 1998. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
38
diff
changeset
|
23 # |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
38
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:
38
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:
38
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:
38
diff
changeset
|
27 # All Rights Reserved. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
38
diff
changeset
|
28 # ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
38
diff
changeset
|
29 # |
| 0 | 30 #####COPYRIGHTEND#### |
| 2 | 31 ##========================================================================== |
| 0 | 32 #######DESCRIPTIONBEGIN#### |
| 33 ## | |
| 2 | 34 ## Author(s): nickg, jskov |
| 35 ## Contributors: nickg, jskov | |
| 36 ## Date: 1999-02-20 | |
| 37 ## Purpose: PowerPC 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. | |
| 0 | 42 ## |
| 43 ######DESCRIPTIONEND#### | |
| 44 ## | |
| 2 | 45 ##========================================================================== |
| 0 | 46 |
| 47 #include <pkgconf/hal.h> | |
| 48 | |
| 49 #ifdef CYGPKG_KERNEL | |
| 50 #include <pkgconf/kernel.h> // CYGPKG_KERNEL_INSTRUMENT | |
| 51 #endif | |
| 2 | 52 |
| 53 #define CYGARC_HAL_COMMON_EXPORT_CPU_MACROS | |
| 54 #include "cyg/hal/ppc_regs.h" | |
| 0 | 55 #include "cyg/hal/ppc.inc" |
| 56 | |
| 2 | 57 #=========================================================================== |
| 0 | 58 |
| 59 .file "vectors.S" | |
| 60 | |
| 61 .extern hal_interrupt_handlers | |
| 62 .extern hal_interrupt_data | |
| 63 .extern hal_interrupt_objects | |
| 64 | |
| 65 .extern cyg_instrument | |
| 66 | |
| 67 .extern hal_hardware_init | |
| 68 | |
| 2 | 69 #=========================================================================== |
| 0 | 70 # MSR initialization value |
| 71 # zero all bits except: | |
| 72 # FP = floating point available | |
| 73 # ME = machine check enabled | |
| 74 # IP = vectors at 0xFFFxxxxx (ROM startup only) | |
| 2 | 75 # IR = instruction address translation |
| 76 # DR = data address translation | |
| 0 | 77 # RI = recoverable interrupt |
| 78 | |
| 2 | 79 #define CYG_MSR_COMMON (MSR_FP | MSR_ME | MSR_IR | MSR_DR | MSR_RI) |
| 80 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_STUBS) | |
|
68
f74b2666b30d
Merge from eCos master repository on 2000-02-04-07:47:04-GMT
jlarmour
parents:
66
diff
changeset
|
81 # ifdef CYGSEM_HAL_POWERPC_COPY_VECTORS |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
82 # define CYG_MSR CYG_MSR_COMMON |
|
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
83 # else |
|
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
84 # define CYG_MSR (CYG_MSR_COMMON | MSR_IP) |
|
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
85 # endif |
| 0 | 86 #endif |
| 87 #ifdef CYG_HAL_STARTUP_RAM | |
| 2 | 88 #define CYG_MSR CYG_MSR_COMMON |
| 89 #endif | |
|
68
f74b2666b30d
Merge from eCos master repository on 2000-02-04-07:47:04-GMT
jlarmour
parents:
66
diff
changeset
|
90 #ifdef CYGPKG_HAL_POWERPC_SIM |
|
14
01ce82f3e11a
Merge from eCos master repository on 1999-06-11-17:05:41-BST
jlarmour
parents:
10
diff
changeset
|
91 # When building for SIM, don~t enable MMU -- it~s not needed since caches |
| 2 | 92 # are disabled, and there is a runtime simulation overhead. |
| 93 #undef CYG_MSR | |
| 94 #define CYG_MSR (CYG_MSR_COMMON & ~(MSR_IR | MSR_DR)) | |
| 0 | 95 #endif |
| 96 | |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
32
diff
changeset
|
97 #define CYG_MSR_NO_INTS (CYG_MSR & ~MSR_ME) |
|
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
32
diff
changeset
|
98 |
| 2 | 99 #=========================================================================== |
| 0 | 100 # If the following option is enabled, we only save registers up to R12. |
| 101 # The PowerPC ABI defines registers 13..31 as callee saved and thus we do | |
| 102 # not need to save them when calling C functions. | |
| 103 | |
| 104 #ifdef CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT | |
| 105 | |
| 2 | 106 #define MAX_SAVE_REG 12 |
| 0 | 107 |
| 108 #else | |
| 109 | |
| 110 #define MAX_SAVE_REG 31 | |
| 111 | |
| 112 #endif | |
| 113 | |
| 2 | 114 #=========================================================================== |
| 0 | 115 # Start by defining the exceptions vectors that must be placed at |
| 116 # locations 0xFFF00000 and 0x00000000. The following code will normally | |
| 117 # be located at 0xFFF00000 in the ROM. It may optionally be copied out | |
| 118 # to 0x00000000 if we want to use the RAM vectors. For this reason this code | |
| 119 # MUST BE POSITION INDEPENDENT. In RAM loaded configurations, this code may | |
| 120 # be placed at 0x00000000 during loading. | |
| 121 | |
| 122 .section ".vectors","ax" | |
| 123 | |
| 2 | 124 #--------------------------------------------------------------------------- |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
125 # Unused first vector. Jump to special handler, trapping null-pointer calls. |
| 0 | 126 |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
127 rom_vectors: |
|
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
128 .extern hal_null_call |
|
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
129 b hal_null_call |
| 0 | 130 |
| 2 | 131 #--------------------------------------------------------------------------- |
| 0 | 132 # Reset vector. |
| 133 | |
| 134 .p2align 8 | |
| 135 .globl reset_vector | |
| 136 | |
| 137 reset_vector: | |
| 138 lwi r3,_start | |
| 139 mtlr r3 | |
| 140 blr | |
| 141 | |
| 2 | 142 #--------------------------------------------------------------------------- |
| 0 | 143 # Macro for generating an exception vector service routine |
| 144 | |
| 145 .macro exception_vector name | |
| 146 .p2align 8 | |
| 147 .globl __exception_\name | |
| 148 __exception_\name: | |
| 2 | 149 mtspr SPRG1,r3 # stash some work registers away |
| 150 mtspr SPRG2,r4 | |
| 151 mtspr SPRG3,r5 | |
| 0 | 152 mfcr r4 # stash CR |
| 153 li r5,__exception_\name@L # load low half of vector address | |
| 154 srwi r5,r5,6 # shift right by 6 | |
| 155 lwi r3,hal_vsr_table # table base | |
| 156 lwzx r3,r3,r5 # address of vsr | |
| 157 mflr r5 # save link register | |
| 158 mtlr r3 # put vsr address into it | |
| 159 li r3,__exception_\name@L # reload low half of vector address | |
| 160 blr # go to common code | |
| 161 .endm | |
| 162 | |
| 2 | 163 #--------------------------------------------------------------------------- |
| 0 | 164 # Define the exception vectors. |
| 165 | |
| 166 # These are the architecture defined vectors that | |
| 167 # are always present. | |
| 168 | |
| 169 exception_vector machine_check | |
| 170 exception_vector data_storage | |
| 171 exception_vector instruction_storage | |
| 172 exception_vector external | |
| 173 exception_vector alignment | |
| 2 | 174 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_STUBS) \ |
| 175 || defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) | |
| 0 | 176 exception_vector program |
| 2 | 177 #else |
| 178 # Provide a crude hook to the GDB exception handler in ROM. | |
| 179 # This allows the testing infrastructure to rely on breakpoints | |
| 180 # to terminate tests, even when the tests are compiled without | |
| 181 # the GDB stub. | |
| 182 # It is _not_ a generic solution to the problem; in particular it | |
| 183 # is not possible to continue after a breakpoint is hit. | |
|
18
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
184 # |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
185 # Note that for platforms where StubROM vectors are copied into RAM |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
186 # at 0x00000000, simply skipping the copy of vector 0x700 is a |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
187 # better solution. See CYGPRI_STUBROM_HAS_RAM_VECTORS below. |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
188 |
| 2 | 189 .p2align 8 |
| 190 .globl __exception_program | |
| 191 __exception_program: | |
| 192 bl _init_CPU # disable caches. | |
| 193 lwi r3,0xfff00700 # address of trap handler | |
| 194 mtlr r3 # in ROM. | |
| 195 blr # jump to it. | |
| 196 | |
| 197 #endif | |
| 0 | 198 exception_vector floatingpoint_unavailable |
| 199 exception_vector decrementer | |
| 200 exception_vector reserved_00a00 | |
| 201 exception_vector reserved_00b00 | |
| 202 exception_vector system_call | |
| 203 exception_vector trace | |
| 204 exception_vector floatingpoint_assist | |
| 205 exception_vector reserved_00f00 | |
| 206 | |
| 207 # There are some additional vectors defined | |
| 208 # on various implementations. | |
| 209 | |
|
68
f74b2666b30d
Merge from eCos master repository on 2000-02-04-07:47:04-GMT
jlarmour
parents:
66
diff
changeset
|
210 #ifdef CYGPKG_HAL_POWERPC_MPC8xx |
| 2 | 211 # MPC8xx vectors |
| 0 | 212 |
| 213 exception_vector software_emu | |
| 214 exception_vector instruction_tlb_miss | |
| 215 exception_vector data_tlb_miss | |
| 216 exception_vector instruction_tlb_error | |
| 217 exception_vector data_tlb_error | |
| 218 exception_vector reserved_01500 | |
| 219 exception_vector reserved_01600 | |
| 220 exception_vector reserved_01700 | |
| 221 exception_vector reserved_01800 | |
| 222 exception_vector reserved_01900 | |
| 223 exception_vector reserved_01A00 | |
| 224 exception_vector reserved_01B00 | |
| 225 exception_vector data_breakpoint | |
| 226 exception_vector instruction_breakpoint | |
| 227 exception_vector peripheral_breakpoint | |
| 228 exception_vector NMI_port | |
| 229 | |
| 2 | 230 #endif |
| 0 | 231 rom_vectors_end: |
| 232 | |
| 2 | 233 #=========================================================================== |
| 234 # Real startup code. We jump here from the various reset vectors to set up | |
| 235 # the world. | |
| 0 | 236 |
| 237 .text | |
| 238 .globl _start | |
| 239 | |
| 2 | 240 _start: |
| 241 # Initialize CPU | |
| 242 bl _init_CPU | |
| 0 | 243 |
|
68
f74b2666b30d
Merge from eCos master repository on 2000-02-04-07:47:04-GMT
jlarmour
parents:
66
diff
changeset
|
244 #ifdef CYGPKG_HAL_POWERPC_MPC8xx |
| 2 | 245 # Disable special MPC8xx "development support" which |
| 246 # suppresses trace exceptions. The CPU seems to hang, not | |
| 247 # executing from offset 0x1e00(?) as expected. | |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
248 |
|
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
249 lwi r3,0x00000007 |
|
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
250 mtspr ICTRL,r3 |
|
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
251 |
| 0 | 252 li r3,0 |
| 2 | 253 mtspr DER, r3 |
| 0 | 254 #endif |
| 255 | |
| 256 # Set up global offset table | |
| 257 lwi r2,_GLOBAL_OFFSET_TABLE_ | |
| 258 | |
| 259 # set up time base register to zero | |
| 260 xor r3,r3,r3 | |
| 2 | 261 mtspr TBL_W,r3 |
| 0 | 262 xor r4,r4,r4 |
| 2 | 263 mtspr TBU_W,r4 |
| 264 | |
| 265 # Call platform specific hardware initialization | |
| 266 # This may include memory controller initialization. It is not | |
| 267 # safe to access RAM until after this point. | |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
268 bl hal_hardware_init # this is platform dependent |
| 0 | 269 |
| 270 # set up stack | |
| 271 lwi sp,__interrupt_stack | |
| 2 | 272 mtspr SPRG0,sp # save in sprg0 for later use |
| 0 | 273 |
| 2 | 274 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_STUBS) |
| 0 | 275 |
| 276 # Copy data from ROM to ram | |
| 277 lwi r3,__rom_data_start # r3 = rom start | |
| 278 lwi r4,__ram_data_start # r4 = ram start | |
| 279 lwi r5,__ram_data_end # r5 = ram end | |
| 280 | |
| 281 cmplw r4,r5 # skip if no data | |
| 282 beq 2f | |
| 283 | |
| 284 1: | |
| 285 lwz r0,0(r3) # get word from ROM | |
| 286 stw r0,0(r4) # store in RAM | |
| 287 addi r3,r3,4 # increment by 1 word | |
| 288 addi r4,r4,4 # increment by 1 word | |
| 289 cmplw r4,r5 # compare | |
| 290 blt 1b # loop if not yet done | |
| 291 2: | |
|
14
01ce82f3e11a
Merge from eCos master repository on 1999-06-11-17:05:41-BST
jlarmour
parents:
10
diff
changeset
|
292 #endif |
| 0 | 293 |
|
14
01ce82f3e11a
Merge from eCos master repository on 1999-06-11-17:05:41-BST
jlarmour
parents:
10
diff
changeset
|
294 |
|
68
f74b2666b30d
Merge from eCos master repository on 2000-02-04-07:47:04-GMT
jlarmour
parents:
66
diff
changeset
|
295 #ifdef CYGSEM_HAL_POWERPC_COPY_VECTORS // only for StubRom-supported startup |
|
18
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
296 |
|
68
f74b2666b30d
Merge from eCos master repository on 2000-02-04-07:47:04-GMT
jlarmour
parents:
66
diff
changeset
|
297 #ifdef CYGPKG_HAL_POWERPC_MBX |
|
32
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
20
diff
changeset
|
298 # define CYGPRI_STUBROM_HAS_RAM_VECTORS |
|
5af43b635655
Merge from eCos master repository on 1999-08-18-15:20:01-BST
jlarmour
parents:
20
diff
changeset
|
299 #endif |
|
18
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
300 |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
301 #ifdef CYGPRI_STUBROM_HAS_RAM_VECTORS |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
302 # ifdef CYG_HAL_STARTUP_RAM |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
303 # ifndef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
304 # define CYGPRI_SKIP_BREAKPOINT_VECTOR |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
305 # endif // no stubs |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
306 # endif // RAM startup |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
307 #endif // Stubrom vectors are in RAM |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
308 |
|
14
01ce82f3e11a
Merge from eCos master repository on 1999-06-11-17:05:41-BST
jlarmour
parents:
10
diff
changeset
|
309 # Copy RAM exception vectors from ROM (or load place) to RAM |
| 0 | 310 lwi r3,rom_vectors # r3 = rom start |
| 311 lwi r4,0 # r4 = ram start | |
|
18
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
312 #ifdef CYGPRI_SKIP_BREAKPOINT_VECTOR |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
313 lwi r5,__exception_program # r5 = end of first leg of copy |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
314 #else |
| 0 | 315 lwi r5,rom_vectors_end # r5 = rom end |
|
18
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
316 #endif |
| 0 | 317 |
| 318 cmplw r3,r5 # skip if no vectors | |
| 319 beq 2f | |
| 320 | |
| 321 1: | |
| 322 lwz r0,0(r3) # get word from ROM | |
| 323 stw r0,0(r4) # store in RAM | |
| 324 addi r3,r3,4 # increment by 1 word | |
| 325 addi r4,r4,4 # increment by 1 word | |
| 326 cmplw r3,r5 # compare | |
| 327 blt 1b # loop if not yet done | |
| 328 2: | |
|
18
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
329 #ifdef CYGPRI_SKIP_BREAKPOINT_VECTOR |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
330 cmplwi r4,__exception_program@L |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
331 bne 3f # is it the breakpoint vector? |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
332 addi r4,r4,0x100 # if so, leave it well alone |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
333 addi r3,r3,0x100 |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
334 lwi r5,rom_vectors_end # r5 = rom end |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
335 b 1b # and do the rest of the copy |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
336 3: |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
337 #endif // Skip copying the breakpoint vector |
| 0 | 338 #endif |
| 2 | 339 |
| 0 | 340 # clear BSS |
| 2 | 341 .extern __bss_start |
| 342 .extern __bss_end | |
| 0 | 343 lwi r3,__bss_start # r3 = start |
| 2 | 344 lwi r4,__bss_end # r4 = end |
| 0 | 345 li r0,0 # r0 = 0 |
| 346 cmplw r3,r4 # skip if no bss | |
| 347 beq 2f | |
| 348 | |
| 2 | 349 1: stw r0,0(r3) # store zero |
| 0 | 350 addi r3,r3,4 # increment by 1 word |
| 351 cmplw r3,r4 # compare | |
| 352 blt 1b # loop if not yet done | |
| 353 2: | |
| 354 | |
| 2 | 355 # clear SBSS |
| 356 .extern __sbss_start | |
| 357 .extern __sbss_end | |
| 358 lwi r3,__sbss_start # r3 = start | |
| 359 lwi r4,__sbss_end # r4 = end | |
| 360 cmplw r3,r4 # skip if no sbss | |
| 361 beq 2f | |
| 362 | |
| 363 1: stw r0,0(r3) # store zero | |
| 364 addi r3,r3,4 # increment by 1 word | |
| 365 cmplw r3,r4 # compare | |
| 366 blt 1b # loop if not yet done | |
| 367 2: | |
| 368 | |
| 369 # It is now safe to call C functions which may rely on initialized | |
| 370 # data. | |
| 371 | |
| 372 # Set up stack for calls to C code. | |
| 0 | 373 subi sp,sp,12 # make space on stack |
| 374 li r0,0 | |
| 375 stw r0,0(sp) # clear back chain | |
| 376 stw r0,8(sp) # zero return pc | |
| 377 stwu sp,-ppc_stack_frame_size(sp) # create new stack frame | |
| 2 | 378 |
| 379 # Initialize MMU. | |
| 380 .extern hal_MMU_init | |
| 381 bl hal_MMU_init | |
| 382 | |
|
38
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
383 # Enable MMU so we can safely enable caches. |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
32
diff
changeset
|
384 lwi r3,CYG_MSR_NO_INTS # interrupts enabled later |
| 2 | 385 sync |
| 386 mtmsr r3 | |
| 387 sync | |
|
14
01ce82f3e11a
Merge from eCos master repository on 1999-06-11-17:05:41-BST
jlarmour
parents:
10
diff
changeset
|
388 |
| 2 | 389 # Enable caches |
| 390 .extern hal_enable_caches | |
| 391 bl hal_enable_caches | |
| 0 | 392 |
| 2 | 393 # call c++ constructors |
| 0 | 394 .extern cyg_hal_invoke_constructors |
| 2 | 395 bl cyg_hal_invoke_constructors |
| 0 | 396 |
|
20
5f5102441818
Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents:
18
diff
changeset
|
397 # set up platform specific interrupt environment |
|
5f5102441818
Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents:
18
diff
changeset
|
398 .extern hal_IRQ_init |
|
5f5102441818
Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents:
18
diff
changeset
|
399 bl hal_IRQ_init |
|
5f5102441818
Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents:
18
diff
changeset
|
400 |
| 2 | 401 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS |
| 402 .extern initialize_stub | |
| 403 bl initialize_stub | |
| 0 | 404 #endif |
| 405 | |
| 406 .extern cyg_start | |
| 407 bl cyg_start # call cyg_start | |
| 408 9: | |
| 409 b 9b # if we return, loop | |
| 410 | |
| 2 | 411 #--------------------------------------------------------------------------- |
| 0 | 412 # This code handles the common part of all exception handlers. |
| 413 # It saves the machine state onto the stack and then calls | |
| 414 # a "C" routine to do the rest of the work. This work may result | |
| 415 # in thread switches, and changes to the saved state. When we return | |
| 416 # here the saved state is restored and execution is continued. | |
| 417 | |
| 418 .text | |
| 419 | |
| 420 .extern __default_exception_vsr | |
| 421 __default_exception_vsr: | |
| 422 | |
| 423 # We come here with all register containing their | |
| 424 # pre-exception values except: | |
| 425 # R3 = ls 16 bits of vector address | |
| 426 # R4 = saved CR | |
| 427 # R5 = saved LR | |
| 428 # LR = VSR address | |
| 429 # SPRG1 = old R3 | |
| 430 # SPRG2 = old R4 | |
| 431 # SPRG3 = old R5 | |
| 432 # SRR0 = old PC | |
| 2 | 433 # SRR1 = old MSR and the exception cause (the POW state is lost!) |
| 0 | 434 |
| 435 subi r1,r1,ppc_exception_decrement | |
| 436 # leave space for registers and | |
| 437 # a safety margin | |
| 438 | |
| 439 # First, save away some registers | |
| 440 stw r3,ppcreg_vector(r1) # stash vector | |
| 441 stw r4,ppcreg_cr(r1) # stash CR | |
| 442 stw r5,ppcreg_lr(r1) # stash LR | |
| 2 | 443 |
| 444 # Enable MMU. | |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
32
diff
changeset
|
445 lwi r3,CYG_MSR_NO_INTS |
| 2 | 446 sync |
| 447 mtmsr r3 | |
| 448 sync | |
| 449 | |
| 450 mfspr r3,SPRG1 # save original R3 | |
| 0 | 451 stw r3,ppcreg_regs+3*4(r1) |
| 2 | 452 mfspr r4,SPRG2 # save original R4 |
| 0 | 453 stw r4,ppcreg_regs+4*4(r1) |
| 2 | 454 mfspr r5,SPRG3 # save original R5 |
| 0 | 455 stw r5,ppcreg_regs+5*4(r1) |
| 456 | |
| 457 stw r0,ppcreg_regs(r1) # save R0 | |
| 458 stw r2,ppcreg_regs+2*4(r1) # save R2 | |
| 459 | |
| 460 mr r3,r1 # recreate original R1 | |
| 461 addi r3,r3,ppc_exception_decrement | |
| 462 stw r3,ppcreg_regs+1*4(r1) # and save it in state | |
| 463 | |
| 2 | 464 # Save registers r6..r12/r31 |
| 0 | 465 .set _reg,6 |
| 466 .rept MAX_SAVE_REG+1-6 | |
| 467 stw _reg,(ppcreg_regs+_reg*4)(r1) | |
| 468 .set _reg,_reg+1 | |
| 469 .endr | |
| 470 | |
| 2 | 471 # Save registers used in vsr (r14+r15) |
| 472 stw r14,(ppcreg_regs+14*4)(r1) | |
| 473 stw r15,(ppcreg_regs+15*4)(r1) | |
| 474 | |
| 0 | 475 # get remaining CPU registers |
| 476 mfxer r3 | |
| 477 mfctr r5 | |
| 478 mfdar r6 | |
| 479 mfdsisr r7 | |
| 480 mfpvr r8 | |
| 481 mfsrr0 r9 | |
| 482 mfsrr1 r10 | |
| 483 | |
| 484 # and store them | |
| 485 stw r3,ppcreg_xer(r1) | |
| 486 stw r5,ppcreg_ctr(r1) | |
| 487 stw r6,ppcreg_dar(r1) | |
| 488 stw r7,ppcreg_dsisr(r1) | |
| 489 stw r8,ppcreg_pvr(r1) | |
| 490 stw r9,ppcreg_pc(r1) | |
| 491 stw r10,ppcreg_msr(r1) | |
| 492 | |
| 493 # The entire CPU state is now stashed on the stack, | |
| 494 # call into C to do something with it. | |
| 495 | |
| 496 mr r3,sp # R3 = register dump | |
| 497 | |
| 498 subi sp,sp,ppc_stack_frame_size # make a null frame | |
| 499 | |
| 500 li r0,0 # R0 = 0 | |
| 501 stw r0,0(sp) # backchain = 0 | |
| 502 stw r0,8(sp) # return pc = 0 | |
| 503 | |
| 504 stwu sp,-ppc_stack_frame_size(sp) # create new stack frame | |
| 505 # where C code can save LR | |
| 506 | |
| 507 lwi r5,restore_state # get return link | |
| 508 mtlr r5 # to link register | |
| 509 | |
| 2 | 510 .extern cyg_hal_exception_handler |
| 511 b cyg_hal_exception_handler # call C code, r3 = registers | |
| 0 | 512 |
| 513 # When the call returns it will go to restore_state below. | |
| 514 | |
| 515 | |
| 2 | 516 ##-------------------------------------------------------------------------- |
| 517 ## The following macros are defined depending on whether the Interrupt | |
| 518 ## system is using isr tables or chaining, and depending on the interrupt | |
| 519 ## controller in the system. | |
| 520 | |
| 521 ## Note: CYG_ISR_TABLE_SIZE must match CYG_ISR_COUNT defined in hal_intr.h. | |
| 522 | |
|
68
f74b2666b30d
Merge from eCos master repository on 2000-02-04-07:47:04-GMT
jlarmour
parents:
66
diff
changeset
|
523 #ifdef CYGPKG_HAL_POWERPC_MPC8xx |
| 2 | 524 |
| 525 ## First level decoding of MPC8xx SIU interrupt controller. | |
| 526 | |
| 527 #define CYG_ISR_TABLE_SIZE 59 | |
| 528 | |
| 529 # decode the interrupt | |
| 530 .macro decode_interrupt dreg,state | |
| 531 lwz \dreg,ppcreg_vector(\state) # retrieve vector number, | |
| 532 rlwinm. \dreg,\dreg,22,31,31 # isolate bit 21 | |
| 533 beq 0f # done if decrementer (vec 0) | |
| 534 lwi \dreg,CYGARC_REG_IMM_SIVEC # if external, get SIU | |
| 535 lbz \dreg,0(\dreg) # vector. | |
| 536 srwi \dreg,\dreg,2 | |
| 537 addi \dreg,\dreg,1 # Skip decrementer vector | |
| 538 0: stw \dreg,ppcreg_vector(\state) # update vector in state frame. | |
| 539 slwi \dreg,\dreg,2 # convert to byte offset. | |
| 540 .endm | |
| 541 | |
| 542 #else | |
| 543 | |
| 544 ## This is the simple version. No interrupt controller, ppcreg_vector | |
| 545 ## is updated with the decoded interrupt vector. Isr tables/chaining | |
| 546 ## use same interrupt decoder. | |
| 547 ## Bit 21 biffers between decrementer (0) and external (1). | |
| 548 | |
| 549 #define CYG_ISR_TABLE_SIZE 2 | |
| 550 | |
| 551 # decode the interrupt | |
| 552 .macro decode_interrupt dreg,state | |
| 553 lwz \dreg,ppcreg_vector(\state) # retrieve vector number, | |
| 554 rlwinm \dreg,\dreg,22,31,31 # isolate bit 21 and update | |
| 555 stw \dreg,ppcreg_vector(\state) # vector in state frame. | |
| 556 slwi \dreg,\dreg,2 # convert to word offset. | |
| 557 .endm | |
| 558 | |
| 559 #endif | |
| 560 | |
| 561 #--------------------------------------------------------------------------- | |
| 0 | 562 # Common interrupt handling code. |
| 563 | |
| 564 .extern __default_interrupt_vsr | |
| 565 __default_interrupt_vsr: | |
| 566 | |
| 567 # We come here with all register containing their | |
| 568 # pre-exception values except: | |
| 569 # R3 = ls 16 bits of vector address | |
| 570 # R4 = saved CR | |
| 571 # R5 = saved LR | |
| 572 # LR = VSR address | |
| 573 # SPRG1 = old R3 | |
| 574 # SPRG2 = old R4 | |
| 575 # SPRG3 = old R5 | |
| 576 # SRR0 = old PC | |
| 577 # SRR1 = old MSR | |
| 578 | |
| 579 | |
| 580 subi r1,r1,ppc_exception_decrement | |
| 581 # leave space for registers and | |
| 582 # a safety margin | |
| 583 | |
| 584 stw r3,ppcreg_vector(r1) # stash vector | |
| 585 stw r4,ppcreg_cr(r1) # stash CR | |
| 586 stw r5,ppcreg_lr(r1) # stash LR | |
| 587 | |
| 2 | 588 # Enable MMU. |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
32
diff
changeset
|
589 lwi r3,CYG_MSR_NO_INTS |
| 2 | 590 sync |
| 591 mtmsr r3 | |
| 592 sync | |
| 593 | |
| 594 mfspr r3,SPRG1 # save original R3 | |
| 0 | 595 stw r3,ppcreg_regs+3*4(r1) |
| 2 | 596 mfspr r4,SPRG2 # save original R4 |
| 0 | 597 stw r4,ppcreg_regs+4*4(r1) |
| 2 | 598 mfspr r5,SPRG3 # save original R5 |
| 0 | 599 stw r5,ppcreg_regs+5*4(r1) |
| 600 | |
| 601 stw r0,ppcreg_regs(r1) # save R0 | |
| 602 stw r2,ppcreg_regs+2*4(r1) # save R2 | |
| 603 | |
| 604 mr r3,r1 # recreate original R1 | |
| 605 addi r3,r3,ppc_exception_decrement | |
| 606 stw r3,ppcreg_regs+1*4(r1) # and save it in state | |
| 607 | |
| 2 | 608 # Save registers r6..r12/r31 |
| 0 | 609 .set _reg,6 |
| 610 .rept MAX_SAVE_REG+1-6 | |
| 611 stw _reg,(ppcreg_regs+_reg*4)(r1) | |
| 612 .set _reg,_reg+1 | |
| 613 .endr | |
| 614 | |
| 2 | 615 # Save registers used in vsr (r14+r15) |
| 616 stw r14,(ppcreg_regs+14*4)(r1) | |
| 617 stw r15,(ppcreg_regs+15*4)(r1) | |
| 618 | |
| 0 | 619 # get remaining CPU registers |
| 620 mfxer r3 | |
| 621 mfctr r5 | |
| 622 mfsrr0 r6 | |
| 623 mfsrr1 r7 | |
| 624 | |
| 625 # and store them | |
| 626 stw r3,ppcreg_xer(r1) | |
| 627 stw r5,ppcreg_ctr(r1) | |
| 628 stw r6,ppcreg_pc(r1) | |
| 629 stw r7,ppcreg_msr(r1) | |
| 630 | |
| 631 # The entire CPU state is now stashed on the stack, | |
| 632 # increment the scheduler lock and call the ISR | |
| 633 # for this vector. | |
| 634 | |
| 635 #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT | |
| 2 | 636 .extern cyg_scheduler_sched_lock |
| 637 lwi r3,cyg_scheduler_sched_lock | |
| 0 | 638 lwz r4,0(r3) |
| 639 addi r4,r4,1 | |
| 640 stw r4,0(r3) | |
| 641 #endif | |
| 642 | |
| 2 | 643 mr r14,sp # r14 = register dump |
| 0 | 644 |
| 645 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
| 646 lwi r3,__interrupt_stack # stack top | |
| 647 lwi r4,__interrupt_stack_base # stack base | |
| 648 sub. r5,sp,r4 # sp - base | |
| 649 blt 1f # if < 0 - not on istack | |
| 650 sub. r5,r3,sp # top - sp | |
| 651 bgt 2f # if > 0 - already on istack | |
| 652 | |
| 653 1: mr sp,r3 # switch to istack | |
| 654 | |
| 2 | 655 2: stwu r14,-4(sp) # save old SP on stack |
| 0 | 656 |
| 657 #endif | |
| 658 | |
| 659 subi sp,sp,ppc_stack_frame_size # make a null frame | |
| 660 | |
| 661 li r0,0 # R0 = 0 | |
| 662 stw r0,0(sp) # backchain = 0 | |
| 663 stw r0,8(sp) # return pc = 0 | |
| 664 | |
| 665 stwu sp,-ppc_stack_frame_size(sp) # create new stack frame | |
| 666 # where C code can save LR | |
| 667 | |
| 668 #if defined(CYGPKG_KERNEL_INSTRUMENT) && defined(CYGDBG_KERNEL_INSTRUMENT_INTR) | |
| 669 | |
| 670 lwi r3,0x0301 # r3 = type = INTR,RAISE | |
| 2 | 671 lwz r4,ppcreg_vector(r14) # arg1 = vector address |
| 0 | 672 srwi r4,r4,8 # arg1 = vector number |
| 673 xor r5,r5,r5 # arg2 = 0 | |
| 674 bl cyg_instrument # call instrument function | |
| 675 | |
| 676 #endif | |
| 677 | |
| 2 | 678 decode_interrupt r15,r14 # get table index |
| 679 | |
| 0 | 680 #ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT |
| 681 .extern cyg_hal_gdb_isr | |
| 2 | 682 lwz r3,ppcreg_pc(r14) # for serial receive irq. |
| 683 bl cyg_hal_gdb_isr # (arg1 is PC) | |
| 0 | 684 cmpwi r3,0x0000 # Call ISR proper? |
| 685 beq 2f # (r3 is 0 when skipping | |
| 686 # to avoid DSR call) | |
| 687 1: | |
| 688 #endif | |
| 689 | |
| 2 | 690 #ifdef CYGSEM_HAL_COMMON_INTERRUPTS_ALLOW_NESTING |
| 0 | 691 |
|
68
f74b2666b30d
Merge from eCos master repository on 2000-02-04-07:47:04-GMT
jlarmour
parents:
66
diff
changeset
|
692 #ifdef CYGPKG_HAL_POWERPC_MPC8xx |
| 2 | 693 # The CPM controller allows nested interrupts. However, |
| 694 # it sits on the back of the SIU controller which has no | |
| 695 # HW support for this. In effect, SW masking of lower | |
| 696 # priority IRQs in the SIU would be required for this to work. | |
| 697 #endif | |
| 698 | |
| 699 #endif | |
| 700 | |
| 701 lwz r3,ppcreg_vector(r14) # retrieve decoded vector # | |
| 0 | 702 |
| 703 lwi r6,hal_interrupt_handlers # get interrupt handler table | |
| 704 lwzx r6,r6,r15 # load routine pointer | |
| 705 | |
| 706 lwi r4,hal_interrupt_data # get interrupt data table | |
| 707 lwzx r4,r4,r15 # load data pointer | |
| 708 # R4 = data argument | |
| 709 | |
| 710 mtctr r6 # put isr address in ctr | |
| 711 | |
| 712 bctrl # branch to ctr reg and link | |
| 713 | |
| 714 #ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT | |
| 715 # If interrupt was caused by GDB, the ISR call above | |
| 716 # is skipped by jumping here. | |
| 717 2: | |
| 718 #endif | |
| 719 | |
| 720 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
| 721 | |
| 722 # If we are returning from the last nested interrupt, move back | |
| 723 # to the thread stack. interrupt_end() must be called on the | |
| 724 # thread stack since it potentially causes a context switch. | |
| 725 # Since we have arranged for the top of stack location to | |
| 726 # contain the sp we need to go back to here, just pop it off | |
| 727 # and put it in SP. | |
| 728 | |
| 729 | |
| 730 lwz sp,ppc_stack_frame_size*2(sp) # sp = *sp | |
| 731 | |
| 732 subi sp,sp,ppc_stack_frame_size # make a null frame | |
| 733 | |
| 734 li r0,0 # R0 = 0 | |
| 735 stw r0,0(sp) # backchain = 0 | |
| 736 stw r0,8(sp) # return pc = 0 | |
| 737 | |
| 738 stwu sp,-ppc_stack_frame_size(sp) # create new stack frame | |
| 739 # where C code can save LR | |
| 740 #endif | |
| 741 | |
| 742 #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT | |
| 743 | |
| 744 # We only need to call _interrupt_end() when there is a kernel | |
| 745 # present to do any tidying up. | |
| 746 | |
| 747 # on return r3 bit 1 will indicate whether a DSR is | |
| 748 # to be posted. Pass this together with a pointer to | |
| 749 # the interrupt object we have just used to the | |
| 750 # interrupt tidy up routine. | |
| 751 | |
| 2 | 752 # Note that r14 and r15 are defined to be preserved across |
| 0 | 753 # calls by the calling convention, so they still contain |
| 754 # the register dump and the vector number respectively. | |
| 2 | 755 |
| 756 # Note: The instructions restoring the msr mask out the POW bit. | |
| 757 # When eCos gets power management aware, this bit will have to be | |
| 758 # set to the correct state rather than just cleared. | |
| 0 | 759 |
| 760 lwi r4,hal_interrupt_objects # get interrupt object table | |
| 761 lwzx r4,r4,r15 # load object pointer | |
| 762 | |
| 2 | 763 lwz r6,ppcreg_msr(r14) # restore msr, including |
| 764 lis r5,0xfffe # interrupt enable. | |
| 765 andc r6,r6,r5 # mask out reserved bits | |
| 766 sync # (and POW!) | |
| 767 mtmsr r6 | |
| 768 sync | |
| 0 | 769 |
| 2 | 770 mr r5,r14 # arg3 = saved register dump |
| 0 | 771 |
| 772 .extern interrupt_end | |
| 773 bl interrupt_end # call into C to finish off | |
| 774 #endif | |
| 775 | |
| 776 restore_state: | |
| 777 # All done, restore CPU state and continue | |
| 778 | |
| 779 addi sp,sp,ppc_stack_frame_size*2 # retrieve CPU state pointer | |
| 780 | |
| 781 # get sprs we want to restore | |
| 782 lwz r3,ppcreg_cr(sp) | |
| 783 lwz r4,ppcreg_pc(sp) | |
| 784 lwz r5,ppcreg_msr(sp) | |
| 785 lwz r6,ppcreg_xer(sp) | |
| 786 lwz r7,ppcreg_lr(sp) | |
| 787 lwz r8,ppcreg_ctr(sp) | |
| 788 | |
| 789 | |
| 790 # stuff some of them into the CPU | |
| 791 mtxer r6 | |
| 792 mtlr r7 | |
| 793 mtctr r8 | |
| 794 | |
| 795 # restore R0 and R2 | |
| 796 lwz r0,ppcreg_regs(sp) | |
| 797 lwz r2,ppcreg_regs+2*4(sp) | |
| 798 | |
| 2 | 799 # Restore registers used in vsr (r14+r15) |
| 800 lwz r14,(ppcreg_regs+14*4)(r1) | |
| 801 lwz r15,(ppcreg_regs+15*4)(r1) | |
| 802 | |
| 803 # restore registers r6..r12/r31 | |
| 0 | 804 .set _reg,6 |
| 805 .rept MAX_SAVE_REG+1-6 | |
| 806 lwz _reg,(ppcreg_regs+_reg*4)(r1) | |
| 807 .set _reg,_reg+1 | |
| 808 .endr | |
| 809 | |
| 810 # Here all the registers are loaded except | |
| 811 # r1 = ppcregs | |
| 812 # r3 = ccr | |
| 813 # r4 = srr0 = pc | |
| 814 # r5 = srr1 = msr | |
| 815 | |
| 816 # We have to disable interrupts while srr0 and | |
| 817 # srr1 are loaded, since another interrupt will | |
| 818 # destroy them. | |
| 819 | |
| 820 mtcr r3 # set ccr | |
| 821 | |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
32
diff
changeset
|
822 lwi r3,CYG_MSR_NO_INTS # do rest with ints disabled |
| 2 | 823 sync |
| 0 | 824 mtmsr r3 |
| 2 | 825 sync |
| 0 | 826 |
| 827 mtsrr0 r4 # load old pc | |
| 828 mtsrr1 r5 # load old msr | |
| 829 | |
| 830 lwz r3,ppcreg_regs+3*4(r1) # load r3 value | |
| 831 lwz r4,ppcreg_regs+4*4(r1) # load r4 value | |
| 832 lwz r5,ppcreg_regs+5*4(r1) # load r5 value | |
| 833 lwz r1,ppcreg_regs+1*4(r1) # restore r1 | |
| 834 | |
| 835 sync # settle things down | |
| 836 isync | |
| 837 rfi # and return | |
| 838 | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
839 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
840 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
841 ##----------------------------------------------------------------------------- |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
842 ## Execute pending DSRs on the interrupt stack with interrupts enabled. |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
843 ## Note: this can only be called from code running on a thread stack |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
844 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
845 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
846 .extern cyg_interrupt_call_pending_DSRs |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
847 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
848 FUNC_START(hal_interrupt_stack_call_pending_DSRs) |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
849 # Disable interrupts |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
850 mfmsr r4 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
851 lis r3,0 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
852 ori r3,r3,0x8000 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
853 andc r5,r4,r3 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
854 mtmsr r5 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
855 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
856 # Change to interrupt stack |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
857 mr r3,sp |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
858 lwi sp,__interrupt_stack |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
859 stwu r3,-4(sp) # store old stackptr on stack |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
860 mflr r3 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
861 stwu r3,-4(sp) # store lr on stack |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
862 stwu r4,-4(sp) # store msr values on stack |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
863 stwu r5,-4(sp) |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
864 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
865 # Set up stack for calls to C code. |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
866 subi sp,sp,12 # make space on stack |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
867 li r0,0 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
868 stw r0,0(sp) # clear back chain |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
869 stw r0,8(sp) # zero return pc |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
870 stwu sp,-ppc_stack_frame_size(sp) # create new stack frame |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
871 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
872 # Restore interrupt state |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
873 mtmsr r4 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
874 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
875 # Call into kernel which will execute DSRs |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
876 bl cyg_interrupt_call_pending_DSRs |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
877 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
878 # Unwind stack and get msr values |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
879 lwzu r5,12+ppc_stack_frame_size(sp) |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
880 lwz r4,4(sp) |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
881 lwz r3,8(sp) |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
882 mtlr r3 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
883 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
884 # Disable interrupts |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
885 mtmsr r5 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
886 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
887 # Restore original stack pointer, original interrupt state and return |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
888 lwz sp,12(sp) |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
889 mtmsr r4 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
890 |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
891 blr |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
892 #endif |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
893 |
| 2 | 894 #--------------------------------------------------------------------------- |
| 895 # Code for putting the CPU in a post-reset state; disabling MMU and caches. | |
| 896 _init_CPU: | |
|
68
f74b2666b30d
Merge from eCos master repository on 2000-02-04-07:47:04-GMT
jlarmour
parents:
66
diff
changeset
|
897 #ifdef CYGPKG_HAL_POWERPC_MPC8xx |
| 2 | 898 lwi r3,CYGARC_REG_DC_CMD_CD |
| 899 sync | |
| 900 mtspr CYGARC_REG_DC_CST,r3 | |
| 901 lwi r3,CYGARC_REG_IC_CMD_CD | |
| 902 isync | |
| 903 mtspr CYGARC_REG_IC_CST,r3 | |
| 904 isync | |
| 905 #endif | |
| 906 | |
| 907 # Set up MSR (disable MMU for now) | |
| 908 lwi r3,(CYG_MSR & ~(MSR_IR | MSR_DR)) | |
| 909 sync | |
| 910 mtmsr r3 | |
| 911 sync | |
| 912 blr | |
| 913 | |
| 914 #--------------------------------------------------------------------------- | |
| 0 | 915 # This table contains a VSR pointer for each defined exception. |
| 916 # All of these except 5 and 9 point to the __default_exception_vsr | |
| 917 # above, 5 and 9 point to the __default_interrupt_vsr. Entries in | |
| 918 # this table may be changed using Cyg_Interrupt::set_vsr(). | |
| 919 | |
| 920 .data | |
| 921 | |
| 922 .globl hal_vsr_table | |
| 923 hal_vsr_table: | |
| 924 # Architecture defined vectors | |
| 925 .long __default_exception_vsr # reserved | |
| 926 .long __default_exception_vsr # system reset | |
| 927 .long __default_exception_vsr # machine check | |
| 928 .long __default_exception_vsr # data storage | |
| 929 .long __default_exception_vsr # instruction storage | |
| 930 | |
| 931 .long __default_interrupt_vsr # external interrupt | |
| 932 | |
| 933 .long __default_exception_vsr # alignment | |
| 934 .long __default_exception_vsr # program | |
| 935 .long __default_exception_vsr # floating point unavailable | |
| 936 | |
| 937 .long __default_interrupt_vsr # decrementer | |
| 938 | |
| 939 .long __default_exception_vsr # reserved 0x0a00 | |
| 940 .long __default_exception_vsr # reserved 0x0b00 | |
| 941 .long __default_exception_vsr # system call | |
| 942 .long __default_exception_vsr # trace | |
| 943 .long __default_exception_vsr # floating point assist | |
| 944 .long __default_exception_vsr # reserved 0x0f00 | |
| 945 | |
|
68
f74b2666b30d
Merge from eCos master repository on 2000-02-04-07:47:04-GMT
jlarmour
parents:
66
diff
changeset
|
946 #ifdef CYGPKG_HAL_POWERPC_MPC8xx |
| 0 | 947 |
| 948 # Implementation defined vectors | |
| 949 .long __default_exception_vsr # software emulation | |
| 950 .long __default_exception_vsr # instruction TLB miss | |
| 951 .long __default_exception_vsr # data TLB miss | |
| 952 .long __default_exception_vsr # instruction TLB error | |
| 953 .long __default_exception_vsr # data TLB error | |
| 954 .long __default_exception_vsr # reserved 0x1500 | |
| 955 .long __default_exception_vsr # reserved 0x1600 | |
| 956 .long __default_exception_vsr # reserved 0x1700 | |
| 957 .long __default_exception_vsr # reserved 0x1800 | |
| 958 .long __default_exception_vsr # reserved 0x1900 | |
| 959 .long __default_exception_vsr # reserved 0x1a00 | |
| 960 .long __default_exception_vsr # reserved 0x1b00 | |
| 961 .long __default_exception_vsr # data breakpoint | |
| 962 .long __default_exception_vsr # instruction breakpoint | |
| 963 .long __default_exception_vsr # peripheral breakpoint | |
| 964 .long __default_exception_vsr # non maskable development port | |
| 965 #endif | |
| 966 | |
| 2 | 967 #--------------------------------------------------------------------------- |
| 0 | 968 # Interrupt vector tables. |
| 969 # These tables contain the isr, data and object pointers used to deliver | |
| 970 # interrupts to user code. | |
| 2 | 971 |
| 972 #if (CYG_ISR_TABLE_SIZE > 2) | |
| 0 | 973 .data |
| 2 | 974 #else |
| 975 .section ".sdata","aw" | |
| 976 #endif | |
| 0 | 977 |
|
14
01ce82f3e11a
Merge from eCos master repository on 1999-06-11-17:05:41-BST
jlarmour
parents:
10
diff
changeset
|
978 .extern hal_default_decrementer_isr |
| 0 | 979 .extern hal_default_isr |
| 980 | |
| 981 .globl hal_interrupt_handlers | |
| 982 hal_interrupt_handlers: | |
|
14
01ce82f3e11a
Merge from eCos master repository on 1999-06-11-17:05:41-BST
jlarmour
parents:
10
diff
changeset
|
983 .long hal_default_decrementer_isr |
|
01ce82f3e11a
Merge from eCos master repository on 1999-06-11-17:05:41-BST
jlarmour
parents:
10
diff
changeset
|
984 .rept CYG_ISR_TABLE_SIZE-1 |
| 0 | 985 .long hal_default_isr |
| 986 .endr | |
| 987 | |
| 988 .globl hal_interrupt_data | |
| 989 hal_interrupt_data: | |
| 2 | 990 .rept CYG_ISR_TABLE_SIZE |
| 0 | 991 .long 0 |
| 992 .endr | |
| 993 | |
| 994 .globl hal_interrupt_objects | |
| 995 hal_interrupt_objects: | |
| 2 | 996 .rept CYG_ISR_TABLE_SIZE |
| 0 | 997 .long 0 |
| 998 .endr | |
| 999 | |
| 2 | 1000 #--------------------------------------------------------------------------- |
| 0 | 1001 ## Temporary interrupt stack |
| 1002 | |
| 1003 .section ".bss" | |
| 1004 | |
| 1005 .balign 16 | |
|
8
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
1006 .global cyg_interrupt_stack_base |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
1007 cyg_interrupt_stack_base: |
| 0 | 1008 __interrupt_stack_base: |
| 1009 .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE | |
| 1010 .byte 0 | |
| 1011 .endr | |
| 1012 .balign 16 | |
|
8
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
1013 .global cyg_interrupt_stack |
|
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
2
diff
changeset
|
1014 cyg_interrupt_stack: |
| 0 | 1015 __interrupt_stack: |
| 1016 | |
| 1017 .long 0,0,0,0,0,0,0,0 | |
| 1018 | |
| 2 | 1019 #--------------------------------------------------------------------------- |
| 0 | 1020 # end of vectors.S |
