Mercurial > ecos
annotate packages/kernel/current/tests/kcache2.c @ 143:6b5f480c6929 ecos-sw-2000-12-08
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
| author | jlarmour |
|---|---|
| date | Fri, 08 Dec 2000 03:30:06 +0000 |
| parents | bf00f99aec69 |
| children | 678094f34118 |
| 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 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
333 HAL_DCACHE_DISABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
334 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
335 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
|
336 "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
|
337 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
|
338 "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
|
339 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
340 HAL_DCACHE_ENABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
341 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
342 #endif // HAL_DCACHE_LINE_SIZE |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
343 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
344 // ------------------------------------------------------------------------- |
| 2 | 345 // Test of data cache line flush. |
| 346 // o Requires write-back cache. | |
| 347 // o Check that flushed data is written to memory. | |
| 348 // o Simple range check of macro. | |
| 349 #ifdef HAL_DCACHE_FLUSH | |
| 350 static void test_dflush(void) | |
| 351 { | |
| 352 volatile cyg_uint8* aligned_p; | |
| 353 cyg_int32 i; | |
| 354 register CYG_INTERRUPT_STATE oldints; | |
| 355 | |
| 356 CYG_TEST_INFO("Data cache flush region"); | |
| 357 | |
| 358 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++) | |
| 359 m[i] = 0; | |
| 360 | |
| 361 HAL_DISABLE_INTERRUPTS(oldints); | |
| 362 HAL_DCACHE_SYNC(); | |
| 363 HAL_DCACHE_DISABLE(); | |
| 364 HAL_DCACHE_SYNC(); | |
| 365 HAL_DCACHE_INVALIDATE_ALL(); | |
| 366 HAL_DCACHE_ENABLE(); | |
| 367 HAL_RESTORE_INTERRUPTS(oldints); | |
| 368 | |
| 369 aligned_p = (volatile cyg_uint8*) | |
| 370 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) | |
| 371 & ~(HAL_DCACHE_LINE_SIZE-1)); | |
| 372 | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
373 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
374 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
375 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
|
376 aligned_p[HAL_DCACHE_LINE_SIZE] = 43 + aligned_p[HAL_DCACHE_LINE_SIZE + 1]; |
| 2 | 377 |
| 378 HAL_DCACHE_FLUSH(aligned_p, HAL_DCACHE_LINE_SIZE); | |
| 379 | |
| 380 HAL_DCACHE_DISABLE(); | |
| 381 | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
382 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
383 |
| 2 | 384 CYG_TEST_CHECK(42 == aligned_p[0], |
| 385 "memory didn't contain flushed data"); | |
| 386 CYG_TEST_CHECK(0 == aligned_p[HAL_DCACHE_LINE_SIZE], | |
| 387 "flushed beyond region"); | |
| 388 | |
| 389 HAL_DCACHE_ENABLE(); | |
| 390 } | |
| 391 #endif | |
| 392 | |
| 393 // ------------------------------------------------------------------------- | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
394 // 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
|
395 // 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
|
396 // 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
|
397 // in the cache. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
398 // 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
|
399 #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
|
400 static void test_ddisable(void) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
401 { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
402 volatile cyg_uint8* aligned_p; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
403 cyg_int32 i; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
404 register CYG_INTERRUPT_STATE oldints; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
405 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
406 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
|
407 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
408 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
|
409 m[i] = 0; |
|
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 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
412 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
413 HAL_DCACHE_DISABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
414 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
415 HAL_DCACHE_INVALIDATE_ALL(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
416 HAL_DCACHE_ENABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
417 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
418 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
419 aligned_p = (volatile cyg_uint8*) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
420 (((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
|
421 & ~(HAL_DCACHE_LINE_SIZE-1)); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
422 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
423 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
424 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
425 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
|
426 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
|
427 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
428 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
|
429 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
430 HAL_DCACHE_DISABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
431 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
432 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
433 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
434 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
|
435 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
|
436 "cache/memory contained invalidated data"); |
|
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[HAL_DCACHE_LINE_SIZE], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
438 "next block contained invalidated data"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
439 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
440 HAL_DCACHE_ENABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
441 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
442 #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
|
443 |
|
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 // 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
|
446 // o Requires write-back cache. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
447 // 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
|
448 // in the cache. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
449 // 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
|
450 #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
|
451 #ifdef HAL_DCACHE_INVALIDATE_ALL |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
452 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
|
453 { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
454 volatile cyg_uint8* aligned_p; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
455 cyg_int32 i; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
456 register CYG_INTERRUPT_STATE oldints; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
457 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
458 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
|
459 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
460 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
|
461 m[i] = 0; |
|
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 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
464 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
465 HAL_DCACHE_DISABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
466 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
467 HAL_DCACHE_INVALIDATE_ALL(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
468 HAL_DCACHE_ENABLE(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
469 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
470 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
471 aligned_p = (volatile cyg_uint8*) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
472 (((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
|
473 & ~(HAL_DCACHE_LINE_SIZE-1)); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
474 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
475 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
476 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
477 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
|
478 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
|
479 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
480 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
|
481 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
482 HAL_DCACHE_INVALIDATE_ALL(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
483 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
484 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
485 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
486 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
|
487 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
|
488 "cache/memory contained invalidated data"); |
|
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[HAL_DCACHE_LINE_SIZE], |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
490 "next block contained invalidated data"); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
491 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
492 #endif |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
493 #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
|
494 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
495 // ------------------------------------------------------------------------- |
| 2 | 496 // Test of data cache line invalidate. |
| 497 // o Requires write-back cache. | |
| 498 // o Check that invalidated data is not written to memory and is invalidated | |
| 499 // in the cache. | |
| 500 // 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
|
501 #ifdef HAL_DCACHE_QUERY_WRITE_MODE // only if we know this, can we test: |
| 2 | 502 #ifdef HAL_DCACHE_INVALIDATE |
| 503 static void test_dinvalidate(void) | |
| 504 { | |
| 505 volatile cyg_uint8* aligned_p; | |
| 506 cyg_int32 i; | |
| 507 register CYG_INTERRUPT_STATE oldints; | |
| 508 | |
| 509 CYG_TEST_INFO("Data cache invalidate region"); | |
| 510 | |
| 511 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++) | |
| 512 m[i] = 0; | |
| 513 | |
| 514 HAL_DISABLE_INTERRUPTS(oldints); | |
| 515 HAL_DCACHE_SYNC(); | |
| 516 HAL_DCACHE_DISABLE(); | |
| 517 HAL_DCACHE_SYNC(); | |
| 518 HAL_DCACHE_INVALIDATE_ALL(); | |
| 519 HAL_DCACHE_ENABLE(); | |
| 520 HAL_RESTORE_INTERRUPTS(oldints); | |
| 521 | |
| 522 aligned_p = (volatile cyg_uint8*) | |
| 523 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) | |
| 524 & ~(HAL_DCACHE_LINE_SIZE-1)); | |
| 525 | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
526 HAL_DISABLE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
527 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
528 aligned_p[0] = 43 + aligned_p[1]; // Load causes cache to be used! |
| 2 | 529 aligned_p[HAL_DCACHE_LINE_SIZE-1] = 43; |
| 530 | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
531 aligned_p[HAL_DCACHE_LINE_SIZE] = 42 + aligned_p[HAL_DCACHE_LINE_SIZE + 1]; |
| 2 | 532 |
| 533 HAL_DCACHE_INVALIDATE(aligned_p, HAL_DCACHE_LINE_SIZE); | |
| 534 | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
535 HAL_RESTORE_INTERRUPTS(oldints); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
536 |
| 2 | 537 CYG_TEST_CHECK(0 == aligned_p[0] && |
| 538 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1], | |
| 539 "cache/memory contained invalidated data"); | |
| 540 CYG_TEST_CHECK(42 == aligned_p[HAL_DCACHE_LINE_SIZE], | |
| 541 "invalidated beyond range"); | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
542 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
543 HAL_DCACHE_SYNC(); |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
544 HAL_DCACHE_DISABLE(); |
|
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 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
|
547 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
|
548 "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
|
549 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
|
550 "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
|
551 |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
552 HAL_DCACHE_ENABLE(); |
| 2 | 553 } |
| 554 #endif | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
555 #endif // def HAL_DCACHE_QUERY_WRITE_MODE |
| 2 | 556 |
| 557 // ------------------------------------------------------------------------- | |
| 558 // Test of instruction cache locking. | |
| 559 // o Time difference between repeatedly executing a bunch of instructions | |
| 560 // with and without locking. | |
| 561 #ifdef HAL_ICACHE_LOCK | |
| 562 static void iloop(unsigned long* start, unsigned long* end) | |
| 563 { | |
| 564 register char c; | |
| 565 register CYG_INTERRUPT_STATE oldints; | |
| 566 | |
| 567 label_start: | |
| 568 // Invalidating shouldn't affect locked lines. | |
| 569 HAL_DISABLE_INTERRUPTS(oldints); | |
| 570 HAL_ICACHE_DISABLE(); | |
| 571 HAL_ICACHE_INVALIDATE_ALL(); | |
| 572 HAL_ICACHE_ENABLE(); | |
| 573 HAL_RESTORE_INTERRUPTS(oldints); | |
| 574 | |
| 575 c = m[HAL_DCACHE_LINE_SIZE*0]; | |
| 576 c = m[HAL_DCACHE_LINE_SIZE*1]; | |
| 577 c = m[HAL_DCACHE_LINE_SIZE*2]; | |
| 578 c = m[HAL_DCACHE_LINE_SIZE*3]; | |
| 579 c = m[HAL_DCACHE_LINE_SIZE*4]; | |
| 580 c = m[HAL_DCACHE_LINE_SIZE*5]; | |
| 581 c = m[HAL_DCACHE_LINE_SIZE*6]; | |
| 582 c = m[HAL_DCACHE_LINE_SIZE*7]; | |
| 583 c = m[HAL_DCACHE_LINE_SIZE*8]; | |
| 584 c = m[HAL_DCACHE_LINE_SIZE*9]; | |
| 585 c = m[HAL_DCACHE_LINE_SIZE*10]; | |
| 586 c = m[HAL_DCACHE_LINE_SIZE*11]; | |
| 587 c = m[HAL_DCACHE_LINE_SIZE*12]; | |
| 588 c = m[HAL_DCACHE_LINE_SIZE*13]; | |
| 589 c = m[HAL_DCACHE_LINE_SIZE*14]; | |
| 590 c = m[HAL_DCACHE_LINE_SIZE*15]; | |
| 591 c = m[HAL_DCACHE_LINE_SIZE*16]; | |
| 592 c = m[HAL_DCACHE_LINE_SIZE*17]; | |
| 593 c = m[HAL_DCACHE_LINE_SIZE*18]; | |
| 594 c = m[HAL_DCACHE_LINE_SIZE*19]; | |
| 595 c = m[HAL_DCACHE_LINE_SIZE*20]; | |
| 596 c = m[HAL_DCACHE_LINE_SIZE*21]; | |
| 597 c = m[HAL_DCACHE_LINE_SIZE*22]; | |
| 598 c = m[HAL_DCACHE_LINE_SIZE*23]; | |
| 599 c = m[HAL_DCACHE_LINE_SIZE*24]; | |
| 600 c = m[HAL_DCACHE_LINE_SIZE*25]; | |
| 601 c = m[HAL_DCACHE_LINE_SIZE*26]; | |
| 602 c = m[HAL_DCACHE_LINE_SIZE*27]; | |
| 603 c = m[HAL_DCACHE_LINE_SIZE*28]; | |
| 604 c = m[HAL_DCACHE_LINE_SIZE*29]; | |
| 605 c = m[HAL_DCACHE_LINE_SIZE*30]; | |
| 606 c = m[HAL_DCACHE_LINE_SIZE*31]; | |
| 607 c = m[HAL_DCACHE_LINE_SIZE*32]; | |
| 608 c = m[HAL_DCACHE_LINE_SIZE*33]; | |
| 609 c = m[HAL_DCACHE_LINE_SIZE*34]; | |
| 610 c = m[HAL_DCACHE_LINE_SIZE*35]; | |
| 611 c = m[HAL_DCACHE_LINE_SIZE*36]; | |
| 612 c = m[HAL_DCACHE_LINE_SIZE*37]; | |
| 613 c = m[HAL_DCACHE_LINE_SIZE*38]; | |
| 614 c = m[HAL_DCACHE_LINE_SIZE*39]; | |
| 615 c = m[HAL_DCACHE_LINE_SIZE*40]; | |
| 616 c = m[HAL_DCACHE_LINE_SIZE*41]; | |
| 617 c = m[HAL_DCACHE_LINE_SIZE*42]; | |
| 618 c = m[HAL_DCACHE_LINE_SIZE*43]; | |
| 619 c = m[HAL_DCACHE_LINE_SIZE*44]; | |
| 620 c = m[HAL_DCACHE_LINE_SIZE*45]; | |
| 621 c = m[HAL_DCACHE_LINE_SIZE*46]; | |
| 622 c = m[HAL_DCACHE_LINE_SIZE*47]; | |
| 623 c = m[HAL_DCACHE_LINE_SIZE*48]; | |
| 624 c = m[HAL_DCACHE_LINE_SIZE*49]; | |
| 625 c = m[HAL_DCACHE_LINE_SIZE*50]; | |
| 626 c = m[HAL_DCACHE_LINE_SIZE*51]; | |
| 627 c = m[HAL_DCACHE_LINE_SIZE*52]; | |
| 628 c = m[HAL_DCACHE_LINE_SIZE*53]; | |
| 629 c = m[HAL_DCACHE_LINE_SIZE*54]; | |
| 630 c = m[HAL_DCACHE_LINE_SIZE*55]; | |
| 631 c = m[HAL_DCACHE_LINE_SIZE*56]; | |
| 632 c = m[HAL_DCACHE_LINE_SIZE*57]; | |
| 633 c = m[HAL_DCACHE_LINE_SIZE*58]; | |
| 634 c = m[HAL_DCACHE_LINE_SIZE*59]; | |
| 635 c = m[HAL_DCACHE_LINE_SIZE*60]; | |
| 636 c = m[HAL_DCACHE_LINE_SIZE*61]; | |
| 637 c = m[HAL_DCACHE_LINE_SIZE*62]; | |
| 638 c = m[HAL_DCACHE_LINE_SIZE*63]; | |
| 639 | |
| 640 label_end: | |
| 641 | |
| 642 *start = (unsigned long) &&label_start; | |
| 643 *end = (unsigned long) &&label_end; | |
| 644 } | |
| 645 | |
| 646 static void time_ilock(void) | |
| 647 { | |
| 648 register cyg_ucount32 k; | |
| 649 cyg_tick_count_t count0, count1; | |
| 650 cyg_ucount32 t; | |
| 651 unsigned long start, end; | |
| 652 register cyg_ucount32 time_ilock_loops = TIME_ILOCK_LOOPS; | |
| 653 | |
| 654 CYG_TEST_INFO("Instruction cache lock"); | |
| 655 | |
| 656 if (cyg_test_is_simulator) | |
| 657 time_ilock_loops = 10; | |
| 658 | |
| 659 count0 = cyg_current_time(); | |
| 660 for (k = 0; k < time_ilock_loops; k++) { | |
| 661 iloop(&start, &end); | |
| 662 } | |
| 663 count1 = cyg_current_time(); | |
| 664 t = count1 - count0; | |
| 665 diag_printf("time without lock: %d\n", t); | |
| 666 | |
| 667 HAL_ICACHE_LOCK(start, end-start); | |
| 668 | |
| 669 count0 = cyg_current_time(); | |
| 670 for (k = 0; k < time_ilock_loops; k++) { | |
| 671 iloop(&start, &end); | |
| 672 } | |
| 673 count1 = cyg_current_time(); | |
| 674 t = count1 - count0; | |
| 675 diag_printf("time with lock: %d\n", t); | |
| 676 | |
| 677 HAL_ICACHE_UNLOCK(start, end-start); | |
| 678 } | |
| 679 #endif // ifdef HAL_ICACHE_LOCK | |
| 680 | |
| 681 // ------------------------------------------------------------------------- | |
| 682 // Test of data cache locking. | |
| 683 // o Time difference between repeatedly accessing a memory region | |
| 684 // with and without locking. | |
| 685 #ifdef HAL_DCACHE_LOCK | |
| 686 static void dloop(void) | |
| 687 { | |
| 688 register cyg_uint32 j; | |
| 689 register char c; | |
| 690 register CYG_INTERRUPT_STATE oldints; | |
| 691 | |
| 692 HAL_DISABLE_INTERRUPTS(oldints); | |
| 693 HAL_DCACHE_SYNC(); | |
| 694 HAL_DCACHE_DISABLE(); | |
| 695 HAL_DCACHE_SYNC(); | |
| 696 HAL_DCACHE_INVALIDATE_ALL(); | |
| 697 HAL_DCACHE_ENABLE(); | |
| 698 HAL_RESTORE_INTERRUPTS(oldints); | |
| 699 for (j = 0; j < HAL_DCACHE_SETS; j++) { | |
| 700 c = m[HAL_DCACHE_LINE_SIZE*j]; | |
| 701 } | |
| 702 } | |
| 703 | |
| 704 static void time_dlock(void) | |
| 705 { | |
| 706 register cyg_ucount32 k; | |
| 707 cyg_tick_count_t count0, count1; | |
| 708 cyg_ucount32 t; | |
| 709 register cyg_ucount32 time_dlock_loops = TIME_DLOCK_LOOPS; | |
| 710 | |
| 711 CYG_TEST_INFO("Data cache lock"); | |
| 712 | |
| 713 if (cyg_test_is_simulator) | |
| 714 time_dlock_loops = 10; | |
| 715 | |
| 716 count0 = cyg_current_time(); | |
| 717 for (k = 0; k < time_dlock_loops; k++) { | |
| 718 dloop(); | |
| 719 } | |
| 720 count1 = cyg_current_time(); | |
| 721 t = count1 - count0; | |
| 722 diag_printf("time without lock: %d\n", t); | |
| 723 | |
| 724 HAL_DCACHE_LOCK(&m[0], HAL_DCACHE_SETS*HAL_DCACHE_LINE_SIZE); | |
| 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 with lock: %d\n", t); | |
| 733 | |
| 734 HAL_DCACHE_UNLOCK(&m[0], HAL_DCACHE_SETS*HAL_DCACHE_LINE_SIZE); | |
| 735 } | |
| 736 #endif // ifdef HAL_DCACHE_LOCK | |
| 737 | |
| 738 // ------------------------------------------------------------------------- | |
| 739 static void entry0( cyg_addrword_t data ) | |
| 740 { | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
741 int numtests = 0; |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
742 #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
|
743 int wmode; |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
744 #endif |
| 2 | 745 #ifdef HAL_DCACHE_LOCK |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
746 time_dlock(); numtests++; |
| 2 | 747 #endif |
| 748 #ifdef HAL_ICACHE_LOCK | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
749 time_ilock(); numtests++; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
750 #endif |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
751 #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
|
752 test_dsync(); numtests++; |
| 2 | 753 #endif |
| 754 #ifdef HAL_DCACHE_STORE | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
755 test_dstore(); numtests++; |
| 2 | 756 #endif |
| 757 #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
|
758 test_dread_hint(); numtests++; |
| 2 | 759 #endif |
| 760 #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
|
761 test_dwrite_hint(); numtests++; |
| 2 | 762 #endif |
| 763 #ifdef HAL_DCACHE_ZERO | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
764 test_dzero(); numtests++; |
| 2 | 765 #endif |
| 766 | |
| 767 // 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
|
768 #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
|
769 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
|
770 |
|
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
771 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
|
772 test_ddisable(); numtests++; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
773 #ifdef HAL_DCACHE_INVALIDATE |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
774 test_dinvalidate_all(); numtests++; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
775 #endif |
| 2 | 776 #ifdef HAL_DCACHE_FLUSH |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
777 test_dflush(); numtests++; |
| 2 | 778 #endif |
| 779 #ifdef HAL_DCACHE_INVALIDATE | |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
780 test_dinvalidate(); numtests++; |
| 2 | 781 #endif |
| 782 } | |
|
24
306eee292492
Merge from eCos master repository on 1999-07-16-05:47:06-BST
jlarmour
parents:
2
diff
changeset
|
783 #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
|
784 if ( numtests ) { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
785 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
|
786 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
787 else { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
66
diff
changeset
|
788 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
|
789 } |
| 2 | 790 } |
| 791 | |
| 792 // ------------------------------------------------------------------------- | |
| 793 | |
| 794 void kcache2_main( void ) | |
| 795 { | |
| 796 CYG_TEST_INIT(); | |
| 797 | |
| 798 cyg_thread_create(4, entry0 , (cyg_addrword_t)0, "kcache2", | |
| 799 (void *)stack[0], STACKSIZE, &thread[0], &thread_obj[0]); | |
| 800 cyg_thread_resume(thread[0]); | |
| 801 | |
| 802 cyg_scheduler_start(); | |
| 803 } | |
| 804 | |
| 805 // ------------------------------------------------------------------------- | |
| 806 | |
| 807 externC void | |
| 808 cyg_start( void ) | |
| 809 { | |
| 810 kcache2_main(); | |
| 811 } | |
| 812 | |
| 813 // ------------------------------------------------------------------------- | |
| 814 | |
| 815 #else // def CYGFUN_KERNEL_API_C | |
| 816 #define N_A_MSG "Kernel C API layer disabled" | |
| 817 #endif // def CYGFUN_KERNEL_API_C | |
| 818 #else // def CYGVAR_KERNEL_COUNTERS_CLOCK | |
| 819 #define N_A_MSG "Kernel real-time clock disabled" | |
| 820 #endif // def CYGVAR_KERNEL_COUNTERS_CLOCK | |
| 821 | |
| 822 #ifdef N_A_MSG | |
| 823 externC void | |
| 824 cyg_start( void ) | |
| 825 { | |
| 826 CYG_TEST_INIT(); | |
| 827 CYG_TEST_NA( N_A_MSG ); | |
| 828 } | |
| 829 #endif // N_A_MSG | |
| 830 | |
| 831 // ------------------------------------------------------------------------- | |
| 832 /* EOF kcache2.c */ |
