text: /*
   * FreeRTOS memory safety proofs with CBMC.
   * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
   *
   * Permission is hereby granted, free of charge, to any person
   * obtaining a copy of this software and associated documentation
   * files (the "Software"), to deal in the Software without
   * restriction, including without limitation the rights to use, copy,
   * modify, merge, publish, distribute, sublicense, and/or sell copies
   * of the Software, and to permit persons to whom the Software is
   * furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be
   * included in all copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
   * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
   * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
   * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
   * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
   * SOFTWARE.
   *
   * http://aws.amazon.com/freertos
   * http://www.FreeRTOS.org
   */
  
  #include "cbmc.h"
  
  /*
   * We allocate a TCB and set some members to basic values
   */
  TaskHandle_t xUnconstrainedTCB( UBaseType_t uxPriority )
  {
      TCB_t * pxTCB = pvPortMalloc( sizeof( TCB_t ) );
  
      if( pxTCB == NULL )
      {
          return NULL;
      }
  
      /* uxPriority is set to a specific priority */
      pxTCB->uxPriority = uxPriority;
  
      vListInitialiseItem( &( pxTCB->xStateListItem ) );
      vListInitialiseItem( &( pxTCB->xEventListItem ) );
  
      listSET_LIST_ITEM_OWNER( &( pxTCB->xStateListItem ), pxTCB );
      listSET_LIST_ITEM_OWNER( &( pxTCB->xEventListItem ), pxTCB );
  
      if( nondet_bool() )
      {
          listSET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ), pxTCB->uxPriority );
      }
      else
      {
          listSET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ), portMAX_DELAY );
      }
  
      if( nondet_bool() )
      {
          listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority );
      }
      else
      {
          listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), portMAX_DELAY );
      }
  
      return pxTCB;
  }
  
  /*
   * We set the values of relevant global
   * variables to nondeterministic values
   */
  void vSetGlobalVariables( void )
  {
      uxSchedulerSuspended = nondet_ubasetype();
  }
  
  /*
   * We initialize and fill with one item each ready tasks list
   * so that the assertion on line 175 (tasks.c) does not fail
   */
  BaseType_t xPrepareTaskLists( void )
  {
      TCB_t * pxTCB = NULL;
  
      __CPROVER_assert_zero_allocation();
  
      prvInitialiseTaskLists();
  
      for( int i = 0; i < configMAX_PRIORITIES; ++i )
      {
          pxTCB = xUnconstrainedTCB( i );
  
          if( pxTCB == NULL )
          {
              return pdFAIL;
          }
  
          vListInsert( &pxReadyTasksLists[ pxTCB->uxPriority ], &( pxTCB->xStateListItem ) );
      }
  
      listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &pxReadyTasksLists[ configMAX_PRIORITIES - 1 ] );
  
      return pdPASS;
  }
  