Mercurial > ecos
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 142:12eccf9656f3 | 143:6b5f480c6929 |
|---|---|
| 232 c = m[HAL_DCACHE_LINE_SIZE*2]; | 232 c = m[HAL_DCACHE_LINE_SIZE*2]; |
| 233 } | 233 } |
| 234 #endif | 234 #endif |
| 235 | 235 |
| 236 // ------------------------------------------------------------------------- | 236 // ------------------------------------------------------------------------- |
| 237 // Test of data cache line store. | 237 // Test of data cache line store |
| 238 // Just check that the macro compiles. | 238 // o No semantic requirement. |
| 239 // o Check that flushed data is written to memory. | |
| 240 // o Simple invocation check of macro. | |
| 239 #ifdef HAL_DCACHE_STORE | 241 #ifdef HAL_DCACHE_STORE |
| 240 static void test_dstore(void) | 242 static void test_dstore(void) |
| 241 { | 243 { |
| 242 volatile cyg_uint8* aligned_p; | 244 volatile cyg_uint8* aligned_p; |
| 243 cyg_int32 i; | 245 cyg_int32 i; |
| 258 | 260 |
| 259 aligned_p = (volatile cyg_uint8*) | 261 aligned_p = (volatile cyg_uint8*) |
| 260 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) | 262 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) |
| 261 & ~(HAL_DCACHE_LINE_SIZE-1)); | 263 & ~(HAL_DCACHE_LINE_SIZE-1)); |
| 262 | 264 |
| 263 aligned_p[0] = 42; | 265 HAL_DISABLE_INTERRUPTS(oldints); |
| 266 | |
| 267 aligned_p[0] = 42 + aligned_p[1]; // Load causes cache to be used! | |
| 264 | 268 |
| 265 HAL_DCACHE_STORE(aligned_p, HAL_DCACHE_LINE_SIZE); | 269 HAL_DCACHE_STORE(aligned_p, HAL_DCACHE_LINE_SIZE); |
| 266 } | 270 |
| 267 #endif | 271 HAL_RESTORE_INTERRUPTS(oldints); |
| 272 | |
| 273 CYG_TEST_CHECK(42 == aligned_p[0], | |
| 274 "memory didn't contain flushed data"); | |
| 275 | |
| 276 HAL_DCACHE_INVALIDATE_ALL(); // Discard... | |
| 277 | |
| 278 CYG_TEST_CHECK(42 == aligned_p[0], | |
| 279 "memory didn't contain flushed data after invalidate all"); | |
| 280 } | |
| 281 #endif | |
| 282 | |
| 283 // ------------------------------------------------------------------------- | |
| 284 // Test of data cache total flush (sync). | |
| 285 // o No semantic requirement. | |
| 286 // o Check that flushed data is written to memory. | |
| 287 // o Simple invocation check of macro. | |
| 288 #ifdef HAL_DCACHE_LINE_SIZE // So we can find our way around memory | |
| 289 static void test_dsync(void) | |
| 290 { | |
| 291 volatile cyg_uint8* aligned_p; | |
| 292 cyg_int32 i; | |
| 293 register CYG_INTERRUPT_STATE oldints; | |
| 294 | |
| 295 CYG_TEST_INFO("Data cache sync all"); | |
| 296 | |
| 297 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++) | |
| 298 m[i] = 0; | |
| 299 | |
| 300 HAL_DISABLE_INTERRUPTS(oldints); | |
| 301 HAL_DCACHE_SYNC(); | |
| 302 HAL_DCACHE_DISABLE(); | |
| 303 HAL_DCACHE_SYNC(); | |
| 304 HAL_DCACHE_INVALIDATE_ALL(); | |
| 305 HAL_DCACHE_ENABLE(); | |
| 306 HAL_RESTORE_INTERRUPTS(oldints); | |
| 307 | |
| 308 aligned_p = (volatile cyg_uint8*) | |
| 309 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) | |
| 310 & ~(HAL_DCACHE_LINE_SIZE-1)); | |
| 311 | |
| 312 HAL_DISABLE_INTERRUPTS(oldints); | |
| 313 | |
| 314 aligned_p[0] = 42 + aligned_p[1]; // Load causes cache to be used! | |
| 315 aligned_p[HAL_DCACHE_LINE_SIZE] = 43 + aligned_p[HAL_DCACHE_LINE_SIZE + 1]; | |
| 316 | |
| 317 HAL_DCACHE_SYNC(); | |
| 318 | |
| 319 HAL_RESTORE_INTERRUPTS(oldints); | |
| 320 | |
| 321 CYG_TEST_CHECK(42 == aligned_p[0], | |
| 322 "memory didn't contain flushed data"); | |
| 323 CYG_TEST_CHECK(43 == aligned_p[HAL_DCACHE_LINE_SIZE], | |
| 324 "memory didn't contain flushed data next block"); | |
| 325 | |
| 326 HAL_DCACHE_INVALIDATE_ALL(); | |
| 327 | |
| 328 CYG_TEST_CHECK(42 == aligned_p[0], | |
| 329 "memory didn't contain flushed data after invalidate"); | |
| 330 CYG_TEST_CHECK(43 == aligned_p[HAL_DCACHE_LINE_SIZE], | |
| 331 "memory didn't contain flushed data next block after invalidate"); | |
| 332 | |
| 333 HAL_DCACHE_DISABLE(); | |
| 334 | |
| 335 CYG_TEST_CHECK(42 == aligned_p[0], | |
| 336 "memory didn't contain flushed data after disable"); | |
| 337 CYG_TEST_CHECK(43 == aligned_p[HAL_DCACHE_LINE_SIZE], | |
| 338 "memory didn't contain flushed data next block after disable"); | |
| 339 | |
| 340 HAL_DCACHE_ENABLE(); | |
| 341 } | |
| 342 #endif // HAL_DCACHE_LINE_SIZE | |
| 268 | 343 |
| 269 // ------------------------------------------------------------------------- | 344 // ------------------------------------------------------------------------- |
| 270 // Test of data cache line flush. | 345 // Test of data cache line flush. |
| 271 // o Requires write-back cache. | 346 // o Requires write-back cache. |
| 272 // o Check that flushed data is written to memory. | 347 // o Check that flushed data is written to memory. |
| 293 | 368 |
| 294 aligned_p = (volatile cyg_uint8*) | 369 aligned_p = (volatile cyg_uint8*) |
| 295 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) | 370 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) |
| 296 & ~(HAL_DCACHE_LINE_SIZE-1)); | 371 & ~(HAL_DCACHE_LINE_SIZE-1)); |
| 297 | 372 |
| 298 aligned_p[0] = 42; | 373 HAL_DISABLE_INTERRUPTS(oldints); |
| 299 aligned_p[HAL_DCACHE_LINE_SIZE] = 43; | 374 |
| 375 aligned_p[0] = 42 + aligned_p[1]; // Load causes cache to be used! | |
| 376 aligned_p[HAL_DCACHE_LINE_SIZE] = 43 + aligned_p[HAL_DCACHE_LINE_SIZE + 1]; | |
| 300 | 377 |
| 301 HAL_DCACHE_FLUSH(aligned_p, HAL_DCACHE_LINE_SIZE); | 378 HAL_DCACHE_FLUSH(aligned_p, HAL_DCACHE_LINE_SIZE); |
| 302 | 379 |
| 303 HAL_DCACHE_DISABLE(); | 380 HAL_DCACHE_DISABLE(); |
| 381 | |
| 382 HAL_RESTORE_INTERRUPTS(oldints); | |
| 304 | 383 |
| 305 CYG_TEST_CHECK(42 == aligned_p[0], | 384 CYG_TEST_CHECK(42 == aligned_p[0], |
| 306 "memory didn't contain flushed data"); | 385 "memory didn't contain flushed data"); |
| 307 CYG_TEST_CHECK(0 == aligned_p[HAL_DCACHE_LINE_SIZE], | 386 CYG_TEST_CHECK(0 == aligned_p[HAL_DCACHE_LINE_SIZE], |
| 308 "flushed beyond region"); | 387 "flushed beyond region"); |
| 309 | 388 |
| 310 HAL_DCACHE_ENABLE(); | 389 HAL_DCACHE_ENABLE(); |
| 311 | 390 } |
| 312 } | 391 #endif |
| 313 #endif | 392 |
| 393 // ------------------------------------------------------------------------- | |
| 394 // Test of data cache disable (which does NOT force contents out to RAM) | |
| 395 // o Requires write-back cache [so NOT invoked unconditionally] | |
| 396 // o Check that dirty data is not written to memory and is invalidated | |
| 397 // in the cache. | |
| 398 // o Simple invocation check of macro. | |
| 399 #ifdef HAL_DCACHE_QUERY_WRITE_MODE // only if we know this, can we test: | |
| 400 static void test_ddisable(void) | |
| 401 { | |
| 402 volatile cyg_uint8* aligned_p; | |
| 403 cyg_int32 i; | |
| 404 register CYG_INTERRUPT_STATE oldints; | |
| 405 | |
| 406 CYG_TEST_INFO("Data cache gross disable"); | |
| 407 | |
| 408 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++) | |
| 409 m[i] = 0; | |
| 410 | |
| 411 HAL_DISABLE_INTERRUPTS(oldints); | |
| 412 HAL_DCACHE_SYNC(); | |
| 413 HAL_DCACHE_DISABLE(); | |
| 414 HAL_DCACHE_SYNC(); | |
| 415 HAL_DCACHE_INVALIDATE_ALL(); | |
| 416 HAL_DCACHE_ENABLE(); | |
| 417 HAL_RESTORE_INTERRUPTS(oldints); | |
| 418 | |
| 419 aligned_p = (volatile cyg_uint8*) | |
| 420 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) | |
| 421 & ~(HAL_DCACHE_LINE_SIZE-1)); | |
| 422 | |
| 423 HAL_DISABLE_INTERRUPTS(oldints); | |
| 424 | |
| 425 aligned_p[0] = 43 + aligned_p[1]; // Load causes cache to be used! | |
| 426 aligned_p[HAL_DCACHE_LINE_SIZE-1] = 43; | |
| 427 | |
| 428 aligned_p[HAL_DCACHE_LINE_SIZE] = 42 + aligned_p[HAL_DCACHE_LINE_SIZE + 1]; | |
| 429 | |
| 430 HAL_DCACHE_DISABLE(); | |
| 431 | |
| 432 HAL_RESTORE_INTERRUPTS(oldints); | |
| 433 | |
| 434 CYG_TEST_CHECK(0 == aligned_p[0] && | |
| 435 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1], | |
| 436 "cache/memory contained invalidated data"); | |
| 437 CYG_TEST_CHECK(0 == aligned_p[HAL_DCACHE_LINE_SIZE], | |
| 438 "next block contained invalidated data"); | |
| 439 | |
| 440 HAL_DCACHE_ENABLE(); | |
| 441 } | |
| 442 #endif // def HAL_DCACHE_QUERY_WRITE_MODE | |
| 443 | |
| 444 // ------------------------------------------------------------------------- | |
| 445 // Test of data cache total invalidate. | |
| 446 // o Requires write-back cache. | |
| 447 // o Check that invalidated data is not written to memory and is invalidated | |
| 448 // in the cache. | |
| 449 // o Simple invocation check of macro. | |
| 450 #ifdef HAL_DCACHE_QUERY_WRITE_MODE // only if we know this, can we test: | |
| 451 #ifdef HAL_DCACHE_INVALIDATE_ALL | |
| 452 static void test_dinvalidate_all(void) | |
| 453 { | |
| 454 volatile cyg_uint8* aligned_p; | |
| 455 cyg_int32 i; | |
| 456 register CYG_INTERRUPT_STATE oldints; | |
| 457 | |
| 458 CYG_TEST_INFO("Data cache invalidate all"); | |
| 459 | |
| 460 for (i = 0; i < HAL_DCACHE_LINE_SIZE*16; i++) | |
| 461 m[i] = 0; | |
| 462 | |
| 463 HAL_DISABLE_INTERRUPTS(oldints); | |
| 464 HAL_DCACHE_SYNC(); | |
| 465 HAL_DCACHE_DISABLE(); | |
| 466 HAL_DCACHE_SYNC(); | |
| 467 HAL_DCACHE_INVALIDATE_ALL(); | |
| 468 HAL_DCACHE_ENABLE(); | |
| 469 HAL_RESTORE_INTERRUPTS(oldints); | |
| 470 | |
| 471 aligned_p = (volatile cyg_uint8*) | |
| 472 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) | |
| 473 & ~(HAL_DCACHE_LINE_SIZE-1)); | |
| 474 | |
| 475 HAL_DISABLE_INTERRUPTS(oldints); | |
| 476 | |
| 477 aligned_p[0] = 43 + aligned_p[1]; // Load causes cache to be used! | |
| 478 aligned_p[HAL_DCACHE_LINE_SIZE-1] = 43; | |
| 479 | |
| 480 aligned_p[HAL_DCACHE_LINE_SIZE] = 42 + aligned_p[HAL_DCACHE_LINE_SIZE + 1]; | |
| 481 | |
| 482 HAL_DCACHE_INVALIDATE_ALL(); | |
| 483 | |
| 484 HAL_RESTORE_INTERRUPTS(oldints); | |
| 485 | |
| 486 CYG_TEST_CHECK(0 == aligned_p[0] && | |
| 487 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1], | |
| 488 "cache/memory contained invalidated data"); | |
| 489 CYG_TEST_CHECK(0 == aligned_p[HAL_DCACHE_LINE_SIZE], | |
| 490 "next block contained invalidated data"); | |
| 491 } | |
| 492 #endif | |
| 493 #endif // def HAL_DCACHE_QUERY_WRITE_MODE | |
| 314 | 494 |
| 315 // ------------------------------------------------------------------------- | 495 // ------------------------------------------------------------------------- |
| 316 // Test of data cache line invalidate. | 496 // Test of data cache line invalidate. |
| 317 // o Requires write-back cache. | 497 // o Requires write-back cache. |
| 318 // o Check that invalidated data is not written to memory and is invalidated | 498 // o Check that invalidated data is not written to memory and is invalidated |
| 319 // in the cache. | 499 // in the cache. |
| 320 // o Simple range check of macro. | 500 // o Simple range check of macro. |
| 501 #ifdef HAL_DCACHE_QUERY_WRITE_MODE // only if we know this, can we test: | |
| 321 #ifdef HAL_DCACHE_INVALIDATE | 502 #ifdef HAL_DCACHE_INVALIDATE |
| 322 static void test_dinvalidate(void) | 503 static void test_dinvalidate(void) |
| 323 { | 504 { |
| 324 volatile cyg_uint8* aligned_p; | 505 volatile cyg_uint8* aligned_p; |
| 325 cyg_int32 i; | 506 cyg_int32 i; |
| 340 | 521 |
| 341 aligned_p = (volatile cyg_uint8*) | 522 aligned_p = (volatile cyg_uint8*) |
| 342 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) | 523 (((unsigned long) &m[HAL_DCACHE_LINE_SIZE*2]) |
| 343 & ~(HAL_DCACHE_LINE_SIZE-1)); | 524 & ~(HAL_DCACHE_LINE_SIZE-1)); |
| 344 | 525 |
| 345 aligned_p[0] = 43; | 526 HAL_DISABLE_INTERRUPTS(oldints); |
| 527 | |
| 528 aligned_p[0] = 43 + aligned_p[1]; // Load causes cache to be used! | |
| 346 aligned_p[HAL_DCACHE_LINE_SIZE-1] = 43; | 529 aligned_p[HAL_DCACHE_LINE_SIZE-1] = 43; |
| 347 | 530 |
| 348 aligned_p[HAL_DCACHE_LINE_SIZE] = 42; | 531 aligned_p[HAL_DCACHE_LINE_SIZE] = 42 + aligned_p[HAL_DCACHE_LINE_SIZE + 1]; |
| 349 | 532 |
| 350 HAL_DCACHE_INVALIDATE(aligned_p, HAL_DCACHE_LINE_SIZE); | 533 HAL_DCACHE_INVALIDATE(aligned_p, HAL_DCACHE_LINE_SIZE); |
| 534 | |
| 535 HAL_RESTORE_INTERRUPTS(oldints); | |
| 351 | 536 |
| 352 CYG_TEST_CHECK(0 == aligned_p[0] && | 537 CYG_TEST_CHECK(0 == aligned_p[0] && |
| 353 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1], | 538 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1], |
| 354 "cache/memory contained invalidated data"); | 539 "cache/memory contained invalidated data"); |
| 355 CYG_TEST_CHECK(42 == aligned_p[HAL_DCACHE_LINE_SIZE], | 540 CYG_TEST_CHECK(42 == aligned_p[HAL_DCACHE_LINE_SIZE], |
| 356 "invalidated beyond range"); | 541 "invalidated beyond range"); |
| 357 } | 542 |
| 358 #endif | 543 HAL_DCACHE_SYNC(); |
| 544 HAL_DCACHE_DISABLE(); | |
| 545 | |
| 546 CYG_TEST_CHECK(0 == aligned_p[0] && | |
| 547 0 == aligned_p[HAL_DCACHE_LINE_SIZE-1], | |
| 548 "cache/memory contained invalidated data after SYNC/DIS"); | |
| 549 CYG_TEST_CHECK(42 == aligned_p[HAL_DCACHE_LINE_SIZE], | |
| 550 "invalidated beyond range after SYNC/DIS"); | |
| 551 | |
| 552 HAL_DCACHE_ENABLE(); | |
| 553 } | |
| 554 #endif | |
| 555 #endif // def HAL_DCACHE_QUERY_WRITE_MODE | |
| 359 | 556 |
| 360 // ------------------------------------------------------------------------- | 557 // ------------------------------------------------------------------------- |
| 361 // Test of instruction cache locking. | 558 // Test of instruction cache locking. |
| 362 // o Time difference between repeatedly executing a bunch of instructions | 559 // o Time difference between repeatedly executing a bunch of instructions |
| 363 // with and without locking. | 560 // with and without locking. |
| 539 #endif // ifdef HAL_DCACHE_LOCK | 736 #endif // ifdef HAL_DCACHE_LOCK |
| 540 | 737 |
| 541 // ------------------------------------------------------------------------- | 738 // ------------------------------------------------------------------------- |
| 542 static void entry0( cyg_addrword_t data ) | 739 static void entry0( cyg_addrword_t data ) |
| 543 { | 740 { |
| 741 int numtests = 0; | |
| 544 #ifdef HAL_DCACHE_QUERY_WRITE_MODE | 742 #ifdef HAL_DCACHE_QUERY_WRITE_MODE |
| 545 int wmode; | 743 int wmode; |
| 546 #endif | 744 #endif |
| 547 #ifdef HAL_DCACHE_LOCK | 745 #ifdef HAL_DCACHE_LOCK |
| 548 time_dlock(); | 746 time_dlock(); numtests++; |
| 549 #endif | 747 #endif |
| 550 #ifdef HAL_ICACHE_LOCK | 748 #ifdef HAL_ICACHE_LOCK |
| 551 time_ilock(); | 749 time_ilock(); numtests++; |
| 750 #endif | |
| 751 #ifdef HAL_DCACHE_LINE_SIZE // So we can find our way around memory | |
| 752 test_dsync(); numtests++; | |
| 552 #endif | 753 #endif |
| 553 #ifdef HAL_DCACHE_STORE | 754 #ifdef HAL_DCACHE_STORE |
| 554 test_dstore(); | 755 test_dstore(); numtests++; |
| 555 #endif | 756 #endif |
| 556 #ifdef HAL_DCACHE_READ_HINT | 757 #ifdef HAL_DCACHE_READ_HINT |
| 557 test_dread_hint(); | 758 test_dread_hint(); numtests++; |
| 558 #endif | 759 #endif |
| 559 #ifdef HAL_DCACHE_WRITE_HINT | 760 #ifdef HAL_DCACHE_WRITE_HINT |
| 560 test_dwrite_hint(); | 761 test_dwrite_hint(); numtests++; |
| 561 #endif | 762 #endif |
| 562 #ifdef HAL_DCACHE_ZERO | 763 #ifdef HAL_DCACHE_ZERO |
| 563 test_dzero(); | 764 test_dzero(); numtests++; |
| 564 #endif | 765 #endif |
| 565 | 766 |
| 566 // The below tests only work on a copy-back cache. | 767 // The below tests only work on a copy-back cache. |
| 567 #ifdef HAL_DCACHE_QUERY_WRITE_MODE | 768 #ifdef HAL_DCACHE_QUERY_WRITE_MODE |
| 568 HAL_DCACHE_QUERY_WRITE_MODE( wmode ); | 769 HAL_DCACHE_QUERY_WRITE_MODE( wmode ); |
| 569 | 770 |
| 570 if ( HAL_DCACHE_WRITEBACK_MODE == wmode ) { | 771 if ( HAL_DCACHE_WRITEBACK_MODE == wmode ) { |
| 772 test_ddisable(); numtests++; | |
| 773 #ifdef HAL_DCACHE_INVALIDATE | |
| 774 test_dinvalidate_all(); numtests++; | |
| 775 #endif | |
| 571 #ifdef HAL_DCACHE_FLUSH | 776 #ifdef HAL_DCACHE_FLUSH |
| 572 test_dflush(); | 777 test_dflush(); numtests++; |
| 573 #endif | 778 #endif |
| 574 #ifdef HAL_DCACHE_INVALIDATE | 779 #ifdef HAL_DCACHE_INVALIDATE |
| 575 test_dinvalidate(); | 780 test_dinvalidate(); numtests++; |
| 576 #endif | 781 #endif |
| 577 } | 782 } |
| 578 #endif // def HAL_DCACHE_QUERY_WRITE_MODE | 783 #endif // def HAL_DCACHE_QUERY_WRITE_MODE |
| 579 | 784 if ( numtests ) { |
| 580 CYG_TEST_PASS_FINISH("End of test"); | 785 CYG_TEST_PASS_FINISH("End of test"); |
| 786 } | |
| 787 else { | |
| 788 CYG_TEST_NA( "No applicable cache tests" ); | |
| 789 } | |
| 581 } | 790 } |
| 582 | 791 |
| 583 // ------------------------------------------------------------------------- | 792 // ------------------------------------------------------------------------- |
| 584 | 793 |
| 585 void kcache2_main( void ) | 794 void kcache2_main( void ) |
