Mercurial > flash_v2
annotate packages/hal/mips/arch/current/src/hal_misc.c @ 38:e7ba79f6d3a8 ecos-sw-1999-09-23
Merge from eCos master repository on 1999-09-23-20:10:25-BST
| author | jlarmour |
|---|---|
| date | Thu, 23 Sep 1999 19:52:27 +0000 |
| parents | e97d78785e2d |
| children | a0774359f013 |
| rev | line source |
|---|---|
| 2 | 1 //========================================================================== |
| 0 | 2 // |
| 2 | 3 // hal_misc.c |
| 0 | 4 // |
| 2 | 5 // HAL miscellaneous functions |
| 0 | 6 // |
| 2 | 7 //========================================================================== |
| 0 | 8 //####COPYRIGHTBEGIN#### |
| 9 // | |
| 10 // ------------------------------------------- | |
| 11 // The contents of this file are subject to the Cygnus eCos Public License | |
| 12 // Version 1.0 (the "License"); you may not use this file except in | |
| 13 // compliance with the License. You may obtain a copy of the License at | |
| 14 // http://sourceware.cygnus.com/ecos | |
| 15 // | |
| 16 // Software distributed under the License is distributed on an "AS IS" | |
| 17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the | |
| 18 // License for the specific language governing rights and limitations under | |
| 19 // the License. | |
| 20 // | |
| 21 // The Original Code is eCos - Embedded Cygnus Operating System, released | |
| 22 // September 30, 1998. | |
| 23 // | |
| 24 // The Initial Developer of the Original Code is Cygnus. Portions created | |
| 2 | 25 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved. |
| 0 | 26 // ------------------------------------------- |
| 27 // | |
| 28 //####COPYRIGHTEND#### | |
| 2 | 29 //========================================================================== |
| 0 | 30 //#####DESCRIPTIONBEGIN#### |
| 31 // | |
| 2 | 32 // Author(s): nickg |
| 33 // Contributors: nickg, jlarmour | |
| 34 // Date: 1999-01-21 | |
| 35 // Purpose: HAL miscellaneous functions | |
| 36 // Description: This file contains miscellaneous functions provided by the | |
| 37 // HAL. | |
| 0 | 38 // |
| 39 //####DESCRIPTIONEND#### | |
| 40 // | |
| 2 | 41 //========================================================================*/ |
| 0 | 42 |
| 43 #include <pkgconf/hal.h> | |
| 44 | |
| 45 #include <cyg/infra/cyg_type.h> // Base types | |
| 46 #include <cyg/infra/cyg_trac.h> // tracing macros | |
| 47 #include <cyg/infra/cyg_ass.h> // assertion macros | |
| 48 | |
| 49 #include <cyg/hal/hal_arch.h> // architectural definitions | |
| 50 | |
| 51 #include <cyg/hal/hal_intr.h> // Interrupt handling | |
| 52 | |
| 53 #include <cyg/hal/hal_cache.h> // Cache handling | |
| 54 | |
| 2 | 55 /*------------------------------------------------------------------------*/ |
|
18
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
56 /* If required, define a variable to store the clock period. */ |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
57 |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
58 #ifdef CYGHWR_HAL_CLOCK_PERIOD_DEFINED |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
59 |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
60 CYG_WORD32 cyg_hal_clock_period; |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
61 |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
62 #endif |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
63 |
|
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
64 /*------------------------------------------------------------------------*/ |
| 2 | 65 /* First level C exception handler. */ |
| 0 | 66 |
| 67 externC void __handle_exception (void); | |
| 68 | |
| 69 externC HAL_SavedRegisters *_hal_registers; | |
| 70 | |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
26
diff
changeset
|
71 externC void *__mem_fault_handler; |
|
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
26
diff
changeset
|
72 |
|
26
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
73 externC cyg_uint8 cyg_hal_mips_process_fpe( HAL_SavedRegisters *regs ); |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
74 |
|
38
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
75 externC cyg_uint32 cyg_hal_exception_handler(HAL_SavedRegisters *regs) |
| 0 | 76 { |
|
26
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
77 #ifdef CYGHWR_HAL_MIPS_FPU |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
78 // We may be required to emulate certain unimplemented Floating Point |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
79 // operations |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
80 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
81 if ((regs->vector>>2) == CYGNUM_HAL_VECTOR_FPE) { |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
82 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
83 // cyg_hal_mips_process_fpe() returns non-zero if it could handle |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
84 // the exception successfully. If so, we just return |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
85 |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
86 if ( cyg_hal_mips_process_fpe(regs) ) |
|
38
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
87 return 0; |
|
26
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
88 } |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
89 #endif |
|
4741a3c3496a
Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
18
diff
changeset
|
90 |
| 0 | 91 #if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) |
| 92 | |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
26
diff
changeset
|
93 // If we caught an exception inside the stubs, see if we were expecting it |
|
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
26
diff
changeset
|
94 // and if so jump to the saved address |
|
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
26
diff
changeset
|
95 if (__mem_fault_handler) { |
|
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
26
diff
changeset
|
96 regs->pc = (CYG_ADDRWORD)__mem_fault_handler; |
|
38
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
97 return 0; // Caught an exception inside stubs |
|
36
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
26
diff
changeset
|
98 } |
|
e97d78785e2d
Merge from eCos master repository on 1999-09-12-15:40:34-BST
jlarmour
parents:
26
diff
changeset
|
99 |
| 0 | 100 // Set the pointer to the registers of the current exception |
| 101 // context. At entry the GDB stub will expand the | |
| 102 // HAL_SavedRegisters structure into a (bigger) register array. | |
| 103 _hal_registers = regs; | |
| 104 __handle_exception(); | |
| 105 | |
| 106 #elif defined(CYGFUN_HAL_COMMON_KERNEL_SUPPORT) && defined(CYGPKG_HAL_EXCEPTIONS) | |
| 107 | |
| 108 // We should decode the vector and pass a more appropriate | |
| 109 // value as the second argument. For now we simply pass a | |
| 110 // pointer to the saved registers. We should also divert | |
| 111 // breakpoint and other debug vectors into the debug stubs. | |
| 112 | |
| 2 | 113 cyg_hal_deliver_exception( regs->vector>>2, (CYG_ADDRWORD)regs ); |
| 0 | 114 |
| 115 #else | |
| 116 | |
| 117 CYG_FAIL("Exception!!!"); | |
| 118 | |
| 119 #endif | |
|
38
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
120 return 0; |
| 0 | 121 } |
| 122 | |
| 2 | 123 /*------------------------------------------------------------------------*/ |
| 124 /* default ISR */ | |
| 0 | 125 |
| 126 externC cyg_uint32 hal_default_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data) | |
| 127 { | |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
128 #if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) && \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
129 defined(CYGHWR_HAL_GDB_PORT_VECTOR) && \ |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
130 defined(HAL_CTRLC_ISR) |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
131 |
|
18
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
132 #ifndef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
133 if( vector == CYGHWR_HAL_GDB_PORT_VECTOR ) |
|
18
7253dcc42a09
Merge from eCos master repository on 1999-06-25-15:31:50-BST
jlarmour
parents:
16
diff
changeset
|
134 #endif |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
135 { |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
136 cyg_uint32 result = HAL_CTRLC_ISR( vector, data ); |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
137 if( result != 0 ) return result; |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
138 } |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
139 |
|
38
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
140 #if defined(CYG_HAL_USE_ROM_MONITOR_CYGMON) |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
141 #if defined(HAL_DIAG_IRQ_CHECK) |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
142 { |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
143 cyg_uint32 ret; |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
144 /* let ROM monitor handle unexpected interrupts */ |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
145 HAL_DIAG_IRQ_CHECK(vector, ret); |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
146 if (ret<=0) |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
147 return ret; |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
148 } |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
149 #endif // def HAL_DIAG_IRQ_CHECK |
|
e7ba79f6d3a8
Merge from eCos master repository on 1999-09-23-20:10:25-BST
jlarmour
parents:
36
diff
changeset
|
150 #endif // def CYG_HAL_USE_ROM_MONITOR |
|
10
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
151 #endif |
|
d3fbcdfa1b2f
Merge from eCos master repository on 1999-05-29-00:13:11-BST
jlarmour
parents:
6
diff
changeset
|
152 |
| 0 | 153 CYG_TRACE1(true, "Interrupt: %d", vector); |
| 154 CYG_FAIL("Spurious Interrupt!!!"); | |
| 155 return 0; | |
| 156 } | |
| 157 | |
| 2 | 158 /*------------------------------------------------------------------------*/ |
| 159 /* data copy and bss zero functions */ | |
| 0 | 160 |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
12
diff
changeset
|
161 typedef void (CYG_SYM_ADDRESS)(void); |
| 0 | 162 |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
12
diff
changeset
|
163 // All these must use this type of address to stop them being given relocations |
|
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
12
diff
changeset
|
164 // relative to $gp (i.e. assuming they would be in .sdata) |
|
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
12
diff
changeset
|
165 extern CYG_SYM_ADDRESS __ram_data_start; |
|
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
12
diff
changeset
|
166 extern CYG_SYM_ADDRESS __ram_data_end; |
|
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
12
diff
changeset
|
167 extern CYG_SYM_ADDRESS __rom_data_start; |
| 2 | 168 |
| 169 #ifdef CYG_HAL_STARTUP_ROM | |
| 0 | 170 void hal_copy_data(void) |
| 171 { | |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
12
diff
changeset
|
172 char *p = (char *)&__ram_data_start; |
| 0 | 173 char *q = (char *)&__rom_data_start; |
| 174 | |
| 175 while( p != (char *)&__ram_data_end ) | |
| 176 *p++ = *q++; | |
| 177 } | |
| 178 #endif | |
| 179 | |
|
16
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
12
diff
changeset
|
180 extern CYG_SYM_ADDRESS __bss_start; |
|
4f2df4ab82c8
Merge from eCos master repository on 1999-06-18-15:25:04-BST
jlarmour
parents:
12
diff
changeset
|
181 extern CYG_SYM_ADDRESS __bss_end; |
| 2 | 182 |
| 0 | 183 void hal_zero_bss(void) |
| 184 { | |
| 185 char *p = (char *)&__bss_start; | |
| 186 | |
| 2 | 187 while( p != (char *)&__bss_end ) |
| 0 | 188 *p++ = 0; |
| 189 } | |
| 190 | |
| 2 | 191 /*------------------------------------------------------------------------*/ |
| 0 | 192 |
| 2 | 193 #ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG |
| 194 cyg_bool cyg_hal_stop_constructors; | |
| 195 #endif | |
| 196 | |
| 197 typedef void (*pfunc) (void); | |
| 198 extern pfunc __CTOR_LIST__[]; | |
|
12
4cc3eff958ab
Merge from eCos master repository on 1999-06-04-22:24:56-BST
jlarmour
parents:
10
diff
changeset
|
199 extern pfunc __CTOR_END__[]; |
| 0 | 200 |
| 201 void | |
| 2 | 202 cyg_hal_invoke_constructors(void) |
| 0 | 203 { |
| 2 | 204 #ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG |
|
12
4cc3eff958ab
Merge from eCos master repository on 1999-06-04-22:24:56-BST
jlarmour
parents:
10
diff
changeset
|
205 static pfunc *p = &__CTOR_END__[-1]; |
| 2 | 206 |
|
12
4cc3eff958ab
Merge from eCos master repository on 1999-06-04-22:24:56-BST
jlarmour
parents:
10
diff
changeset
|
207 cyg_hal_stop_constructors = 0; |
|
4cc3eff958ab
Merge from eCos master repository on 1999-06-04-22:24:56-BST
jlarmour
parents:
10
diff
changeset
|
208 for (; p >= __CTOR_LIST__; p--) { |
|
4cc3eff958ab
Merge from eCos master repository on 1999-06-04-22:24:56-BST
jlarmour
parents:
10
diff
changeset
|
209 (*p) (); |
| 2 | 210 if (cyg_hal_stop_constructors) { |
|
12
4cc3eff958ab
Merge from eCos master repository on 1999-06-04-22:24:56-BST
jlarmour
parents:
10
diff
changeset
|
211 p--; |
| 2 | 212 break; |
| 213 } | |
| 214 } | |
| 215 #else | |
|
12
4cc3eff958ab
Merge from eCos master repository on 1999-06-04-22:24:56-BST
jlarmour
parents:
10
diff
changeset
|
216 pfunc *p; |
|
4cc3eff958ab
Merge from eCos master repository on 1999-06-04-22:24:56-BST
jlarmour
parents:
10
diff
changeset
|
217 |
|
4cc3eff958ab
Merge from eCos master repository on 1999-06-04-22:24:56-BST
jlarmour
parents:
10
diff
changeset
|
218 for (p = &__CTOR_END__[-1]; p >= __CTOR_LIST__; p--) |
|
4cc3eff958ab
Merge from eCos master repository on 1999-06-04-22:24:56-BST
jlarmour
parents:
10
diff
changeset
|
219 (*p) (); |
| 2 | 220 #endif |
| 0 | 221 |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
222 } // cyg_hal_invoke_constructors() |
| 0 | 223 |
| 2 | 224 /*------------------------------------------------------------------------*/ |
| 225 /* Determine the index of the ls bit of the supplied mask. */ | |
| 0 | 226 |
| 227 cyg_uint32 hal_lsbit_index(cyg_uint32 mask) | |
| 228 { | |
| 229 cyg_uint32 n = mask; | |
| 230 | |
| 231 static const signed char tab[64] = | |
| 232 { -1, 0, 1, 12, 2, 6, 0, 13, 3, 0, 7, 0, 0, 0, 0, 14, 10, | |
| 233 4, 0, 0, 8, 0, 0, 25, 0, 0, 0, 0, 0, 21, 27 , 15, 31, 11, | |
| 234 5, 0, 0, 0, 0, 0, 9, 0, 0, 24, 0, 0 , 20, 26, 30, 0, 0, 0, | |
| 235 0, 23, 0, 19, 29, 0, 22, 18, 28, 17, 16, 0 | |
| 236 }; | |
| 237 | |
| 238 n &= ~(n-1UL); | |
| 239 n = (n<<16)-n; | |
| 240 n = (n<<6)+n; | |
| 241 n = (n<<4)+n; | |
| 242 | |
| 243 return tab[n>>26]; | |
| 244 } | |
| 245 | |
| 2 | 246 /*------------------------------------------------------------------------*/ |
| 247 /* Determine the index of the ms bit of the supplied mask. */ | |
| 0 | 248 |
| 249 cyg_uint32 hal_msbit_index(cyg_uint32 mask) | |
| 250 { | |
| 251 cyg_uint32 x = mask; | |
| 252 cyg_uint32 w; | |
| 253 | |
| 254 /* Phase 1: make word with all ones from that one to the right */ | |
| 255 x |= x >> 16; | |
| 256 x |= x >> 8; | |
| 257 x |= x >> 4; | |
| 258 x |= x >> 2; | |
| 259 x |= x >> 1; | |
| 260 | |
| 261 /* Phase 2: calculate number of "1" bits in the word */ | |
| 262 w = (x & 0x55555555) + ((x >> 1) & 0x55555555); | |
| 263 w = (w & 0x33333333) + ((w >> 2) & 0x33333333); | |
| 264 w = w + (w >> 4); | |
| 265 w = (w & 0x000F000F) + ((w >> 8) & 0x000F000F); | |
| 266 return (cyg_uint32)((w + (w >> 16)) & 0xFF); | |
| 267 | |
| 268 } | |
| 269 | |
| 2 | 270 /*------------------------------------------------------------------------*/ |
| 271 /* Idle thread action */ | |
| 0 | 272 |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
273 #include <cyg/infra/diag.h> |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
274 |
| 0 | 275 void hal_idle_thread_action( cyg_uint32 count ) |
| 276 { | |
| 277 #if 0 //def CYG_HAL_MIPS_SIM | |
| 278 if( (count % 1000) == 0 ) | |
| 279 { | |
| 280 // This code causes a fake interrupt. | |
| 281 asm volatile ( | |
| 282 "xor $24,$24,$24;" | |
| 283 "mtc0 $24,$13;" | |
| 284 "lui $25,%%hi(1f);" | |
| 285 "ori $25,$25,%%lo(1f);" | |
| 286 "j other_vector;" | |
| 287 "nop;" | |
| 288 "1:" | |
| 289 : | |
| 290 : | |
| 291 : "t8", "t9" | |
| 292 ); | |
| 293 } | |
| 294 #endif | |
| 295 #if 0 //def CYG_HAL_MIPS_JMR3904 | |
| 296 | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
297 if( (count % 100000 ) == 0 ) |
| 0 | 298 { |
| 299 // cyg_uint32 tval, isr, imr, ilr; | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
300 cyg_uint32 sr = 0, cr = 0, ctr = 0, cpr = 0; |
| 0 | 301 // HAL_CLOCK_READ( &tval ); |
| 302 // HAL_READ_UINT32( 0xFFFFC000, isr ); | |
| 303 // HAL_READ_UINT32( 0xFFFFC004, imr ); | |
| 304 // HAL_READ_UINT32( 0xFFFFC01C, ilr ); | |
| 305 // CYG_TRACE2(1, "Timer value, ISR ",tval, isr); | |
| 306 // CYG_TRACE2(1, "IMR ILR0 ", imr, ilr); | |
| 307 | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
308 // asm volatile ( |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
309 // "mfc0 %0,$12;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
310 // "nop; nop; nop;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
311 // "mfc0 %1,$13;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
312 // "nop; nop; nop;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
313 // "mfc0 %2,$9;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
314 // "nop; nop; nop;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
315 // "mfc0 %3,$11;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
316 // "nop; nop; nop;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
317 // : "=r"(sr), "=r"(cr), "=r"(ctr), "=r"(cpr) |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
318 // ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
319 |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
320 |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
321 // diag_printf("Status %08x ", sr ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
322 // diag_printf("Cause %08x ", cr ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
323 // diag_printf("Counter %08x ", ctr ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
324 // diag_printf("Compare %08x\n", cpr); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
325 |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
326 #if 0 |
| 0 | 327 asm volatile ( |
| 328 "mfc0 %0,$12;" | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
329 "nop; nop; nop;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
330 : "=r"(sr) |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
331 ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
332 diag_write_string("Status "); diag_write_hex( sr ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
333 |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
334 asm volatile ( |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
335 "mfc0 %0,$13;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
336 "nop; nop; nop;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
337 : "=r"(cr) |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
338 ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
339 diag_write_string(" Cause "); diag_write_hex( cr ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
340 |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
341 asm volatile ( |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
342 "mfc0 %0,$9;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
343 "nop; nop; nop;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
344 : "=r"(ctr) |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
345 ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
346 diag_write_string(" Counter "); diag_write_hex( ctr ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
347 |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
348 asm volatile ( |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
349 "mfc0 %0,$11;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
350 "nop; nop; nop;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
351 : "=r"(cpr) |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
352 ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
353 diag_write_string(" Compare "); diag_write_hex( cpr ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
354 diag_write_string( "\n" ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
355 |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
356 #endif |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
357 #if 1 |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
358 asm volatile ( |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
359 "mfc0 %0,$12;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
360 "nop; nop; nop;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
361 : "=r"(sr) |
| 0 | 362 ); |
| 363 | |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
364 asm volatile ( |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
365 "mfc0 %0,$13;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
366 "nop; nop; nop;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
367 : "=r"(cr) |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
368 ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
369 |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
370 CYG_INSTRUMENT_USER( 1, sr, cr ); |
| 0 | 371 |
|
6
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
372 asm volatile ( |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
373 "mfc0 %0,$9;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
374 "nop; nop; nop;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
375 : "=r"(ctr) |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
376 ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
377 |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
378 asm volatile ( |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
379 "mfc0 %0,$11;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
380 "nop; nop; nop;" |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
381 : "=r"(cpr) |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
382 ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
383 |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
384 CYG_INSTRUMENT_USER( 2, ctr, cpr ); |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
385 #endif |
|
d376b777e2ce
Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents:
2
diff
changeset
|
386 |
| 0 | 387 // if( count == 4 ) |
| 388 // { | |
| 389 // HAL_ENABLE_INTERRUPTS(); | |
| 390 // } | |
| 391 | |
| 392 // if( count >= 10 ) | |
| 393 // for(;;); | |
| 394 } | |
| 395 #endif | |
| 396 } | |
| 397 | |
| 2 | 398 /*------------------------------------------------------------------------*/ |
| 399 /* End of hal_misc.c */ |
