SMP¶
SMP時には、各CPU間で連携を行うためのAPIが用意されています。
API¶
SMP関連のAPIを使用するには、solid_smp.h をインクルードしてください。
#include "solid_smp.h"
SOLID_CORE_MAX¶
-
SOLID_CORE_MAX¶
システムで使用するCPUコアの最大数です。ビルド構成で定義され、定義されていない 場合は 1 となります。
SOLID_SMP_GetCpuId¶
-
int SOLID_SMP_GetCpuId()¶
実行中のCPUのID(0~)を取得します。
0がSOLIDを起動したCPUとなり、それ以外を1, 2, ...の順にIDを割り当てます。
- 戻り値:
CPUID
SOLID_SMP_DOFUNC_T¶
-
typedef void (*SOLID_SMP_DOFUNC_T)(void*, void*)¶
説明
CPU間連携機能で使用するコールバック関数
定義
typedef void(*SOLID_SMP_DOFUNC_T)(void*, void*);
CPU間連携用CPUマスク¶
SOLID_SMP_ForEachCpu¶
-
int SOLID_SMP_ForEachCpu(SOLID_SMP_DOFUNC_T pFunc, void *arg1, void *arg2, uint32_t cpumask)¶
各CPUで関数を実行します
SOLIDで管理しているCPUに対し、関数の実行を要求します。このAPIを呼び出したCPUではそのコンテキスト上で、 それ以外のCPUではSVC(AArch32)/EL1h(AArch64)モードで実行されます。
指定されたCPUで関数の処理がすべて終了するまで、このAPIから戻りません。
このAPIでは内部でSGI割り込みを使用します。実行先が割り込み禁止で何らかの待ち状態になっていると デッドロックが発生する可能性があります。
- パラメータ:
pFunc -- 実行する関数へのポインタ
arg1 -- 関数に渡す第一引数
arg2 -- 関数に渡す第二引数
cpumask -- 実行するCPUマスク(bit0:CPU0, bit1:CPU1, ...)または SOLID_SMP_CPUMASK_XXX
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
CPU間連携用要求フラグ¶
SOLID_SMP_RequestExec¶
-
int SOLID_SMP_RequestExec(int cpuId, SOLID_SMP_DOFUNC_T pFunc, void *arg1, void *arg2, int flags)¶
指定されたCPUで関数を実行します
SOLIDで管理しているCPUに対し、関数の実行を要求します。関数はSVC(AArch32)/EL1h(AArch64)モードで実行されます。 自CPUを指定することはできません。
flagsに
SOLID_SMP_REQFLAG_NOWAITを使用すると、APIは実行完了を待たずに戻ります。このAPIでは内部でSGI割り込みを使用します。実行先が割り込み禁止で何らかの待ち状態になっていると デッドロックが発生する可能性があります。
- パラメータ:
cpuId -- 実行を要求するCPUID
pFunc -- 実行する関数へのポインタ
arg1 -- 関数に渡す第一引数
arg2 -- 関数に渡す第二引数 (flagsで
SOLID_SMP_REQFLAG_A2CONTEXTを設定しているとこの引数は無視されます)flags -- SOLID_SMP_REQFLAG_XXXのOR指定
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_SMP_SetRegister¶
-
int SOLID_SMP_SetRegister(int cpuId, intptr_t regNo, SOLID_REGISTER regValue)¶
指定されたCPUのレジスタを変更します
- パラメータ:
cpuId -- 実行を要求するCPUID
regNo -- レジスタ番号 (AArch32/ r0-r15 = 0..15, AArch64/ x0-x30 = 0..30, sp =32, pc=33)
regValue -- 設定する値
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_SMP_SetJump¶
-
int SOLID_SMP_SetJump(int cpuId, SOLID_ADDRESS addr)¶
指定されたCPUのPCを変更します
- パラメータ:
cpuId -- 実行を要求するCPUID
addr -- 設定する値
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_SMPLOCK_T¶
-
typedef struct _SOLID_SMPLOCK_T_ SOLID_SMPLOCK_T¶
-
struct _SOLID_SMPLOCK_T_¶
説明
SMP用スピンロックの状態を保持する構造体です。メンバはコアサービスが内部的に 使用するため、ユーザが直接操作する必要はありません。
SOLID_SMP_LOCK_Initで初期化してから使用してください。
SOLID_SMP_LOCK_Init¶
-
int SOLID_SMP_LOCK_Init(SOLID_SMPLOCK_T *t)¶
SMPスピンロックを初期化します。
- パラメータ:
t -- スピンロック変数へのアドレス
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー
SOLID_SMP_LOCK_Lock¶
-
int SOLID_SMP_LOCK_Lock(SOLID_SMPLOCK_T *t)¶
SMPスピンロックを獲得します。
他のCPUがロックを保持している場合、解放されるまで待ち状態(スピン)になります。 ロックが不要になったら、すぐに
SOLID_SMP_LOCK_Unlockで解放してください。- パラメータ:
t -- スピンロック変数へのアドレス
- 戻り値:
SOLID_ERR_OK: ロックを獲得したそれ以外: エラー
SOLID_SMP_LOCK_TryLock¶
-
int SOLID_SMP_LOCK_TryLock(SOLID_SMPLOCK_T *t)¶
SMPスピンロックの獲得を試みます。
他のCPUがロックを保持している場合、待たずに即時戻ります。
- パラメータ:
t -- スピンロック変数へのアドレス
- 戻り値:
SOLID_ERR_OK: ロックを獲得したSOLID_ERR_BUSY: 他のCPUがロックを保持しているそれ以外: エラー
SOLID_SMP_LOCK_Unlock¶
-
int SOLID_SMP_LOCK_Unlock(SOLID_SMPLOCK_T *t)¶
SMPスピンロックを解放します。
- パラメータ:
t -- スピンロック変数へのアドレス
- 戻り値:
SOLID_ERR_OK: 正常終了それ以外: エラー