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