SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
copyrights:
- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
enabled-by: true
links: []
test-actions:
- action-brief: |
Call the ${../if/disable-data:/name} and ${../if/enable-data:/name}
directives.
action-code: |
rtems_cache_disable_data();
rtems_cache_enable_data();
checks: []
links:
- role: validation
uid: ../req/disable-data
- role: validation
uid: ../req/enable-data
- action-brief: |
Call the ${../if/disable-data:/name} and ${../if/enable-data:/name}
directives with maskable interrupts disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
rtems_cache_disable_data();
rtems_cache_enable_data();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/disable-data
- role: validation
uid: ../req/enable-data
- action-brief: |
Call the ${../if/disable-instruction:/name} and
${../if/enable-instruction:/name} directives.
action-code: |
rtems_cache_disable_instruction();
rtems_cache_enable_instruction();
checks: []
links:
- role: validation
uid: ../req/disable-instruction
- role: validation
uid: ../req/enable-instruction
- action-brief: |
Call the ${../if/disable-instruction:/name} and
${../if/enable-instruction:/name} directives with maskable interrupts
disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
rtems_cache_disable_instruction();
rtems_cache_enable_instruction();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/disable-instruction
- role: validation
uid: ../req/enable-instruction
- action-brief: |
Call the ${../if/freeze-data:/name} and ${../if/unfreeze-data:/name}
directives.
action-code: |
rtems_cache_freeze_data();
rtems_cache_unfreeze_data();
checks: []
links:
- role: validation
uid: ../req/freeze-data
- role: validation
uid: ../req/unfreeze-data
- action-brief: |
Call the ${../if/freeze-data:/name} and ${../if/unfreeze-data:/name}
directives with maskable interrupts disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
rtems_cache_freeze_data();
rtems_cache_unfreeze_data();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/freeze-data
- role: validation
uid: ../req/unfreeze-data
- action-brief: |
Call the ${../if/freeze-instruction:/name} and
${../if/unfreeze-instruction:/name} directives.
action-code: |
rtems_cache_freeze_instruction();
rtems_cache_unfreeze_instruction();
checks: []
links:
- role: validation
uid: ../req/freeze-instruction
- role: validation
uid: ../req/unfreeze-instruction
- action-brief: |
Call the ${../if/freeze-instruction:/name} and
${../if/unfreeze-instruction:/name} directives with maskable interrupts
disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
rtems_cache_freeze_instruction();
rtems_cache_unfreeze_instruction();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/freeze-instruction
- role: validation
uid: ../req/unfreeze-instruction
- action-brief: |
Call the ${../if/invalidate-entire-data:/name} directive with maskable
interrupts disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
rtems_cache_invalidate_entire_data();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/invalidate-entire-data
- action-brief: |
Call the ${../if/invalidate-entire-instruction:/name} directive.
action-code: |
rtems_cache_invalidate_entire_instruction();
checks: []
links:
- role: validation
uid: ../req/invalidate-entire-instruction
- action-brief: |
Call the ${../if/invalidate-entire-instruction:/name} directive with
maskable interrupts disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
rtems_cache_invalidate_entire_instruction();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/invalidate-entire-instruction
- action-brief: |
Call the ${../if/flush-entire-data:/name} directive.
action-code: |
rtems_cache_flush_entire_data();
checks: []
links:
- role: validation
uid: ../req/flush-entire-data
- action-brief: |
Call the ${../if/flush-entire-data:/name} directive with maskable
interrupts disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
rtems_cache_flush_entire_data();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/flush-entire-data
- action-brief: |
Call the ${../if/flush-multiple-data-lines:/name} directive with a sample
set of memory areas.
action-code: |
CallFlushMultipleDataLines();
checks: []
links:
- role: validation
uid: ../req/flush-multiple-data-lines
- action-brief: |
Call the ${../if/flush-multiple-data-lines:/name} directive with a sample
set of memory areas with maskable interrupts disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
CallFlushMultipleDataLines();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/flush-multiple-data-lines
- action-brief: |
Call the ${../if/invalidate-multiple-data-lines:/name} directive with a sample
set of memory areas.
action-code: |
CallInvalidateMultipleDataLines();
checks: []
links:
- role: validation
uid: ../req/invalidate-multiple-data-lines
- action-brief: |
Call the ${../if/invalidate-multiple-data-lines:/name} directive with a sample
set of memory areas with maskable interrupts disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
CallInvalidateMultipleDataLines();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/invalidate-multiple-data-lines
- action-brief: |
Call the ${../if/invalidate-multiple-instruction-lines:/name} directive
with a sample set of memory areas.
action-code: |
CallInvalidateMultipleInstructionLines();
checks: []
links:
- role: validation
uid: ../req/invalidate-multiple-instruction-lines
- action-brief: |
Call the ${../if/invalidate-multiple-instruction-lines:/name} directive
with a sample set of memory areas with maskable interrupts disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
CallInvalidateMultipleInstructionLines();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/invalidate-multiple-instruction-lines
- action-brief: |
Call the ${../if/instruction-sync-after-code-change:/name} directive
with a sample set of memory areas.
action-code: |
CallInstructionSyncAfterCodeChange();
checks: []
links:
- role: validation
uid: ../req/instruction-sync-after-code-change
- action-brief: |
Call the ${../if/instruction-sync-after-code-change:/name} directive
with a sample set of memory areas with maskable interrupts disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
CallInstructionSyncAfterCodeChange();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/instruction-sync-after-code-change
- action-brief: |
Call the ${../if/get-data-line-size:/name},
${../if/get-instruction-line-size:/name}, and the
${../if/get-maximal-line-size:/name} directives.
action-code: |
size_t data_line_size;
size_t instruction_line_size;
size_t maximal_line_size;
data_line_size = rtems_cache_get_data_line_size();
instruction_line_size = rtems_cache_get_instruction_line_size();
maximal_line_size = rtems_cache_get_maximal_line_size();
checks:
- brief: |
Check that the maximal cache line size is greater than or equal to the
data cache line size.
code: |
T_step_ge_sz( ${step}, maximal_line_size, data_line_size );
links:
- role: validation
uid: ../req/get-maximal-line-size
- brief: |
Check that the maximal cache line size is greater than or equal to the
instruction cache line size.
code: |
T_step_ge_sz( ${step}, maximal_line_size, instruction_line_size );
links:
- role: validation
uid: ../req/get-maximal-line-size
links:
- role: validation
uid: ../req/get-data-line-size
- role: validation
uid: ../req/get-instruction-line-size
- action-brief: |
Call the ${../if/get-data-line-size:/name},
${../if/get-instruction-line-size:/name}, and the
${../if/get-maximal-line-size:/name} directives with maskable interrupts
disabled.
action-code: |
size_t data_line_size;
size_t instruction_line_size;
size_t maximal_line_size;
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
data_line_size = rtems_cache_get_data_line_size();
instruction_line_size = rtems_cache_get_instruction_line_size();
maximal_line_size = rtems_cache_get_maximal_line_size();
rtems_interrupt_local_enable(level);
checks:
- brief: |
Check that the maximal cache line size is greater than or equal to the
data cache line size.
code: |
T_step_ge_sz( ${step}, maximal_line_size, data_line_size );
links:
- role: validation
uid: ../req/get-maximal-line-size
- brief: |
Check that the maximal cache line size is greater than or equal to the
instruction cache line size.
code: |
T_step_ge_sz( ${step}, maximal_line_size, instruction_line_size );
links:
- role: validation
uid: ../req/get-maximal-line-size
links:
- role: validation
uid: ../req/get-data-line-size
- role: validation
uid: ../req/get-instruction-line-size
- action-brief: |
Call the ${../if/get-data-size:/name} directive with increasing level
starting with zero until it returns zero.
action-code: |
CallGetDataSize();
checks: []
links:
- role: validation
uid: ../req/get-data-size
- role: validation
uid: ../req/get-data-size-level-zero
- role: validation
uid: ../req/get-data-size-no-cache
- role: validation
uid: ../req/get-data-size-no-level
- action-brief: |
Call the ${../if/get-data-size:/name} directive with increasing level
starting with zero until it returns zero with maskable interrupts disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
CallGetDataSize();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/get-data-size
- action-brief: |
Call the ${../if/get-instruction-size:/name} directive with increasing
level starting with zero until it returns zero.
action-code: |
CallGetInstructionSize();
checks: []
links:
- role: validation
uid: ../req/get-instruction-size
- role: validation
uid: ../req/get-instruction-size-level-zero
- role: validation
uid: ../req/get-instruction-size-no-cache
- role: validation
uid: ../req/get-instruction-size-no-level
- action-brief: |
Call the ${../if/get-instruction-size:/name} directive with increasing
level starting with zero until it returns zero with maskable interrupts
disabled.
action-code: |
rtems_interrupt_level level;
rtems_interrupt_local_disable(level);
CallGetInstructionSize();
rtems_interrupt_local_enable(level);
checks: []
links:
- role: validation
uid: ../req/get-instruction-size
test-brief: |
Tests some ${../if/group:/name} directives.
test-context: []
test-context-support: null
test-description: null
test-header: null
test-includes:
- rtems.h
test-local-includes: []
test-setup: null
test-stop: null
test-support: |
static void CallFlushMultipleDataLines( void )
{
uint8_t buf[256];
uintptr_t data;
uintptr_t n;
uintptr_t i;
rtems_cache_flush_multiple_data_lines( NULL, 0 );
data = RTEMS_ALIGN_UP( (uintptr_t) &buf[ 1 ], 128 );
for ( n = 16; n <= 128 ; n *= 2 ) {
for ( i = 0; i < 3; ++i ) {
uintptr_t j;
for ( j = 0; j < 3; ++j ) {
rtems_cache_flush_multiple_data_lines(
(const void *) ( data + 1 - i ),
n + 1 - j
);
}
}
}
}
static void CallInvalidateMultipleDataLines( void )
{
uint8_t buf[256];
uintptr_t data;
uintptr_t n;
uintptr_t i;
rtems_cache_invalidate_multiple_data_lines( NULL, 0 );
data = RTEMS_ALIGN_UP( (uintptr_t) &buf[ 1 ], 128 );
for ( n = 16; n <= 128 ; n *= 2 ) {
for ( i = 0; i < 3; ++i ) {
uintptr_t j;
for ( j = 0; j < 3; ++j ) {
rtems_cache_invalidate_multiple_data_lines(
(const void *) ( data + 1 - i ),
n + 1 - j
);
}
}
}
}
static void CallInvalidateMultipleInstructionLines( void )
{
uintptr_t data;
uintptr_t n;
uintptr_t i;
rtems_cache_invalidate_multiple_instruction_lines( NULL, 0 );
data = (uintptr_t) rtems_cache_invalidate_multiple_instruction_lines;
for ( n = 16; n <= 128 ; n *= 2 ) {
for ( i = 0; i < 3; ++i ) {
uintptr_t j;
for ( j = 0; j < 3; ++j ) {
rtems_cache_invalidate_multiple_instruction_lines(
(const void *) ( data + 1 - i ),
n + 1 - j
);
}
}
}
}
static void CallInstructionSyncAfterCodeChange( void )
{
uintptr_t data;
uintptr_t n;
uintptr_t i;
rtems_cache_instruction_sync_after_code_change( NULL, 0 );
data = (uintptr_t) rtems_cache_instruction_sync_after_code_change;
for ( n = 16; n <= 128 ; n *= 2 ) {
for ( i = 0; i < 3; ++i ) {
uintptr_t j;
for ( j = 0; j < 3; ++j ) {
rtems_cache_instruction_sync_after_code_change(
(const void *) ( data + 1 - i ),
n + 1 - j
);
}
}
}
}
static void CallGetDataSize( void )
{
uint32_t level;
size_t n;
level = 0;
do {
n = rtems_cache_get_data_cache_size( level );
++level;
} while (n != 0 );
}
static void CallGetInstructionSize( void )
{
uint32_t level;
size_t n;
level = 0;
do {
n = rtems_cache_get_instruction_cache_size( level );
++level;
} while (n != 0 );
}
test-target: testsuites/validation/tc-cache.c
test-teardown: null
type: test-case