annotate packages/hal/arm/arch/current/src/vectors.S @ 3173:afb59e9b7339

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