diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-07-05 19:37:38 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-07-12 14:53:01 +0200 |
commit | 1f509ab9dc86177e987442ed41e5d83d2b351dd7 (patch) | |
tree | 21d27aee35c6b1bfae3273470fad249a266650fd | |
parent | spec: Specify rtems_interrupt_cause_on() (diff) | |
download | rtems-central-1f509ab9dc86177e987442ed41e5d83d2b351dd7.tar.bz2 |
spec: Specify rtems_interrupt_get_affinity()
-rw-r--r-- | spec/rtems/intr/req/get-affinity.yml | 366 | ||||
-rw-r--r-- | spec/rtems/intr/req/get-attributes.yml | 17 |
2 files changed, 383 insertions, 0 deletions
diff --git a/spec/rtems/intr/req/get-affinity.yml b/spec/rtems/intr/req/get-affinity.yml new file mode 100644 index 00000000..82665e5d --- /dev/null +++ b/spec/rtems/intr/req/get-affinity.yml @@ -0,0 +1,366 @@ +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 +functional-type: action +links: +- role: interface-function + uid: ../if/get-affinity +post-conditions: +- name: Status + states: + - name: Ok + test-code: | + /* Validation done by CheckGetAffinity() for each interrupt vector */ + text: | + The return status of ${../if/get-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/get-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/get-affinity:/name} shall be + ${../../status/if/invalid-id:/name}. + - name: InvSize + test-code: | + T_rsc( ctx->status, RTEMS_INVALID_SIZE ); + text: | + The return status of ${../if/get-affinity:/name} shall be + ${../../status/if/invalid-size:/name}. + - name: Unsat + test-code: | + /* Validation done by CheckGetAffinity() for each interrupt vector */ + text: | + The return status of ${../if/get-affinity:/name} shall be + ${../../status/if/unsatisfied:/name}. + test-epilogue: null + test-prologue: null +- name: CPUSetObj + states: + - name: Set + test-code: | + /* Validation done by CheckGetAffinity() for each interrupt vector */ + text: | + The value of the object referenced by the + ${../if/get-affinity:/params[2]/name} parameter shall be set to the + processor affinity set of the interrupt specified by the + ${../if/get-affinity:/params[0]/name} parameter at some point during the + call after the return of the ${../if/get-affinity:/name} call. + - name: Nop + test-code: | + /* + * Validation done by CheckGetAffinity() for each interrupt vector and in + * the action code. + */ + text: | + Objects referenced by the ${../if/get-affinity:/params[2]/name} + parameter in past calls to ${../if/get-affinity:/name} shall + not be accessed by the ${../if/get-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/get-affinity:/params[0]/name} parameter is + associated with an interrupt vector. + - name: Invalid + test-code: | + ctx->valid_vector = false; + text: | + While the ${../if/get-affinity:/params[0]/name} parameter is not + associated with an interrupt vector. + test-epilogue: null + test-prologue: null +- name: CPUSetSize + states: + - name: Valid + test-code: | + ctx->cpusetsize = sizeof( ctx->cpuset_obj ); + text: | + While the ${../if/get-affinity:/params[1]/name} parameter is an integral + multiple of the size of long, + while the ${../if/get-affinity:/params[1]/name} parameter specifies a + processor set which is large enough to contain the processor affinity set + of the interrupt specified by ${../if/get-affinity:/params[0]/name}. + - name: TooSmall + test-code: | + ctx->cpusetsize = 0; + text: | + While the ${../if/get-affinity:/params[1]/name} parameter is an integral + multiple of the size of long, + while the ${../if/get-affinity:/params[1]/name} parameter specifies a + processor set which is not large enough to contain the processor affinity + set of the interrupt specified by ${../if/get-affinity:/params[0]/name}. + - name: Askew + test-code: | + ctx->cpusetsize = SIZE_MAX; + text: | + While the ${../if/get-affinity:/params[1]/name} parameter is not an + integral multiple of the size of long. + test-epilogue: null + test-prologue: null +- name: CPUSet + states: + - name: Valid + test-code: | + ctx->cpuset = &ctx->cpuset_obj; + text: | + While the ${../if/get-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/get-affinity:/params[2]/name} parameter is equal to + ${/c/if/null:/name}. + test-epilogue: null + test-prologue: null +- name: CanGetAffinity + states: + - name: 'Yes' + test-code: | + /* Validation done by CheckGetAffinity() for each interrupt vector */ + text: | + While getting the affinity for the interrupt vector specified by + ${../if/get-affinity:/params[0]/name} parameter is supported. + - name: 'No' + test-code: | + /* Validation done by CheckGetAffinity() for each interrupt vector */ + text: | + While getting the affinity for the interrupt vector specified by + ${../if/get-affinity:/params[0]/name} parameter is not supported. + test-epilogue: null + test-prologue: null +rationale: null +references: [] +requirement-type: functional +skip-reasons: {} +test-action: | + if ( + ctx->valid_vector && ctx->cpusetsize == sizeof( ctx->cpuset_obj ) && + ctx->cpuset == &ctx->cpuset_obj + ) { + for ( + ctx->vector = 0; + ctx->vector < BSP_INTERRUPT_VECTOR_COUNT; + ++ctx->vector + ) { + rtems_status_code sc; + 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 ); + + CheckGetAffinity( ctx, &attr ); + } + } else { + cpu_set_t set; + + if ( ctx->valid_vector ) { + ctx->vector = ctx->some_vector; + } else { + ctx->vector = BSP_INTERRUPT_VECTOR_COUNT; + } + + CPU_ZERO( &ctx->cpuset_obj ); + + ctx->status = rtems_interrupt_get_affinity( + ctx->vector, + ctx->cpusetsize, + ctx->cpuset + ); + + CPU_ZERO( &set ); + T_eq_int( CPU_CMP( &ctx->cpuset_obj, &set ), 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/get-affinity:/params[2]/name} parameter. + description: null + member: | + cpu_set_t cpuset_obj +- brief: | + This member contains the return value of the ${../if/get-affinity:/name} + call. + description: null + member: | + rtems_status_code status +- brief: | + If this member is true, then the ${../if/get-affinity:/params[0]/name} + parameter shall be valid. + description: null + member: | + bool valid_vector +- brief: | + This member specifies if the ${../if/get-affinity:/params[1]/name} + parameter value. + description: null + member: | + size_t cpusetsize +- brief: | + This member specifies if the ${../if/get-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 +- string.h +test-local-includes: +- tx-support.h +test-prepare: null +test-setup: + brief: null + code: | + rtems_interrupt_attributes required; + + memset( &required, 0, sizeof( required ) ); + required.can_get_affinity = true; + ctx->some_vector = GetValidInterruptVectorNumber( &required ); + description: null +test-stop: null +test-support: | + typedef RtemsIntrReqGetAffinity_Context Context; + + static void CheckGetAffinity( + Context *ctx, + const rtems_interrupt_attributes *attr + ) + { + rtems_status_code sc; + + sc = rtems_interrupt_get_affinity( + ctx->vector, + ctx->cpusetsize, + ctx->cpuset + ); + + if ( attr->can_get_affinity ) { + T_rsc_success( sc ); + } else { + T_rsc( sc, RTEMS_UNSATISFIED ); + } + } +test-target: testsuites/validation/tc-intr-get-affinity.c +test-teardown: null +text: ${.:text-template} +transition-map: +- enabled-by: true + post-conditions: + Status: Ok + CPUSetObj: Set + pre-conditions: + Vector: + - Valid + CPUSetSize: + - Valid + CPUSet: + - Valid + CanGetAffinity: + - 'Yes' +- enabled-by: true + post-conditions: + Status: InvAddr + CPUSetObj: Nop + pre-conditions: + Vector: + - Valid + CPUSetSize: all + CPUSet: + - 'Null' + CanGetAffinity: all +- enabled-by: true + post-conditions: + Status: InvAddr + CPUSetObj: Nop + pre-conditions: + Vector: + - Invalid + CPUSetSize: all + CPUSet: + - 'Null' + CanGetAffinity: N/A +- enabled-by: true + post-conditions: + Status: InvId + CPUSetObj: Nop + pre-conditions: + Vector: + - Invalid + CPUSetSize: all + CPUSet: + - Valid + CanGetAffinity: all +- enabled-by: true + post-conditions: + Status: InvSize + CPUSetObj: Nop + pre-conditions: + Vector: + - Valid + CPUSetSize: + - Askew + CPUSet: + - Valid + CanGetAffinity: all +- enabled-by: true + post-conditions: + Status: InvSize + CPUSetObj: Nop + pre-conditions: + Vector: + - Valid + CPUSetSize: + - TooSmall + CPUSet: + - Valid + CanGetAffinity: + - 'Yes' +- enabled-by: true + post-conditions: + Status: Unsat + CPUSetObj: Nop + pre-conditions: + Vector: + - Valid + CPUSetSize: + - Valid + - TooSmall + CPUSet: + - Valid + CanGetAffinity: + - 'No' +type: requirement diff --git a/spec/rtems/intr/req/get-attributes.yml b/spec/rtems/intr/req/get-attributes.yml index 50e6070c..ca19c369 100644 --- a/spec/rtems/intr/req/get-attributes.yml +++ b/spec/rtems/intr/req/get-attributes.yml @@ -104,6 +104,7 @@ test-action: | for ( vector = 0; vector < BSP_INTERRUPT_VECTOR_COUNT; ++vector ) { rtems_status_code sc; + memset( &ctx->attributes_obj, 0xff, sizeof( ctx->attributes_obj ) ); sc = rtems_interrupt_get_attributes( vector, ctx->attributes ); if ( sc == RTEMS_INVALID_ID ) { @@ -112,6 +113,22 @@ test-action: | T_rsc_success( sc ); ctx->status = sc; + + if ( ctx->attributes_obj.always_enabled ) { + T_true( ctx->attributes_obj.can_enable ); + T_true( ctx->attributes_obj.maybe_enable ); + T_false( ctx->attributes_obj.can_disable ); + } + + if ( ctx->attributes_obj.can_enable ) { + T_true( ctx->attributes_obj.maybe_enable ); + } + + if ( ctx->attributes_obj.can_disable ) { + T_true( + ctx->attributes_obj.can_enable || ctx->attributes_obj.maybe_enable + ); + } } } else { if ( ctx->valid_vector ) { |