Mercurial > flash_v2
annotate packages/kernel/current/tests/kcache2.c @ 199:920b9b754b53
Merge from eCos master repository on 2001-12-15-12:00:33-GMT
| author | jlarmour |
|---|---|
| date | Sat, 15 Dec 2001 13:42:19 +0000 |
| parents | 67850532eebb |
| children | e0c0827131d1 |
| rev | line source |
|---|---|
| 2 | 1 /*================================================================= |
| 2 // | |
| 3 // kcache2.c | |
| 4 // | |
| 5 // Cache feature/timing tests | |
| 6 // | |
| 7 //========================================================================== | |
| 8 //####COPYRIGHTBEGIN#### | |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
24
diff
changeset
|
9 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
24
diff
changeset
|
10 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
24
diff
changeset
|
11 // 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
|
12 // 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:
24
diff
changeset
|
13 // 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
|
14 // http://www.redhat.com/ |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
24
diff
changeset
|
15 // |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
16 // 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:
24
diff
changeset
|
17 // 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:
24
diff
changeset
|
18 // 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:
24
diff
changeset
|
19 // the License. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
24
diff
changeset
|
20 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
24
diff
changeset
|
21 // 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:
24
diff
changeset
|
22 // released September 30, 1998. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
24
diff
changeset
|
23 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
24
diff
changeset
|
24 // 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:
24
diff
changeset
|
25 // Portions created by Red Hat are |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
24
diff
changeset
|
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
24
diff
changeset
|
27 // All Rights Reserved. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
24
diff
changeset
|
28 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
24
diff
changeset
|
29 // |
| 2 | 30 //####COPYRIGHTEND#### |
| 31 //========================================================================== | |
| 32 //#####DESCRIPTIONBEGIN#### | |
| 33 // | |
| 34 // Author(s): jskov, based on kcache1.c by dsm | |
| 35 // Contributors: jskov | |
| 36 // Date: 1998-12-10 | |
| 37 // Description: Tests some of the more exotic cache macros. | |
| 38 //####DESCRIPTIONEND#### | |
| 39 */ | |
| 40 | |
| 41 #include <cyg/hal/hal_arch.h> // CYGNUM_HAL_STACK_SIZE_TYPICAL | |
| 42 | |
| 43 #include <cyg/kernel/kapi.h> | |
| 44 | |
| 45 #include <cyg/infra/testcase.h> | |
| 46 | |
| 47 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK | |
| 48 #ifdef CYGFUN_KERNEL_API_C | |
| 49 | |
| 50 #include <cyg/infra/diag.h> | |
| 51 #include <cyg/hal/hal_cache.h> | |
| 52 | |
| 53 // ------------------------------------------------------------------------- | |
| 54 | |
| 55 #define NTHREADS 1 | |
| 56 #define STACKSIZE CYGNUM_HAL_STACK_SIZE_TYPICAL | |
| 57 | |
| 58 // The following are defaults for loop variables. Note they will be overriden | |
| 59 // on simulator targets, where detected - there is no point testing a cache | |
| 60 // which doesn't exist :-). | |
| 61 | |
| 62 #define TEST_DZERO_LOOPS 5000 // default number of loops for test_dzero() | |
| 63 #define TIME_ILOCK_LOOPS 10000 // default number of loops for time_ilock() | |
| 64 #define TIME_DLOCK_LOOPS 10000 // default number of loops for time_dlock() | |
| 65 | |
| 66 | |
| 67 static cyg_handle_t thread[NTHREADS]; | |
| 68 | |
| 69 static cyg_thread thread_obj[NTHREADS]; | |
| 70 static char stack[NTHREADS][STACKSIZE]; | |
| 71 | |
| 72 #define MAXSIZE 1<<18 | |
| 73 | |
| 74 volatile char m[MAXSIZE]; | |
| 75 | |
| 76 // ------------------------------------------------------------------------- | |
| 77 // Test of data cache zero. | |
| 78 // o Timing comparison with instructions doing the same amount of work. | |
| 79 // o Check that area cleared with the DCACHE_ZERO macro contains zeros. | |
| 80 #ifdef HAL_DCACHE_ZERO | |
| 81 static void test_dzero(void) | |
| 82 { | |
| 83 register cyg_uint32 k, i; | |
| 84 cyg_tick_count_t count0, count1; | |
| 85 cyg_ucount32 t; | |
| 86 volatile cyg_uint32* aligned_p; | |
| 87 volatile cyg_uint32* p; | |
| 88 register CYG_INTERRUPT_STATE oldints; | |
| 89 cyg_ucount32 test_dzero_loops = TEST_DZERO_LOOPS; | |
| 90 | |
| 91 CYG_TEST_INFO("Data cache zero"); | |
| 92 | |
| 93 if (cyg_test_is_simulator) | |
| 94 test_dzero_loops=10; | |
| 95 | |
| 96 aligned_p = (volatile cyg_uint32*) | |
| 97 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) | |
| 98 & ~(HAL_DCACHE_LINE_SIZE-1)); | |
| 99 | |
| 100 // Time with conventional instructions. | |
| 101 HAL_DISABLE_INTERRUPTS(oldints); | |
| 102 HAL_DCACHE_SYNC(); | |
| 103 HAL_DCACHE_DISABLE(); | |
| 104 HAL_DCACHE_SYNC(); | |
| 105 HAL_DCACHE_INVALIDATE_ALL(); | |
| 106 HAL_DCACHE_ENABLE(); | |
| 107 HAL_RESTORE_INTERRUPTS(oldints); | |
| 108 count0 = cyg_current_time(); | |
| 109 for (k = 0; k < test_dzero_loops; k++) { | |
| 110 p = aligned_p; | |
| 111 for (i = 0; i < HAL_DCACHE_SETS; i++) { | |
| 112 #if (16 == HAL_DCACHE_LINE_SIZE) | |
| 113 *p++ = 0; | |
| 114 *p++ = 0; | |
| 115 *p++ = 0; | |
| 116 *p++ = 0; | |
| 117 #else | |
| 118 #error "Not defined for this cache line size." | |
| 119 #endif | |
| 120 } | |
| 121 | |
| 122 HAL_DISABLE_INTERRUPTS(oldints); | |
| 123 HAL_DCACHE_SYNC(); | |
| 124 HAL_DCACHE_DISABLE(); | |
| 125 HAL_DCACHE_SYNC(); | |
| 126 HAL_DCACHE_INVALIDATE_ALL(); | |
| 127 HAL_DCACHE_ENABLE(); | |
| 128 HAL_RESTORE_INTERRUPTS(oldints); | |
| 129 } | |
| 130 count1 = cyg_current_time(); | |
| 131 t = count1 - count0; | |
| 132 diag_printf("time with instructions: %d\n", t); | |
| 133 | |
| 134 // Initialize the area with non-zero so we can check whether | |
| 135 // the macro cleared the area properly. | |
| 136 p = aligned_p; | |
| 137 for (i = 0; | |
| 138 i < HAL_DCACHE_SETS*HAL_DCACHE_LINE_SIZE/sizeof(cyg_uint32); | |
| 139 i++) { | |
| 140 *p++ = 0xdeadbeef; | |
| 141 } | |
| 142 | |
| 143 // Time with DCACHE_ZERO. | |
| 144 HAL_DISABLE_INTERRUPTS(oldints); | |
| 145 HAL_DCACHE_SYNC(); | |
| 146 HAL_DCACHE_DISABLE(); | |
| 147 HAL_DCACHE_SYNC(); | |
| 148 HAL_DCACHE_INVALIDATE_ALL(); | |
| 149 HAL_DCACHE_ENABLE(); | |
| 150 HAL_RESTORE_INTERRUPTS(oldints); | |
| 151 count0 = cyg_current_time(); | |
| 152 for (k = 0; k < test_dzero_loops; k++) { | |
| 153 HAL_DCACHE_ZERO(aligned_p, HAL_DCACHE_SETS*HAL_DCACHE_LINE_SIZE); | |
| 154 | |
| 155 HAL_DISABLE_INTERRUPTS(oldints); | |
| 156 HAL_DCACHE_SYNC(); | |
| 157 HAL_DCACHE_DISABLE(); | |
| 158 HAL_DCACHE_SYNC(); | |
| 159 HAL_DCACHE_INVALIDATE_ALL(); | |
| 160 HAL_DCACHE_ENABLE(); | |
| 161 HAL_RESTORE_INTERRUPTS(oldints); | |
| 162 } | |
| 163 count1 = cyg_current_time(); | |
| 164 t = count1 - count0; | |
| 165 diag_printf("time with HAL_DCACHE_ZERO: %d\n", t); | |
| 166 | |
| 167 // Verify that the area was actually cleared. | |
| 168 { | |
| 169 cyg_uint32 d; | |
| 170 | |
| 171 d = 0; | |
| 172 p = aligned_p; | |
| 173 for (i = 0; | |
| 174 i < HAL_DCACHE_SETS*HAL_DCACHE_LINE_SIZE/sizeof(cyg_uint32); | |
| 175 i++) { | |
| 176 d |= *p++; | |
| 177 } | |
| 178 | |
| 179 CYG_TEST_CHECK(0 == d, "region not properly cleared"); | |
| 180 } | |
| 181 | |
| 182 } | |
| 183 #endif | |
| 184 | |
| 185 // ------------------------------------------------------------------------- | |
| 186 // Test of data cache write hint. | |
| 187 // Just check that the macro compiles. | |
| 188 #ifdef HAL_DCACHE_WRITE_HINT | |
| 189 static void test_dwrite_hint(void) | |
| 190 { | |
| 191 register cyg_uint32 k; | |
| 192 register CYG_INTERRUPT_STATE oldints; | |
| 193 | |
| 194 CYG_TEST_INFO("Data cache write hint"); | |
| 195 | |
| 196 HAL_DISABLE_INTERRUPTS(oldints); | |
| 197 HAL_DCACHE_SYNC(); | |
| 198 HAL_DCACHE_DISABLE(); | |
| 199 HAL_DCACHE_SYNC(); | |
| 200 HAL_DCACHE_INVALIDATE_ALL(); | |
| 201 HAL_DCACHE_ENABLE(); | |
| 202 HAL_RESTORE_INTERRUPTS(oldints); | |
| 203 | |
| 204 HAL_DCACHE_WRITE_HINT(&m[HAL_DCACHE_LINE_SIZE*2], 2*HAL_DCACHE_LINE_SIZE); | |
| 205 for (k = 0; k < 20; k++); | |
| 206 m[HAL_DCACHE_LINE_SIZE*2] = 42; | |
| 207 } | |
| 208 #endif | |
| 209 | |
| 210 // ------------------------------------------------------------------------- | |
| 211 // Test of data cache read hint. | |
| 212 // Just check that the macro compiles. | |
| 213 #ifdef HAL_DCACHE_READ_HINT | |
| 214 static void test_dread_hint(void) | |
| 215 { | |
| 216 register char c; | |
| 217 register cyg_uint32 k; | |
| 218 register CYG_INTERRUPT_STATE oldints; | |
| 219 | |
| 220 CYG_TEST_INFO("Data cache read hint"); | |
| 221 | |
| 222 HAL_DISABLE_INTERRUPTS(oldints); | |
| 223 HAL_DCACHE_SYNC(); | |
| 224 HAL_DCACHE_DISABLE(); | |
| 225 HAL_DCACHE_SYNC(); | |
| 226 HAL_DCACHE_INVALIDATE_ALL(); | |
| 227 HAL_DCACHE_ENABLE(); | |
| 228 HAL_RESTORE_INTERRUPTS(oldints); | |
| 229 | |
| 230 HAL_DCACHE_READ_HINT(&m[HAL_DCACHE_LINE_SIZE*2], 2*HAL_DCACHE_LINE_SIZE); | |
| 231 for (k = 0; k < 20; k++); | |
| 232 c = m[HAL_DCACHE_LINE_SIZE*2]; | |
| 233 } | |
| 234 #endif | |
| 235 | |
| 236 // ------------------------------------------------------------------------- | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
237 // Test of data cache line store |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
238 // o No semantic requirement. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
239 // o Check that flushed data is written to memory. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
240 // o Simple invocation check of macro. |
| 2 | 241 #ifdef HAL_DCACHE_STORE |
| 242 static void test_dstore(void) | |
| 243 { | |
| 244 volatile cyg_uint8* aligned_p; | |
| 245 cyg_int32 i; | |
| 246 register CYG_INTERRUPT_STATE oldints; | |
| 247 | |
| 248 CYG_TEST_INFO("Data cache store region"); | |
| 249 | |
| 250 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++) | |
| 251 m[i] = 0; | |
| 252 | |
| 253 HAL_DISABLE_INTERRUPTS(oldints); | |
| 254 HAL_DCACHE_SYNC(); | |
| 255 HAL_DCACHE_DISABLE(); | |
| 256 HAL_DCACHE_SYNC(); | |
| 257 HAL_DCACHE_INVALIDATE_ALL(); | |
| 258 HAL_DCACHE_ENABLE(); | |
| 259 HAL_RESTORE_INTERRUPTS(oldints); | |
| 260 | |
| 261 aligned_p = (volatile cyg_uint8*) | |
| 262 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) | |
| 263 & ~(HAL_DCACHE_LINE_SIZE-1)); | |
| 264 | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
265 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
266 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
267 aligned_p[0] = 42 + aligned_p[1]; // Load causes cache to be used! |
| 2 | 268 |
| 269 HAL_DCACHE_STORE(aligned_p, HAL_DCACHE_LINE_SIZE); | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
270 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
271 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
272 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
273 CYG_TEST_CHECK(42 == aligned_p[0], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
274 "memory didn't contain flushed data"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
275 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
276 HAL_DCACHE_INVALIDATE_ALL(); // Discard... |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
277 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
278 CYG_TEST_CHECK(42 == aligned_p[0], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
279 "memory didn't contain flushed data after invalidate all"); |
| 2 | 280 } |
| 281 #endif | |
| 282 | |
| 283 // ------------------------------------------------------------------------- | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
284 // Test of data cache total flush (sync). |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
285 // o No semantic requirement. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
286 // o Check that flushed data is written to memory. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
287 // o Simple invocation check of macro. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
288 #ifdef HAL_DCACHE_LINE_SIZE // So we can find our way around memory |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
289 static void test_dsync(void) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
290 { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
291 volatile cyg_uint8* aligned_p; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
292 cyg_int32 i; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
293 register CYG_INTERRUPT_STATE oldints; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
294 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
295 CYG_TEST_INFO("Data cache sync all"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
296 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
297 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
298 m[i] = 0; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
299 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
300 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
301 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
302 HAL_DCACHE_DISABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
303 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
304 HAL_DCACHE_INVALIDATE_ALL(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
305 HAL_DCACHE_ENABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
306 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
307 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
308 aligned_p = (volatile cyg_uint8*) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
309 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
310 & ~(HAL_DCACHE_LINE_SIZE-1)); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
311 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
312 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
313 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
314 aligned_p[0] = 42 + aligned_p[1]; // Load causes cache to be used! |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
315 aligned_p[HAL_DCACHE_LINE_SIZE] = 43 + aligned_p[HAL_DCACHE_LINE_SIZE + 1]; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
316 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
317 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
318 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
319 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
320 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
321 CYG_TEST_CHECK(42 == aligned_p[0], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
322 "memory didn't contain flushed data"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
323 CYG_TEST_CHECK(43 == aligned_p[HAL_DCACHE_LINE_SIZE], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
324 "memory didn't contain flushed data next block"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
325 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
326 HAL_DCACHE_INVALIDATE_ALL(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
327 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
328 CYG_TEST_CHECK(42 == aligned_p[0], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
329 "memory didn't contain flushed data after invalidate"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
330 CYG_TEST_CHECK(43 == aligned_p[HAL_DCACHE_LINE_SIZE], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
331 "memory didn't contain flushed data next block after invalidate"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
332 |
|
195
67850532eebb
Merge from eCos master repository on 2001-11-02-06:43:03-GMT
jlarmour
parents:
191
diff
changeset
|
333 HAL_ICACHE_INVALIDATE_ALL(); |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
334 HAL_DCACHE_DISABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
335 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
336 CYG_TEST_CHECK(42 == aligned_p[0], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
337 "memory didn't contain flushed data after disable"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
338 CYG_TEST_CHECK(43 == aligned_p[HAL_DCACHE_LINE_SIZE], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
339 "memory didn't contain flushed data next block after disable"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
340 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
341 HAL_DCACHE_ENABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
342 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
343 #endif // HAL_DCACHE_LINE_SIZE |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
344 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
345 // ------------------------------------------------------------------------- |
| 2 | 346 // Test of data cache line flush. |
| 347 // o Requires write-back cache. | |
| 348 // o Check that flushed data is written to memory. | |
| 349 // o Simple range check of macro. | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
143
diff
changeset
|
350 #ifdef HAL_DCACHE_QUERY_WRITE_MODE // only if we know this, can we test: |
| 2 | 351 #ifdef HAL_DCACHE_FLUSH |
| 352 static void test_dflush(void) | |
| 353 { | |
| 354 volatile cyg_uint8* aligned_p; | |
| 355 cyg_int32 i; | |
| 356 register CYG_INTERRUPT_STATE oldints; | |
| 357 | |
| 358 CYG_TEST_INFO("Data cache flush region"); | |
| 359 | |
| 360 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++) | |
| 361 m[i] = 0; | |
| 362 | |
| 363 HAL_DISABLE_INTERRUPTS(oldints); | |
| 364 HAL_DCACHE_SYNC(); | |
| 365 HAL_DCACHE_DISABLE(); | |
| 366 HAL_DCACHE_SYNC(); | |
| 367 HAL_DCACHE_INVALIDATE_ALL(); | |
| 368 HAL_DCACHE_ENABLE(); | |
| 369 HAL_RESTORE_INTERRUPTS(oldints); | |
| 370 | |
| 371 aligned_p = (volatile cyg_uint8*) | |
| 372 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) | |
| 373 & ~(HAL_DCACHE_LINE_SIZE-1)); | |
| 374 | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
375 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
376 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
377 aligned_p[0] = 42 + aligned_p[1]; // Load causes cache to be used! |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
378 aligned_p[HAL_DCACHE_LINE_SIZE] = 43 + aligned_p[HAL_DCACHE_LINE_SIZE + 1]; |
| 2 | 379 |
| 380 HAL_DCACHE_FLUSH(aligned_p, HAL_DCACHE_LINE_SIZE); | |
| 381 | |
| 382 HAL_DCACHE_DISABLE(); | |
| 383 | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
384 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
385 |
| 2 | 386 CYG_TEST_CHECK(42 == aligned_p[0], |
| 387 "memory didn't contain flushed data"); | |
| 388 CYG_TEST_CHECK(0 == aligned_p[HAL_DCACHE_LINE_SIZE], | |
| 389 "flushed beyond region"); | |
| 390 | |
| 391 HAL_DCACHE_ENABLE(); | |
| 392 } | |
| 393 #endif | |
|
191
678094f34118
Merge from eCos master repository on 2001-10-19-06:43:02-BST
jlarmour
parents:
143
diff
changeset
|
394 #endif |
| 2 | 395 |
| 396 // ------------------------------------------------------------------------- | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
397 // Test of data cache disable (which does NOT force contents out to RAM) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
398 // o Requires write-back cache [so NOT invoked unconditionally] |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
399 // o Check that dirty data is not written to memory and is invalidated |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
400 // in the cache. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
401 // o Simple invocation check of macro. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
402 #ifdef HAL_DCACHE_QUERY_WRITE_MODE // only if we know this, can we test: |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
403 static void test_ddisable(void) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
404 { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
405 volatile cyg_uint8* aligned_p; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
406 cyg_int32 i; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
407 register CYG_INTERRUPT_STATE oldints; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
408 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
409 CYG_TEST_INFO("Data cache gross disable"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
410 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
411 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
412 m[i] = 0; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
413 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
414 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
415 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
416 HAL_DCACHE_DISABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
417 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
418 HAL_DCACHE_INVALIDATE_ALL(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
419 HAL_DCACHE_ENABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
420 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
421 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
422 aligned_p = (volatile cyg_uint8*) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
423 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
424 & ~(HAL_DCACHE_LINE_SIZE-1)); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
425 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
426 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
427 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
428 aligned_p[0] = 43 + aligned_p[1]; // Load causes cache to be used! |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
429 aligned_p[HAL_DCACHE_LINE_SIZE-1] = 43; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
430 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
431 aligned_p[HAL_DCACHE_LINE_SIZE] = 42 + aligned_p[HAL_DCACHE_LINE_SIZE + 1]; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
432 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
433 HAL_DCACHE_DISABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
434 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
435 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
436 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
437 CYG_TEST_CHECK(0 == aligned_p[0] && |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
438 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
439 "cache/memory contained invalidated data"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
440 CYG_TEST_CHECK(0 == aligned_p[HAL_DCACHE_LINE_SIZE], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
441 "next block contained invalidated data"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
442 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
443 HAL_DCACHE_ENABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
444 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
445 #endif // def HAL_DCACHE_QUERY_WRITE_MODE |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
446 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
447 // ------------------------------------------------------------------------- |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
448 // Test of data cache total invalidate. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
449 // o Requires write-back cache. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
450 // o Check that invalidated data is not written to memory and is invalidated |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
451 // in the cache. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
452 // o Simple invocation check of macro. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
453 #ifdef HAL_DCACHE_QUERY_WRITE_MODE // only if we know this, can we test: |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
454 #ifdef HAL_DCACHE_INVALIDATE_ALL |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
455 static void test_dinvalidate_all(void) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
456 { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
457 volatile cyg_uint8* aligned_p; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
458 cyg_int32 i; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
459 register CYG_INTERRUPT_STATE oldints; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
460 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
461 CYG_TEST_INFO("Data cache invalidate all"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
462 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
463 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
464 m[i] = 0; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
465 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
466 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
467 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
468 HAL_DCACHE_DISABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
469 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
470 HAL_DCACHE_INVALIDATE_ALL(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
471 HAL_DCACHE_ENABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
472 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
473 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
474 aligned_p = (volatile cyg_uint8*) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
475 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
476 & ~(HAL_DCACHE_LINE_SIZE-1)); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
477 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
478 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
479 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
480 aligned_p[0] = 43 + aligned_p[1]; // Load causes cache to be used! |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
481 aligned_p[HAL_DCACHE_LINE_SIZE-1] = 43; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
482 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
483 aligned_p[HAL_DCACHE_LINE_SIZE] = 42 + aligned_p[HAL_DCACHE_LINE_SIZE + 1]; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
484 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
485 HAL_DCACHE_INVALIDATE_ALL(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
486 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
487 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
488 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
489 CYG_TEST_CHECK(0 == aligned_p[0] && |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
490 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
491 "cache/memory contained invalidated data"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
492 CYG_TEST_CHECK(0 == aligned_p[HAL_DCACHE_LINE_SIZE], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
493 "next block contained invalidated data"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
494 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
495 #endif |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
496 #endif // def HAL_DCACHE_QUERY_WRITE_MODE |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
497 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
498 // ------------------------------------------------------------------------- |
| 2 | 499 // Test of data cache line invalidate. |
| 500 // o Requires write-back cache. | |
| 501 // o Check that invalidated data is not written to memory and is invalidated | |
| 502 // in the cache. | |
| 503 // o Simple range check of macro. | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
504 #ifdef HAL_DCACHE_QUERY_WRITE_MODE // only if we know this, can we test: |
| 2 | 505 #ifdef HAL_DCACHE_INVALIDATE |
| 506 static void test_dinvalidate(void) | |
| 507 { | |
| 508 volatile cyg_uint8* aligned_p; | |
| 509 cyg_int32 i; | |
| 510 register CYG_INTERRUPT_STATE oldints; | |
| 511 | |
| 512 CYG_TEST_INFO("Data cache invalidate region"); | |
| 513 | |
| 514 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++) | |
| 515 m[i] = 0; | |
| 516 | |
| 517 HAL_DISABLE_INTERRUPTS(oldints); | |
| 518 HAL_DCACHE_SYNC(); | |
| 519 HAL_DCACHE_DISABLE(); | |
| 520 HAL_DCACHE_SYNC(); | |
| 521 HAL_DCACHE_INVALIDATE_ALL(); | |
| 522 HAL_DCACHE_ENABLE(); | |
| 523 HAL_RESTORE_INTERRUPTS(oldints); | |
| 524 | |
| 525 aligned_p = (volatile cyg_uint8*) | |
| 526 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) | |
| 527 & ~(HAL_DCACHE_LINE_SIZE-1)); | |
| 528 | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
529 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
530 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
531 aligned_p[0] = 43 + aligned_p[1]; // Load causes cache to be used! |
| 2 | 532 aligned_p[HAL_DCACHE_LINE_SIZE-1] = 43; |
| 533 | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
534 aligned_p[HAL_DCACHE_LINE_SIZE] = 42 + aligned_p[HAL_DCACHE_LINE_SIZE + 1]; |
| 2 | 535 |
| 536 HAL_DCACHE_INVALIDATE(aligned_p, HAL_DCACHE_LINE_SIZE); | |
| 537 | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
538 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
539 |
| 2 | 540 CYG_TEST_CHECK(0 == aligned_p[0] && |
| 541 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1], | |
| 542 "cache/memory contained invalidated data"); | |
| 543 CYG_TEST_CHECK(42 == aligned_p[HAL_DCACHE_LINE_SIZE], | |
| 544 "invalidated beyond range"); | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
545 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
546 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
547 HAL_DCACHE_DISABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
548 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
549 CYG_TEST_CHECK(0 == aligned_p[0] && |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
550 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
551 "cache/memory contained invalidated data after SYNC/DIS"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
552 CYG_TEST_CHECK(42 == aligned_p[HAL_DCACHE_LINE_SIZE], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
553 "invalidated beyond range after SYNC/DIS"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
554 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
555 HAL_DCACHE_ENABLE(); |
| 2 | 556 } |
| 557 #endif | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
558 #endif // def HAL_DCACHE_QUERY_WRITE_MODE |
| 2 | 559 |
| 560 // ------------------------------------------------------------------------- | |
| 561 // Test of instruction cache locking. | |
| 562 // o Time difference between repeatedly executing a bunch of instructions | |
| 563 // with and without locking. | |
| 564 #ifdef HAL_ICACHE_LOCK | |
|
199
920b9b754b53
Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents:
195
diff
changeset
|
565 static void iloop(unsigned long* start, unsigned long* end, int dummy) |
| 2 | 566 { |
|
199
920b9b754b53
Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents:
195
diff
changeset
|
567 // dummy is just used to fool the compiler to not move the labels |
|
920b9b754b53
Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents:
195
diff
changeset
|
568 // around. All callers should call with dummy=0; |
|
920b9b754b53
Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents:
195
diff
changeset
|
569 |
| 2 | 570 register char c; |
| 571 register CYG_INTERRUPT_STATE oldints; | |
| 572 | |
|
199
920b9b754b53
Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents:
195
diff
changeset
|
573 if (1 == dummy) goto label_end; |
|
920b9b754b53
Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents:
195
diff
changeset
|
574 |
| 2 | 575 label_start: |
| 576 // Invalidating shouldn't affect locked lines. | |
| 577 HAL_DISABLE_INTERRUPTS(oldints); | |
| 578 HAL_ICACHE_DISABLE(); | |
| 579 HAL_ICACHE_INVALIDATE_ALL(); | |
| 580 HAL_ICACHE_ENABLE(); | |
| 581 HAL_RESTORE_INTERRUPTS(oldints); | |
| 582 | |
| 583 c = m[HAL_DCACHE_LINE_SIZE*0]; | |
| 584 c = m[HAL_DCACHE_LINE_SIZE*1]; | |
| 585 c = m[HAL_DCACHE_LINE_SIZE*2]; | |
| 586 c = m[HAL_DCACHE_LINE_SIZE*3]; | |
| 587 c = m[HAL_DCACHE_LINE_SIZE*4]; | |
| 588 c = m[HAL_DCACHE_LINE_SIZE*5]; | |
| 589 c = m[HAL_DCACHE_LINE_SIZE*6]; | |
| 590 c = m[HAL_DCACHE_LINE_SIZE*7]; | |
| 591 c = m[HAL_DCACHE_LINE_SIZE*8]; | |
| 592 c = m[HAL_DCACHE_LINE_SIZE*9]; | |
| 593 c = m[HAL_DCACHE_LINE_SIZE*10]; | |
| 594 c = m[HAL_DCACHE_LINE_SIZE*11]; | |
| 595 c = m[HAL_DCACHE_LINE_SIZE*12]; | |
| 596 c = m[HAL_DCACHE_LINE_SIZE*13]; | |
| 597 c = m[HAL_DCACHE_LINE_SIZE*14]; | |
| 598 c = m[HAL_DCACHE_LINE_SIZE*15]; | |
| 599 c = m[HAL_DCACHE_LINE_SIZE*16]; | |
| 600 c = m[HAL_DCACHE_LINE_SIZE*17]; | |
| 601 c = m[HAL_DCACHE_LINE_SIZE*18]; | |
| 602 c = m[HAL_DCACHE_LINE_SIZE*19]; | |
| 603 c = m[HAL_DCACHE_LINE_SIZE*20]; | |
| 604 c = m[HAL_DCACHE_LINE_SIZE*21]; | |
| 605 c = m[HAL_DCACHE_LINE_SIZE*22]; | |
| 606 c = m[HAL_DCACHE_LINE_SIZE*23]; | |
| 607 c = m[HAL_DCACHE_LINE_SIZE*24]; | |
| 608 c = m[HAL_DCACHE_LINE_SIZE*25]; | |
| 609 c = m[HAL_DCACHE_LINE_SIZE*26]; | |
| 610 c = m[HAL_DCACHE_LINE_SIZE*27]; | |
| 611 c = m[HAL_DCACHE_LINE_SIZE*28]; | |
| 612 c = m[HAL_DCACHE_LINE_SIZE*29]; | |
| 613 c = m[HAL_DCACHE_LINE_SIZE*30]; | |
| 614 c = m[HAL_DCACHE_LINE_SIZE*31]; | |
| 615 c = m[HAL_DCACHE_LINE_SIZE*32]; | |
| 616 c = m[HAL_DCACHE_LINE_SIZE*33]; | |
| 617 c = m[HAL_DCACHE_LINE_SIZE*34]; | |
| 618 c = m[HAL_DCACHE_LINE_SIZE*35]; | |
| 619 c = m[HAL_DCACHE_LINE_SIZE*36]; | |
| 620 c = m[HAL_DCACHE_LINE_SIZE*37]; | |
| 621 c = m[HAL_DCACHE_LINE_SIZE*38]; | |
| 622 c = m[HAL_DCACHE_LINE_SIZE*39]; | |
| 623 c = m[HAL_DCACHE_LINE_SIZE*40]; | |
| 624 c = m[HAL_DCACHE_LINE_SIZE*41]; | |
| 625 c = m[HAL_DCACHE_LINE_SIZE*42]; | |
| 626 c = m[HAL_DCACHE_LINE_SIZE*43]; | |
| 627 c = m[HAL_DCACHE_LINE_SIZE*44]; | |
| 628 c = m[HAL_DCACHE_LINE_SIZE*45]; | |
| 629 c = m[HAL_DCACHE_LINE_SIZE*46]; | |
| 630 c = m[HAL_DCACHE_LINE_SIZE*47]; | |
| 631 c = m[HAL_DCACHE_LINE_SIZE*48]; | |
| 632 c = m[HAL_DCACHE_LINE_SIZE*49]; | |
| 633 c = m[HAL_DCACHE_LINE_SIZE*50]; | |
| 634 c = m[HAL_DCACHE_LINE_SIZE*51]; | |
| 635 c = m[HAL_DCACHE_LINE_SIZE*52]; | |
| 636 c = m[HAL_DCACHE_LINE_SIZE*53]; | |
| 637 c = m[HAL_DCACHE_LINE_SIZE*54]; | |
| 638 c = m[HAL_DCACHE_LINE_SIZE*55]; | |
| 639 c = m[HAL_DCACHE_LINE_SIZE*56]; | |
| 640 c = m[HAL_DCACHE_LINE_SIZE*57]; | |
| 641 c = m[HAL_DCACHE_LINE_SIZE*58]; | |
| 642 c = m[HAL_DCACHE_LINE_SIZE*59]; | |
| 643 c = m[HAL_DCACHE_LINE_SIZE*60]; | |
| 644 c = m[HAL_DCACHE_LINE_SIZE*61]; | |
| 645 c = m[HAL_DCACHE_LINE_SIZE*62]; | |
| 646 c = m[HAL_DCACHE_LINE_SIZE*63]; | |
| 647 | |
| 648 label_end: | |
| 649 | |
| 650 *start = (unsigned long) &&label_start; | |
| 651 *end = (unsigned long) &&label_end; | |
|
199
920b9b754b53
Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents:
195
diff
changeset
|
652 |
|
920b9b754b53
Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents:
195
diff
changeset
|
653 if (1 == dummy) goto label_start; |
| 2 | 654 } |
| 655 | |
| 656 static void time_ilock(void) | |
| 657 { | |
| 658 register cyg_ucount32 k; | |
| 659 cyg_tick_count_t count0, count1; | |
| 660 cyg_ucount32 t; | |
| 661 unsigned long start, end; | |
| 662 register cyg_ucount32 time_ilock_loops = TIME_ILOCK_LOOPS; | |
| 663 | |
| 664 CYG_TEST_INFO("Instruction cache lock"); | |
| 665 | |
| 666 if (cyg_test_is_simulator) | |
| 667 time_ilock_loops = 10; | |
| 668 | |
| 669 count0 = cyg_current_time(); | |
| 670 for (k = 0; k < time_ilock_loops; k++) { | |
|
199
920b9b754b53
Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents:
195
diff
changeset
|
671 iloop(&start, &end, 0); |
| 2 | 672 } |
| 673 count1 = cyg_current_time(); | |
| 674 t = count1 - count0; | |
| 675 diag_printf("time without lock: %d\n", t); | |
| 676 | |
| 677 HAL_ICACHE_LOCK(start, end-start); | |
| 678 | |
| 679 count0 = cyg_current_time(); | |
| 680 for (k = 0; k < time_ilock_loops; k++) { | |
|
199
920b9b754b53
Merge from eCos master repository on 2001-12-15-12:00:33-GMT
jlarmour
parents:
195
diff
changeset
|
681 iloop(&start, &end, 0); |
| 2 | 682 } |
| 683 count1 = cyg_current_time(); | |
| 684 t = count1 - count0; | |
| 685 diag_printf("time with lock: %d\n", t); | |
| 686 | |
| 687 HAL_ICACHE_UNLOCK(start, end-start); | |
| 688 } | |
| 689 #endif // ifdef HAL_ICACHE_LOCK | |
| 690 | |
| 691 // ------------------------------------------------------------------------- | |
| 692 // Test of data cache locking. | |
| 693 // o Time difference between repeatedly accessing a memory region | |
| 694 // with and without locking. | |
| 695 #ifdef HAL_DCACHE_LOCK | |
| 696 static void dloop(void) | |
| 697 { | |
| 698 register cyg_uint32 j; | |
| 699 register char c; | |
| 700 register CYG_INTERRUPT_STATE oldints; | |
| 701 | |
| 702 HAL_DISABLE_INTERRUPTS(oldints); | |
| 703 HAL_DCACHE_SYNC(); | |
| 704 HAL_DCACHE_DISABLE(); | |
| 705 HAL_DCACHE_SYNC(); | |
| 706 HAL_DCACHE_INVALIDATE_ALL(); | |
| 707 HAL_DCACHE_ENABLE(); | |
| 708 HAL_RESTORE_INTERRUPTS(oldints); | |
| 709 for (j = 0; j < HAL_DCACHE_SETS; j++) { | |
| 710 c = m[HAL_DCACHE_LINE_SIZE*j]; | |
| 711 } | |
| 712 } | |
| 713 | |
| 714 static void time_dlock(void) | |
| 715 { | |
| 716 register cyg_ucount32 k; | |
| 717 cyg_tick_count_t count0, count1; | |
| 718 cyg_ucount32 t; | |
| 719 register cyg_ucount32 time_dlock_loops = TIME_DLOCK_LOOPS; | |
| 720 | |
| 721 CYG_TEST_INFO("Data cache lock"); | |
| 722 | |
| 723 if (cyg_test_is_simulator) | |
| 724 time_dlock_loops = 10; | |
| 725 | |
| 726 count0 = cyg_current_time(); | |
| 727 for (k = 0; k < time_dlock_loops; k++) { | |
| 728 dloop(); | |
| 729 } | |
| 730 count1 = cyg_current_time(); | |
| 731 t = count1 - count0; | |
| 732 diag_printf("time without lock: %d\n", t); | |
| 733 | |
| 734 HAL_DCACHE_LOCK(&m[0], HAL_DCACHE_SETS*HAL_DCACHE_LINE_SIZE); | |
| 735 | |
| 736 count0 = cyg_current_time(); | |
| 737 for (k = 0; k < time_dlock_loops; k++) { | |
| 738 dloop(); | |
| 739 } | |
| 740 count1 = cyg_current_time(); | |
| 741 t = count1 - count0; | |
| 742 diag_printf("time with lock: %d\n", t); | |
| 743 | |
| 744 HAL_DCACHE_UNLOCK(&m[0], HAL_DCACHE_SETS*HAL_DCACHE_LINE_SIZE); | |
| 745 } | |
| 746 #endif // ifdef HAL_DCACHE_LOCK | |
| 747 | |
| 748 // ------------------------------------------------------------------------- | |
| 749 static void entry0( cyg_addrword_t data ) | |
| 750 { | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
751 int numtests = 0; |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
752 #ifdef HAL_DCACHE_QUERY_WRITE_MODE |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
753 int wmode; |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
754 #endif |
| 2 | 755 #ifdef HAL_DCACHE_LOCK |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
756 time_dlock(); numtests++; |
| 2 | 757 #endif |
| 758 #ifdef HAL_ICACHE_LOCK | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
759 time_ilock(); numtests++; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
760 #endif |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
761 #ifdef HAL_DCACHE_LINE_SIZE // So we can find our way around memory |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
762 test_dsync(); numtests++; |
| 2 | 763 #endif |
| 764 #ifdef HAL_DCACHE_STORE | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
765 test_dstore(); numtests++; |
| 2 | 766 #endif |
| 767 #ifdef HAL_DCACHE_READ_HINT | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
768 test_dread_hint(); numtests++; |
| 2 | 769 #endif |
| 770 #ifdef HAL_DCACHE_WRITE_HINT | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
771 test_dwrite_hint(); numtests++; |
| 2 | 772 #endif |
| 773 #ifdef HAL_DCACHE_ZERO | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
774 test_dzero(); numtests++; |
| 2 | 775 #endif |
| 776 | |
| 777 // The below tests only work on a copy-back cache. | |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
778 #ifdef HAL_DCACHE_QUERY_WRITE_MODE |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
779 HAL_DCACHE_QUERY_WRITE_MODE( wmode ); |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
780 |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
781 if ( HAL_DCACHE_WRITEBACK_MODE == wmode ) { |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
782 test_ddisable(); numtests++; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
783 #ifdef HAL_DCACHE_INVALIDATE |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
784 test_dinvalidate_all(); numtests++; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
785 #endif |
| 2 | 786 #ifdef HAL_DCACHE_FLUSH |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
787 test_dflush(); numtests++; |
| 2 | 788 #endif |
| 789 #ifdef HAL_DCACHE_INVALIDATE | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
790 test_dinvalidate(); numtests++; |
| 2 | 791 #endif |
| 792 } | |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
793 #endif // def HAL_DCACHE_QUERY_WRITE_MODE |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
794 if ( numtests ) { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
795 CYG_TEST_PASS_FINISH("End of test"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
796 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
797 else { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
798 CYG_TEST_NA( "No applicable cache tests" ); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
799 } |
| 2 | 800 } |
| 801 | |
| 802 // ------------------------------------------------------------------------- | |
| 803 | |
| 804 void kcache2_main( void ) | |
| 805 { | |
| 806 CYG_TEST_INIT(); | |
| 807 | |
| 808 cyg_thread_create(4, entry0 , (cyg_addrword_t)0, "kcache2", | |
| 809 (void *)stack[0], STACKSIZE, &thread[0], &thread_obj[0]); | |
| 810 cyg_thread_resume(thread[0]); | |
| 811 | |
| 812 cyg_scheduler_start(); | |
| 813 } | |
| 814 | |
| 815 // ------------------------------------------------------------------------- | |
| 816 | |
| 817 externC void | |
| 818 cyg_start( void ) | |
| 819 { | |
| 820 kcache2_main(); | |
| 821 } | |
| 822 | |
| 823 // ------------------------------------------------------------------------- | |
| 824 | |
| 825 #else // def CYGFUN_KERNEL_API_C | |
| 826 #define N_A_MSG "Kernel C API layer disabled" | |
| 827 #endif // def CYGFUN_KERNEL_API_C | |
| 828 #else // def CYGVAR_KERNEL_COUNTERS_CLOCK | |
| 829 #define N_A_MSG "Kernel real-time clock disabled" | |
| 830 #endif // def CYGVAR_KERNEL_COUNTERS_CLOCK | |
| 831 | |
| 832 #ifdef N_A_MSG | |
| 833 externC void | |
| 834 cyg_start( void ) | |
| 835 { | |
| 836 CYG_TEST_INIT(); | |
| 837 CYG_TEST_NA( N_A_MSG ); | |
| 838 } | |
| 839 #endif // N_A_MSG | |
| 840 | |
| 841 // ------------------------------------------------------------------------- | |
| 842 /* EOF kcache2.c */ |
