SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause copyrights: - Copyright (C) 2021, 2022 embedded brains GmbH & Co. KG enabled-by: true functional-type: action links: - role: interface-function uid: ../if/set-affinity post-conditions: - name: Status states: - name: Ok test-code: | /* Validation done by CheckSetAffinity() for each interrupt vector */ text: | The return status of ${../if/set-affinity:/name} shall be ${../../status/if/successful:/name}. - name: InvAddr test-code: | T_rsc( ctx->status, RTEMS_INVALID_ADDRESS ); text: | The return status of ${../if/set-affinity:/name} shall be ${../../status/if/invalid-address:/name}. - name: InvId test-code: | T_rsc( ctx->status, RTEMS_INVALID_ID ); text: | The return status of ${../if/set-affinity:/name} shall be ${../../status/if/invalid-id:/name}. - name: InvNum test-code: | T_rsc( ctx->status, RTEMS_INVALID_NUMBER ); text: | The return status of ${../if/set-affinity:/name} shall be ${../../status/if/invalid-number:/name}. - name: Unsat test-code: | /* Validation done by CheckSetAffinity() for each interrupt vector */ text: | The return status of ${../if/set-affinity:/name} shall be ${../../status/if/unsatisfied:/name}. test-epilogue: null test-prologue: null - name: SetAffinity states: - name: Set test-code: | /* Validation done by CheckSetAffinity() for each interrupt vector */ text: | The affinity set of the interrupt specified by ${../if/set-affinity:/params[0]/name} shall be set to the processor set specified by ${../if/set-affinity:/params[1]/name} and ${../if/set-affinity:/params[2]/name} at some point during the ${../if/set-affinity:/name} call. - name: Nop test-code: | /* * Validation done by CheckSetAffinity() for each interrupt vector and in * the action code. */ text: | The affinity set of the interrupt specified by ${../if/set-affinity:/params[0]/name} shall not be modified by the ${../if/set-affinity:/name} call. test-epilogue: null test-prologue: null pre-conditions: - name: Vector states: - name: Valid test-code: | ctx->valid_vector = true; text: | While the ${../if/set-affinity:/params[0]/name} parameter is associated with an interrupt vector. - name: Invalid test-code: | ctx->valid_vector = false; text: | While the ${../if/set-affinity:/params[0]/name} parameter is not associated with an interrupt vector. test-epilogue: null test-prologue: null - name: CPUSetSize states: - name: Askew test-code: | ctx->cpusetsize = SIZE_MAX; text: | While the ${../if/set-affinity:/params[1]/name} parameter is not an integral multiple of the size of long. - name: Normal test-code: | ctx->cpusetsize = sizeof( ctx->cpuset_obj[ 0 ] ); text: | While the ${../if/set-affinity:/params[1]/name} parameter is an integral multiple of the size of long, while the ${../if/set-affinity:/params[1]/name} parameter is less than or equal to the maximum processor set size storable in the system. - name: Huge test-code: | ctx->cpusetsize = sizeof( ctx->cpuset_obj ); text: | While the ${../if/set-affinity:/params[1]/name} parameter is an integral multiple of the size of long, while the ${../if/set-affinity:/params[1]/name} parameter is greater than the maximum processor set size storable in the system. test-epilogue: null test-prologue: null - name: CPUSetOnline states: - name: Valid test-code: | /* Already prepared */ text: | While the intersection of the processor set specified by the ${../if/set-affinity:/params[1]/name} and ${../if/set-affinity:/params[2]/name} parameters and the set of online processors is not empty, while the intersection of the processor set specified by the ${../if/set-affinity:/params[1]/name} and ${../if/set-affinity:/params[2]/name} parameters and the set of online processors is a processor affinity set supported by the interrupt vector. - name: Empty test-code: | CPU_ZERO( &ctx->cpuset_obj[ 0 ] ); text: | While the intersection of the processor set specified by the ${../if/set-affinity:/params[1]/name} and ${../if/set-affinity:/params[2]/name} parameters and the set of online processors is empty. test-epilogue: null test-prologue: null - name: CPUSetHuge states: - name: NotZero test-code: | /* Already prepared */ text: | While the processor set specified by the ${../if/set-affinity:/params[1]/name} and ${../if/set-affinity:/params[2]/name} parameters contains at least one processor which is not storable in a processor set supported by the system. - name: Zero test-code: | CPU_ZERO( &ctx->cpuset_obj[ 1 ] ); text: | While the processor set specified by the ${../if/set-affinity:/params[1]/name} and ${../if/set-affinity:/params[2]/name} parameters contains no processor which is not storable in a processor set supported by the system. test-epilogue: null test-prologue: null - name: CPUSet states: - name: Valid test-code: | ctx->cpuset = &ctx->cpuset_obj[ 0 ]; text: | While the ${../if/set-affinity:/params[2]/name} parameter references an object of type ${/c/if/cpu_set_t:/name}. - name: 'Null' test-code: | ctx->cpuset = NULL; text: | While the ${../if/set-affinity:/params[2]/name} parameter is equal to ${/c/if/null:/name}. test-epilogue: null test-prologue: null - name: CanSetAffinity states: - name: 'Yes' test-code: | /* Validation done by CheckSetAffinity() for each interrupt vector */ text: | While setting the affinity for the interrupt vector specified by ${../if/set-affinity:/params[0]/name} parameter is supported. - name: 'No' test-code: | /* Validation done by CheckSetAffinity() for each interrupt vector */ text: | While setting the affinity for the interrupt vector specified by ${../if/set-affinity:/params[0]/name} parameter is not supported. test-epilogue: null test-prologue: null rationale: null references: [] requirement-type: functional skip-reasons: {} test-action: | rtems_status_code sc; if ( ctx->valid_vector && ctx->cpusetsize == sizeof( ctx->cpuset_obj[ 0 ] ) && ctx->cpuset == &ctx->cpuset_obj[ 0 ] && !CPU_EMPTY( &ctx->cpuset_obj[ 0 ] ) ) { for ( ctx->vector = 0; ctx->vector < BSP_INTERRUPT_VECTOR_COUNT; ++ctx->vector ) { rtems_interrupt_attributes attr; memset( &attr, 0, sizeof( attr ) ); sc = rtems_interrupt_get_attributes( ctx->vector, &attr ); if ( sc == RTEMS_INVALID_ID ) { continue; } T_rsc_success( sc ); CheckSetAffinity( ctx, &attr ); ctx->status = RTEMS_SUCCESSFUL; } } else { cpu_set_t set; cpu_set_t set2; CPU_ZERO( &set ); CPU_ZERO( &set2 ); CPU_SET( 0, &set ); CPU_SET( 0, &set2 ); if ( ctx->valid_vector ) { ctx->vector = ctx->some_vector; sc = rtems_interrupt_get_affinity( ctx->vector, sizeof( set ), &set ); T_true( sc == RTEMS_SUCCESSFUL || sc == RTEMS_UNSATISFIED ); } else { ctx->vector = BSP_INTERRUPT_VECTOR_COUNT; } if ( !CPU_EMPTY( &ctx->cpuset_obj[ 0 ] ) ) { CPU_COPY( &set, &ctx->cpuset_obj[ 0 ] ); } ctx->status = rtems_interrupt_set_affinity( ctx->vector, ctx->cpusetsize, ctx->cpuset ); if ( ctx->valid_vector ) { sc = rtems_interrupt_get_affinity( ctx->vector, sizeof( set2 ), &set2 ); T_true( sc == RTEMS_SUCCESSFUL || sc == RTEMS_UNSATISFIED ); T_eq_int( CPU_CMP( &set, &set2 ), 0 ); } } test-brief: null test-cleanup: null test-context: - brief: | This member contains the current vector number. description: null member: | rtems_vector_number vector - brief: | This member contains some valid vector number. description: null member: | rtems_vector_number some_vector - brief: | This member provides the object referenced by the ${../if/set-affinity:/params[2]/name} parameter. description: null member: | cpu_set_t cpuset_obj[ 2 ] - brief: | This member contains the return value of the ${../if/set-affinity:/name} call. description: null member: | rtems_status_code status - brief: | If this member is true, then the ${../if/set-affinity:/params[0]/name} parameter shall be valid. description: null member: | bool valid_vector - brief: | This member specifies if the ${../if/set-affinity:/params[1]/name} parameter value. description: null member: | size_t cpusetsize - brief: | This member specifies if the ${../if/set-affinity:/params[2]/name} parameter value. description: null member: | cpu_set_t *cpuset test-context-support: null test-description: null test-header: null test-includes: - rtems/irq-extension.h - bsp/irq-generic.h test-local-includes: - tx-support.h test-prepare: | CPU_FILL_S( sizeof( ctx->cpuset_obj ), &ctx->cpuset_obj[ 0 ] ); test-setup: brief: null code: | ctx->some_vector = GetValidInterruptVectorNumber( NULL ); description: null test-stop: null test-support: | typedef ${.:/test-context-type} Context; static void CheckSetAffinity( Context *ctx, const rtems_interrupt_attributes *attr ) { rtems_status_code sc; cpu_set_t set; cpu_set_t set2; CPU_ZERO( &set ); if ( attr->can_get_affinity ) { sc = rtems_interrupt_get_affinity( ctx->vector, sizeof( set ), &set ); T_rsc_success( sc ); } else { CPU_SET( 0, &set ); } CPU_COPY( &set, &ctx->cpuset_obj[ 0 ] ); sc = rtems_interrupt_set_affinity( ctx->vector, ctx->cpusetsize, ctx->cpuset ); if ( attr->can_set_affinity ) { T_rsc_success( sc ); } else { T_rsc( sc, RTEMS_UNSATISFIED ); } if ( attr->can_get_affinity ) { CPU_FILL( &set2 ); sc = rtems_interrupt_get_affinity( ctx->vector, sizeof( set2 ), &set2 ); T_rsc_success( sc ); T_eq_int( CPU_CMP( &set, &set2 ), 0 ); } } test-target: testsuites/validation/tc-intr-set-affinity.c test-teardown: null text: ${.:text-template} transition-map: - enabled-by: true post-conditions: Status: - if: pre-conditions: CPUSetSize: Askew then: InvNum - if: pre-conditions: CPUSetOnline: Empty then: InvNum - if: pre-conditions: CanSetAffinity: 'No' then: Unsat - else: Ok SetAffinity: - if: post-conditions: Status: Ok then: Set - else: Nop pre-conditions: Vector: - Valid CPUSetSize: - Askew - Normal CPUSetOnline: all CPUSetHuge: N/A CPUSet: - Valid CanSetAffinity: all - enabled-by: true post-conditions: Status: - if: pre-conditions: CPUSetOnline: Empty then: InvNum - if: pre-conditions: CanSetAffinity: 'No' then: Unsat - else: Ok SetAffinity: - if: post-conditions: Status: Ok then: Set - else: Nop pre-conditions: Vector: - Valid CPUSetSize: - Huge CPUSetOnline: all CPUSetHuge: all CPUSet: - Valid CanSetAffinity: all - enabled-by: true post-conditions: Status: InvAddr SetAffinity: Nop pre-conditions: Vector: - Valid CPUSetSize: all CPUSetOnline: N/A CPUSetHuge: N/A CPUSet: - 'Null' CanSetAffinity: all - enabled-by: true post-conditions: Status: InvId SetAffinity: Nop pre-conditions: Vector: - Invalid CPUSetSize: - Askew - Normal CPUSetOnline: N/A CPUSetHuge: N/A CPUSet: - Valid CanSetAffinity: N/A - enabled-by: true post-conditions: Status: InvId SetAffinity: Nop pre-conditions: Vector: - Invalid CPUSetSize: - Huge CPUSetOnline: N/A CPUSetHuge: all CPUSet: - Valid CanSetAffinity: N/A - enabled-by: true post-conditions: Status: InvAddr SetAffinity: Nop pre-conditions: Vector: - Invalid CPUSetSize: all CPUSetOnline: N/A CPUSetHuge: N/A CPUSet: - 'Null' CanSetAffinity: N/A type: requirement