summaryrefslogblamecommitdiffstats
path: root/spec/rtems/intr/req/get-affinity.yml
blob: 08e8acb6b877410914fa20674c1b73e4ba928a73 (plain) (tree)





















































                                                                              


















                                                                               



































                                                                               
                                       







                                                                               
                                       







                                                                               
                                                





                     
                                    

































                                                                             
                                  




















                                                                
                       






                                               


                                                   
                                                             






                                               




                                                  
            
                                       

     
                                                                 

                              


















                                                     
                              












































                                                                            
                                          






                                          
                               
 


                                                   
                                   
                                                               
            
                                                               
     






                                      
                                     
 

                                   
                                                                    

                                     
                                                                   
     

                              










































                                                         
                   





                   
                       














                       
                      











                   
                   










                   
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: Partial
    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
      subset of the processor affinity set which fits into the object 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: Zero
    test-code: |
      /*
       * Validation done by CheckGetAffinity() for each interrupt vector and in
       * the action code.
       */
    text: |
      The value of the object referenced by the
      ${../if/get-affinity:/params[2]/name} parameter shall be set to zero.
  - 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[ 2 ];

    if ( ctx->valid_vector ) {
      ctx->vector = ctx->some_vector;
    } else {
      ctx->vector = BSP_INTERRUPT_VECTOR_COUNT;
    }

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Warray-bounds"

    CPU_FILL_S( sizeof( ctx->cpuset_obj ), ctx->cpuset_obj );

    ctx->status = rtems_interrupt_get_affinity(
      ctx->vector,
      ctx->cpusetsize,
      ctx->cpuset
    );

    if (
      ctx->cpuset == NULL ||
      ctx->cpusetsize != sizeof( ctx->cpuset_obj )
    ) {
      CPU_FILL_S( sizeof( set ), set );
    } else {
      CPU_ZERO_S( sizeof( set ), set );
    }

    T_true( CPU_EQUAL_S( sizeof( set ), ctx->cpuset_obj, set ) );

    #pragma GCC diagnostic pop
  }
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[ 2 ];
- 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 ${.:/test-context-type} Context;

  static void CheckGetAffinity(
    Context                          *ctx,
    const rtems_interrupt_attributes *attr
  )
  {
    rtems_status_code sc;
    cpu_set_t         set[ 2 ];

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Warray-bounds"

    if ( attr->can_get_affinity ) {
      CPU_ZERO_S( sizeof( ctx->cpuset_obj ), ctx->cpuset_obj );
    } else {
      CPU_FILL_S( sizeof( ctx->cpuset_obj ), ctx->cpuset_obj );
    }

    sc = rtems_interrupt_get_affinity(
      ctx->vector,
      ctx->cpusetsize,
      ctx->cpuset
    );

    CPU_ZERO_S( sizeof( set ), set );

    if ( attr->can_get_affinity ) {
      T_rsc_success( sc );
      T_false( CPU_EQUAL_S( sizeof( set ), ctx->cpuset_obj, set ) );
    } else {
      T_rsc( sc, RTEMS_UNSATISFIED );
      T_true( CPU_EQUAL_S( sizeof( set ), ctx->cpuset_obj, set ) );
    }

    #pragma GCC diagnostic pop
  }
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: Zero
  pre-conditions:
    Vector:
    - Invalid
    CPUSetSize: all
    CPUSet:
    - Valid
    CanGetAffinity: N/A
- 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: Partial
  pre-conditions:
    Vector:
    - Valid
    CPUSetSize:
    - TooSmall
    CPUSet:
    - Valid
    CanGetAffinity:
    - 'Yes'
- enabled-by: true
  post-conditions:
    Status: Unsat
    CPUSetObj: Zero
  pre-conditions:
    Vector:
    - Valid
    CPUSetSize:
    - Valid
    - TooSmall
    CPUSet:
    - Valid
    CanGetAffinity:
    - 'No'
type: requirement