Mercurial > ecos
annotate packages/hal/arm/arch/current/src/vectors.S @ 1307:1750695510ac
Fix exception debug in THUMB mode - from Thomas Koeller
| author | gthomas |
|---|---|
| date | Tue, 14 Oct 2003 13:51:48 +0000 |
| parents | 04b94baa3683 |
| children | 8758da1a0278 |
| rev | line source |
|---|---|
| 2 | 1 // #======================================================================== |
| 2 // # | |
| 3 // # vectors.S | |
| 4 // # | |
| 5 // # ARM exception vectors | |
| 6 // # | |
| 7 // #======================================================================== | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
8 //####ECOSGPLCOPYRIGHTBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
9 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
10 // This file is part of eCos, the Embedded Configurable Operating System. |
| 1002 | 11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
12 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
13 // eCos is free software; you can redistribute it and/or modify it under |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
14 // the terms of the GNU General Public License as published by the Free |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
15 // Software Foundation; either version 2 or (at your option) any later version. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
16 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
20 // for more details. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
21 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
22 // You should have received a copy of the GNU General Public License along |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
23 // with eCos; if not, write to the Free Software Foundation, Inc., |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
25 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
26 // As a special exception, if other files instantiate templates or use macros |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
27 // or inline functions from this file, or you compile this file and link it |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
28 // with other works to produce a work based on this file, this file does not |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
29 // by itself cause the resulting work to be covered by the GNU General Public |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
30 // License. However the source code for this file must still be made available |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
31 // in accordance with section (3) of the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
32 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
33 // This exception does not invalidate any other reasons why a work based on |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
34 // this file might be covered by the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
35 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
|
210
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
37 // at http://sources.redhat.com/ecos/ecos-license/ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
38 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
39 //####ECOSGPLCOPYRIGHTEND#### |
| 2 | 40 // #======================================================================== |
| 41 // ######DESCRIPTIONBEGIN#### | |
| 42 // # | |
| 43 // # Author(s): nickg, gthomas | |
| 44 // # Contributors: nickg, gthomas | |
| 45 // # Date: 1999-02-20 | |
| 46 // # Purpose: ARM exception vectors | |
| 47 // # Description: This file defines the code placed into the exception | |
| 48 // # 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
|
49 // # 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
|
50 // # interrupts. |
| 2 | 51 // # |
| 52 // #####DESCRIPTIONEND#### | |
| 53 // # | |
| 54 // #======================================================================== | |
| 55 | |
| 56 #include <pkgconf/hal.h> | |
| 57 #include <pkgconf/hal_arm.h> | |
| 58 #ifdef CYGPKG_KERNEL // no CDL yet | |
| 59 #include <pkgconf/kernel.h> | |
| 60 #else | |
| 61 # 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
|
62 # undef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK |
| 2 | 63 #endif |
| 64 #include <cyg/hal/hal_platform_setup.h> | |
| 65 | |
| 66 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS | |
| 67 // The CDL should enforce this | |
| 68 #undef CYGHWR_HAL_ARM_DUMP_EXCEPTIONS | |
| 69 #endif | |
| 70 | |
| 71 #include "arm.inc" | |
| 72 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
73 #ifdef __thumb__ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
74 // Switch to thumb mode |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
75 #define THUMB_MODE(_r_, _l_) \ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
76 ldr _r_,=_l_ ## f+1 ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
77 bx _r_ ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
78 .pool ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
79 .code 16 ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
80 .thumb_func ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
81 _l_: |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
82 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
83 // Switch to ARM mode |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
84 #define ARM_MODE(_r_, _l_) \ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
85 ldr _r_,=_l_ ## f ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
86 bx _r_ ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
87 .pool ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
88 .code 32 ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
89 _l_: |
| 2 | 90 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
91 // 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
|
92 #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
|
93 .code 16 ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
94 .thumb_func ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
95 .globl _name_ ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
96 _name_: ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
97 ldr _r_,=_name_ ## _ARM ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
98 bx _r_ ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
99 .code 32 ;\ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
100 _name_ ## _ARM: |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
101 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
102 #else |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
103 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
104 // Switch to thumb mode |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
105 #define THUMB_MODE(_r_, _l_) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
106 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
107 // Switch to ARM mode |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
108 #define ARM_MODE(_r_, _l_) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
109 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
110 // 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
|
111 #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
|
112 .globl _name_; \ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
113 _name_: |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
114 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
115 #endif |
|
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 |
|
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 #define PTR(name) \ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
120 .##name: .word name |
| 2 | 121 |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
122 // 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
|
123 // 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
|
124 // 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
|
125 // 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
|
126 // 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
|
127 // 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
|
128 // |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
129 // 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
|
130 |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
131 #ifndef UNMAPPED |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
132 #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
|
133 # ifndef CYGHWR_HAL_ROM_VADDR |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
134 # 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
|
135 # endif |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
136 # 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
|
137 #else |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
138 # define UNMAPPED(x) (x) |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
139 #endif |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
140 #endif |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
141 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
142 #define UNMAPPED_PTR(name) \ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
143 .##name: .word UNMAPPED(name) |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
14
diff
changeset
|
144 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
145 // .file "vectors.S" |
| 2 | 146 |
|
50
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
147 |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
148 // 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
|
149 // 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
|
150 // 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
|
151 // interpreted as CPP stringify operators. |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
152 // 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
|
153 #ifndef CYGHWR_LED_MACRO |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
154 #define CYGHWR_LED_MACRO |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
155 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
156 |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
157 .macro LED x |
|
50
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
158 CYGHWR_LED_MACRO |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
159 .endm |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
160 |
| 2 | 161 |
| 162 //========================================================================== | |
| 163 // Hardware exception vectors. | |
| 164 // This entire section will be copied to location 0x0000 at startup time. | |
| 165 // | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
166 .code 32 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
167 .section ".vectors","ax" |
|
160
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
168 |
|
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
169 // 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
|
170 // 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
|
171 // 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
|
172 // 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
|
173 #ifdef PLATFORM_PREAMBLE |
|
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
174 PLATFORM_PREAMBLE |
|
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
175 #endif |
|
0d0f03f76f6a
Merge from eCos master repository on 2001-06-01-18:52:13-BST
jlarmour
parents:
159
diff
changeset
|
176 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
177 .global __exception_handlers |
| 2 | 178 __exception_handlers: |
|
159
511f4dc167f6
Merge from eCos master repository on 2001-05-18-01:30:05-BST
jlarmour
parents:
158
diff
changeset
|
179 #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
|
180 // 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
|
181 // 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
|
182 b reset_vector // 0x00 |
|
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
183 #else |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
184 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
|
185 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
186 ldr pc,.undefined_instruction // 0x04 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
187 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
|
188 ldr pc,.abort_prefetch // 0x0C |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
189 ldr pc,.abort_data // 0x10 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
190 .word 0 // unused |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
191 ldr pc,.IRQ // 0x18 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
192 ldr pc,.FIQ // 0x1C |
| 2 | 193 |
| 194 // The layout of these pointers should match the vector table above since | |
| 195 // 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
|
196 .global vectors |
| 2 | 197 vectors: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
198 UNMAPPED_PTR(reset_vector) // 0x20 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
199 PTR(undefined_instruction) // 0x24 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
200 PTR(software_interrupt) // 0x28 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
201 PTR(abort_prefetch) // 0x2C |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
202 PTR(abort_data) // 0x30 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
203 .word 0 // 0x34 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
204 PTR(IRQ) // 0x38 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
205 PTR(FIQ) // 0x3c |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
206 #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
|
207 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
|
208 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
209 // 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
|
210 // for some platforms. |
|
103
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
211 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
212 // |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
213 // "Vectors" - fixed location data items |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
214 // 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
|
215 // 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
|
216 // ROM. |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
217 // |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
218 .section ".fixed_vectors" |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
219 // Interrupt/exception VSR pointers |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
220 .globl hal_vsr_table |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
221 hal_vsr_table: |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
222 .rept 8 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
223 .long 0 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
224 .endr |
| 2 | 225 |
|
103
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
226 .globl hal_dram_size |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
227 hal_dram_size: |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
145
diff
changeset
|
228 .long 0 |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
145
diff
changeset
|
229 // 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
|
230 .globl hal_dram_type |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
145
diff
changeset
|
231 hal_dram_type: |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
145
diff
changeset
|
232 .long 0 |
|
103
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
233 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
234 .balign 16 |
|
110
84e4bde58b26
Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents:
108
diff
changeset
|
235 #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
|
236 // 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
|
237 .globl hal_virtual_vector_table |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
238 hal_virtual_vector_table: |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
239 .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
|
240 .long 0 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
241 .endr |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
242 #endif |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
243 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
244 #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
|
245 .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
|
246 ice_thread_vector: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
247 .long 0 // Must be 'MICE' |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
248 .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
|
249 .long 0 // eCos executing flag |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
250 .long 0 // Must be 'GDB ' |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
251 #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
|
252 .balign 32 |
|
96
b15c60e34c84
Merge from eCos master repository on 2000-06-06-05:24:42-BST
jlarmour
parents:
80
diff
changeset
|
253 |
|
b15c60e34c84
Merge from eCos master repository on 2000-06-06-05:24:42-BST
jlarmour
parents:
80
diff
changeset
|
254 // 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
|
255 #ifdef PLATFORM_VECTORS |
|
b15c60e34c84
Merge from eCos master repository on 2000-06-06-05:24:42-BST
jlarmour
parents:
80
diff
changeset
|
256 PLATFORM_VECTORS |
|
b15c60e34c84
Merge from eCos master repository on 2000-06-06-05:24:42-BST
jlarmour
parents:
80
diff
changeset
|
257 #endif |
|
b15c60e34c84
Merge from eCos master repository on 2000-06-06-05:24:42-BST
jlarmour
parents:
80
diff
changeset
|
258 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
259 .text |
| 2 | 260 // 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
|
261 .global reset_vector |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
262 .type reset_vector,function |
| 2 | 263 reset_vector: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
264 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
|
265 // 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
|
266 // 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
|
267 |
|
54
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
268 // Come here to reset board |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
269 warm_reset: |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
270 |
| 2 | 271 #if defined(CYG_HAL_STARTUP_RAM) && \ |
| 272 !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
|
273 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
|
274 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
|
275 cmp r7,#CPSR_SUPERVISOR_MODE |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
276 beq start |
| 2 | 277 #endif |
| 278 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
279 // 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
|
280 LED 7 |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
281 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
282 mov r0,#0 // move vectors |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
283 ldr r1,=__exception_handlers |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
284 #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
|
285 // 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
|
286 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
|
287 str r2,[r0,#0x04] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
288 ldr r2,[r1,#0x24] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
289 str r2,[r0,#0x24] |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
290 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
291 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
|
292 str r2,[r0,#0x08] |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
40
diff
changeset
|
293 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
294 #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
|
295 ldr r2,=ice_thread_vector |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
296 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
|
297 ldr r3,=0x4D494345 // 'MICE' |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
298 str r3,[r2],#4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
299 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
|
300 str r3,[r2],#4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
301 mov r3,#1 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
302 str r3,[r2],#4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
303 ldr r3,=0x47444220 // 'GDB ' |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
304 str r3,[r2],#4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
305 #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
|
306 |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
152
diff
changeset
|
307 #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
|
308 // 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
|
309 ldr r2,[r1,#0x40] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
310 str r2,[r0,#0x28] |
|
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 LED 6 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
313 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
314 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
|
315 #endif |
| 2 | 316 |
| 317 // ========================================================================= | |
| 318 // 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
|
319 .globl start |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
320 start: |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
321 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
322 LED 5 |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
323 |
| 2 | 324 #if defined(CYG_HAL_STARTUP_RAM) && \ |
| 325 !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) | |
| 326 // 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
|
327 ldr r0,.init_flag |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
328 ldr r1,[r0] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
329 1: cmp r1,#0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
330 bne 1b |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
331 ldr r1,init_done |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
332 str r1,[r0] |
| 2 | 333 #endif |
| 334 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
335 // Reset software interrupt pointer |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
336 mov r0,#0 // move vectors |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
337 ldr r1,.__exception_handlers |
| 2 | 338 #if defined(CYG_HAL_STARTUP_RAM) && \ |
| 339 !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
|
340 cmp r7,#CPSR_SUPERVISOR_MODE |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
341 beq 10f |
| 2 | 342 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
343 ldr r2,[r1,#0x28] // software interrupt |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
344 str r2,[r0,#0x28] |
| 2 | 345 10: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
346 ldr r2,[r1,#0x18] // IRQ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
347 str r2,[r0,#0x18] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
348 ldr r2,[r1,#0x38] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
349 str r2,[r0,#0x38] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
350 ldr r2,[r1,#0x1C] // FIQ |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
351 str r2,[r0,#0x1C] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
352 ldr r2,[r1,#0x3C] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
353 str r2,[r0,#0x3C] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
354 ldr r2,[r1,#0x0C] // abort (prefetch) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
355 str r2,[r0,#0x0C] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
356 ldr r2,[r1,#0x2C] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
357 str r2,[r0,#0x2C] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
358 ldr r2,[r1,#0x10] // abort (data) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
359 str r2,[r0,#0x10] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
360 ldr r2,[r1,#0x30] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
361 str r2,[r0,#0x30] |
| 2 | 362 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
363 LED 4 |
|
50
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
364 |
|
172
cd45958b28ff
Merge from eCos master repository on 2001-07-20-10:24:43-BST
jlarmour
parents:
161
diff
changeset
|
365 #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
|
366 // Set up reset vector |
|
132
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
112
diff
changeset
|
367 mov r0,#0 |
|
0ae0bc38e387
Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents:
112
diff
changeset
|
368 ldr r1,.__exception_handlers |
|
54
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
369 ldr r2,[r1,#0x00] // reset vector intstruction |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
370 str r2,[r0,#0x00] |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
371 ldr r2,=warm_reset |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
372 str r2,[r0,#0x20] |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
373 // 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
|
374 ldr r3,.__rom_data_start |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
375 ldr r4,.__ram_data_start |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
376 ldr r5,.__ram_data_end |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
377 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
|
378 beq 2f |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
379 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
|
380 sub r4,r4,#4 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
381 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
|
382 str r0,[r4,#4]! |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
383 cmp r4,r5 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
384 bne 1b |
| 2 | 385 2: |
| 386 #endif | |
| 387 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
388 // initialize interrupt/exception environments |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
389 ldr sp,.__startup_stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
390 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
|
391 msr cpsr,r0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
392 ldr sp,.__exception_stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
393 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
|
394 msr cpsr,r0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
395 ldr sp,.__exception_stack |
| 2 | 396 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
397 // initialize CPSR (machine state register) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
398 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
|
399 msr cpsr,r0 |
| 2 | 400 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
401 // 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
|
402 msr spsr,r0 |
| 2 | 403 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
404 // initialize stack |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
405 #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
|
406 // 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
|
407 // 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
|
408 ldr sp,.__interrupt_stack |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
409 #else |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
410 ldr sp,.__startup_stack |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
411 #endif |
| 2 | 412 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
413 // clear BSS |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
414 ldr r1,.__bss_start |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
415 ldr r2,.__bss_end |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
416 mov r0,#0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
417 cmp r1,r2 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
418 beq 2f |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
419 1: str r0,[r1],#4 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
420 cmp r1,r2 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
421 bls 1b |
| 2 | 422 2: |
| 423 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
424 // 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
|
425 THUMB_MODE(r1,10) |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
426 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
427 LED 3 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
428 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
429 // Call platform specific hardware initialization |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
430 bl hal_hardware_init |
| 2 | 431 |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
432 #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
|
433 bl initialize_stub |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
434 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
435 // 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
|
436 // 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
|
437 // 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
|
438 // 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
|
439 #endif |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
440 |
|
a0774359f013
Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents:
46
diff
changeset
|
441 #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
|
442 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
|
443 mov r0,#0 // move vectors |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
444 ldr r1,=__exception_handlers |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
445 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
|
446 str r2,[r0,#0x04] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
447 ldr r2,[r1,#0x24] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
448 str r2,[r0,#0x24] |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
34
diff
changeset
|
449 #endif |
|
112
02ea4320376c
Merge from eCos master repository on 2000-07-21-21:01:39-BST
jlarmour
parents:
110
diff
changeset
|
450 |
|
103
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
451 #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
|
452 || 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
|
453 .extern hal_ctrlc_isr_init |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
454 bl hal_ctrlc_isr_init |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
455 #endif |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
456 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
457 LED 2 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
458 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
459 // Run through static constructors |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
460 bl cyg_hal_invoke_constructors |
| 2 | 461 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
462 LED 1 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
463 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
464 // 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
|
465 #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
|
466 ldr r1,=__startup_stack |
|
b4d06891fe1a
Fix a thumb build problem, and switch to arm-elf-gcc -mthumb rather
bartv
parents:
316
diff
changeset
|
467 mov sp,r1 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
468 #endif |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
469 bl cyg_start |
| 2 | 470 _start_hang: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
471 b _start_hang |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
472 .code 32 |
|
54
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
473 |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
474 .global reset_platform |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
475 .type reset_platform,function |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
476 reset_platform: |
|
70
c5536bad4c24
Merge from eCos master repository on 2000-02-11-15:46:40-GMT
jlarmour
parents:
66
diff
changeset
|
477 #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
|
478 // initialize CPSR (machine state register) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
479 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
|
480 msr cpsr,r0 |
|
54
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
481 b warm_reset |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
482 #else |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
483 mov r0,#0 |
|
f10165814f1e
Merge from eCos master repository on 1999-11-19-22:24:39-GMT
jlarmour
parents:
50
diff
changeset
|
484 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
|
485 #endif |
| 2 | 486 |
| 487 init_done: | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
488 .long 0xDEADB00B |
| 2 | 489 |
| 490 // | |
| 491 // Exception handlers | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
492 // Assumption: get here from a non-user context [mode] |
| 1002 | 493 // except in case of standalone app. running in user mode |
| 494 // (CYGOPT_HAL_ARM_WITH_USER_MODE should have been defined) | |
| 2 | 495 // |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
496 .code 32 |
| 2 | 497 undefined_instruction: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
498 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
|
499 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
|
500 mrs r1,spsr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
501 tst r1,#CPSR_THUMB_ENABLE |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
502 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
|
503 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
|
504 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
|
505 mov r3,sp |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
506 b call_exception_handler |
| 2 | 507 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
508 .code 32 |
| 2 | 509 software_interrupt: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
510 stmfd sp!,{r8} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
511 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
|
512 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
|
513 mov r3,r8 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
514 ldmfd sp!,{r8} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
515 mrs r1,spsr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
516 tst r1,#CPSR_THUMB_ENABLE |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
517 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
|
518 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
|
519 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
|
520 b call_exception_handler |
| 2 | 521 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
522 .code 32 |
| 2 | 523 abort_prefetch: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
524 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
|
525 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
|
526 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
|
527 mrs r1,spsr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
528 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
|
529 mov r3,sp |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
530 b call_exception_handler |
| 2 | 531 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
532 .code 32 |
| 2 | 533 abort_data: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
534 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
|
535 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
|
536 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
|
537 mrs r1,spsr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
538 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
|
539 mov r3,sp |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
540 b call_exception_handler |
|
20
5f5102441818
Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents:
16
diff
changeset
|
541 |
| 2 | 542 // |
| 543 // Dispatch an exception handler. | |
| 544 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
545 .code 32 |
| 2 | 546 call_exception_handler: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
547 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
548 // On Entry: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
549 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
550 // r4,r5 = scratch |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
551 // 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
|
552 // r2 = vector number |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
553 // r1 = exception psr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
554 // r0 = exception pc |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
555 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
556 // [r3+20]: exception r5 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
557 // [r3+16]: exception r4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
558 // [r3+12]: exception r3 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
559 // [r3+8] : exception r2 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
560 // [r3+4] : exception r1 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
561 // [r3] : exception r0 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
562 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
563 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
|
564 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
|
565 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
|
566 msr cpsr,r4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
567 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
568 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
|
569 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
|
570 #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
|
571 // 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
|
572 ldr sp,.__GDB_stack |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
573 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
|
574 bhi 10f |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
575 ldr r4,.__GDB_stack_base |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
576 cmp r5,r4 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
577 movhi sp,r5 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
578 10: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
579 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
580 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
581 // 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
|
582 // 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
|
583 // |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
584 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
585 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
|
586 |
| 1002 | 587 #ifdef CYGOPT_HAL_ARM_WITH_USER_MODE |
| 588 // did exception occur in user mode ? | |
| 589 and r2, r1, #CPSR_MODE_BITS | |
| 590 cmp r2, #CPSR_USER_MODE | |
| 591 bne 1f | |
| 592 stmfd sp, {r8-r12, sp, lr}^ // get user mode regs | |
| 593 nop | |
| 594 sub sp, sp, #4*7 | |
| 595 bal 2f | |
| 596 1: | |
| 597 #endif | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
598 // 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
|
599 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
|
600 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
|
601 orr r1,r1,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE |
| 316 | 602 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
|
603 msr cpsr,r1 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
604 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
|
605 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
|
606 mov sp,r0 // update stack pointer |
| 1002 | 607 2: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
608 // 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
|
609 ldmfd r3,{r0-r5} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
610 stmfd sp!,{r0-r7} |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
611 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
612 // 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
|
613 // 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
|
614 // 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
|
615 ldr r1,[sp,#armreg_cpsr] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
616 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
|
617 cmp r1,#CPSR_SUPERVISOR_MODE |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
618 ldreq r1,[sp,#armreg_svcsp] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
619 streq r1,[sp,#armreg_sp] |
|
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 #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
|
622 mov r0,sp |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
623 ldr r1,.__dump_procs |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
624 ldr r2,[sp,#armreg_vector] |
|
1307
1750695510ac
Fix exception debug in THUMB mode - from Thomas Koeller
gthomas
parents:
1084
diff
changeset
|
625 ldr r1,[r1,r2,lsl #2] |
|
1750695510ac
Fix exception debug in THUMB mode - from Thomas Koeller
gthomas
parents:
1084
diff
changeset
|
626 THUMB_MODE(r9,10) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
627 mov lr,pc |
|
1307
1750695510ac
Fix exception debug in THUMB mode - from Thomas Koeller
gthomas
parents:
1084
diff
changeset
|
628 mov pc,r1 |
|
1750695510ac
Fix exception debug in THUMB mode - from Thomas Koeller
gthomas
parents:
1084
diff
changeset
|
629 #else |
|
1750695510ac
Fix exception debug in THUMB mode - from Thomas Koeller
gthomas
parents:
1084
diff
changeset
|
630 THUMB_MODE(r9,10) |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
631 #endif |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
632 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
633 // call exception handler |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
634 mov r0,sp |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
635 bl exception_handler |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
636 |
| 2 | 637 #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
|
638 mov r0,sp |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
639 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
|
640 #endif |
| 2 | 641 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
642 ARM_MODE(r1,10) |
| 2 | 643 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
644 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
645 // Return from exception |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
646 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
647 return_from_exception: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
648 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
649 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
|
650 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
651 // 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
|
652 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
|
653 cmp r1,#CPSR_SUPERVISOR_MODE |
| 1002 | 654 |
| 655 #ifndef CYGOPT_HAL_ARM_PRESERVE_SVC_SPSR | |
| 656 msr spsr,r0 | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
657 ldmeqfd sp,{r0-r14,pc}^ |
| 1002 | 658 #else |
| 659 // we must take care of not corrupting the current (svc) | |
| 660 // spsr which happens to be also the pre-exception spsr | |
| 661 bne 1f | |
| 1084 | 662 tst r0, #CPSR_THUMB_ENABLE |
| 663 | |
| 664 // when returning to thumb/svc mode, there is no easy way to preserve | |
| 665 // spsr. It is possible to do so, but would add a lot of instructions. | |
| 666 // The purpose of CYGOPT_HAL_ARM_PRESERVE_SVC_SPSR is to allow stepping | |
| 667 // through SWI exception handling code, so not preserving spsr in this | |
| 668 // case should be okay. | |
| 669 msrne spsr,r0 | |
| 670 ldmnefd sp,{r0-r14,pc}^ | |
| 671 | |
| 672 // we are returning to arm/svc mode thus we must restore the | |
| 1002 | 673 // pre-exception cpsr before returning to interrupted code |
| 674 msr cpsr, r0 | |
| 675 ldmfd sp, {r0-r14, pc} | |
| 676 1: | |
| 677 // we are not returning to svc mode thus we can safely restore | |
| 678 // svc spsr | |
| 679 msr spsr, r0 | |
| 680 #endif | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
681 |
| 1002 | 682 #ifdef CYGOPT_HAL_ARM_WITH_USER_MODE |
| 683 // are we returning to user mode ? | |
| 684 and r2, r1, #CPSR_MODE_BITS | |
| 685 cmp r2, #CPSR_USER_MODE | |
| 686 add r2, sp, #armreg_r8 | |
| 687 bne 1f | |
| 688 ldmfd r2, {r8-r14}^ // restore user mode regs | |
| 689 nop | |
| 690 bal 2f | |
| 691 1: | |
| 692 #else | |
| 693 add r2, sp, #armreg_r8 | |
| 694 #endif | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
695 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
696 // 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
|
697 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
698 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
699 // 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
|
700 mrs r1,cpsr |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
701 orr r0,r0,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE |
| 316 | 702 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
|
703 msr cpsr,r0 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
704 ldmfd r2,{r8-r14} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
705 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
|
706 |
| 1002 | 707 2: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
708 // 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
|
709 ldr r0,[sp,#armreg_svcsp] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
710 str r0,[sp,#armreg_r8] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
711 ldr r0,[sp,#armreg_svclr] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
712 str r0,[sp,#armreg_r9] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
713 ldr r0,[sp,#armreg_pc] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
714 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
|
715 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
716 // 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
|
717 ldmfd sp,{r0-r7,sp,lr,pc}^ |
| 2 | 718 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
719 #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
|
720 __dump_procs: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
721 .word 0 // placeholder for reset |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
722 .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
|
723 .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
|
724 .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
|
725 .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
|
726 .word 0 // reserved |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
727 #endif |
| 2 | 728 |
| 729 | |
| 730 // Handle device interrupts | |
| 731 // This is slightly more complicated than the other exception handlers because | |
| 732 // it needs to interface with the kernel (if present). | |
| 1002 | 733 // Assumption: can get here from any mode, including user mode |
| 734 // (spurious interrupt while standalone app. is running in user mode) | |
| 2 | 735 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
736 .code 32 |
|
20
5f5102441818
Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents:
16
diff
changeset
|
737 FIQ: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
738 // 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
|
739 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
|
740 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
|
741 cmp r9,#CPSR_IRQ_MODE |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
742 bne 1f |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
743 // 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
|
744 // 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
|
745 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
|
746 msr spsr,r8 |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
747 subs pc,lr,#4 |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
748 1: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
749 // 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
|
750 // fall through to IRQ handler. |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
751 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
|
752 stmdb sp,{r8,lr} |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
753 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
|
754 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
|
755 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
|
756 ldmdb sp,{sp,lr} |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
757 msr spsr,sp |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
758 |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
759 // 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
|
760 // FIQ is disabled so we don't recurse. |
| 2 | 761 IRQ: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
762 // 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
|
763 // 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
|
764 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
|
765 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
|
766 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
|
767 mrs r1,spsr |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
768 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
|
769 mov r3,sp |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
770 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
771 handle_IRQ_or_FIQ: |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
772 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
773 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
|
774 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
|
775 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
|
776 msr cpsr,r4 |
|
20
5f5102441818
Merge from eCos master repository on 1999-07-02-23:17:07-BST
jlarmour
parents:
16
diff
changeset
|
777 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
778 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
|
779 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
|
780 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
|
781 |
| 1002 | 782 #ifdef CYGOPT_HAL_ARM_WITH_USER_MODE |
| 783 // did exception occur in user mode ? | |
| 784 and r2, r1, #CPSR_MODE_BITS | |
| 785 cmp r2, #CPSR_USER_MODE | |
| 786 bne 1f | |
| 787 stmfd sp, {r8-r12, sp, lr}^ // get user mode regs | |
| 788 nop | |
| 789 sub sp, sp, #4*7 | |
| 790 bal 2f | |
| 791 1: | |
| 792 #endif | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
793 // 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
|
794 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
|
795 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
|
796 orr r1,r1,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE |
| 316 | 797 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
|
798 msr cpsr,r1 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
799 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
|
800 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
|
801 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
|
802 |
| 1002 | 803 2: |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
804 // 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
|
805 ldmfd r3,{r0-r5} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
806 stmfd sp!,{r0-r7} |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
807 |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
808 // 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
|
809 ldr r1,[sp,#armreg_cpsr] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
810 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
|
811 cmp r1,#CPSR_SUPERVISOR_MODE |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
812 ldreq r1,[sp,#armreg_svcsp] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
813 streq r1,[sp,#armreg_sp] |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
814 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
815 mov v6,sp // Save pointer to register frame |
| 2 | 816 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
817 // mov r0,sp |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
818 // bl _show_frame_in |
| 2 | 819 |
| 820 #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
|
821 // Switch to interrupt stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
822 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
|
823 ldr r0,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
824 add r1,r0,#1 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
825 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
|
826 cmp r0,#0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
827 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
|
828 ldreq sp,.__interrupt_stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
829 stmeqfd sp!,{r1} |
| 2 | 830 10: |
| 831 #endif | |
| 832 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
833 // 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
|
834 // increment the scheduler lock and handle the interrupt |
| 2 | 835 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
836 #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
|
837 .extern cyg_scheduler_sched_lock |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
838 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
|
839 ldr r4,[r3] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
840 add r4,r4,#1 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
841 str r4,[r3] |
| 2 | 842 #endif |
| 843 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
844 THUMB_MODE(r3,10) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
845 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
846 mov r0,v6 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
847 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
|
848 mov v1,r0 // returned vector # |
| 2 | 849 |
| 850 #if defined(CYGPKG_KERNEL_INSTRUMENT) && \ | |
| 851 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
|
852 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
|
853 mov r1,v1 // arg1 = vector |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
854 mov r2,#0 // arg2 = 0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
855 bl cyg_instrument // call instrument function |
| 2 | 856 #endif |
| 857 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
858 ARM_MODE(r0,10) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
859 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
860 mov r0,v1 // vector # |
|
103
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
861 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
862 #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
|
863 || 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
|
864 // 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
|
865 // 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
|
866 // 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
|
867 |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
868 .extern hal_saved_interrupt_state |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
869 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
|
870 str v6,[r2] |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
871 #endif |
|
95f3e12a6327
Merge from eCos master repository on 2000-06-23-16:41:10-BST
jlarmour
parents:
96
diff
changeset
|
872 |
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
151
diff
changeset
|
873 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
|
874 bne 10f |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
151
diff
changeset
|
875 #ifndef CYGIMP_HAL_COMMON_INTERRUPTS_IGNORE_SPURIOUS |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
160
diff
changeset
|
876 mov r0,v6 // register frame |
|
982
282a39769954
* src/vectors.S (handle_IRQ_or_FIQ): Tweak below to be conditional on
jlarmour
parents:
980
diff
changeset
|
877 # ifdef __thumb__ |
| 980 | 878 ldr r1,=hal_spurious_IRQ |
| 879 mov lr,pc | |
| 880 bx r1 | |
|
982
282a39769954
* src/vectors.S (handle_IRQ_or_FIQ): Tweak below to be conditional on
jlarmour
parents:
980
diff
changeset
|
881 # else |
|
282a39769954
* src/vectors.S (handle_IRQ_or_FIQ): Tweak below to be conditional on
jlarmour
parents:
980
diff
changeset
|
882 bl hal_spurious_IRQ |
|
282a39769954
* src/vectors.S (handle_IRQ_or_FIQ): Tweak below to be conditional on
jlarmour
parents:
980
diff
changeset
|
883 # endif |
|
152
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
151
diff
changeset
|
884 #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
|
885 b spurious_IRQ |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
151
diff
changeset
|
886 |
|
f935b880e96c
Merge from eCos master repository on 2001-02-14-01:27:14-GMT
jlarmour
parents:
151
diff
changeset
|
887 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
|
888 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
|
889 ldr r2,.hal_interrupt_handlers |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
890 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
|
891 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
|
892 // for the ISR too, for ^C detection) |
| 2 | 893 |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
894 #ifdef __thumb__ |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
895 ldr lr,=10f |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
896 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
|
897 .pool |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
898 .code 16 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
899 .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
|
900 IRQ_10T: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
901 10: ldr r2,=15f |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
902 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
|
903 .pool |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
904 .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
|
905 15: |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
906 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
|
907 #else |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
908 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
|
909 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
|
910 #endif |
| 2 | 911 |
|
38
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
912 spurious_IRQ: |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
913 |
| 2 | 914 #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
|
915 // 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
|
916 // 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
|
917 // 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
|
918 ldr r2,.irq_level |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
919 ldr r3,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
920 subs r1,r3,#1 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
921 str r1,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
922 ldreq sp,[sp] // This should be the saved stack pointer |
| 2 | 923 #endif |
| 924 #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
925 // 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
|
926 // 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
|
927 // interrupt object we have just used to the interrupt tidy up routine. |
| 2 | 928 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
160
diff
changeset
|
929 // 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
|
930 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
|
931 beq 17f |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
932 ldr r1,.hal_interrupt_objects |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
933 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
|
934 mov r2,v6 // register frame |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
935 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
936 THUMB_MODE(r3,10) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
937 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
938 bl interrupt_end // post any bottom layer handler |
| 2 | 939 // threads and call scheduler |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
160
diff
changeset
|
940 ARM_MODE(r1,10) |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
160
diff
changeset
|
941 17: |
| 2 | 942 #endif |
| 943 | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
944 // mov r0,sp |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
945 // bl show_frame_out |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
946 |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
947 // 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
|
948 b return_from_exception |
| 2 | 949 |
| 950 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
| 951 // Execute pending DSRs the interrupt stack | |
| 952 // 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
|
953 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
|
954 stmfd sp!,{r4,r5,lr} |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
955 // Disable interrupts |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
956 mrs r4,cpsr // disable IRQ's |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
957 orr r2,r4,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
958 bic r5,r4,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
959 msr cpsr,r2 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
960 // Switch to interrupt stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
961 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
|
962 ldr sp,.__interrupt_stack |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
963 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
|
964 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
|
965 ldr r3,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
966 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
|
967 str r3,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
968 msr cpsr,r5 // enable interrupts |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
969 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
970 THUMB_MODE(r1,20) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
971 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
972 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
|
973 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
974 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
975 ARM_MODE(r1,22) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
976 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
977 // Disable interrupts |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
978 mrs r1,cpsr // disable IRQ's |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
979 orr r2,r1,#CPSR_IRQ_DISABLE|CPSR_FIQ_DISABLE |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
980 msr cpsr,r2 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
981 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
982 // 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
|
983 ldr r2,.irq_level |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
984 ldr r3,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
985 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
|
986 str r3,[r2] |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
987 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
|
988 msr cpsr,r4 // restore interrupts to original state |
| 2 | 989 |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
990 #ifdef __thumb__ |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
991 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
|
992 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
|
993 #else |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
994 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
|
995 #endif // __thumb__ |
| 2 | 996 #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
|
997 |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
998 // 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
|
999 #ifdef __thumb__ |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1000 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1001 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
|
1002 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
|
1003 orr r1,r0,#0xC0 // mask both FIQ and IRQ |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1004 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
|
1005 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
|
1006 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1007 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
|
1008 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
|
1009 bic r1,r0,#0xC0 // mask both FIQ and IRQ |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1010 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
|
1011 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
|
1012 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1013 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
|
1014 mrs r1,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
|
1015 bic r1,r1,#0xC0 // mask out FIQ/IRQ bits |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1016 and r0,r0,#0xC0 // keep only FIQ/IRQ |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1017 orr r1,r1,r0 // mask both FIQ and IRQ |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1018 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
|
1019 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
|
1020 |
|
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_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
|
1022 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
|
1023 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
|
1024 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1025 #endif // __thumb__ |
| 2 | 1026 |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
1027 // Dummy/support functions |
| 2 | 1028 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1029 .global __gccmain |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1030 .global _psr |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1031 .global _sp |
|
34
29bc183297e1
Merge from eCos master repository on 1999-09-02-16:26:10-BST
jlarmour
parents:
28
diff
changeset
|
1032 |
|
76
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1033 #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
|
1034 .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
|
1035 .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
|
1036 __gccmain: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1037 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
|
1038 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1039 .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
|
1040 .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
|
1041 _psr: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1042 ARM_MODE(r1,10) |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1043 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
|
1044 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
|
1045 |
|
435cced73e2f
eCos v1.3.1 merged from eCos master repository on 2000-03-27-23:22:51-BST
jlarmour
parents:
70
diff
changeset
|
1046 .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
|
1047 .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
|
1048 _sp: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1049 mov r0,sp |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1050 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
|
1051 #else |
| 2 | 1052 __gccmain: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1053 mov pc,lr |
| 2 | 1054 |
| 1055 _psr: | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1056 mrs r0,cpsr |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1057 mov pc,lr |
| 2 | 1058 |
| 1059 _sp: | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1060 mov r0,sp |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1061 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
|
1062 #endif |
| 2 | 1063 |
| 1064 | |
| 1065 // | |
| 1066 // Pointers to various objects. | |
| 1067 // | |
| 1068 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS | |
| 1069 PTR(__GDB_stack_base) | |
| 1070 PTR(__GDB_stack) | |
| 1071 #endif | |
| 1072 PTR(__startup_stack) | |
| 1073 PTR(__exception_stack) | |
| 1074 PTR(__undef_exception_stack) | |
| 1075 PTR(__bss_start) | |
| 1076 PTR(__bss_end) | |
| 1077 PTR(_end) | |
| 1078 PTR(__rom_data_start) | |
| 1079 PTR(__ram_data_start) | |
| 1080 PTR(__ram_data_end) | |
| 1081 PTR(hal_interrupt_handlers) | |
| 1082 PTR(hal_interrupt_data) | |
| 1083 PTR(hal_interrupt_objects) | |
| 1084 PTR(__exception_handlers) | |
| 1085 PTR(init_flag) | |
| 1086 #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT | |
| 1087 PTR(cyg_scheduler_sched_lock) | |
| 1088 #endif | |
| 1089 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
| 1090 PTR(irq_level) | |
| 1091 PTR(__interrupt_stack) | |
| 1092 #endif | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
1093 #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
|
1094 PTR(__dump_procs) |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
172
diff
changeset
|
1095 #endif |
| 2 | 1096 |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
1097 // |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
1098 // 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
|
1099 _eCos_id: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1100 .asciz "eCos : " __DATE__ |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
8
diff
changeset
|
1101 |
| 2 | 1102 |
| 1103 // ------------------------------------------------------------------------- | |
| 1104 // Interrupt vector tables. | |
| 1105 // These tables contain the isr, data and object pointers used to deliver | |
| 1106 // interrupts to user code. | |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
1107 |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
20
diff
changeset
|
1108 // 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
|
1109 // 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
|
1110 // 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
|
1111 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1112 .data |
| 2 | 1113 |
| 1114 init_flag: | |
|
150
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
148
diff
changeset
|
1115 .balign 4 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1116 .long 0 |
| 2 | 1117 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1118 .extern hal_default_isr |
| 2 | 1119 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1120 .globl hal_interrupt_handlers |
| 2 | 1121 hal_interrupt_handlers: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1122 .rept CYGNUM_HAL_ISR_COUNT |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1123 .long hal_default_isr |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1124 .endr |
| 2 | 1125 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1126 .globl hal_interrupt_data |
| 2 | 1127 hal_interrupt_data: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1128 .rept CYGNUM_HAL_ISR_COUNT |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1129 .long 0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1130 .endr |
| 2 | 1131 |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1132 .globl hal_interrupt_objects |
| 2 | 1133 hal_interrupt_objects: |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1134 .rept CYGNUM_HAL_ISR_COUNT |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1135 .long 0 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1136 .endr |
| 2 | 1137 |
| 1138 // ------------------------------------------------------------------------- | |
| 1139 // Temporary interrupt stack | |
| 1140 | |
| 1141 .section ".bss" | |
| 1142 | |
| 1143 // Small stacks, only used for saving information between CPU modes | |
| 1144 __exception_stack_base: | |
| 1145 .rept 32 | |
| 1146 .long 0 | |
| 1147 .endr | |
| 1148 __exception_stack: | |
| 1149 .rept 32 | |
| 1150 .long 0 | |
| 1151 .endr | |
| 1152 __undef_exception_stack: | |
| 1153 | |
| 1154 // Runtime stack used during all interrupt processing | |
| 1155 #ifndef CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE | |
| 1156 #define CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE 4096 | |
| 1157 #endif | |
| 1158 #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
|
1159 .balign 16 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1160 .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
|
1161 cyg_interrupt_stack_base: |
| 2 | 1162 __interrupt_stack_base: |
| 1163 .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE | |
| 1164 .byte 0 | |
| 1165 .endr | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1166 .balign 16 |
|
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1167 .global cyg_interrupt_stack |
|
8
ece80412419a
Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents:
6
diff
changeset
|
1168 cyg_interrupt_stack: |
| 2 | 1169 __interrupt_stack: |
| 1170 irq_level: | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1171 .long 0 |
| 2 | 1172 #endif |
| 1173 | |
| 1174 #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
|
1175 .balign 16 |
| 2 | 1176 __GDB_stack_base: |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
1177 .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE // rather than 1k |
| 2 | 1178 .byte 0 |
| 1179 .endr | |
| 1180 __GDB_stack: | |
| 1181 #endif | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1182 .balign 16 |
| 2 | 1183 __startup_stack_base: |
| 1184 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
| 1185 .rept 512 | |
| 1186 #else | |
| 1187 .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE | |
| 1188 #endif | |
| 1189 .byte 0 | |
| 1190 .endr | |
|
80
2085233a121a
Merge from eCos master repository on 2000-04-07-07:52:29-BST
jlarmour
parents:
76
diff
changeset
|
1191 .balign 16 |
| 2 | 1192 __startup_stack: |
| 1193 | |
|
56
755351606154
Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents:
54
diff
changeset
|
1194 #ifdef PLATFORM_EXTRAS |
|
755351606154
Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents:
54
diff
changeset
|
1195 #include PLATFORM_EXTRAS |
|
755351606154
Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents:
54
diff
changeset
|
1196 #endif |
|
755351606154
Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents:
54
diff
changeset
|
1197 |
| 2 | 1198 // -------------------------------------------------------------------------- |
| 1199 // end of vectors.S |
