Mercurial > ecos
annotate packages/hal/arm/arch/current/src/vectors.S @ 3292:7f8e529b4d82 default tip
Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
| author | vae |
|---|---|
| date | Wed, 29 Apr 2015 23:31:48 +0000 |
| parents | afb59e9b7339 |
| children |
| rev | line source |
|---|---|
| 2 | 1 // #======================================================================== |
| 2 // # | |
| 3 // # vectors.S | |
| 4 // # | |
| 5 // # ARM exception vectors | |
| 6 // # | |
| 7 // #======================================================================== | |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
8 // ####ECOSGPLCOPYRIGHTBEGIN#### |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
9 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
10 // This file is part of eCos, the Embedded Configurable Operating System. |
|
2800
a501465abec6
* src/vectors.S: Use .type xxx, function everywhere where
jlarmour
parents:
2775
diff
changeset
|
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2009 Free Software Foundation, Inc. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
12 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
13 // eCos is free software; you can redistribute it and/or modify it under |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
14 // the terms of the GNU General Public License as published by the Free |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
15 // Software Foundation; either version 2 or (at your option) any later |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
16 // version. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
17 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
18 // eCos is distributed in the hope that it will be useful, but WITHOUT |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
21 // for more details. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
22 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
23 // You should have received a copy of the GNU General Public License |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
24 // along with eCos; if not, write to the Free Software Foundation, Inc., |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
26 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
27 // As a special exception, if other files instantiate templates or use |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
28 // macros or inline functions from this file, or you compile this file |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
29 // and link it with other works to produce a work based on this file, |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
30 // this file does not by itself cause the resulting work to be covered by |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
31 // the GNU General Public License. However the source code for this file |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
32 // must still be made available in accordance with section (3) of the GNU |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
33 // General Public License v2. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
34 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
35 // This exception does not invalidate any other reasons why a work based |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
36 // on this file might be covered by the GNU General Public License. |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
37 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2594
diff
changeset
|
38 // ####ECOSGPLCOPYRIGHTEND#### |
| 2 | 39 // #======================================================================== |
| 40 // ######DESCRIPTIONBEGIN#### | |
| 41 // # | |
| 42 // # Author(s): nickg, gthomas | |
| 43 // # Contributors: nickg, gthomas | |
| 44 // # Date: 1999-02-20 | |
| 45 // # Purpose: ARM exception vectors | |
| 46 // # Description: This file defines the code placed into the exception | |
| 47 // # vectors. It also contains the first level default VSRs | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
48 // # that save and restore state for both exceptions and |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
49 // # interrupts. |
| 2 | 50 // # |
| 51 // #####DESCRIPTIONEND#### | |
| 52 // # | |
| 53 // #======================================================================== | |
| 54 | |
| 55 #include <pkgconf/hal.h> | |
| 56 #include <pkgconf/hal_arm.h> | |
| 57 #ifdef CYGPKG_KERNEL // no CDL yet | |
| 58 #include <pkgconf/kernel.h> | |
| 59 #else | |
| 60 # undef CYGFUN_HAL_COMMON_KERNEL_SUPPORT | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
4
diff
changeset
|
61 # undef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
| 2 | 62 #endif |
| 63 #include <cyg/hal/hal_platform_setup.h> | |
| 64 | |
| 65 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS | |
| 66 // The CDL should enforce this | |
| 67 #undef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS | |
| 68 #endif | |
| 69 | |
| 70 #include "arm.inc" | |
| 71 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
72 #ifdef __thumb__ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
73 // Switch to thumb mode |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
74 #define THUMB_MODE(_r_, _l_) \ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
75 ldr _r_,=_l_ ## f+1 ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
76 bx _r_ ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
77 .pool ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
78 .code 16 ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
79 .thumb_func ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
80 _l_: |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
81 |
|
1334
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
82 // Call thumb function from ARM mode, return to ARM |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
83 // mode afterwards |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
84 #define THUMB_CALL(_r_, _l_, _f_) \ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
85 ldr _r_,=_f_+1 ;\ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
86 mov lr,pc ;\ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
87 bx _r_ ;\ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
88 .pool ;\ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
89 .code 16 ;\ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
90 .thumb_func ;\ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
91 ldr _r_,=_l_ ## f ;\ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
92 bx _r_ ;\ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
93 .pool ;\ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
94 .code 32 ;\ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
95 _l_: |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
96 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
97 // Switch to ARM mode |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
98 #define ARM_MODE(_r_, _l_) \ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
99 ldr _r_,=_l_ ## f ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
100 bx _r_ ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
101 .pool ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
102 .code 32 ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
103 _l_: |
| 2 | 104 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
105 // Function definition, start executing body in ARM mode |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
106 #define FUNC_START_ARM(_name_, _r_) \ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
107 .code 16 ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
108 .thumb_func ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
109 .globl _name_ ;\ |
|
2800
a501465abec6
* src/vectors.S: Use .type xxx, function everywhere where
jlarmour
parents:
2775
diff
changeset
|
110 .type _name_, function ;\ |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
111 _name_: ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
112 ldr _r_,=_name_ ## _ARM ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
113 bx _r_ ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
114 .code 32 ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
115 _name_ ## _ARM: |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
116 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
117 #else |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
118 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
119 // Switch to thumb mode |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
120 #define THUMB_MODE(_r_, _l_) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
121 |
|
1334
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
122 // Call ARM function |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
123 #define THUMB_CALL(_r_, _l_, _f_) \ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
124 bl _f_ |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
125 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
126 // Switch to ARM mode |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
127 #define ARM_MODE(_r_, _l_) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
128 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
129 // Function definition, start executing body in ARM mode |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
130 #define FUNC_START_ARM(_name_, _r_) \ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
131 .globl _name_; \ |
|
2800
a501465abec6
* src/vectors.S: Use .type xxx, function everywhere where
jlarmour
parents:
2775
diff
changeset
|
132 .type _name_, function ;\ |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
133 _name_: |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
134 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
135 #endif |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
136 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
137 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
138 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
139 #define PTR(name) \ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
140 .##name: .word name |
| 2 | 141 |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
142 // CYGHWR_HAL_ROM_VADDR is used when compiling for a different location |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
143 // from the base of ROM. hal_platform_setup.h might define it. For |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
144 // example, if flash is from 0x50000000 upwards (as on SA11x0), and we are |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
145 // to execute at 0x50040000, then we want the reset vector to point to |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
146 // 0x0004pqrs - the unmapped ROM address of the code - rather than |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
147 // 0x0000pqrs, which is the offset into our flash block. |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
148 // |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
149 // But usually it's not defined, so the behaviour is the obvious. |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
150 |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
151 #ifndef UNMAPPED |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
152 #ifdef CYGHWR_HAL_ARM_HAS_MMU |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
153 # ifndef CYGHWR_HAL_ROM_VADDR |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
154 # define CYGHWR_HAL_ROM_VADDR __exception_handlers |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
155 # endif |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
156 # define UNMAPPED(x) ((x)-CYGHWR_HAL_ROM_VADDR) |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
157 #else |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
158 # define UNMAPPED(x) (x) |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
159 #endif |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
160 #endif |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
161 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
162 #define UNMAPPED_PTR(name) \ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
163 .##name: .word UNMAPPED(name) |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
164 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
165 // .file "vectors.S" |
| 2 | 166 |
|
50
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
167 |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
168 // CYGHWR_LED_MACRO can be defined in hal_platform_setup.h. It's free to |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
169 // use r0+r1. Argument is in "\x" - cannot use macro arguments since the |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
170 // macro may contain #-chars and use of arguments cause these to be |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
171 // interpreted as CPP stringify operators. |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
172 // See example in PID hal_platform_setup.h. |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
173 #ifndef CYGHWR_LED_MACRO |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
174 #define CYGHWR_LED_MACRO |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
175 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
176 |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
177 .macro LED x |
|
50
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
178 CYGHWR_LED_MACRO |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
179 .endm |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
180 |
| 2 | 181 |
| 182 //========================================================================== | |
| 183 // Hardware exception vectors. | |
|
2594
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
184 // This entire section will be copied to the vector table base (by default at |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
185 // location 0x0000) at startup time. |
| 2 | 186 // |
|
2594
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
187 |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
188 #ifndef CYGHWR_HAL_VECTOR_TABLE_BASE |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
189 # define CYGHWR_HAL_VECTOR_TABLE_BASE 0x0 |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
190 #endif /* ifdef CYGHWR_HAL_VECTOR_TABLE_BASE */ |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
191 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
192 .code 32 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
193 .section ".vectors","ax" |
|
160
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
194 |
|
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
195 // This macro allows platforms to add their own code at the very start of |
|
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
196 // the image. This may be required in some circumstances where eCos ROM |
|
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
197 // based code does not run immediately upon reset and/or when some sort of |
|
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
198 // special header is required at the start of the image. |
|
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
199 #ifdef PLATFORM_PREAMBLE |
|
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
200 PLATFORM_PREAMBLE |
|
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
201 #endif |
|
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
202 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
203 .global __exception_handlers |
| 2 | 204 __exception_handlers: |
|
159
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
158
diff
changeset
|
205 #ifdef CYGSEM_HAL_ROM_RESET_USES_JUMP |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
206 // Assumption: ROM code has these vectors at the hardware reset address. |
|
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
207 // A simple jump removes any address-space dependencies [i.e. safer] |
|
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
208 b reset_vector // 0x00 |
|
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
209 #else |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
210 ldr pc,.reset_vector // 0x00 |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
211 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
212 ldr pc,.undefined_instruction // 0x04 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
213 ldr pc,.software_interrupt // 0x08 start && software int |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
214 ldr pc,.abort_prefetch // 0x0C |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
215 ldr pc,.abort_data // 0x10 |
|
2363
f0b2da61ab63
Fix for boot vectors on LPC2xxx platforms - on behalf of Sergei Gavrikov and Wang Cui
gthomas
parents:
2126
diff
changeset
|
216 #ifdef CYGNUM_HAL_ARM_VECTOR_0x14 |
|
f0b2da61ab63
Fix for boot vectors on LPC2xxx platforms - on behalf of Sergei Gavrikov and Wang Cui
gthomas
parents:
2126
diff
changeset
|
217 .word CYGNUM_HAL_ARM_VECTOR_0x14 |
|
f0b2da61ab63
Fix for boot vectors on LPC2xxx platforms - on behalf of Sergei Gavrikov and Wang Cui
gthomas
parents:
2126
diff
changeset
|
218 #else |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
219 .word 0 // unused |
|
2363
f0b2da61ab63
Fix for boot vectors on LPC2xxx platforms - on behalf of Sergei Gavrikov and Wang Cui
gthomas
parents:
2126
diff
changeset
|
220 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
221 ldr pc,.IRQ // 0x18 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
222 ldr pc,.FIQ // 0x1C |
| 2 | 223 |
| 224 // The layout of these pointers should match the vector table above since | |
| 225 // they are copied in pairs. | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
226 .global vectors |
| 2 | 227 vectors: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
228 UNMAPPED_PTR(reset_vector) // 0x20 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
229 PTR(undefined_instruction) // 0x24 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
230 PTR(software_interrupt) // 0x28 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
231 PTR(abort_prefetch) // 0x2C |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
232 PTR(abort_data) // 0x30 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
233 .word 0 // 0x34 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
234 PTR(IRQ) // 0x38 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
235 PTR(FIQ) // 0x3c |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
236 #ifdef CYGSEM_HAL_ARM_PID_ANGEL_BOOT |
|
26
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
24
diff
changeset
|
237 PTR(start) // This is copied to 0x28 for bootup // 0x40 |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
238 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
239 // location 0x40 is used for storing DRAM size if known |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
240 // for some platforms. |
|
103
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
241 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
242 // |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
243 // "Vectors" - fixed location data items |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
244 // This section contains any data which might be shared between |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
245 // an eCos application and any other environment, e.g. the debug |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
246 // ROM. |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
247 // |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
248 .section ".fixed_vectors" |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
249 // Interrupt/exception VSR pointers |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
250 .globl hal_vsr_table |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
251 hal_vsr_table: |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
252 .rept 8 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
253 .long 0 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
254 .endr |
| 2 | 255 |
|
103
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
256 .globl hal_dram_size |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
257 hal_dram_size: |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
145
diff
changeset
|
258 .long 0 |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
145
diff
changeset
|
259 // what, if anything, hal_dram_type means is up to the platform |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
145
diff
changeset
|
260 .globl hal_dram_type |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
145
diff
changeset
|
261 hal_dram_type: |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
145
diff
changeset
|
262 .long 0 |
|
103
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
263 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
264 .balign 16 |
|
110
84e4bde58b26
Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents:
108
diff
changeset
|
265 #ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT |
|
84e4bde58b26
Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents:
108
diff
changeset
|
266 // Vectors used to communicate between eCos and ROM environments |
|
103
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
267 .globl hal_virtual_vector_table |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
268 hal_virtual_vector_table: |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
269 .rept CYGNUM_CALL_IF_TABLE_SIZE |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
270 .long 0 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
271 .endr |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
272 #endif |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
273 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
274 #ifdef CYGHWR_HAL_ARM_ICE_THREAD_SUPPORT |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
275 .balign 16 // Should be at 0x50 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
276 ice_thread_vector: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
277 .long 0 // Must be 'MICE' |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
278 .long 0 // Pointer to thread support vector |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
279 .long 0 // eCos executing flag |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
280 .long 0 // Must be 'GDB ' |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
281 #endif // CYGHWR_HAL_ARM_ICE_THREAD_SUPPORT |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
282 .balign 32 |
|
96
b15c60e34c84
Merge from eCos master repository on 2000-06-06-05:24:42-BST
jlarmour
parents:
80
diff
changeset
|
283 |
|
b15c60e34c84
Merge from eCos master repository on 2000-06-06-05:24:42-BST
jlarmour
parents:
80
diff
changeset
|
284 // Other vectors - this may include "fixed" locations |
|
b15c60e34c84
Merge from eCos master repository on 2000-06-06-05:24:42-BST
jlarmour
parents:
80
diff
changeset
|
285 #ifdef PLATFORM_VECTORS |
|
b15c60e34c84
Merge from eCos master repository on 2000-06-06-05:24:42-BST
jlarmour
parents:
80
diff
changeset
|
286 PLATFORM_VECTORS |
|
b15c60e34c84
Merge from eCos master repository on 2000-06-06-05:24:42-BST
jlarmour
parents:
80
diff
changeset
|
287 #endif |
|
b15c60e34c84
Merge from eCos master repository on 2000-06-06-05:24:42-BST
jlarmour
parents:
80
diff
changeset
|
288 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
289 .text |
| 2 | 290 // Startup code which will get the machine into supervisor mode |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
291 .global reset_vector |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
292 .type reset_vector,function |
| 2 | 293 reset_vector: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
294 PLATFORM_SETUP1 // Early stage platform initialization |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
295 // which can set DRAM size at 0x40 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
296 // see <cyg/hal/hal_platform_setup.h> |
|
4
1d7f19c9e4d1
Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents:
2
diff
changeset
|
297 |
|
54
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
298 // Come here to reset board |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
299 warm_reset: |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
300 |
| 2 | 301 #if defined(CYG_HAL_STARTUP_RAM) && \ |
| 302 !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
303 mrs r7,cpsr // move back to IRQ mode |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
304 and r7,r7,#CPSR_MODE_BITS |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
305 cmp r7,#CPSR_SUPERVISOR_MODE |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
306 beq start |
| 2 | 307 #endif |
| 308 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
309 // We cannot access any LED registers until after PLATFORM_SETUP1 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
310 LED 7 |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
311 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
312 mov r0,#0 // move vectors |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
313 ldr r1,=__exception_handlers |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
314 #ifndef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
315 // Wait with this if stubs are included (see further down). |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
316 ldr r2,[r1,#0x04] // undefined instruction |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
317 str r2,[r0,#0x04] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
318 ldr r2,[r1,#0x24] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
319 str r2,[r0,#0x24] |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
320 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
321 ldr r2,[r1,#0x08] // software interrupt |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
322 str r2,[r0,#0x08] |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
40
diff
changeset
|
323 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
324 #ifdef CYGHWR_HAL_ARM_ICE_THREAD_SUPPORT |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
325 ldr r2,=ice_thread_vector |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
326 sub r2,r2,r1 // compute fixed (low memory) address |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
327 ldr r3,=0x4D494345 // 'MICE' |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
328 str r3,[r2],#4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
329 ldr r3,=hal_arm_ice_thread_handler |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
330 str r3,[r2],#4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
331 mov r3,#1 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
332 str r3,[r2],#4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
333 ldr r3,=0x47444220 // 'GDB ' |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
334 str r3,[r2],#4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
335 #endif // CYGHWR_HAL_ARM_ICE_THREAD_SUPPORT |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
40
diff
changeset
|
336 |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
337 #if defined(CYGSEM_HAL_ARM_PID_ANGEL_BOOT) |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
338 // Ugly hack to get into supervisor mode |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
339 ldr r2,[r1,#0x40] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
340 str r2,[r0,#0x28] |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
341 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
342 LED 6 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
343 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
344 swi // switch to supervisor mode |
|
14
01ce82f3e11a
Merge from eCos master repository on 1999-06-11-17:05:41-BST
jlarmour
parents:
10
diff
changeset
|
345 #endif |
| 2 | 346 |
| 347 // ========================================================================= | |
| 348 // Real startup code. We jump here from the reset vector to set up the world. | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
349 .globl start |
|
2800
a501465abec6
* src/vectors.S: Use .type xxx, function everywhere where
jlarmour
parents:
2775
diff
changeset
|
350 .type start,function |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
351 start: |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
352 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
353 LED 5 |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
354 |
| 2 | 355 #if defined(CYG_HAL_STARTUP_RAM) && \ |
| 356 !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) | |
| 357 // If we get restarted, hang here to avoid corrupting memory | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
358 ldr r0,.init_flag |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
359 ldr r1,[r0] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
360 1: cmp r1,#0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
361 bne 1b |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
362 ldr r1,init_done |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
363 str r1,[r0] |
| 2 | 364 #endif |
| 365 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
366 // Reset software interrupt pointer |
|
2594
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
367 ldr r0,=CYGHWR_HAL_VECTOR_TABLE_BASE // move vectors |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
368 ldr r1,.__exception_handlers |
| 2 | 369 #if defined(CYG_HAL_STARTUP_RAM) && \ |
| 370 !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
371 cmp r7,#CPSR_SUPERVISOR_MODE |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
372 beq 10f |
| 2 | 373 #endif |
|
2594
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
374 ldr r2,[r1,#HAL_ARM_SWI_VECTOR_ADDR] // software interrupt |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
375 str r2,[r0,#HAL_ARM_SWI_VECTOR_ADDR] |
| 2 | 376 10: |
|
2594
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
377 ldr r2,[r1,#HAL_ARM_IRQ_VECTOR] // IRQ |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
378 str r2,[r0,#HAL_ARM_IRQ_VECTOR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
379 ldr r2,[r1,#HAL_ARM_IRQ_VECTOR_ADDR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
380 str r2,[r0,#HAL_ARM_IRQ_VECTOR_ADDR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
381 ldr r2,[r1,#HAL_ARM_FIQ_VECTOR] // FIQ |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
382 str r2,[r0,#HAL_ARM_FIQ_VECTOR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
383 ldr r2,[r1,#HAL_ARM_FIQ_VECTOR_ADDR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
384 str r2,[r0,#HAL_ARM_FIQ_VECTOR_ADDR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
385 ldr r2,[r1,#HAL_ARM_PREFETCH_VECTOR] // abort (prefetch) |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
386 str r2,[r0,#HAL_ARM_PREFETCH_VECTOR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
387 ldr r2,[r1,#HAL_ARM_PREFETCH_VECTOR_ADDR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
388 str r2,[r0,#HAL_ARM_PREFETCH_VECTOR_ADDR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
389 ldr r2,[r1,#HAL_ARM_ABORT_VECTOR] // abort (data) |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
390 str r2,[r0,#HAL_ARM_ABORT_VECTOR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
391 ldr r2,[r1,#HAL_ARM_ABORT_VECTOR_ADDR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
392 str r2,[r0,#HAL_ARM_ABORT_VECTOR_ADDR] |
| 2 | 393 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
394 LED 4 |
|
50
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
395 |
|
172
cd45958b28ff
Merge from eCos master repository on 2001-07-20-10:24:43-BST
jlarmour
parents:
161
diff
changeset
|
396 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM) |
|
54
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
397 // Set up reset vector |
|
2594
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
398 ldr r0,=CYGHWR_HAL_VECTOR_TABLE_BASE |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
112
diff
changeset
|
399 ldr r1,.__exception_handlers |
|
2594
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
400 # ifndef CYGSEM_HAL_KEEP_RESET_VECTOR |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
401 ldr r2,[r1,#HAL_ARM_RESET_VECTOR] // reset vector instruction |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
402 str r2,[r0,#HAL_ARM_RESET_VECTOR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
403 # ifndef CYGSEM_HAL_ROM_RESET_USES_JUMP // if using jump, reset vector address is not referenced |
|
54
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
404 ldr r2,=warm_reset |
|
2594
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
405 str r2,[r0,#HAL_ARM_RESET_VECTOR_ADDR] |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
406 # endif |
|
4ca9d5dac8b0
* src/arm.ld: Discard C++ EH-related sections when we can't
jlarmour
parents:
2363
diff
changeset
|
407 # endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
408 // Relocate [copy] data from ROM to RAM |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
409 ldr r3,.__rom_data_start |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
410 ldr r4,.__ram_data_start |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
411 ldr r5,.__ram_data_end |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
412 cmp r4,r5 // jump if no data to move |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
413 beq 2f |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
414 sub r3,r3,#4 // loop adjustments |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
415 sub r4,r4,#4 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
416 1: ldr r0,[r3,#4]! // copy info |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
417 str r0,[r4,#4]! |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
418 cmp r4,r5 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
419 bne 1b |
| 2 | 420 2: |
| 421 #endif | |
| 422 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
423 // initialize interrupt/exception environments |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
424 ldr sp,.__startup_stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
425 mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_IRQ_MODE) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
426 msr cpsr,r0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
427 ldr sp,.__exception_stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
428 mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_UNDEF_MODE) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
429 msr cpsr,r0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
430 ldr sp,.__exception_stack |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
431 #ifndef CYGOPT_HAL_ARM_FIQ_DISABLE |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
432 mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_FIQ_MODE) |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
433 msr cpsr,r0 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
434 ldr sp,.__fiq_stack |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
435 #endif |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
436 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
437 // initialize CPSR (machine state register) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
438 mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_SUPERVISOR_MODE) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
439 msr cpsr,r0 |
| 2 | 440 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
441 // Note: some functions in LIBGCC1 will cause a "restore from SPSR"!! |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
442 msr spsr,r0 |
| 2 | 443 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
444 // initialize stack |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
445 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
446 // use interrupt stack for system initialization since it's bigger |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
447 // than the "startup" stack in this configuration |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
448 ldr sp,.__interrupt_stack |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
449 #else |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
450 ldr sp,.__startup_stack |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
451 #endif |
| 2 | 452 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
453 // clear BSS |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
454 ldr r1,.__bss_start |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
455 ldr r2,.__bss_end |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
456 mov r0,#0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
457 cmp r1,r2 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
458 beq 2f |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
459 1: str r0,[r1],#4 |
| 2775 | 460 cmp r2,r1 |
| 461 bhi 1b | |
| 2 | 462 2: |
| 463 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
464 // Run kernel + application in THUMB mode |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
465 THUMB_MODE(r1,10) |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
466 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
467 LED 3 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
468 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
469 // Call platform specific hardware initialization |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
470 bl hal_hardware_init |
| 2 | 471 |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
472 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
473 bl initialize_stub |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
474 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
475 // Now that stub is initialized, change vector. It is possible |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
476 // to single-step through most of the init code, except the below. |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
477 // Put a breakpoint at the call to cyg_hal_invoke_constructors to |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
478 // pass over this bit (s-s depends on internal state in the stub). |
|
50
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
479 #endif |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
480 |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
481 #if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) || \ |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
482 defined(CYGIMP_HAL_PROCESS_ALL_EXCEPTIONS) |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
483 mov r0,#0 // move vectors |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
484 ldr r1,=__exception_handlers |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
485 ldr r2,[r1,#0x04] // undefined instruction |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
486 str r2,[r0,#0x04] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
487 ldr r2,[r1,#0x24] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
488 str r2,[r0,#0x24] |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
489 #endif |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
110
diff
changeset
|
490 |
|
103
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
491 #if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \ |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
492 || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT) |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
493 .extern hal_ctrlc_isr_init |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
494 bl hal_ctrlc_isr_init |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
495 #endif |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
496 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
497 LED 2 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
498 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
499 // Run through static constructors |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
500 bl cyg_hal_invoke_constructors |
| 2 | 501 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
502 LED 1 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
503 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
504 // This starts up the eCos kernel |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
505 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
|
946
b4d06891fe1a
Fix a thumb build problem, and switch to arm-elf-gcc -mthumb rather
bartv
parents:
316
diff
changeset
|
506 ldr r1,=__startup_stack |
|
b4d06891fe1a
Fix a thumb build problem, and switch to arm-elf-gcc -mthumb rather
bartv
parents:
316
diff
changeset
|
507 mov sp,r1 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
508 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
509 bl cyg_start |
| 2 | 510 _start_hang: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
511 b _start_hang |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
512 .code 32 |
|
54
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
513 |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
514 .global reset_platform |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
515 .type reset_platform,function |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
516 reset_platform: |
|
70
c5536bad4c24
Merge from eCos master repository on 2000-02-11-15:46:40-GMT
jlarmour
parents:
66
diff
changeset
|
517 #ifdef CYGSEM_HAL_ROM_MONITOR |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
518 // initialize CPSR (machine state register) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
519 mov r0,#(CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE|CPSR_SUPERVISOR_MODE) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
520 msr cpsr,r0 |
|
54
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
521 b warm_reset |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
522 #else |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
523 mov r0,#0 |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
524 mov pc,r0 // Jump to reset vector |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
525 #endif |
| 2 | 526 |
| 527 init_done: | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
528 .long 0xDEADB00B |
| 2 | 529 |
| 530 // | |
| 531 // Exception handlers | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
532 // Assumption: get here from a non-user context [mode] |
| 1002 | 533 // except in case of standalone app. running in user mode |
| 534 // (CYGOPT_HAL_ARM_WITH_USER_MODE should have been defined) | |
| 2 | 535 // |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
536 .code 32 |
| 2 | 537 undefined_instruction: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
538 ldr sp,.__undef_exception_stack // get good stack |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
539 stmfd sp!,{r0-r5} // save some supervisor regs |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
540 mrs r1,spsr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
541 tst r1,#CPSR_THUMB_ENABLE |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
542 subeq r0,lr,#4 // PC at time of interrupt (ARM) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
543 subne r0,lr,#2 // PC at time of interrupt (thumb) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
544 mov r2,#CYGNUM_HAL_EXCEPTION_ILLEGAL_INSTRUCTION |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
545 mov r3,sp |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
546 b call_exception_handler |
| 2 | 547 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
548 .code 32 |
| 2 | 549 software_interrupt: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
550 stmfd sp!,{r8} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
551 ldr r8,.__undef_exception_stack // get good stack |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
552 stmfd r8!,{r0-r5} // save some supervisor regs |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
553 mov r3,r8 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
554 ldmfd sp!,{r8} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
555 mrs r1,spsr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
556 tst r1,#CPSR_THUMB_ENABLE |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
557 subeq r0,lr,#4 // PC at time of SWI (ARM) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
558 subne r0,lr,#2 // PC at time of SWI (thumb) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
559 mov r2,#CYGNUM_HAL_EXCEPTION_INTERRUPT |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
560 b call_exception_handler |
| 2 | 561 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
562 .code 32 |
| 2 | 563 abort_prefetch: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
564 ldr sp,.__undef_exception_stack // get good stack |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
565 stmfd sp!,{r0-r5} // save some supervisor regs |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
566 sub r0,lr,#4 // PC at time of interrupt |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
567 mrs r1,spsr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
568 mov r2,#CYGNUM_HAL_EXCEPTION_CODE_ACCESS |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
569 mov r3,sp |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
570 b call_exception_handler |
| 2 | 571 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
572 .code 32 |
| 2 | 573 abort_data: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
574 ldr sp,.__undef_exception_stack // get good stack |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
575 stmfd sp!,{r0-r5} // save some supervisor regs |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
576 sub r0,lr,#4 // PC at time of interrupt |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
577 mrs r1,spsr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
578 mov r2,#CYGNUM_HAL_EXCEPTION_DATA_ACCESS |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
579 mov r3,sp |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
580 b call_exception_handler |
|
20
5f5102441818
Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents:
16
diff
changeset
|
581 |
| 2 | 582 // |
| 583 // Dispatch an exception handler. | |
| 584 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
585 .code 32 |
| 2 | 586 call_exception_handler: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
587 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
588 // On Entry: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
589 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
590 // r4,r5 = scratch |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
591 // r3 = pointer to temp save area |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
592 // r2 = vector number |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
593 // r1 = exception psr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
594 // r0 = exception pc |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
595 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
596 // [r3+20]: exception r5 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
597 // [r3+16]: exception r4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
598 // [r3+12]: exception r3 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
599 // [r3+8] : exception r2 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
600 // [r3+4] : exception r1 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
601 // [r3] : exception r0 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
602 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
603 mrs r4,cpsr // switch to Supervisor Mode |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
604 bic r4,r4,#CPSR_MODE_BITS |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
605 orr r4,r4,#CPSR_SUPERVISOR_MODE |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
606 msr cpsr,r4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
607 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
608 mov r5,sp // save original svc sp |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
609 mov r4,lr // and original svc lr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
610 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
611 // Make sure we use the GDB stack. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
612 ldr sp,.__GDB_stack |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
613 cmp r5,sp // already on GDB stack? |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
614 bhi 10f |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
615 ldr r4,.__GDB_stack_base |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
616 cmp r5,r4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
617 movhi sp,r5 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
618 10: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
619 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
620 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
621 // r5 holds original svc sp, current sp is stack to use |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
622 // r4 holds original svc lr, which must also be preserved |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
623 // |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
624 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
625 stmfd sp!,{r0-r2,r4,r5} // push svc_sp, svc_lr, vector, psr, pc |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
626 |
| 1002 | 627 #ifdef CYGOPT_HAL_ARM_WITH_USER_MODE |
| 628 // did exception occur in user mode ? | |
| 629 and r2, r1, #CPSR_MODE_BITS | |
| 630 cmp r2, #CPSR_USER_MODE | |
| 631 bne 1f | |
| 632 stmfd sp, {r8-r12, sp, lr}^ // get user mode regs | |
| 633 nop | |
| 634 sub sp, sp, #4*7 | |
| 635 bal 2f | |
| 636 1: | |
| 637 #endif | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
638 // switch to pre-exception mode to get banked regs |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
639 mov r0,sp // r0 survives mode switch |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
640 mrs r2,cpsr // Save current psr for return |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
641 orr r1,r1,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE |
| 316 | 642 bic r1,r1,#CPSR_THUMB_ENABLE |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
643 msr cpsr,r1 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
644 stmfd r0!,{r8-r12,sp,lr} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
645 msr cpsr,r2 // back to svc mode |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
646 mov sp,r0 // update stack pointer |
| 1002 | 647 2: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
648 // now save pre-exception r0-r7 on current stack |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
649 ldmfd r3,{r0-r5} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
650 stmfd sp!,{r0-r7} |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
651 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
652 // SP needs fixing if exception occured in SVC mode. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
653 // The original SVC LR is still in place so that |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
654 // does not need to be fixed here. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
655 ldr r1,[sp,#armreg_cpsr] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
656 and r1,r1,#CPSR_MODE_BITS |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
657 cmp r1,#CPSR_SUPERVISOR_MODE |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
658 ldreq r1,[sp,#armreg_svcsp] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
659 streq r1,[sp,#armreg_sp] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
660 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
661 #ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
662 mov r0,sp |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
663 ldr r1,.__dump_procs |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
664 ldr r2,[sp,#armreg_vector] |
|
1307
1750695510ac
Fix exception debug in THUMB mode - from Thomas Koeller
gthomas
parents:
1084
diff
changeset
|
665 ldr r1,[r1,r2,lsl #2] |
|
1750695510ac
Fix exception debug in THUMB mode - from Thomas Koeller
gthomas
parents:
1084
diff
changeset
|
666 THUMB_MODE(r9,10) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
667 mov lr,pc |
|
1307
1750695510ac
Fix exception debug in THUMB mode - from Thomas Koeller
gthomas
parents:
1084
diff
changeset
|
668 mov pc,r1 |
|
1750695510ac
Fix exception debug in THUMB mode - from Thomas Koeller
gthomas
parents:
1084
diff
changeset
|
669 #else |
|
1750695510ac
Fix exception debug in THUMB mode - from Thomas Koeller
gthomas
parents:
1084
diff
changeset
|
670 THUMB_MODE(r9,10) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
671 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
672 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
673 // call exception handler |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
674 mov r0,sp |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
675 bl exception_handler |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
676 |
| 2 | 677 #ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
678 mov r0,sp |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
679 bl cyg_hal_report_exception_handler_returned |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
680 #endif |
| 2 | 681 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
682 ARM_MODE(r1,10) |
| 2 | 683 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
684 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
685 // Return from exception |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
686 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
687 return_from_exception: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
688 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
689 ldr r0,[sp,#armreg_cpsr] |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
690 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
691 // return to supervisor mode is simple |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
692 and r1,r0,#CPSR_MODE_BITS |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
693 cmp r1,#CPSR_SUPERVISOR_MODE |
| 1002 | 694 |
| 695 #ifndef CYGOPT_HAL_ARM_PRESERVE_SVC_SPSR | |
| 696 msr spsr,r0 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
697 ldmeqfd sp,{r0-r14,pc}^ |
| 1002 | 698 #else |
| 699 // we must take care of not corrupting the current (svc) | |
| 700 // spsr which happens to be also the pre-exception spsr | |
| 701 bne 1f | |
| 1084 | 702 tst r0, #CPSR_THUMB_ENABLE |
| 703 | |
| 704 // when returning to thumb/svc mode, there is no easy way to preserve | |
| 705 // spsr. It is possible to do so, but would add a lot of instructions. | |
| 706 // The purpose of CYGOPT_HAL_ARM_PRESERVE_SVC_SPSR is to allow stepping | |
| 707 // through SWI exception handling code, so not preserving spsr in this | |
| 708 // case should be okay. | |
| 709 msrne spsr,r0 | |
| 710 ldmnefd sp,{r0-r14,pc}^ | |
| 711 | |
| 712 // we are returning to arm/svc mode thus we must restore the | |
| 1002 | 713 // pre-exception cpsr before returning to interrupted code |
| 714 msr cpsr, r0 | |
| 715 ldmfd sp, {r0-r14, pc} | |
| 716 1: | |
| 717 // we are not returning to svc mode thus we can safely restore | |
| 718 // svc spsr | |
| 719 msr spsr, r0 | |
| 720 #endif | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
721 |
| 1002 | 722 #ifdef CYGOPT_HAL_ARM_WITH_USER_MODE |
| 723 // are we returning to user mode ? | |
| 724 and r2, r1, #CPSR_MODE_BITS | |
| 725 cmp r2, #CPSR_USER_MODE | |
| 726 add r2, sp, #armreg_r8 | |
| 727 bne 1f | |
| 728 ldmfd r2, {r8-r14}^ // restore user mode regs | |
| 729 nop | |
| 730 bal 2f | |
| 731 1: | |
| 732 #else | |
| 733 add r2, sp, #armreg_r8 | |
| 734 #endif | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
735 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
736 // return to other non-user modes is a little trickier |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
737 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
738 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
739 // switch to pre-exception mode and restore r8-r14 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
740 mrs r1,cpsr |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
741 orr r0,r0,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE |
| 316 | 742 bic r0,r0,#CPSR_THUMB_ENABLE |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
743 msr cpsr,r0 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
744 ldmfd r2,{r8-r14} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
745 msr cpsr, r1 // back to svc mode |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
746 |
| 1002 | 747 2: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
748 // move sp,lr and pc for final load |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
749 ldr r0,[sp,#armreg_svcsp] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
750 str r0,[sp,#armreg_r8] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
751 ldr r0,[sp,#armreg_svclr] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
752 str r0,[sp,#armreg_r9] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
753 ldr r0,[sp,#armreg_pc] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
754 str r0,[sp,#armreg_r10] |
|
38
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
755 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
756 // restore r0-r7,sp,lr and return from exception |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
757 ldmfd sp,{r0-r7,sp,lr,pc}^ |
| 2 | 758 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
759 #ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
760 __dump_procs: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
761 .word 0 // placeholder for reset |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
762 .word cyg_hal_report_undefined_instruction |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
763 .word cyg_hal_report_software_interrupt |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
764 .word cyg_hal_report_abort_prefetch |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
765 .word cyg_hal_report_abort_data |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
766 .word 0 // reserved |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
767 #endif |
| 2 | 768 |
| 769 | |
| 770 // Handle device interrupts | |
| 771 // This is slightly more complicated than the other exception handlers because | |
| 772 // it needs to interface with the kernel (if present). | |
| 1002 | 773 // Assumption: can get here from any mode, including user mode |
| 774 // (spurious interrupt while standalone app. is running in user mode) | |
| 2 | 775 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
776 .code 32 |
|
20
5f5102441818
Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents:
16
diff
changeset
|
777 FIQ: |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
778 #ifndef CYGOPT_HAL_ARM_FIQ_DISABLE |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
779 // If we are not disabling FIQs as part of eCos, these will be under |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
780 // user control. In theory the user should have installed their own |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
781 // FIQ VSR before enabling them and we should never come here. If |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
782 // we do there is nothing eCos itself can do because we are outside |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
783 // the scope of the system. The default action here, then, is to simply |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
784 // mask FIQs and return. |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
785 mrs r8,spsr // CPSR at time of interrupt |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
786 orr r8,r8,#CPSR_FIQ_DISABLE |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
787 msr spsr,r8 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
788 subs pc,lr,#4 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
789 #else |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
790 // We can get here from any non-user mode. |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
791 mrs r8,spsr // CPSR at time of interrupt |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
792 and r9,r8,#CPSR_MODE_BITS // isolate pre-interrupt mode |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
793 cmp r9,#CPSR_IRQ_MODE |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
794 bne 1f |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
795 // If FIQ interrupted IRQ mode, just return with FIQ disabled. |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
796 // The common interrupt handling takes care of the rest. |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
797 orr r8,r8,#CPSR_FIQ_DISABLE |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
798 msr spsr,r8 |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
799 subs pc,lr,#4 |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
800 1: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
801 // If FIQ interrupted other non-user mode, switch to IRQ mode and |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
802 // fall through to IRQ handler. |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
803 ldr sp,.__exception_stack // get good stack to save lr and spsr |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
804 stmdb sp,{r8,lr} |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
805 mov r8,#CPSR_IRQ_MODE|CPSR_FIQ_DISABLE|CPSR_IRQ_DISABLE |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
806 msr cpsr,r8 // switch to IRQ mode |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
807 ldr sp,.__exception_stack // get regs saved in FIQ mode |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
808 ldmdb sp,{sp,lr} |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
809 msr spsr,sp |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
810 |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
811 // now it looks like we got an IRQ instead of an FIQ except that |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
812 // FIQ is disabled so we don't recurse. |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
813 #endif |
| 2 | 814 IRQ: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
815 // Note: I use this exception stack while saving the context because |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
816 // the current SP does not seem to be always valid in this CPU mode. |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
817 ldr sp,.__exception_stack // get good stack |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
818 stmfd sp!,{r0-r5} // save some supervisor regs |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
819 sub r0,lr,#4 // PC at time of interrupt |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
820 mrs r1,spsr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
821 mov r2,#CYGNUM_HAL_VECTOR_IRQ |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
822 mov r3,sp |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
823 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
824 mrs r4,cpsr // switch to Supervisor Mode |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
825 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
826 #ifdef CYGOPT_HAL_ARM_FIQ_DISABLE |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
827 // Due to a small chance of contention with FIQ, |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
828 // we should disable FIQ while still in IRQ mode and then |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
829 // change to SVC mode. This only applies when eCos is masking |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
830 // FIQ alongside IRQ, otherwise FIQs are outside eCos' control |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
831 // and the FIQ to IRQ translation doesn't happen. |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
832 orr r4,r4,#CPSR_FIQ_DISABLE |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
833 msr cpsr,r4 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
834 #endif |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
835 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
836 bic r4,r4,#CPSR_MODE_BITS |
|
2126
0141a9e24d21
* src/vectors.S: disable FIQ in IRQ handler to fix race condition
asl
parents:
1851
diff
changeset
|
837 // When handling an IRQ we must disable FIQ unless the current |
|
0141a9e24d21
* src/vectors.S: disable FIQ in IRQ handler to fix race condition
asl
parents:
1851
diff
changeset
|
838 // mode in CPSR is IRQ. If we were to get a FIQ while in another |
|
0141a9e24d21
* src/vectors.S: disable FIQ in IRQ handler to fix race condition
asl
parents:
1851
diff
changeset
|
839 // mode, the FIQ handling code would transform the FIQ into an |
|
0141a9e24d21
* src/vectors.S: disable FIQ in IRQ handler to fix race condition
asl
parents:
1851
diff
changeset
|
840 // IRQ and call the non-reentrant IRQ handler again. As a result, |
|
0141a9e24d21
* src/vectors.S: disable FIQ in IRQ handler to fix race condition
asl
parents:
1851
diff
changeset
|
841 // for example, the stack pointer would be set to the beginning |
|
0141a9e24d21
* src/vectors.S: disable FIQ in IRQ handler to fix race condition
asl
parents:
1851
diff
changeset
|
842 // of the exception_stack clobbering the registers we have just |
|
0141a9e24d21
* src/vectors.S: disable FIQ in IRQ handler to fix race condition
asl
parents:
1851
diff
changeset
|
843 // saved. |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
844 // However, if we are allowing the user to handle their own |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
845 // FIQs, we don't need to do that, since FIQ will not be |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
846 // translated to IRQ. |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
847 orr r4,r4,#CPSR_SUPERVISOR_MODE|CPSR_INTR_MASK |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
848 msr cpsr,r4 |
|
20
5f5102441818
Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents:
16
diff
changeset
|
849 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
850 mov r5,sp // save original svc sp |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
851 mov r4,lr // save original svc lr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
852 stmfd sp!,{r0-r2,r4,r5} // push svc_sp, svc_lr, vector, psr, pc |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
853 |
| 1002 | 854 #ifdef CYGOPT_HAL_ARM_WITH_USER_MODE |
| 855 // did exception occur in user mode ? | |
| 856 and r2, r1, #CPSR_MODE_BITS | |
| 857 cmp r2, #CPSR_USER_MODE | |
| 858 bne 1f | |
| 859 stmfd sp, {r8-r12, sp, lr}^ // get user mode regs | |
| 860 nop | |
| 861 sub sp, sp, #4*7 | |
| 862 bal 2f | |
| 863 1: | |
| 864 #endif | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
865 // switch to pre-exception mode to get banked regs |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
866 mov r0,sp // r0 survives mode switch |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
867 mrs r2,cpsr // Save current psr for return |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
868 orr r1,r1,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE |
| 316 | 869 bic r1,r1,#CPSR_THUMB_ENABLE |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
870 msr cpsr,r1 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
871 stmfd r0!,{r8-r12,sp,lr} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
872 msr cpsr,r2 // back to svc mode |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
873 mov sp,r0 // update stack pointer |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
874 |
| 1002 | 875 2: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
876 // now save pre-exception r0-r7 on current stack |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
877 ldmfd r3,{r0-r5} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
878 stmfd sp!,{r0-r7} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
879 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
880 // sp needs fixing if exception occured in SVC mode. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
881 ldr r1,[sp,#armreg_cpsr] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
882 and r1,r1,#CPSR_MODE_BITS |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
883 cmp r1,#CPSR_SUPERVISOR_MODE |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
884 ldreq r1,[sp,#armreg_svcsp] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
885 streq r1,[sp,#armreg_sp] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
886 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
887 mov v6,sp // Save pointer to register frame |
| 2 | 888 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
889 // mov r0,sp |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
890 // bl _show_frame_in |
| 2 | 891 |
| 892 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
893 // Switch to interrupt stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
894 ldr r2,.irq_level // current number of nested interrupts |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
895 ldr r0,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
896 add r1,r0,#1 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
897 str r1,[r2] // if was zero, switch stacks |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
898 cmp r0,#0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
899 moveq r1,sp // save old stack pointer |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
900 ldreq sp,.__interrupt_stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
901 stmeqfd sp!,{r1} |
| 2 | 902 10: |
| 903 #endif | |
| 904 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
905 // The entire CPU state is now stashed on the stack, |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
906 // increment the scheduler lock and handle the interrupt |
| 2 | 907 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
908 #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
909 .extern cyg_scheduler_sched_lock |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
910 ldr r3,.cyg_scheduler_sched_lock |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
911 ldr r4,[r3] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
912 add r4,r4,#1 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
913 str r4,[r3] |
| 2 | 914 #endif |
| 915 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
916 THUMB_MODE(r3,10) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
917 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
918 mov r0,v6 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
919 bl hal_IRQ_handler // determine interrupt source |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
920 mov v1,r0 // returned vector # |
| 2 | 921 |
| 922 #if defined(CYGPKG_KERNEL_INSTRUMENT) && \ | |
| 923 defined(CYGDBG_KERNEL_INSTRUMENT_INTR) | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
924 ldr r0,=RAISE_INTR // arg0 = type = INTR,RAISE |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
925 mov r1,v1 // arg1 = vector |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
926 mov r2,#0 // arg2 = 0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
927 bl cyg_instrument // call instrument function |
| 2 | 928 #endif |
| 929 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
930 ARM_MODE(r0,10) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
931 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
932 mov r0,v1 // vector # |
|
103
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
933 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
934 #if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \ |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
935 || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT) |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
936 // If we are supporting Ctrl-C interrupts from GDB, we must squirrel |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
937 // away a pointer to the save interrupt state here so that we can |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
938 // plant a breakpoint at some later time. |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
939 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
940 .extern hal_saved_interrupt_state |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
941 ldr r2,=hal_saved_interrupt_state |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
942 str v6,[r2] |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
943 #endif |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
944 |
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
151
diff
changeset
|
945 cmp r0,#CYGNUM_HAL_INTERRUPT_NONE // spurious interrupt |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
151
diff
changeset
|
946 bne 10f |
|
1334
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
947 |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
948 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
949 // Acknowledge the interrupt |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
950 THUMB_CALL(r1,12,hal_interrupt_acknowledge) |
|
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
951 #else |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
160
diff
changeset
|
952 mov r0,v6 // register frame |
|
1334
8758da1a0278
2003-10-23 Thomas Koeller <thomas.koeller@baslerweb.com>
nickg
parents:
1307
diff
changeset
|
953 THUMB_CALL(r1,12,hal_spurious_IRQ) |
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
151
diff
changeset
|
954 #endif // CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
151
diff
changeset
|
955 b spurious_IRQ |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
151
diff
changeset
|
956 |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
151
diff
changeset
|
957 10: ldr r1,.hal_interrupt_data |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
958 ldr r1,[r1,v1,lsl #2] // handler data |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
959 ldr r2,.hal_interrupt_handlers |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
960 ldr v3,[r2,v1,lsl #2] // handler (indexed by vector #) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
961 mov r2,v6 // register frame (this is necessary |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
962 // for the ISR too, for ^C detection) |
| 2 | 963 |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
964 #ifdef __thumb__ |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
965 ldr lr,=10f |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
966 bx v3 // invoke handler (thumb mode) |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
967 .pool |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
968 .code 16 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
969 .thumb_func |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
970 IRQ_10T: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
971 10: ldr r2,=15f |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
972 bx r2 // switch back to ARM mode |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
973 .pool |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
974 .code 32 |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
975 15: |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
976 IRQ_15A: |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
977 #else |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
978 mov lr,pc // invoke handler (call indirect |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
979 mov pc,v3 // thru v3) |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
980 #endif |
| 2 | 981 |
|
38
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
982 spurious_IRQ: |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
983 |
| 2 | 984 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
985 // If we are returning from the last nested interrupt, move back |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
986 // to the thread stack. interrupt_end() must be called on the |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
987 // thread stack since it potentially causes a context switch. |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
988 ldr r2,.irq_level |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
989 ldr r3,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
990 subs r1,r3,#1 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
991 str r1,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
992 ldreq sp,[sp] // This should be the saved stack pointer |
| 2 | 993 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
994 // The return value from the handler (in r0) will indicate whether a |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
995 // DSR is to be posted. Pass this together with a pointer to the |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
996 // interrupt object we have just used to the interrupt tidy up routine. |
| 2 | 997 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
160
diff
changeset
|
998 // don't run this for spurious interrupts! |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
160
diff
changeset
|
999 cmp v1,#CYGNUM_HAL_INTERRUPT_NONE |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
160
diff
changeset
|
1000 beq 17f |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1001 ldr r1,.hal_interrupt_objects |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1002 ldr r1,[r1,v1,lsl #2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1003 mov r2,v6 // register frame |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1004 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1005 THUMB_MODE(r3,10) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1006 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1007 bl interrupt_end // post any bottom layer handler |
| 2 | 1008 // threads and call scheduler |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
160
diff
changeset
|
1009 ARM_MODE(r1,10) |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
160
diff
changeset
|
1010 17: |
| 2 | 1011 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1012 // mov r0,sp |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1013 // bl show_frame_out |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
1014 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
1015 // return from IRQ is same as return from exception |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
1016 b return_from_exception |
| 2 | 1017 |
| 1018 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
| 1019 // Execute pending DSRs the interrupt stack | |
| 1020 // Note: this can only be called from code running on a thread stack | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1021 FUNC_START_ARM(hal_interrupt_stack_call_pending_DSRs, r1) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1022 stmfd sp!,{r4,r5,lr} |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1023 // Disable interrupts |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1024 mrs r4,cpsr // disable IRQ's |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1025 orr r2,r4,#CPSR_INTR_MASK |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1026 bic r5,r4,#CPSR_INTR_MASK |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1027 msr cpsr,r2 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1028 // Switch to interrupt stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1029 mov r3,sp // save old stack pointer |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1030 ldr sp,.__interrupt_stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1031 stmfd sp!,{r3} // stored at top of interrupt stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1032 ldr r2,.irq_level // current number of nested interrupts |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1033 ldr r3,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1034 add r3,r3,#1 // bump nesting level |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1035 str r3,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1036 msr cpsr,r5 // enable interrupts |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1037 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1038 THUMB_MODE(r1,20) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1039 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1040 bl cyg_interrupt_call_pending_DSRs |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1041 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1042 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1043 ARM_MODE(r1,22) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1044 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1045 // Disable interrupts |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1046 mrs r1,cpsr // disable IRQ's |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1047 orr r2,r1,#CPSR_INTR_MASK |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1048 msr cpsr,r2 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1049 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1050 // Move back to the thread stack. |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1051 ldr r2,.irq_level |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1052 ldr r3,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1053 sub r3,r3,#1 // decrement nesting level |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1054 str r3,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1055 ldr sp,[sp] // This should be the saved stack pointer |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1056 msr cpsr,r4 // restore interrupts to original state |
| 2 | 1057 |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1058 #ifdef __thumb__ |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1059 ldmfd sp!,{r4,r5,lr} // return |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1060 bx lr |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1061 #else |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1062 ldmfd sp!,{r4,r5,pc} // return |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1063 #endif // __thumb__ |
| 2 | 1064 #endif // CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
|
14
01ce82f3e11a
Merge from eCos master repository on 1999-06-11-17:05:41-BST
jlarmour
parents:
10
diff
changeset
|
1065 |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1066 // Thumb-only support functions |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1067 #ifdef __thumb__ |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1068 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1069 FUNC_START_ARM(hal_disable_interrupts, r1) |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1070 mrs r0,cpsr // current state |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1071 orr r1,r0,#CPSR_INTR_MASK // mask interrupts |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1072 msr cpsr,r1 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1073 bx lr // exit, _old_ in r0 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1074 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1075 FUNC_START_ARM(hal_enable_interrupts, r1) |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1076 mrs r0,cpsr // current state |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1077 bic r1,r0,#CPSR_INTR_MASK // mask interrupts |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1078 msr cpsr,r1 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1079 bx lr // exit |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1080 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1081 FUNC_START_ARM(hal_restore_interrupts, r1) |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1082 mrs r1,cpsr // current state |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1083 bic r1,r1,#CPSR_INTR_MASK // mask out interrupts |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1084 and r0,r0,#CPSR_INTR_MASK // keep only interrupts |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1085 orr r1,r1,r0 // mask interrupts |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1086 msr cpsr,r1 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1087 bx lr // exit |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1088 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1089 FUNC_START_ARM(hal_query_interrupts, r1) |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1090 mrs r0,cpsr // current state |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1091 bx lr // exit, state in r0 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1092 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1093 #endif // __thumb__ |
| 2 | 1094 |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1095 #ifndef CYGOPT_HAL_ARM_FIQ_DISABLE |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1096 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1097 // Functions for controlling FIQ independently of IRQ. |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1098 // These are only present if we are not manipulating FIQs |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1099 // alongside IRQs in the standard interrupt control macros. |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1100 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1101 FUNC_START_ARM(hal_disable_FIQ, r1) |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1102 mrs r0,cpsr // current state |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1103 orr r1,r0,#CPSR_FIQ_DISABLE // mask FIQs |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1104 msr cpsr,r1 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1105 bx lr // exit, _old_ in r0 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1106 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1107 FUNC_START_ARM(hal_enable_FIQ, r1) |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1108 mrs r0,cpsr // current state |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1109 bic r1,r0,#CPSR_FIQ_DISABLE // mask FIQs |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1110 msr cpsr,r1 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1111 bx lr // exit |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1112 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1113 FUNC_START_ARM(hal_restore_FIQ, r1) |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1114 mrs r1,cpsr // current state |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1115 bic r1,r1,#CPSR_FIQ_DISABLE // mask out FIQs |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1116 and r0,r0,#CPSR_FIQ_DISABLE // keep only FIQs |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1117 orr r1,r1,r0 // mask FIQs |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1118 msr cpsr,r1 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1119 bx lr // exit |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1120 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1121 FUNC_START_ARM(hal_query_FIQ, r1) |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1122 mrs r0,cpsr // current state |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1123 bx lr // exit, state in r0 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1124 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1125 #endif |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1126 |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
1127 // Dummy/support functions |
| 2 | 1128 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1129 .global __gccmain |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1130 .global _psr |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1131 .global _sp |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
1132 |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1133 #ifdef __thumb__ |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1134 .code 16 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1135 .thumb_func |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1136 __gccmain: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1137 bx lr |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1138 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1139 .code 16 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1140 .thumb_func |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1141 _psr: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1142 ARM_MODE(r1,10) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1143 mrs r0,cpsr |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1144 bx lr |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1145 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1146 .code 16 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1147 .thumb_func |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1148 _sp: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1149 mov r0,sp |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1150 bx lr |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1151 #else |
| 2 | 1152 __gccmain: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1153 mov pc,lr |
| 2 | 1154 |
| 1155 _psr: | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1156 mrs r0,cpsr |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1157 mov pc,lr |
| 2 | 1158 |
| 1159 _sp: | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1160 mov r0,sp |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1161 mov pc,lr |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1162 #endif |
| 2 | 1163 |
| 1164 | |
| 1165 // | |
| 1166 // Pointers to various objects. | |
| 1167 // | |
| 1168 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS | |
| 1169 PTR(__GDB_stack_base) | |
| 1170 PTR(__GDB_stack) | |
| 1171 #endif | |
| 1172 PTR(__startup_stack) | |
| 1173 PTR(__exception_stack) | |
| 1174 PTR(__undef_exception_stack) | |
| 1175 PTR(__bss_start) | |
| 1176 PTR(__bss_end) | |
| 1177 PTR(_end) | |
| 1178 PTR(__rom_data_start) | |
| 1179 PTR(__ram_data_start) | |
| 1180 PTR(__ram_data_end) | |
| 1181 PTR(hal_interrupt_handlers) | |
| 1182 PTR(hal_interrupt_data) | |
| 1183 PTR(hal_interrupt_objects) | |
| 1184 PTR(__exception_handlers) | |
| 1185 PTR(init_flag) | |
| 1186 #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT | |
| 1187 PTR(cyg_scheduler_sched_lock) | |
| 1188 #endif | |
| 1189 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
| 1190 PTR(irq_level) | |
| 1191 PTR(__interrupt_stack) | |
| 1192 #endif | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
1193 #ifdef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
1194 PTR(__dump_procs) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
1195 #endif |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1196 #ifndef CYGOPT_HAL_ARM_FIQ_DISABLE |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1197 PTR(__fiq_stack) |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1198 #endif |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
1199 // |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
1200 // Identification - useful to find out when a system was configured |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
1201 _eCos_id: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1202 .asciz "eCos : " __DATE__ |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
1203 |
| 2 | 1204 |
| 1205 // ------------------------------------------------------------------------- | |
| 1206 // Interrupt vector tables. | |
| 1207 // These tables contain the isr, data and object pointers used to deliver | |
| 1208 // interrupts to user code. | |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
1209 |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
1210 // Despite appearances, their sizes are not #defines, but .equ symbols |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
1211 // generated by magic without proper dependencies in arm.inc |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
1212 // Recompiling will not DTRT without manual intervention. |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
1213 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1214 .data |
| 2 | 1215 |
| 1216 init_flag: | |
|
150
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
148
diff
changeset
|
1217 .balign 4 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1218 .long 0 |
| 2 | 1219 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1220 .extern hal_default_isr |
| 2 | 1221 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1222 .globl hal_interrupt_handlers |
| 2 | 1223 hal_interrupt_handlers: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1224 .rept CYGNUM_HAL_ISR_COUNT |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1225 .long hal_default_isr |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1226 .endr |
| 2 | 1227 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1228 .globl hal_interrupt_data |
| 2 | 1229 hal_interrupt_data: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1230 .rept CYGNUM_HAL_ISR_COUNT |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1231 .long 0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1232 .endr |
| 2 | 1233 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1234 .globl hal_interrupt_objects |
| 2 | 1235 hal_interrupt_objects: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1236 .rept CYGNUM_HAL_ISR_COUNT |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1237 .long 0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1238 .endr |
| 2 | 1239 |
| 1240 // ------------------------------------------------------------------------- | |
| 1241 // Temporary interrupt stack | |
| 1242 | |
| 1243 .section ".bss" | |
| 1244 | |
| 1245 // Small stacks, only used for saving information between CPU modes | |
| 1246 __exception_stack_base: | |
| 1247 .rept 32 | |
| 1248 .long 0 | |
| 1249 .endr | |
| 1250 __exception_stack: | |
| 1251 .rept 32 | |
| 1252 .long 0 | |
| 1253 .endr | |
| 1254 __undef_exception_stack: | |
| 1255 | |
|
3173
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1256 #ifndef CYGOPT_HAL_ARM_FIQ_DISABLE |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1257 .balign 16 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1258 __fiq_stack_base: |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1259 .rept CYGNUM_HAL_ARM_FIQ_STACK_SIZE |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1260 .byte 0 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1261 .endr |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1262 .balign 16 |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1263 __fiq_stack: |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1264 #endif |
|
afb59e9b7339
* cdl/hal_arm.cdl: Add CDL to control whether both IRQs and FIQs
nickg
parents:
2800
diff
changeset
|
1265 |
| 2 | 1266 // Runtime stack used during all interrupt processing |
| 1267 #ifndef CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE | |
| 1268 #define CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE 4096 | |
| 1269 #endif | |
| 1270 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1271 .balign 16 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1272 .global cyg_interrupt_stack_base |
|
8
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
6
diff
changeset
|
1273 cyg_interrupt_stack_base: |
| 2 | 1274 __interrupt_stack_base: |
| 1275 .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE | |
| 1276 .byte 0 | |
| 1277 .endr | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1278 .balign 16 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1279 .global cyg_interrupt_stack |
|
8
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
6
diff
changeset
|
1280 cyg_interrupt_stack: |
| 2 | 1281 __interrupt_stack: |
| 1282 irq_level: | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1283 .long 0 |
| 2 | 1284 #endif |
| 1285 | |
| 1286 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1287 .balign 16 |
| 2 | 1288 __GDB_stack_base: |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1289 .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE // rather than 1k |
| 2 | 1290 .byte 0 |
| 1291 .endr | |
| 1292 __GDB_stack: | |
| 1293 #endif | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1294 .balign 16 |
| 2 | 1295 __startup_stack_base: |
| 1296 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
| 1297 .rept 512 | |
| 1298 #else | |
| 1299 .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE | |
| 1300 #endif | |
| 1301 .byte 0 | |
| 1302 .endr | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1303 .balign 16 |
| 2 | 1304 __startup_stack: |
| 1305 | |
|
56
755351606154
Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents:
54
diff
changeset
|
1306 #ifdef PLATFORM_EXTRAS |
|
755351606154
Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents:
54
diff
changeset
|
1307 #include PLATFORM_EXTRAS |
|
755351606154
Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents:
54
diff
changeset
|
1308 #endif |
|
755351606154
Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents:
54
diff
changeset
|
1309 |
| 2 | 1310 // -------------------------------------------------------------------------- |
| 1311 // end of vectors.S |
