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