SMP
SMP時には、各CPU間で連携を行うためのAPIが用意されています。
API
SMP関連のAPIを使用するには、solid_smp.h
をインクルードしてください。
#include "solid_smp.h"
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
: 正常終了それ以外: エラー