forked from Imagelibrary/rtems
1629 lines
58 KiB
C
1629 lines
58 KiB
C
/* SPDX-License-Identifier: BSD-2-Clause */
|
|
|
|
/**
|
|
* @file
|
|
*
|
|
* @ingroup ScoreSchedSmpEdfReqSetAffinity
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2021 embedded brains GmbH & Co. KG
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
/*
|
|
* This file is part of the RTEMS quality process and was automatically
|
|
* generated. If you find something that needs to be fixed or
|
|
* worded better please post a report or patch to an RTEMS mailing list
|
|
* or raise a bug report:
|
|
*
|
|
* https://www.rtems.org/bugs.html
|
|
*
|
|
* For information on updating and regenerating please refer to the How-To
|
|
* section in the Software Requirements Engineering chapter of the
|
|
* RTEMS Software Engineering manual. The manual is provided as a part of
|
|
* a release. For development sources please refer to the online
|
|
* documentation at:
|
|
*
|
|
* https://docs.rtems.org
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
#include <rtems.h>
|
|
#include <rtems/score/percpu.h>
|
|
#include <rtems/score/threaddispatch.h>
|
|
#include <rtems/score/threadimpl.h>
|
|
|
|
#include "tx-support.h"
|
|
#include "tx-thread-queue.h"
|
|
|
|
#include <rtems/test.h>
|
|
|
|
/**
|
|
* @defgroup ScoreSchedSmpEdfReqSetAffinity \
|
|
* spec:/score/sched/smp/edf/req/set-affinity
|
|
*
|
|
* @ingroup TestsuitesValidationSmpOnly0
|
|
*
|
|
* @{
|
|
*/
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Before_All,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Before_X,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Before_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Pre_Before;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_After_All,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_After_X,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_After_Y,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_After_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Pre_After;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Priority_High,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Priority_Low,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Priority_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Pre_Priority;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_State_Ready,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_State_Blocked,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_State_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Pre_State;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Sticky_Yes,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Sticky_No,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Sticky_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Pre_Sticky;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Pinned_Yes,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Pinned_No,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Pinned_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Pre_Pinned;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaPriority_High,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaPriority_Low,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaPriority_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaPriority;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaAffinity_All,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaAffinity_X,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaAffinity_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaAffinity;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaIdle_Yes,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaIdle_No,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaIdle_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaIdle;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaPriority_High,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaPriority_Low,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaPriority_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Pre_BetaPriority;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaAffinity_All,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaAffinity_Y,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaAffinity_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Pre_BetaAffinity;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaIdle_Yes,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaIdle_No,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaIdle_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Pre_BetaIdle;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Task,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_TaskIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Alpha,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_AlphaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Beta,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_BetaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Post_X;
|
|
|
|
typedef enum {
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Task,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_TaskIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Alpha,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_AlphaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Beta,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_BetaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_NA
|
|
} ScoreSchedSmpEdfReqSetAffinity_Post_Y;
|
|
|
|
typedef struct {
|
|
uint32_t Skip : 1;
|
|
uint32_t Pre_Before_NA : 1;
|
|
uint32_t Pre_After_NA : 1;
|
|
uint32_t Pre_Priority_NA : 1;
|
|
uint32_t Pre_State_NA : 1;
|
|
uint32_t Pre_Sticky_NA : 1;
|
|
uint32_t Pre_Pinned_NA : 1;
|
|
uint32_t Pre_AlphaPriority_NA : 1;
|
|
uint32_t Pre_AlphaAffinity_NA : 1;
|
|
uint32_t Pre_AlphaIdle_NA : 1;
|
|
uint32_t Pre_BetaPriority_NA : 1;
|
|
uint32_t Pre_BetaAffinity_NA : 1;
|
|
uint32_t Pre_BetaIdle_NA : 1;
|
|
uint32_t Post_X : 3;
|
|
uint32_t Post_Y : 3;
|
|
} ScoreSchedSmpEdfReqSetAffinity_Entry;
|
|
|
|
/**
|
|
* @brief Test context for spec:/score/sched/smp/edf/req/set-affinity test
|
|
* case.
|
|
*/
|
|
typedef struct {
|
|
/**
|
|
* @brief This member contains the thread queue test context.
|
|
*/
|
|
TQContext tq_ctx;
|
|
|
|
/**
|
|
* @brief This member specifies the task affinity before changing the
|
|
* affinity.
|
|
*/
|
|
cpu_set_t task_affinity_before;
|
|
|
|
/**
|
|
* @brief This member specifies the task affinity after changing the
|
|
* affinity.
|
|
*/
|
|
cpu_set_t task_affinity_after;
|
|
|
|
/**
|
|
* @brief This member specifies the priority of the task.
|
|
*/
|
|
rtems_task_priority task_priority;
|
|
|
|
/**
|
|
* @brief If this member is true, then the task state shall be ready.
|
|
*/
|
|
bool task_ready;
|
|
|
|
/**
|
|
* @brief If this member is true, then the task shall have obtained a sticky
|
|
* mutex.
|
|
*/
|
|
bool task_sticky;
|
|
|
|
/**
|
|
* @brief If this member is true, then the task shall be pinned.
|
|
*/
|
|
bool task_pinned;
|
|
|
|
/**
|
|
* @brief This member specifies the priority of the alpha task.
|
|
*/
|
|
rtems_task_priority alpha_priority;
|
|
|
|
/**
|
|
* @brief This member specifies the affinity of the alpha task.
|
|
*/
|
|
cpu_set_t alpha_affinity;
|
|
|
|
/**
|
|
* @brief If this member is true, then an idle task shall execute on behalf
|
|
* of the alpha task.
|
|
*/
|
|
bool alpha_idle;
|
|
|
|
/**
|
|
* @brief This member specifies the priority of the beta task.
|
|
*/
|
|
rtems_task_priority beta_priority;
|
|
|
|
/**
|
|
* @brief This member specifies the affinity of the beta task.
|
|
*/
|
|
cpu_set_t beta_affinity;
|
|
|
|
/**
|
|
* @brief If this member is true, then an idle task shall execute on behalf
|
|
* of the beta task.
|
|
*/
|
|
bool beta_idle;
|
|
|
|
struct {
|
|
/**
|
|
* @brief This member defines the pre-condition states for the next action.
|
|
*/
|
|
size_t pcs[ 12 ];
|
|
|
|
/**
|
|
* @brief If this member is true, then the test action loop is executed.
|
|
*/
|
|
bool in_action_loop;
|
|
|
|
/**
|
|
* @brief This member contains the next transition map index.
|
|
*/
|
|
size_t index;
|
|
|
|
/**
|
|
* @brief This member contains the current transition map entry.
|
|
*/
|
|
ScoreSchedSmpEdfReqSetAffinity_Entry entry;
|
|
|
|
/**
|
|
* @brief If this member is true, then the current transition variant
|
|
* should be skipped.
|
|
*/
|
|
bool skip;
|
|
} Map;
|
|
} ScoreSchedSmpEdfReqSetAffinity_Context;
|
|
|
|
static ScoreSchedSmpEdfReqSetAffinity_Context
|
|
ScoreSchedSmpEdfReqSetAffinity_Instance;
|
|
|
|
static const char * const ScoreSchedSmpEdfReqSetAffinity_PreDesc_Before[] = {
|
|
"All",
|
|
"X",
|
|
"NA"
|
|
};
|
|
|
|
static const char * const ScoreSchedSmpEdfReqSetAffinity_PreDesc_After[] = {
|
|
"All",
|
|
"X",
|
|
"Y",
|
|
"NA"
|
|
};
|
|
|
|
static const char * const ScoreSchedSmpEdfReqSetAffinity_PreDesc_Priority[] = {
|
|
"High",
|
|
"Low",
|
|
"NA"
|
|
};
|
|
|
|
static const char * const ScoreSchedSmpEdfReqSetAffinity_PreDesc_State[] = {
|
|
"Ready",
|
|
"Blocked",
|
|
"NA"
|
|
};
|
|
|
|
static const char * const ScoreSchedSmpEdfReqSetAffinity_PreDesc_Sticky[] = {
|
|
"Yes",
|
|
"No",
|
|
"NA"
|
|
};
|
|
|
|
static const char * const ScoreSchedSmpEdfReqSetAffinity_PreDesc_Pinned[] = {
|
|
"Yes",
|
|
"No",
|
|
"NA"
|
|
};
|
|
|
|
static const char * const ScoreSchedSmpEdfReqSetAffinity_PreDesc_AlphaPriority[] = {
|
|
"High",
|
|
"Low",
|
|
"NA"
|
|
};
|
|
|
|
static const char * const ScoreSchedSmpEdfReqSetAffinity_PreDesc_AlphaAffinity[] = {
|
|
"All",
|
|
"X",
|
|
"NA"
|
|
};
|
|
|
|
static const char * const ScoreSchedSmpEdfReqSetAffinity_PreDesc_AlphaIdle[] = {
|
|
"Yes",
|
|
"No",
|
|
"NA"
|
|
};
|
|
|
|
static const char * const ScoreSchedSmpEdfReqSetAffinity_PreDesc_BetaPriority[] = {
|
|
"High",
|
|
"Low",
|
|
"NA"
|
|
};
|
|
|
|
static const char * const ScoreSchedSmpEdfReqSetAffinity_PreDesc_BetaAffinity[] = {
|
|
"All",
|
|
"Y",
|
|
"NA"
|
|
};
|
|
|
|
static const char * const ScoreSchedSmpEdfReqSetAffinity_PreDesc_BetaIdle[] = {
|
|
"Yes",
|
|
"No",
|
|
"NA"
|
|
};
|
|
|
|
static const char * const * const ScoreSchedSmpEdfReqSetAffinity_PreDesc[] = {
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc_Before,
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc_After,
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc_Priority,
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc_State,
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc_Sticky,
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc_Pinned,
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc_AlphaPriority,
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc_AlphaAffinity,
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc_AlphaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc_BetaPriority,
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc_BetaAffinity,
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc_BetaIdle,
|
|
NULL
|
|
};
|
|
|
|
#define TASK TQ_BLOCKER_C
|
|
|
|
#define ALPHA TQ_BLOCKER_A
|
|
|
|
#define BETA TQ_BLOCKER_B
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Pre_Before_Prepare(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Before state
|
|
)
|
|
{
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_Before_All: {
|
|
/*
|
|
* While task ``T`` is affine to all processors of its home scheduler
|
|
* before the new thread to processor affinity is set.
|
|
*/
|
|
CPU_FILL( &ctx->task_affinity_before );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_Before_X: {
|
|
/*
|
|
* While task ``T`` is affine to processor ``X`` before the new thread to
|
|
* processor affinity is set.
|
|
*/
|
|
CPU_ZERO( &ctx->task_affinity_before );
|
|
CPU_SET( 0, &ctx->task_affinity_before );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_Before_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Pre_After_Prepare(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_After state
|
|
)
|
|
{
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_After_All: {
|
|
/*
|
|
* While task ``T`` is set to be affine to all processors of its home
|
|
* scheduler.
|
|
*/
|
|
CPU_FILL( &ctx->task_affinity_after );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_After_X: {
|
|
/*
|
|
* While task ``T`` is set to be affine to processor ``X``.
|
|
*/
|
|
CPU_ZERO( &ctx->task_affinity_after );
|
|
CPU_SET( 0, &ctx->task_affinity_after );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_After_Y: {
|
|
/*
|
|
* While task ``T`` is set to be affine to processor ``Y``.
|
|
*/
|
|
CPU_ZERO( &ctx->task_affinity_after );
|
|
CPU_SET( 1, &ctx->task_affinity_after );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_After_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Pre_Priority_Prepare(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Priority state
|
|
)
|
|
{
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_Priority_High: {
|
|
/*
|
|
* While task ``T`` has a high priority.
|
|
*/
|
|
ctx->task_priority = PRIO_HIGH;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_Priority_Low: {
|
|
/*
|
|
* While task ``T`` has a low priority.
|
|
*/
|
|
ctx->task_priority = PRIO_NORMAL;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_Priority_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Pre_State_Prepare(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_State state
|
|
)
|
|
{
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_State_Ready: {
|
|
/*
|
|
* While task ``T`` is ready.
|
|
*/
|
|
ctx->task_ready = true;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_State_Blocked: {
|
|
/*
|
|
* While task ``T`` is blocked.
|
|
*/
|
|
ctx->task_ready = false;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_State_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Pre_Sticky_Prepare(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Sticky state
|
|
)
|
|
{
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_Sticky_Yes: {
|
|
/*
|
|
* While task ``T`` is sticky.
|
|
*/
|
|
ctx->task_sticky = true;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_Sticky_No: {
|
|
/*
|
|
* While task ``T`` is not sticky.
|
|
*/
|
|
ctx->task_sticky = false;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_Sticky_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Pre_Pinned_Prepare(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Pinned state
|
|
)
|
|
{
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_Pinned_Yes: {
|
|
/*
|
|
* While task ``T`` is pinned to a processor.
|
|
*/
|
|
ctx->task_pinned = true;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_Pinned_No: {
|
|
/*
|
|
* While task ``T`` is not pinned to a processor.
|
|
*/
|
|
ctx->task_pinned = false;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_Pinned_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaPriority_Prepare(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaPriority state
|
|
)
|
|
{
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaPriority_High: {
|
|
/*
|
|
* While task ``A`` has a high priority.
|
|
*/
|
|
ctx->alpha_priority = PRIO_HIGH;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaPriority_Low: {
|
|
/*
|
|
* While task ``A`` has a low priority.
|
|
*/
|
|
ctx->alpha_priority = PRIO_NORMAL;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaPriority_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaAffinity_Prepare(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaAffinity state
|
|
)
|
|
{
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaAffinity_All: {
|
|
/*
|
|
* While task ``A`` is affine to all processors of its home scheduler.
|
|
*/
|
|
CPU_FILL( &ctx->alpha_affinity );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaAffinity_X: {
|
|
/*
|
|
* While task ``A`` is affine to processor ``X``.
|
|
*/
|
|
CPU_ZERO( &ctx->alpha_affinity );
|
|
CPU_SET( 0, &ctx->alpha_affinity );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaAffinity_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaIdle_Prepare(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaIdle state
|
|
)
|
|
{
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaIdle_Yes: {
|
|
/*
|
|
* While task ``A`` is sticky, while task ``A`` is blocked.
|
|
*/
|
|
ctx->alpha_idle = true;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaIdle_No: {
|
|
/*
|
|
* While task ``A`` is not sticky.
|
|
*/
|
|
ctx->alpha_idle = false;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaIdle_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Pre_BetaPriority_Prepare(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaPriority state
|
|
)
|
|
{
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_BetaPriority_High: {
|
|
/*
|
|
* While task ``B`` has a high priority.
|
|
*/
|
|
ctx->beta_priority = PRIO_HIGH;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_BetaPriority_Low: {
|
|
/*
|
|
* While task ``B`` has a low priority.
|
|
*/
|
|
ctx->beta_priority = PRIO_NORMAL;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_BetaPriority_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Pre_BetaAffinity_Prepare(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaAffinity state
|
|
)
|
|
{
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_BetaAffinity_All: {
|
|
/*
|
|
* While task ``B`` is affine to all processors of its home scheduler.
|
|
*/
|
|
CPU_FILL( &ctx->beta_affinity );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_BetaAffinity_Y: {
|
|
/*
|
|
* While task ``B`` is affine to processor ``Y``.
|
|
*/
|
|
CPU_ZERO( &ctx->beta_affinity );
|
|
CPU_SET( 1, &ctx->beta_affinity );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_BetaAffinity_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Pre_BetaIdle_Prepare(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaIdle state
|
|
)
|
|
{
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_BetaIdle_Yes: {
|
|
/*
|
|
* While task ``B`` is sticky, while task ``B`` is blocked.
|
|
*/
|
|
ctx->beta_idle = true;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_BetaIdle_No: {
|
|
/*
|
|
* While task ``B`` is not sticky,
|
|
*/
|
|
ctx->beta_idle = false;
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Pre_BetaIdle_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Post_X_Check(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X state
|
|
)
|
|
{
|
|
const Per_CPU_Control *cpu;
|
|
const Thread_Control *scheduled;
|
|
const Scheduler_Node *scheduler_node;
|
|
|
|
cpu = _Per_CPU_Get_by_index( 0 );
|
|
scheduled = cpu->heir;
|
|
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_X_Task: {
|
|
/*
|
|
* The task ``T`` shall be scheduled on processor ``X``.
|
|
*/
|
|
T_eq_ptr( scheduled, ctx->tq_ctx.worker_tcb[ TASK ] );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_X_TaskIdle: {
|
|
/*
|
|
* An idle task on behalf of task ``T`` shall be scheduled on processor
|
|
* ``X``.
|
|
*/
|
|
T_true( scheduled->is_idle );
|
|
scheduler_node = _Thread_Scheduler_get_home_node(
|
|
ctx->tq_ctx.worker_tcb[ TASK ]
|
|
);
|
|
T_eq_ptr( scheduler_node->user, scheduled );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_X_Alpha: {
|
|
/*
|
|
* The task ``A`` shall be scheduled on processor ``X``.
|
|
*/
|
|
T_eq_ptr( scheduled, ctx->tq_ctx.worker_tcb[ ALPHA ] );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_X_AlphaIdle: {
|
|
/*
|
|
* An idle task on behalf of task ``A`` shall be scheduled on processor
|
|
* ``X``.
|
|
*/
|
|
T_true( scheduled->is_idle );
|
|
scheduler_node = _Thread_Scheduler_get_home_node(
|
|
ctx->tq_ctx.worker_tcb[ ALPHA ]
|
|
);
|
|
T_eq_ptr( scheduler_node->user, scheduled );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_X_Beta: {
|
|
/*
|
|
* The task ``B`` shall be scheduled on processor ``X``.
|
|
*/
|
|
T_eq_ptr( scheduled, ctx->tq_ctx.worker_tcb[ BETA ] );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_X_BetaIdle: {
|
|
/*
|
|
* An idle task on behalf of task ``B`` shall be scheduled on processor
|
|
* ``X``.
|
|
*/
|
|
T_true( scheduled->is_idle );
|
|
scheduler_node = _Thread_Scheduler_get_home_node(
|
|
ctx->tq_ctx.worker_tcb[ BETA ]
|
|
);
|
|
T_eq_ptr( scheduler_node->user, scheduled );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_X_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Post_Y_Check(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y state
|
|
)
|
|
{
|
|
const Per_CPU_Control *cpu;
|
|
const Thread_Control *scheduled;
|
|
const Scheduler_Node *scheduler_node;
|
|
|
|
cpu = _Per_CPU_Get_by_index( 1 );
|
|
scheduled = cpu->heir;
|
|
|
|
switch ( state ) {
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_Y_Task: {
|
|
/*
|
|
* The task ``T`` shall be scheduled on processor ``Y``.
|
|
*/
|
|
T_eq_ptr( scheduled, ctx->tq_ctx.worker_tcb[ TASK ] );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_Y_TaskIdle: {
|
|
/*
|
|
* An idle task on behalf of task ``T`` shall be scheduled on processor
|
|
* ``Y``.
|
|
*/
|
|
T_true( scheduled->is_idle );
|
|
scheduler_node = _Thread_Scheduler_get_home_node(
|
|
ctx->tq_ctx.worker_tcb[ TASK ]
|
|
);
|
|
T_eq_ptr( scheduler_node->user, scheduled );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_Y_Alpha: {
|
|
/*
|
|
* The task ``A`` shall be scheduled on processor ``Y``.
|
|
*/
|
|
T_eq_ptr( scheduled, ctx->tq_ctx.worker_tcb[ ALPHA ] );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_Y_AlphaIdle: {
|
|
/*
|
|
* An idle task on behalf of task ``A`` shall be scheduled on processor
|
|
* ``Y``.
|
|
*/
|
|
T_true( scheduled->is_idle );
|
|
scheduler_node = _Thread_Scheduler_get_home_node(
|
|
ctx->tq_ctx.worker_tcb[ ALPHA ]
|
|
);
|
|
T_eq_ptr( scheduler_node->user, scheduled );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_Y_Beta: {
|
|
/*
|
|
* The task ``B`` shall be scheduled on processor ``Y``.
|
|
*/
|
|
T_eq_ptr( scheduled, ctx->tq_ctx.worker_tcb[ BETA ] );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_Y_BetaIdle: {
|
|
/*
|
|
* An idle task on behalf of task ``B`` shall be scheduled on processor
|
|
* ``Y``.
|
|
*/
|
|
T_true( scheduled->is_idle );
|
|
scheduler_node = _Thread_Scheduler_get_home_node(
|
|
ctx->tq_ctx.worker_tcb[ BETA ]
|
|
);
|
|
T_eq_ptr( scheduler_node->user, scheduled );
|
|
break;
|
|
}
|
|
|
|
case ScoreSchedSmpEdfReqSetAffinity_Post_Y_NA:
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Setup(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx
|
|
)
|
|
{
|
|
rtems_status_code sc;
|
|
rtems_id mutex_a;
|
|
rtems_id mutex_b;
|
|
rtems_id mutex_c;
|
|
|
|
memset( ctx, 0, sizeof( *ctx ) );
|
|
ctx->tq_ctx.deadlock = TQ_DEADLOCK_STATUS;
|
|
ctx->tq_ctx.enqueue_prepare = TQEnqueuePrepareDefault;
|
|
ctx->tq_ctx.enqueue_done = TQEnqueueDoneDefault;
|
|
ctx->tq_ctx.enqueue = TQEnqueueClassicSem;
|
|
ctx->tq_ctx.surrender = TQSurrenderClassicSem;
|
|
ctx->tq_ctx.get_owner = TQGetOwnerClassicSem;
|
|
ctx->tq_ctx.convert_status = TQConvertStatusClassic;
|
|
TQInitialize( &ctx->tq_ctx );
|
|
|
|
DeleteMutex( ctx->tq_ctx.mutex_id[ TQ_MUTEX_A ] );
|
|
DeleteMutex( ctx->tq_ctx.mutex_id[ TQ_MUTEX_B ] );
|
|
DeleteMutex( ctx->tq_ctx.mutex_id[ TQ_MUTEX_C ] );
|
|
|
|
mutex_a = 0;
|
|
sc = rtems_semaphore_create(
|
|
rtems_build_name( 'M', 'T', 'X', 'A' ),
|
|
1,
|
|
RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY |
|
|
RTEMS_MULTIPROCESSOR_RESOURCE_SHARING,
|
|
PRIO_LOW,
|
|
&mutex_a
|
|
);
|
|
T_rsc_success( sc );
|
|
|
|
mutex_b = 0;
|
|
sc = rtems_semaphore_create(
|
|
rtems_build_name( 'M', 'T', 'X', 'B' ),
|
|
1,
|
|
RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY |
|
|
RTEMS_MULTIPROCESSOR_RESOURCE_SHARING,
|
|
PRIO_VERY_LOW,
|
|
&mutex_b
|
|
);
|
|
T_rsc_success( sc );
|
|
|
|
mutex_c = 0;
|
|
sc = rtems_semaphore_create(
|
|
rtems_build_name( 'M', 'T', 'X', 'C' ),
|
|
1,
|
|
RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY |
|
|
RTEMS_MULTIPROCESSOR_RESOURCE_SHARING,
|
|
PRIO_NORMAL,
|
|
&mutex_c
|
|
);
|
|
T_rsc_success( sc );
|
|
|
|
ctx->tq_ctx.mutex_id[ TQ_MUTEX_A ] = mutex_a;
|
|
ctx->tq_ctx.mutex_id[ TQ_MUTEX_B ] = mutex_b;
|
|
ctx->tq_ctx.mutex_id[ TQ_MUTEX_C ] = mutex_c;
|
|
|
|
RemoveProcessor( SCHEDULER_B_ID, 1 );
|
|
AddProcessor( SCHEDULER_A_ID, 1 );
|
|
|
|
TQSetPriority( &ctx->tq_ctx, TASK, PRIO_NORMAL );
|
|
TQSetPriority( &ctx->tq_ctx, ALPHA, PRIO_LOW );
|
|
TQSetPriority( &ctx->tq_ctx, BETA, PRIO_VERY_LOW );
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Setup_Wrap( void *arg )
|
|
{
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx;
|
|
|
|
ctx = arg;
|
|
ctx->Map.in_action_loop = false;
|
|
ScoreSchedSmpEdfReqSetAffinity_Setup( ctx );
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Teardown(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx
|
|
)
|
|
{
|
|
SetSelfAffinityAll();
|
|
TQDestroy( &ctx->tq_ctx );
|
|
RemoveProcessor( SCHEDULER_A_ID, 1 );
|
|
AddProcessor( SCHEDULER_B_ID, 1 );
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Teardown_Wrap( void *arg )
|
|
{
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx;
|
|
|
|
ctx = arg;
|
|
ctx->Map.in_action_loop = false;
|
|
ScoreSchedSmpEdfReqSetAffinity_Teardown( ctx );
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Action(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx
|
|
)
|
|
{
|
|
rtems_event_set events;
|
|
|
|
SetSelfPriority( PRIO_ULTRA_HIGH );
|
|
SetSelfAffinityAll();
|
|
|
|
if ( ctx->beta_idle ) {
|
|
events = TQ_EVENT_MUTEX_B_OBTAIN;
|
|
TQSendAndWaitForExecutionStop( &ctx->tq_ctx, BETA, events );
|
|
} else {
|
|
ctx->tq_ctx.busy_wait[ BETA ] = true;
|
|
events = TQ_EVENT_BUSY_WAIT;
|
|
TQSendAndSynchronizeRunner( &ctx->tq_ctx, BETA, events );
|
|
}
|
|
|
|
if ( ctx->alpha_idle ) {
|
|
events = TQ_EVENT_MUTEX_A_OBTAIN;
|
|
TQSendAndWaitForExecutionStop( &ctx->tq_ctx, ALPHA, events );
|
|
} else {
|
|
ctx->tq_ctx.busy_wait[ ALPHA ] = true;
|
|
events = TQ_EVENT_BUSY_WAIT;
|
|
TQSendAndSynchronizeRunner( &ctx->tq_ctx, ALPHA, events );
|
|
}
|
|
|
|
if ( ctx->task_pinned ) {
|
|
SetSelfAffinityOne( 1 );
|
|
TQSendAndSynchronizeRunner( &ctx->tq_ctx, TASK, TQ_EVENT_PIN );
|
|
SetSelfAffinityAll();
|
|
}
|
|
|
|
if ( ctx->task_ready ) {
|
|
ctx->tq_ctx.busy_wait[ TASK ] = true;
|
|
events = TQ_EVENT_BUSY_WAIT;
|
|
} else {
|
|
events = 0;
|
|
}
|
|
|
|
if ( ctx->task_sticky ) {
|
|
events |= TQ_EVENT_MUTEX_C_OBTAIN;
|
|
}
|
|
|
|
TQSendAndSynchronizeRunner( &ctx->tq_ctx, TASK, events );
|
|
|
|
if ( !ctx->task_ready ) {
|
|
TQWaitForExecutionStop( &ctx->tq_ctx, TASK );
|
|
}
|
|
|
|
(void) _Thread_Dispatch_disable();
|
|
|
|
SetAffinity( ctx->tq_ctx.worker_id[ TASK ], &ctx->task_affinity_before );
|
|
SetAffinity( ctx->tq_ctx.worker_id[ ALPHA ], &ctx->alpha_affinity );
|
|
SetAffinity( ctx->tq_ctx.worker_id[ BETA ], &ctx->beta_affinity );
|
|
SetSelfAffinityOne( 1 );
|
|
TQSetPriority( &ctx->tq_ctx, TASK, ctx->task_priority );
|
|
SetSelfPriority( PRIO_ULTRA_LOW );
|
|
TQSetPriority( &ctx->tq_ctx, ALPHA, ctx->alpha_priority );
|
|
TQSetPriority( &ctx->tq_ctx, BETA, ctx->beta_priority );
|
|
|
|
SetAffinity( ctx->tq_ctx.worker_id[ TASK ], &ctx->task_affinity_after );
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_Cleanup(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx
|
|
)
|
|
{
|
|
rtems_event_set events;
|
|
|
|
SetSelfPriority( PRIO_ULTRA_HIGH );
|
|
_Thread_Dispatch_enable( _Per_CPU_Get() );
|
|
|
|
SetSelfAffinityAll();
|
|
|
|
ctx->tq_ctx.busy_wait[ TASK ] = false;
|
|
ctx->tq_ctx.busy_wait[ ALPHA ] = false;
|
|
ctx->tq_ctx.busy_wait[ BETA ] = false;
|
|
|
|
TQSetPriority( &ctx->tq_ctx, TASK, PRIO_NORMAL );
|
|
TQSetPriority( &ctx->tq_ctx, ALPHA, PRIO_LOW );
|
|
TQSetPriority( &ctx->tq_ctx, BETA, PRIO_VERY_LOW );
|
|
|
|
if ( ctx->task_sticky ) {
|
|
events = TQ_EVENT_MUTEX_C_RELEASE;
|
|
} else {
|
|
events = 0;
|
|
}
|
|
|
|
if ( ctx->task_pinned ) {
|
|
events |= TQ_EVENT_UNPIN;
|
|
}
|
|
|
|
if ( events != 0 ) {
|
|
TQSendAndWaitForExecutionStop( &ctx->tq_ctx, TASK, events );
|
|
} else {
|
|
TQWaitForExecutionStop( &ctx->tq_ctx, TASK );
|
|
}
|
|
|
|
SetAffinityAll( ctx->tq_ctx.worker_id[ TASK ] );
|
|
SetAffinityAll( ctx->tq_ctx.worker_id[ ALPHA ] );
|
|
|
|
if ( ctx->alpha_idle ) {
|
|
events = TQ_EVENT_MUTEX_A_RELEASE;
|
|
} else {
|
|
events = 0;
|
|
}
|
|
|
|
if ( events != 0 ) {
|
|
TQSendAndWaitForExecutionStop( &ctx->tq_ctx, ALPHA, events );
|
|
} else {
|
|
TQWaitForExecutionStop( &ctx->tq_ctx, ALPHA );
|
|
}
|
|
|
|
SetAffinityAll( ctx->tq_ctx.worker_id[ BETA ] );
|
|
|
|
if ( ctx->beta_idle ) {
|
|
events = TQ_EVENT_MUTEX_B_RELEASE;
|
|
} else {
|
|
events = 0;
|
|
}
|
|
|
|
if ( events != 0 ) {
|
|
TQSendAndWaitForExecutionStop( &ctx->tq_ctx, BETA, events );
|
|
} else {
|
|
TQWaitForExecutionStop( &ctx->tq_ctx, BETA );
|
|
}
|
|
}
|
|
|
|
static const ScoreSchedSmpEdfReqSetAffinity_Entry
|
|
ScoreSchedSmpEdfReqSetAffinity_Entries[] = {
|
|
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_NA,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_NA },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_AlphaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_BetaIdle },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_AlphaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Beta },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Alpha,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_BetaIdle },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Alpha,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Beta },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Task,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_BetaIdle },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Task,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Beta },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Task,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_AlphaIdle },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Task,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Alpha },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_AlphaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Task },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Alpha,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Task },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_BetaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_AlphaIdle },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Beta,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_AlphaIdle },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_BetaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Alpha },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Beta,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Alpha },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_AlphaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_TaskIdle },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Alpha,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_TaskIdle },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_TaskIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_BetaIdle },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_TaskIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Beta },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_TaskIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_AlphaIdle },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_TaskIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Alpha },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_BetaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Task },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Beta,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Task },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_BetaIdle,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_TaskIdle },
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Beta,
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_TaskIdle }
|
|
};
|
|
|
|
static const uint8_t
|
|
ScoreSchedSmpEdfReqSetAffinity_Map[] = {
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 7, 7, 9, 9, 13, 14, 3, 4,
|
|
8, 8, 10, 10, 1, 2, 1, 2, 9, 9, 9, 9, 3, 4, 3, 4, 10, 10, 10, 10, 5, 6, 5, 6,
|
|
7, 7, 9, 9, 5, 6, 5, 6, 8, 8, 10, 10, 5, 6, 5, 6, 9, 9, 9, 9, 5, 6, 5, 6, 10,
|
|
10, 10, 10, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 6, 5, 6, 5, 6,
|
|
5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 7, 7, 7, 7, 5, 6, 5, 6, 8, 8, 8, 8,
|
|
5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 11, 12, 1, 2, 7, 7, 9, 9, 13,
|
|
14, 3, 4, 8, 8, 10, 10, 1, 2, 1, 2, 9, 9, 9, 9, 3, 4, 3, 4, 10, 10, 10, 10,
|
|
5, 6, 5, 6, 7, 7, 9, 9, 5, 6, 5, 6, 8, 8, 10, 10, 5, 6, 5, 6, 9, 9, 9, 9, 5,
|
|
6, 5, 6, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2,
|
|
19, 19, 15, 15, 13, 14, 3, 4, 20, 20, 16, 16, 1, 2, 1, 2, 15, 15, 15, 15, 3,
|
|
4, 3, 4, 16, 16, 16, 16, 17, 18, 17, 18, 19, 19, 15, 15, 17, 18, 17, 18, 20,
|
|
20, 16, 16, 17, 18, 17, 18, 15, 15, 15, 15, 17, 18, 17, 18, 16, 16, 16, 16,
|
|
1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4,
|
|
3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2,
|
|
1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4,
|
|
3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2,
|
|
3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 11, 12, 1, 2, 13, 14, 3, 4, 13,
|
|
14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 11, 12,
|
|
1, 2, 3, 4, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3,
|
|
4, 11, 12, 1, 2, 7, 7, 7, 7, 13, 14, 3, 4, 8, 8, 8, 8, 1, 2, 1, 2, 1, 2, 1,
|
|
2, 3, 4, 3, 4, 3, 4, 3, 4, 5, 6, 5, 6, 7, 7, 7, 7, 5, 6, 5, 6, 8, 8, 8, 8, 5,
|
|
6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 11, 12, 1, 2, 11, 12, 1, 2, 13,
|
|
14, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2,
|
|
1, 2, 11, 12, 1, 2, 3, 4, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4,
|
|
3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 11, 12,
|
|
1, 2, 13, 14, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4,
|
|
3, 4, 1, 2, 1, 2, 11, 12, 1, 2, 3, 4, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2,
|
|
1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4,
|
|
1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4,
|
|
3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2,
|
|
1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4,
|
|
3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2,
|
|
3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 7,
|
|
7, 7, 7, 13, 14, 3, 4, 8, 8, 8, 8, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4,
|
|
3, 4, 5, 6, 5, 6, 7, 7, 7, 7, 5, 6, 5, 6, 8, 8, 8, 8, 5, 6, 5, 6, 5, 6, 5, 6,
|
|
5, 6, 5, 6, 5, 6, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 6,
|
|
5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 7, 7, 7, 7, 5, 6, 5, 6,
|
|
8, 8, 8, 8, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 11, 12, 1, 2, 7,
|
|
7, 7, 7, 13, 14, 3, 4, 8, 8, 8, 8, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4,
|
|
3, 4, 5, 6, 5, 6, 7, 7, 7, 7, 5, 6, 5, 6, 8, 8, 8, 8, 5, 6, 5, 6, 5, 6, 5, 6,
|
|
5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 19,
|
|
19, 19, 19, 13, 14, 3, 4, 20, 20, 20, 20, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4,
|
|
3, 4, 3, 4, 17, 18, 17, 18, 19, 19, 19, 19, 17, 18, 17, 18, 20, 20, 20, 20,
|
|
17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 1, 2, 1, 2,
|
|
1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4,
|
|
3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2,
|
|
3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2,
|
|
1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4,
|
|
3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 11, 12, 1, 2, 13, 14, 3, 4, 13, 14, 3, 4, 1,
|
|
2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 11, 12, 1, 2, 3, 4,
|
|
3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 11, 12,
|
|
1, 2, 7, 7, 7, 7, 13, 14, 3, 4, 8, 8, 8, 8, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3,
|
|
4, 3, 4, 3, 4, 5, 6, 5, 6, 7, 7, 7, 7, 5, 6, 5, 6, 8, 8, 8, 8, 5, 6, 5, 6, 5,
|
|
6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 11, 12, 1, 2, 11, 12, 1, 2, 13, 14, 3, 4,
|
|
13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 11,
|
|
12, 1, 2, 3, 4, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4,
|
|
3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 11, 12, 1, 2, 13, 14,
|
|
3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1,
|
|
2, 11, 12, 1, 2, 3, 4, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3,
|
|
4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1,
|
|
2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3,
|
|
4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3,
|
|
4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1,
|
|
2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3,
|
|
4, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 9, 9, 9, 9, 13,
|
|
14, 3, 4, 10, 10, 10, 10, 1, 2, 1, 2, 9, 9, 9, 9, 3, 4, 3, 4, 10, 10, 10, 10,
|
|
21, 22, 1, 2, 9, 9, 9, 9, 21, 22, 3, 4, 10, 10, 10, 10, 21, 22, 1, 2, 9, 9,
|
|
9, 9, 21, 22, 3, 4, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8,
|
|
8, 8, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 7, 7, 7, 7,
|
|
5, 6, 5, 6, 8, 8, 8, 8, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 11,
|
|
12, 1, 2, 9, 9, 9, 9, 13, 14, 3, 4, 10, 10, 10, 10, 1, 2, 1, 2, 9, 9, 9, 9,
|
|
3, 4, 3, 4, 10, 10, 10, 10, 21, 22, 1, 2, 9, 9, 9, 9, 21, 22, 3, 4, 10, 10,
|
|
10, 10, 21, 22, 1, 2, 9, 9, 9, 9, 21, 22, 3, 4, 10, 10, 10, 10, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 15, 15, 15, 15, 13, 14, 3, 4, 16, 16,
|
|
16, 16, 1, 2, 1, 2, 15, 15, 15, 15, 3, 4, 3, 4, 16, 16, 16, 16, 23, 24, 1, 2,
|
|
15, 15, 15, 15, 23, 24, 3, 4, 16, 16, 16, 16, 23, 24, 1, 2, 15, 15, 15, 15,
|
|
23, 24, 3, 4, 16, 16, 16, 16, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4,
|
|
1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4,
|
|
3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2,
|
|
1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4,
|
|
3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2,
|
|
3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 11,
|
|
12, 1, 2, 13, 14, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3,
|
|
4, 3, 4, 1, 2, 1, 2, 11, 12, 1, 2, 3, 4, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1,
|
|
2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 11, 12, 1, 2, 7, 7, 7, 7, 13, 14, 3, 4, 8,
|
|
8, 8, 8, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 5, 6, 5, 6, 7, 7, 7,
|
|
7, 5, 6, 5, 6, 8, 8, 8, 8, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6,
|
|
11, 12, 1, 2, 11, 12, 1, 2, 13, 14, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1,
|
|
2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 11, 12, 1, 2, 3, 4, 3, 4, 13, 14, 3,
|
|
4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 11, 12, 1, 2, 11, 12, 1, 2, 13, 14, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2,
|
|
1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 11, 12, 1, 2, 3, 4, 3, 4, 13,
|
|
14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2,
|
|
1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4,
|
|
1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4,
|
|
3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2,
|
|
1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4,
|
|
3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 11, 12, 1, 2, 7, 7, 9, 9, 13, 14, 3, 4, 8, 8, 10, 10, 1, 2, 1, 2,
|
|
9, 9, 9, 9, 3, 4, 3, 4, 10, 10, 10, 10, 5, 6, 5, 6, 7, 7, 9, 9, 5, 6, 5, 6,
|
|
8, 8, 10, 10, 5, 6, 5, 6, 9, 9, 9, 9, 5, 6, 5, 6, 10, 10, 10, 10, 7, 7, 7, 7,
|
|
7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6,
|
|
5, 6, 5, 6, 5, 6, 7, 7, 7, 7, 5, 6, 5, 6, 8, 8, 8, 8, 5, 6, 5, 6, 5, 6, 5, 6,
|
|
5, 6, 5, 6, 5, 6, 5, 6, 11, 12, 1, 2, 7, 7, 9, 9, 13, 14, 3, 4, 8, 8, 10, 10,
|
|
1, 2, 1, 2, 9, 9, 9, 9, 3, 4, 3, 4, 10, 10, 10, 10, 5, 6, 5, 6, 7, 7, 9, 9,
|
|
5, 6, 5, 6, 8, 8, 10, 10, 5, 6, 5, 6, 9, 9, 9, 9, 5, 6, 5, 6, 10, 10, 10, 10,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 19, 19, 15, 15, 13, 14, 3,
|
|
4, 20, 20, 16, 16, 1, 2, 1, 2, 15, 15, 15, 15, 3, 4, 3, 4, 16, 16, 16, 16,
|
|
17, 18, 17, 18, 19, 19, 15, 15, 17, 18, 17, 18, 20, 20, 16, 16, 17, 18, 17,
|
|
18, 15, 15, 15, 15, 17, 18, 17, 18, 16, 16, 16, 16, 1, 2, 1, 2, 1, 2, 1, 2,
|
|
3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2,
|
|
1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4,
|
|
3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2,
|
|
1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4,
|
|
1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 11, 12, 1, 2, 11, 12, 1, 2, 13, 14, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1,
|
|
2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 11, 12, 1, 2, 3, 4, 3, 4, 13,
|
|
14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 11, 12, 1, 2, 7, 7,
|
|
7, 7, 13, 14, 3, 4, 8, 8, 8, 8, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3,
|
|
4, 5, 6, 5, 6, 7, 7, 7, 7, 5, 6, 5, 6, 8, 8, 8, 8, 5, 6, 5, 6, 5, 6, 5, 6, 5,
|
|
6, 5, 6, 5, 6, 5, 6, 11, 12, 1, 2, 11, 12, 1, 2, 13, 14, 3, 4, 13, 14, 3, 4,
|
|
1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 11, 12, 1, 2, 3,
|
|
4, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 11, 12, 1, 2, 13, 14, 3, 4, 13,
|
|
14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 11, 12,
|
|
1, 2, 3, 4, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3,
|
|
4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3,
|
|
4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1,
|
|
2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3,
|
|
4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1,
|
|
2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 7, 7, 7, 7, 13, 14, 3, 4, 8,
|
|
8, 8, 8, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 5, 6, 5, 6, 7, 7, 7,
|
|
7, 5, 6, 5, 6, 8, 8, 8, 8, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 7,
|
|
7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5,
|
|
6, 5, 6, 5, 6, 5, 6, 5, 6, 7, 7, 7, 7, 5, 6, 5, 6, 8, 8, 8, 8, 5, 6, 5, 6, 5,
|
|
6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 11, 12, 1, 2, 7, 7, 7, 7, 13, 14, 3, 4, 8,
|
|
8, 8, 8, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 5, 6, 5, 6, 7, 7, 7,
|
|
7, 5, 6, 5, 6, 8, 8, 8, 8, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 19, 19, 19, 19, 13, 14, 3, 4,
|
|
20, 20, 20, 20, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 17, 18, 17,
|
|
18, 19, 19, 19, 19, 17, 18, 17, 18, 20, 20, 20, 20, 17, 18, 17, 18, 17, 18,
|
|
17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4,
|
|
3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2,
|
|
1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4,
|
|
1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4,
|
|
3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2,
|
|
1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11,
|
|
12, 1, 2, 11, 12, 1, 2, 13, 14, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2,
|
|
3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 11, 12, 1, 2, 3, 4, 3, 4, 13, 14, 3, 4,
|
|
1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 11, 12, 1, 2, 7, 7, 7, 7, 13,
|
|
14, 3, 4, 8, 8, 8, 8, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 5, 6,
|
|
5, 6, 7, 7, 7, 7, 5, 6, 5, 6, 8, 8, 8, 8, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6,
|
|
5, 6, 5, 6, 11, 12, 1, 2, 11, 12, 1, 2, 13, 14, 3, 4, 13, 14, 3, 4, 1, 2, 1,
|
|
2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 11, 12, 1, 2, 3, 4, 3, 4,
|
|
13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 11, 12, 1, 2, 13, 14, 3, 4, 13, 14, 3, 4,
|
|
1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 11, 12, 1, 2, 3,
|
|
4, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2,
|
|
1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4,
|
|
3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2,
|
|
1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4,
|
|
1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4,
|
|
3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 9, 9, 9, 9, 13, 14, 3, 4, 10, 10, 10,
|
|
10, 1, 2, 1, 2, 9, 9, 9, 9, 3, 4, 3, 4, 10, 10, 10, 10, 21, 22, 1, 2, 9, 9,
|
|
9, 9, 21, 22, 3, 4, 10, 10, 10, 10, 21, 22, 1, 2, 9, 9, 9, 9, 21, 22, 3, 4,
|
|
10, 10, 10, 10, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 6, 5, 6,
|
|
5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 7, 7, 7, 7, 5, 6, 5, 6, 8, 8,
|
|
8, 8, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 11, 12, 1, 2, 9, 9, 9,
|
|
9, 13, 14, 3, 4, 10, 10, 10, 10, 1, 2, 1, 2, 9, 9, 9, 9, 3, 4, 3, 4, 10, 10,
|
|
10, 10, 21, 22, 1, 2, 9, 9, 9, 9, 21, 22, 3, 4, 10, 10, 10, 10, 21, 22, 1, 2,
|
|
9, 9, 9, 9, 21, 22, 3, 4, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
11, 12, 1, 2, 15, 15, 15, 15, 13, 14, 3, 4, 16, 16, 16, 16, 1, 2, 1, 2, 15,
|
|
15, 15, 15, 3, 4, 3, 4, 16, 16, 16, 16, 23, 24, 1, 2, 15, 15, 15, 15, 23, 24,
|
|
3, 4, 16, 16, 16, 16, 23, 24, 1, 2, 15, 15, 15, 15, 23, 24, 3, 4, 16, 16, 16,
|
|
16, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2,
|
|
3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2,
|
|
1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4,
|
|
3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2,
|
|
1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 11, 12, 1, 2, 13, 14, 3, 4,
|
|
13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 11,
|
|
12, 1, 2, 3, 4, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4,
|
|
3, 4, 11, 12, 1, 2, 7, 7, 7, 7, 13, 14, 3, 4, 8, 8, 8, 8, 1, 2, 1, 2, 1, 2,
|
|
1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 5, 6, 5, 6, 7, 7, 7, 7, 5, 6, 5, 6, 8, 8, 8, 8,
|
|
5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 11, 12, 1, 2, 11, 12, 1, 2,
|
|
13, 14, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4,
|
|
1, 2, 1, 2, 11, 12, 1, 2, 3, 4, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2,
|
|
3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 1, 2, 11,
|
|
12, 1, 2, 13, 14, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3,
|
|
4, 3, 4, 1, 2, 1, 2, 11, 12, 1, 2, 3, 4, 3, 4, 13, 14, 3, 4, 1, 2, 1, 2, 1,
|
|
2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3,
|
|
4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3,
|
|
4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1,
|
|
2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3,
|
|
4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1,
|
|
2, 3, 4, 3, 4, 3, 4, 3, 4
|
|
};
|
|
|
|
static size_t ScoreSchedSmpEdfReqSetAffinity_Scope(
|
|
void *arg,
|
|
char *buf,
|
|
size_t n
|
|
)
|
|
{
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx;
|
|
|
|
ctx = arg;
|
|
|
|
if ( ctx->Map.in_action_loop ) {
|
|
return T_get_scope(
|
|
ScoreSchedSmpEdfReqSetAffinity_PreDesc,
|
|
buf,
|
|
n,
|
|
ctx->Map.pcs
|
|
);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static T_fixture ScoreSchedSmpEdfReqSetAffinity_Fixture = {
|
|
.setup = ScoreSchedSmpEdfReqSetAffinity_Setup_Wrap,
|
|
.stop = NULL,
|
|
.teardown = ScoreSchedSmpEdfReqSetAffinity_Teardown_Wrap,
|
|
.scope = ScoreSchedSmpEdfReqSetAffinity_Scope,
|
|
.initial_context = &ScoreSchedSmpEdfReqSetAffinity_Instance
|
|
};
|
|
|
|
static inline ScoreSchedSmpEdfReqSetAffinity_Entry
|
|
ScoreSchedSmpEdfReqSetAffinity_PopEntry(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx
|
|
)
|
|
{
|
|
size_t index;
|
|
|
|
index = ctx->Map.index;
|
|
ctx->Map.index = index + 1;
|
|
return ScoreSchedSmpEdfReqSetAffinity_Entries[
|
|
ScoreSchedSmpEdfReqSetAffinity_Map[ index ]
|
|
];
|
|
}
|
|
|
|
static void ScoreSchedSmpEdfReqSetAffinity_TestVariant(
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx
|
|
)
|
|
{
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Before_Prepare( ctx, ctx->Map.pcs[ 0 ] );
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_After_Prepare( ctx, ctx->Map.pcs[ 1 ] );
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Priority_Prepare(
|
|
ctx,
|
|
ctx->Map.pcs[ 2 ]
|
|
);
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_State_Prepare( ctx, ctx->Map.pcs[ 3 ] );
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Sticky_Prepare( ctx, ctx->Map.pcs[ 4 ] );
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_Pinned_Prepare( ctx, ctx->Map.pcs[ 5 ] );
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaPriority_Prepare(
|
|
ctx,
|
|
ctx->Map.pcs[ 6 ]
|
|
);
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaAffinity_Prepare(
|
|
ctx,
|
|
ctx->Map.pcs[ 7 ]
|
|
);
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaIdle_Prepare(
|
|
ctx,
|
|
ctx->Map.pcs[ 8 ]
|
|
);
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaPriority_Prepare(
|
|
ctx,
|
|
ctx->Map.pcs[ 9 ]
|
|
);
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaAffinity_Prepare(
|
|
ctx,
|
|
ctx->Map.pcs[ 10 ]
|
|
);
|
|
ScoreSchedSmpEdfReqSetAffinity_Pre_BetaIdle_Prepare(
|
|
ctx,
|
|
ctx->Map.pcs[ 11 ]
|
|
);
|
|
ScoreSchedSmpEdfReqSetAffinity_Action( ctx );
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_X_Check( ctx, ctx->Map.entry.Post_X );
|
|
ScoreSchedSmpEdfReqSetAffinity_Post_Y_Check( ctx, ctx->Map.entry.Post_Y );
|
|
}
|
|
|
|
/**
|
|
* @fn void T_case_body_ScoreSchedSmpEdfReqSetAffinity( void )
|
|
*/
|
|
T_TEST_CASE_FIXTURE(
|
|
ScoreSchedSmpEdfReqSetAffinity,
|
|
&ScoreSchedSmpEdfReqSetAffinity_Fixture
|
|
)
|
|
{
|
|
ScoreSchedSmpEdfReqSetAffinity_Context *ctx;
|
|
|
|
ctx = T_fixture_context();
|
|
ctx->Map.in_action_loop = true;
|
|
ctx->Map.index = 0;
|
|
|
|
for (
|
|
ctx->Map.pcs[ 0 ] = ScoreSchedSmpEdfReqSetAffinity_Pre_Before_All;
|
|
ctx->Map.pcs[ 0 ] < ScoreSchedSmpEdfReqSetAffinity_Pre_Before_NA;
|
|
++ctx->Map.pcs[ 0 ]
|
|
) {
|
|
for (
|
|
ctx->Map.pcs[ 1 ] = ScoreSchedSmpEdfReqSetAffinity_Pre_After_All;
|
|
ctx->Map.pcs[ 1 ] < ScoreSchedSmpEdfReqSetAffinity_Pre_After_NA;
|
|
++ctx->Map.pcs[ 1 ]
|
|
) {
|
|
for (
|
|
ctx->Map.pcs[ 2 ] = ScoreSchedSmpEdfReqSetAffinity_Pre_Priority_High;
|
|
ctx->Map.pcs[ 2 ] < ScoreSchedSmpEdfReqSetAffinity_Pre_Priority_NA;
|
|
++ctx->Map.pcs[ 2 ]
|
|
) {
|
|
for (
|
|
ctx->Map.pcs[ 3 ] = ScoreSchedSmpEdfReqSetAffinity_Pre_State_Ready;
|
|
ctx->Map.pcs[ 3 ] < ScoreSchedSmpEdfReqSetAffinity_Pre_State_NA;
|
|
++ctx->Map.pcs[ 3 ]
|
|
) {
|
|
for (
|
|
ctx->Map.pcs[ 4 ] = ScoreSchedSmpEdfReqSetAffinity_Pre_Sticky_Yes;
|
|
ctx->Map.pcs[ 4 ] < ScoreSchedSmpEdfReqSetAffinity_Pre_Sticky_NA;
|
|
++ctx->Map.pcs[ 4 ]
|
|
) {
|
|
for (
|
|
ctx->Map.pcs[ 5 ] = ScoreSchedSmpEdfReqSetAffinity_Pre_Pinned_Yes;
|
|
ctx->Map.pcs[ 5 ] < ScoreSchedSmpEdfReqSetAffinity_Pre_Pinned_NA;
|
|
++ctx->Map.pcs[ 5 ]
|
|
) {
|
|
for (
|
|
ctx->Map.pcs[ 6 ] = ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaPriority_High;
|
|
ctx->Map.pcs[ 6 ] < ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaPriority_NA;
|
|
++ctx->Map.pcs[ 6 ]
|
|
) {
|
|
for (
|
|
ctx->Map.pcs[ 7 ] = ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaAffinity_All;
|
|
ctx->Map.pcs[ 7 ] < ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaAffinity_NA;
|
|
++ctx->Map.pcs[ 7 ]
|
|
) {
|
|
for (
|
|
ctx->Map.pcs[ 8 ] = ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaIdle_Yes;
|
|
ctx->Map.pcs[ 8 ] < ScoreSchedSmpEdfReqSetAffinity_Pre_AlphaIdle_NA;
|
|
++ctx->Map.pcs[ 8 ]
|
|
) {
|
|
for (
|
|
ctx->Map.pcs[ 9 ] = ScoreSchedSmpEdfReqSetAffinity_Pre_BetaPriority_High;
|
|
ctx->Map.pcs[ 9 ] < ScoreSchedSmpEdfReqSetAffinity_Pre_BetaPriority_NA;
|
|
++ctx->Map.pcs[ 9 ]
|
|
) {
|
|
for (
|
|
ctx->Map.pcs[ 10 ] = ScoreSchedSmpEdfReqSetAffinity_Pre_BetaAffinity_All;
|
|
ctx->Map.pcs[ 10 ] < ScoreSchedSmpEdfReqSetAffinity_Pre_BetaAffinity_NA;
|
|
++ctx->Map.pcs[ 10 ]
|
|
) {
|
|
for (
|
|
ctx->Map.pcs[ 11 ] = ScoreSchedSmpEdfReqSetAffinity_Pre_BetaIdle_Yes;
|
|
ctx->Map.pcs[ 11 ] < ScoreSchedSmpEdfReqSetAffinity_Pre_BetaIdle_NA;
|
|
++ctx->Map.pcs[ 11 ]
|
|
) {
|
|
ctx->Map.entry =
|
|
ScoreSchedSmpEdfReqSetAffinity_PopEntry( ctx );
|
|
|
|
if ( ctx->Map.entry.Skip ) {
|
|
continue;
|
|
}
|
|
|
|
ScoreSchedSmpEdfReqSetAffinity_TestVariant( ctx );
|
|
ScoreSchedSmpEdfReqSetAffinity_Cleanup( ctx );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/** @} */
|