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_CPUMASK_ALL
SOLID_SMP_CPUMASK_OTHER

定数

名前

説明

SOLID_SMP_CPUMASK_ALL

0x0000FFFF

すべてのCPU

SOLID_SMP_CPUMASK_OTHER

0x0001FFFF

自分以外の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

戻り値:

CPU間連携用要求フラグ

SOLID_SMP_REQFLAG_NONE
SOLID_SMP_REQFLAG_NOWAIT
SOLID_SMP_REQFLAG_A2CONTEXT

定数

名前

説明

SOLID_SMP_REQFLAG_NONE

0x00000000

なし

SOLID_SMP_REQFLAG_NOWAIT

0x00000001

実行完了を待たない

SOLID_SMP_REQFLAG_A2CONTEXT

0x00000002

第二引数をcontextに変更する

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割り込みを使用します。実行先が割り込み禁止で何らかの待ち状態になっていると デッドロックが発生する可能性があります。

パラメータ:
戻り値:

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_SMP_SetJump

int SOLID_SMP_SetJump(int cpuId, SOLID_ADDRESS addr)

指定されたCPUのPCを変更します

パラメータ:
  • cpuId -- 実行を要求するCPUID

  • addr -- 設定する値

戻り値: