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: 正常終了
- それ以外: エラー