[PATCH] spcache01: Add tests for misaligned cache access

Joel Sherrill joel.sherrill at OARcorp.com
Fri Apr 18 16:12:56 UTC 2014


FYI this test does not link on many architectures.

I have a patch for the sh pending. If libcpu does not
build the shared cache code and install the .h, the
test does not link.

On 4/10/2014 11:25 AM, Ralf Kirchner wrote:
> ---
>  testsuites/sptests/spcache01/init.c        |   81 ++++++++++++++++++++++++++++
>  testsuites/sptests/spcache01/spcache01.doc |    1 +
>  testsuites/sptests/spcache01/spcache01.scn |    2 +
>  3 Dateien geändert, 84 Zeilen hinzugefügt(+)
>
> diff --git a/testsuites/sptests/spcache01/init.c b/testsuites/sptests/spcache01/init.c
> index 2c9d184..4be1040 100644
> --- a/testsuites/sptests/spcache01/init.c
> +++ b/testsuites/sptests/spcache01/init.c
> @@ -37,6 +37,86 @@ const char rtems_test_name[] = "SPCACHE 1";
>  
>  CPU_STRUCTURE_ALIGNMENT static int data[1024];
>  
> +static void test_misalignment(void)
> +{
> +  if (rtems_cache_get_data_line_size() > 0) {
> +    rtems_interrupt_lock         lock;
> +    rtems_interrupt_lock_context lock_context;
> +    volatile int                *vdata      = &data[0];
> +    int                         *tdata      = &data[2];
> +    const uint32_t               LINE_SIZE  = rtems_cache_get_data_line_size();
> +    int                          tcount     = LINE_SIZE;
> +    int                          vcount     = tcount + 3 * LINE_SIZE;
> +    size_t                       tdata_size = tcount * sizeof(data[0]);
> +    bool                         write_through;
> +    int                          i;
> +    int                          end;
> +
> +    printf("data cache flush and invalidate test with misaligned addresses\n");
> +
> +    rtems_interrupt_lock_initialize(&lock, "test");
> +    rtems_interrupt_lock_acquire(&lock, &lock_context);
> +
> +    for (i = 0; i < vcount; ++i) {
> +      vdata[i] = i;
> +    }
> +
> +    rtems_cache_flush_multiple_data_lines(tdata, tdata_size);
> +
> +    for (i = 0; i < vcount; ++i) {
> +      rtems_test_assert(vdata[i] == i);
> +    }
> +
> +    for (i = 0; i < vcount; ++i) {
> +      vdata[i] = ~i;
> +    }
> +    
> +    rtems_cache_invalidate_multiple_data_lines(tdata, tdata_size);
> +
> +    end = (tdata_size + LINE_SIZE) / sizeof(data[0]);
> +
> +    write_through = vdata[LINE_SIZE / sizeof(data[0])] == ~LINE_SIZE / sizeof(data[0]);
> +    if (write_through) {
> +      for (i = 0; i < end; ++i) {
> +        rtems_test_assert(vdata[i] == ~i);
> +      }
> +    } else {
> +      for( i = 0; i < end; ++i) {
> +        rtems_test_assert(vdata[i] == i);
> +      }
> +    }
> +    i = end;
> +    end = i + LINE_SIZE + LINE_SIZE;
> +    for( ; i < end;  ++i) {
> +      rtems_test_assert(vdata[i] == ~i);
> +    }
> +      
> +    for (i = 0; i < vcount; ++i) {
> +      vdata[i] = ~i;
> +    }
> +
> +    rtems_cache_flush_multiple_data_lines(tdata, tdata_size);
> +    rtems_cache_invalidate_multiple_data_lines(tdata, tdata_size);
> +
> +    for (i = 0; i < vcount; ++i) {
> +      rtems_test_assert(vdata[i] == ~i);
> +    }
> +
> +    rtems_interrupt_lock_release(&lock, &lock_context);
> +    rtems_interrupt_lock_destroy(&lock);
> +    
> +    printf(
> +      "data cache operations with misaligned addresses passed the test (%s cache detected)\n",
> +           write_through ? "write-through" : "copy-back"
> +    );
> +  } else {
> +    printf(
> +      "skip data cache flush and invalidate test with misaligned addresses"
> +      " due to cache line size of zero\n"
> +    );
> +  }
> +}
> +
>  static void test_data_flush_and_invalidate(void)
>  {
>    if (rtems_cache_get_data_line_size() > 0) {
> @@ -376,6 +456,7 @@ static void Init(rtems_task_argument arg)
>    TEST_BEGIN();
>  
>    test_data_flush_and_invalidate();
> +  test_misalignment();
>    test_timing();
>  
>    TEST_END();
> diff --git a/testsuites/sptests/spcache01/spcache01.doc b/testsuites/sptests/spcache01/spcache01.doc
> index bbc8f25..1a56be8 100644
> --- a/testsuites/sptests/spcache01/spcache01.doc
> +++ b/testsuites/sptests/spcache01/spcache01.doc
> @@ -17,3 +17,4 @@ directives:
>  concepts:
>  
>    - Ensure that some cache manager functions work.
> +  - Ensure they also work with misaligned addesses
> diff --git a/testsuites/sptests/spcache01/spcache01.scn b/testsuites/sptests/spcache01/spcache01.scn
> index 8013945..53d3e70 100644
> --- a/testsuites/sptests/spcache01/spcache01.scn
> +++ b/testsuites/sptests/spcache01/spcache01.scn
> @@ -2,6 +2,8 @@
>  data cache flush and invalidate test
>  data cache operations by line passed the test
>  data cache operations by line passed the test (copy-back cache detected)
> +data cache flush and invalidate test with misaligned addresses
> +data cache operations with misaligned addresses passed the test (copy-back cache detected)
>  data cache line size 32 bytes
>  data cache size 262144 bytes
>  data cache level 1 size 32768 bytes

-- 
Joel Sherrill, Ph.D.             Director of Research & Development
joel.sherrill at OARcorp.com        On-Line Applications Research
Ask me about RTEMS: a free RTOS  Huntsville AL 35805
Support Available                (256) 722-9985




More information about the devel mailing list