Mercurial > flash_v2
annotate packages/hal/mn10300/arch/current/include/hal_arch.h @ 1777:c16341b1bac6 default tip
* Added execute permissions to files missed in conversion from CVS
| author | alexs |
|---|---|
| date | Mon, 12 Oct 2009 02:26:09 +0100 |
| parents | d2c90368aeef |
| children |
| rev | line source |
|---|---|
| 0 | 1 #ifndef CYGONCE_HAL_HAL_ARCH_H |
| 2 #define CYGONCE_HAL_HAL_ARCH_H | |
| 2 | 3 //========================================================================== |
| 4 // | |
| 5 // hal_arch.h | |
| 0 | 6 // |
| 2 | 7 // Architecture specific abstractions |
| 0 | 8 // |
| 2 | 9 //========================================================================== |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
10 //####ECOSGPLCOPYRIGHTBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
11 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
12 // This file is part of eCos, the Embedded Configurable Operating System. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
13 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
14 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
15 // eCos is free software; you can redistribute it and/or modify it under |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
16 // the terms of the GNU General Public License as published by the Free |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
17 // Software Foundation; either version 2 or (at your option) any later version. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
18 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
19 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
20 // WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
21 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
22 // for more details. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
23 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
24 // You should have received a copy of the GNU General Public License along |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
25 // with eCos; if not, write to the Free Software Foundation, Inc., |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
26 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
27 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
28 // As a special exception, if other files instantiate templates or use macros |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
29 // or inline functions from this file, or you compile this file and link it |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
30 // with other works to produce a work based on this file, this file does not |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
31 // by itself cause the resulting work to be covered by the GNU General Public |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
32 // License. However the source code for this file must still be made available |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
33 // in accordance with section (3) of the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
34 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
35 // This exception does not invalidate any other reasons why a work based on |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
36 // this file might be covered by the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
37 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
38 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
|
210
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
39 // at http://sources.redhat.com/ecos/ecos-license/ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
40 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
143
diff
changeset
|
41 //####ECOSGPLCOPYRIGHTEND#### |
| 2 | 42 //========================================================================== |
| 0 | 43 //#####DESCRIPTIONBEGIN#### |
| 44 // | |
| 2 | 45 // Author(s): nickg |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
46 // Contributors: nickg, dmoseley |
| 2 | 47 // Date: 1999-02-18 |
| 48 // Purpose: Define architecture abstractions | |
| 49 // Usage: #include <cyg/hal/hal_arch.h> | |
| 50 // | |
| 0 | 51 //####DESCRIPTIONEND#### |
| 52 // | |
| 2 | 53 //========================================================================== |
| 0 | 54 |
| 2 | 55 #include <pkgconf/hal.h> |
| 0 | 56 #include <cyg/infra/cyg_type.h> |
| 57 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
58 #include <cyg/hal/var_arch.h> |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
59 |
| 2 | 60 //-------------------------------------------------------------------------- |
| 0 | 61 // Exception handling function. |
| 62 // This function is defined by the kernel according to this prototype. It is | |
| 63 // invoked from the HAL to deal with any CPU exceptions that the HAL does | |
| 64 // not want to deal with itself. It usually invokes the kernel's exception | |
| 65 // delivery mechanism. | |
| 66 | |
| 2 | 67 externC void cyg_hal_deliver_exception( CYG_WORD code, CYG_ADDRWORD data ); |
| 0 | 68 |
| 2 | 69 //-------------------------------------------------------------------------- |
| 0 | 70 // Bit manipulation routines |
| 71 | |
| 72 externC cyg_uint32 hal_lsbit_index(cyg_uint32 mask); | |
| 73 externC cyg_uint32 hal_msbit_index(cyg_uint32 mask); | |
| 74 | |
| 75 #define HAL_LSBIT_INDEX(index, mask) index = hal_lsbit_index(mask); | |
| 76 | |
| 77 #define HAL_MSBIT_INDEX(index, mask) index = hal_msbit_index(mask); | |
| 78 | |
| 2 | 79 //-------------------------------------------------------------------------- |
| 0 | 80 // Context Initialization |
| 81 // Initialize the context of a thread. | |
| 82 // Arguments: | |
| 83 // _sp_ name of variable containing current sp, will be written with new sp | |
| 84 // _thread_ thread object address, passed as argument to entry point | |
| 85 // _entry_ entry point address. | |
| 86 // _id_ bit pattern used in initializing registers, for debugging. | |
| 87 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
88 #ifndef HAL_THREAD_INIT_CONTEXT_EXTRA |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
89 #define HAL_THREAD_INIT_CONTEXT_EXTRA(_regs_, _id_) |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
90 #endif |
| 0 | 91 |
| 92 #define HAL_THREAD_INIT_CONTEXT( _sp_, _thread_, _entry_, _id_ ) \ | |
| 93 { \ | |
| 94 register HAL_SavedRegisters *_regs_; \ | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
95 _regs_ = (HAL_SavedRegisters *)(((CYG_ADDRWORD)(_sp_)&~15) - \ |
| 2 | 96 sizeof(HAL_SavedRegisters)*2); \ |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
97 HAL_THREAD_INIT_CONTEXT_EXTRA(_regs_, _id_); \ |
| 0 | 98 _regs_->d0 = (CYG_WORD)(_thread_); \ |
| 99 _regs_->d1 = (_id_)|0xddd1; \ | |
| 100 _regs_->d2 = (_id_)|0xddd2; \ | |
| 101 _regs_->d3 = (_id_)|0xddd3; \ | |
| 102 _regs_->a0 = (_id_)|0xaaa0; \ | |
| 103 _regs_->a1 = (_id_)|0xaaa1; \ | |
| 104 _regs_->a2 = (_id_)|0xaaa2; \ | |
| 105 _regs_->a3 = (_id_)|0xaaa3; \ | |
| 106 _regs_->mdr = 0; \ | |
| 107 _regs_->lir = 0; \ | |
| 108 _regs_->lar = 0; \ | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
109 _regs_->psw = 0x0000F00; \ |
| 0 | 110 _regs_->pc = (CYG_WORD)(_entry_); \ |
| 111 _sp_ = (CYG_ADDRESS)_regs_; \ | |
| 112 } | |
| 113 | |
| 2 | 114 //-------------------------------------------------------------------------- |
| 0 | 115 // Context switch macros. |
| 116 // The arguments are pointers to locations where the stack pointer | |
| 117 // of the current thread is to be stored, and from where the sp of the | |
| 118 // next thread is to be fetched. | |
| 119 | |
| 120 externC void hal_thread_switch_context( CYG_ADDRESS to, CYG_ADDRESS from ); | |
| 121 externC void hal_thread_load_context( CYG_ADDRESS to ) | |
| 122 __attribute__ ((noreturn)); | |
| 123 | |
| 124 #define HAL_THREAD_SWITCH_CONTEXT(_fspptr_,_tspptr_) \ | |
| 2 | 125 hal_thread_switch_context((CYG_ADDRESS)_tspptr_, \ |
| 126 (CYG_ADDRESS)_fspptr_); | |
| 0 | 127 |
| 128 #define HAL_THREAD_LOAD_CONTEXT(_tspptr_) \ | |
| 129 hal_thread_load_context( (CYG_ADDRESS)_tspptr_ ); | |
| 130 | |
| 2 | 131 //-------------------------------------------------------------------------- |
| 0 | 132 // Execution reorder barrier. |
| 133 // When optimizing the compiler can reorder code. In multithreaded systems | |
| 134 // where the order of actions is vital, this can sometimes cause problems. | |
| 135 // This macro may be inserted into places where reordering should not happen. | |
| 136 | |
| 2 | 137 #define HAL_REORDER_BARRIER() asm volatile ( "" : : : "memory" ) |
| 0 | 138 |
| 2 | 139 //-------------------------------------------------------------------------- |
| 0 | 140 // Breakpoint support |
| 2 | 141 // HAL_BREAKPOINT() is a code sequence that will cause a breakpoint to |
| 142 // happen if executed. | |
| 143 // HAL_BREAKINST is the value of the breakpoint instruction and | |
| 144 // HAL_BREAKINST_SIZE is its size in bytes. | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
145 // HAL_BREAKINST_TYPE is the type. |
| 0 | 146 |
| 147 #define HAL_BREAKPOINT(_label_) \ | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
148 asm volatile (" .globl _" #_label_ ";" \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
149 "_"#_label_":" \ |
| 0 | 150 ".byte 0xFF" \ |
| 151 ); | |
| 152 | |
| 153 #define HAL_BREAKINST 0xFF | |
| 154 | |
| 155 #define HAL_BREAKINST_SIZE 1 | |
| 156 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
157 #define HAL_BREAKINST_TYPE cyg_uint8 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
158 |
| 2 | 159 //-------------------------------------------------------------------------- |
| 0 | 160 // Thread register state manipulation for GDB support. |
| 161 | |
| 162 // Translate a stack pointer as saved by the thread context macros above into | |
| 163 // a pointer to a HAL_SavedRegisters structure. | |
| 2 | 164 #define HAL_THREAD_GET_SAVED_REGISTERS( _sp_, _regs_ ) \ |
| 0 | 165 (_regs_) = (HAL_SavedRegisters *)(_sp_) |
| 166 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
167 #ifndef HAL_GET_GDB_EXTRA_REGISTERS |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
168 #define HAL_GET_GDB_EXTRA_REGISTERS( _regval_, _regs_ ) |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
169 #endif |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
170 #ifndef HAL_SET_GDB_EXTRA_REGISTERS |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
171 #define HAL_SET_GDB_EXTRA_REGISTERS( _regs_, _regval_ ) |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
172 #endif |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
173 |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
174 |
| 0 | 175 // Copy a set of registers from a HAL_SavedRegisters structure into a |
| 176 // GDB ordered array. | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
177 // |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
178 // The CYGMON version should differ by also handling SP and PSW |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
179 // since we will be using a different stack. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
180 #ifdef CYGPKG_CYGMON |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
181 #define HAL_GET_GDB_REGISTERS( _aregval_ , _regs_ ) \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
182 { \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
183 CYG_ADDRWORD *_regval_ = (CYG_ADDRWORD *)(_aregval_); \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
184 \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
185 _regval_[0] = (_regs_)->d0; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
186 _regval_[1] = (_regs_)->d1; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
187 _regval_[2] = (_regs_)->d2; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
188 _regval_[3] = (_regs_)->d3; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
189 _regval_[4] = (_regs_)->a0; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
190 _regval_[5] = (_regs_)->a1; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
191 _regval_[6] = (_regs_)->a2; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
192 _regval_[7] = (_regs_)->a3; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
193 \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
194 _regval_[8] = (_regs_)->sp; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
195 _regval_[9] = (_regs_)->pc; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
196 _regval_[10] = (_regs_)->mdr; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
197 _regval_[11] = (_regs_)->psw; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
198 \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
199 _regval_[12] = (_regs_)->lar; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
200 _regval_[13] = (_regs_)->lir; \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
201 HAL_GET_GDB_EXTRA_REGISTERS( _regval_, _regs_ ); \ |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
202 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
203 #else |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
204 #define HAL_GET_GDB_REGISTERS( _aregval_ , _regs_ ) \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
205 { \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
206 CYG_ADDRWORD *_regval_ = (CYG_ADDRWORD *)(_aregval_); \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
207 \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
208 _regval_[0] = (_regs_)->d0; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
209 _regval_[1] = (_regs_)->d1; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
210 _regval_[2] = (_regs_)->d2; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
211 _regval_[3] = (_regs_)->d3; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
212 _regval_[4] = (_regs_)->a0; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
213 _regval_[5] = (_regs_)->a1; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
214 _regval_[6] = (_regs_)->a2; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
215 _regval_[7] = (_regs_)->a3; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
216 \ |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
217 _regval_[8] = (_regs_)->sp = (CYG_ADDRWORD)(_regs_) + \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
218 sizeof(HAL_SavedRegisters); \ |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
219 _regval_[9] = (_regs_)->pc; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
220 _regval_[10] = (_regs_)->mdr; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
221 _regval_[11] = (_regs_)->psw; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
222 \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
223 _regval_[12] = (_regs_)->lar; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
224 _regval_[13] = (_regs_)->lir; \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
225 HAL_GET_GDB_EXTRA_REGISTERS( _regval_, _regs_ ); \ |
| 0 | 226 } |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
115
diff
changeset
|
227 #endif |
| 0 | 228 |
| 229 // Copy a GDB ordered array into a HAL_SavedRegisters structure. | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
230 // |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
231 // The CYGMON version should differ by also handling SP and PSW |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
232 // since we will be using a different stack. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
233 #ifdef CYGPKG_CYGMON |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
234 #define HAL_SET_GDB_REGISTERS( _regs_ , _aregval_ ) \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
235 { \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
236 CYG_ADDRWORD *_regval_ = (CYG_ADDRWORD *)(_aregval_); \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
237 \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
238 (_regs_)->d0 = _regval_[0]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
239 (_regs_)->d1 = _regval_[1]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
240 (_regs_)->d2 = _regval_[2]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
241 (_regs_)->d3 = _regval_[3]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
242 (_regs_)->a0 = _regval_[4]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
243 (_regs_)->a1 = _regval_[5]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
244 (_regs_)->a2 = _regval_[6]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
245 (_regs_)->a3 = _regval_[7]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
246 \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
247 (_regs_)->sp = _regval_[8]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
248 (_regs_)->pc = _regval_[9]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
249 (_regs_)->mdr = _regval_[10]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
250 (_regs_)->psw = _regval_[11]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
251 \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
252 (_regs_)->lar = _regval_[12]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
253 (_regs_)->lir = _regval_[13]; \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
254 \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
255 HAL_SET_GDB_EXTRA_REGISTERS( _regs_, _regval_ ); \ |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
256 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
257 #else |
| 0 | 258 #define HAL_SET_GDB_REGISTERS( _regs_ , _aregval_ ) \ |
| 259 { \ | |
| 260 CYG_ADDRWORD *_regval_ = (CYG_ADDRWORD *)(_aregval_); \ | |
| 261 \ | |
| 262 (_regs_)->d0 = _regval_[0]; \ | |
| 263 (_regs_)->d1 = _regval_[1]; \ | |
| 264 (_regs_)->d2 = _regval_[2]; \ | |
| 265 (_regs_)->d3 = _regval_[3]; \ | |
| 266 (_regs_)->a0 = _regval_[4]; \ | |
| 267 (_regs_)->a1 = _regval_[5]; \ | |
| 268 (_regs_)->a2 = _regval_[6]; \ | |
| 269 (_regs_)->a3 = _regval_[7]; \ | |
| 270 \ | |
| 271 (_regs_)->pc = _regval_[9]; \ | |
| 272 (_regs_)->mdr = _regval_[10]; \ | |
| 273 \ | |
| 274 (_regs_)->lar = _regval_[12]; \ | |
| 275 (_regs_)->lir = _regval_[13]; \ | |
| 276 \ | |
| 277 /* We do not allow the SP or PSW to be set. Changing the SP will \ | |
| 278 * mess up the saved state. No PSW is saved on thread context \ | |
| 279 * switches, so there is nowhere to save it to. \ | |
| 280 */ \ | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
281 \ |
|
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
282 HAL_SET_GDB_EXTRA_REGISTERS( _regs_, _regval_ ); \ |
| 0 | 283 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
101
diff
changeset
|
284 #endif |
| 0 | 285 |
| 2 | 286 //------------------------------------------------------------------------- |
| 0 | 287 // HAL setjmp |
| 2 | 288 // Note: These definitions are repeated in context.S. If changes are required |
| 289 // remember to update both sets. | |
| 0 | 290 |
| 2 | 291 #define CYGARC_JMP_BUF_SP 0 |
| 292 #define CYGARC_JMP_BUF_D2 1 | |
| 293 #define CYGARC_JMP_BUF_D3 2 | |
| 294 #define CYGARC_JMP_BUF_A2 3 | |
| 295 #define CYGARC_JMP_BUF_A3 4 | |
| 296 #define CYGARC_JMP_BUF_LR 5 | |
| 0 | 297 |
| 2 | 298 #define CYGARC_JMP_BUF_SIZE 6 |
| 299 | |
| 300 typedef cyg_uint32 hal_jmp_buf[CYGARC_JMP_BUF_SIZE]; | |
| 0 | 301 |
| 302 externC int hal_setjmp(hal_jmp_buf env); | |
| 303 externC void hal_longjmp(hal_jmp_buf env, int val); | |
| 304 | |
| 2 | 305 //------------------------------------------------------------------------- |
| 0 | 306 // Idle thread code. |
| 307 // This macro is called in the idle thread loop, and gives the HAL the | |
| 308 // chance to insert code. Typical idle thread behaviour might be to halt the | |
| 309 // processor. | |
| 310 | |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
311 externC void hal_idle_thread_action(cyg_uint32 loop_count); |
| 0 | 312 |
|
30
641b639be825
Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents:
6
diff
changeset
|
313 #define HAL_IDLE_THREAD_ACTION(_count_) hal_idle_thread_action(_count_) |
| 0 | 314 |
| 315 //----------------------------------------------------------------------------- | |
| 2 | 316 // Minimal and sensible stack sizes: the intention is that applications |
| 317 // will use these to provide a stack size in the first instance prior to | |
| 318 // proper analysis. Idle thread stack should be this big. | |
| 319 | |
| 320 // THESE ARE NOT INTENDED TO BE MICROMETRICALLY ACCURATE FIGURES. | |
| 321 // THEY ARE HOWEVER ENOUGH TO START PROGRAMMING. | |
| 322 // YOU MUST MAKE YOUR STACKS LARGER IF YOU HAVE LARGE "AUTO" VARIABLES! | |
| 323 | |
| 324 // We define quite large stack needs for SPARClite, for it requires 576 | |
| 325 // bytes (144 words) to process an interrupt and thread-switch, and | |
| 326 // momentarily, but needed in case of recursive interrupts, it needs 208 | |
| 327 // words - if a sequence of saves to push out other regsets is interrupted. | |
| 328 | |
| 329 // This is not a config option because it should not be adjusted except | |
| 330 // under "enough rope" sort of disclaimers. | |
| 331 | |
| 332 // Worst case stack frame size: return link + 4 args + 4 pushed registers. | |
| 333 #define CYGNUM_HAL_STACK_FRAME_SIZE (40) | |
| 334 | |
| 335 // Stack needed for a context switch: | |
| 336 #define CYGNUM_HAL_STACK_CONTEXT_SIZE (60) | |
| 337 | |
| 338 // Interrupt + call to ISR, interrupt_end() and the DSR | |
| 339 #define CYGNUM_HAL_STACK_INTERRUPT_SIZE (128) | |
| 340 | |
| 341 #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
| 342 | |
| 343 // An interrupt stack which is large enough for all possible interrupt | |
| 344 // conditions (and only used for that purpose) exists. "User" stacks | |
| 345 // can be much smaller | |
| 346 | |
| 347 #define CYGNUM_HAL_STACK_SIZE_MINIMUM (CYGNUM_HAL_STACK_CONTEXT_SIZE+ \ | |
| 348 CYGNUM_HAL_STACK_INTERRUPT_SIZE*2+ \ | |
| 349 CYGNUM_HAL_STACK_FRAME_SIZE*16) | |
| 350 #define CYGNUM_HAL_STACK_SIZE_TYPICAL (2048) | |
| 351 | |
| 352 #else // CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK | |
| 353 | |
| 354 // No separate interrupt stack exists. Make sure all threads contain | |
| 355 // a stack sufficiently large. | |
| 356 | |
| 357 #define CYGNUM_HAL_STACK_SIZE_MINIMUM (4096) | |
| 358 #define CYGNUM_HAL_STACK_SIZE_TYPICAL (4096) | |
| 359 | |
| 360 #endif | |
| 361 | |
| 362 //-------------------------------------------------------------------------- | |
|
101
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
363 // Macros for switching context between two eCos instances (jump from |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
364 // code in ROM to code in RAM or vice versa). |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
365 #define CYGARC_HAL_SAVE_GP() |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
366 #define CYGARC_HAL_RESTORE_GP() |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
367 |
|
c37d3a9e1b28
Merge from eCos master repository on 2000-06-16-07:47:03-BST
jlarmour
parents:
76
diff
changeset
|
368 //-------------------------------------------------------------------------- |
| 0 | 369 #endif // CYGONCE_HAL_HAL_ARCH_H |
| 2 | 370 // EOF hal_arch.h |
