割り込みコントローラ¶
SOLID-OSでは、割り込み要求発生時に、登録した関数を呼び出すことができます。
関数は、コアサービスが内部で所有しているスタックを使用して、SVC(AARCH32)/EL1h(AARCH64)モードで呼び出されます。
割り込みコントローラ関連のAPIを使用するには、solid_intc.h をインクルードしてください。
#include "solid_intc.h"
API¶
SOLID_INTC_HANDLER¶
-
typedef struct _SOLID_INTC_HANDLER_ SOLID_INTC_HANDLER¶
-
struct _SOLID_INTC_HANDLER_¶
説明
割り込みハンドラ登録用構造体
定義
typedef struct _SOLID_INTC_HANDLER_ { int intno; int priority; int config; int (*func)(void*, SOLID_CPU_CONTEXT*); void* param; } SOLID_INTC_HANDLER;
メンバー
-
int intno¶
割り込み番号
- 0-15
SGI (CallSGIで生成)
- 16-31
PPI (各コア個別の割り込み)
- 32-255
SPI (通常の割り込み)
-
int priority¶
処理優先度 0: 高 - 255: 低
-
int config¶
割り込み設定(ICFGR) 2bitのみ有効 -1を指定した場合はconfigを変更しません
- SGI
無効
- PPI
実装依存
- SPI
0X/レベルトリガ 1X:エッジトリガ
-
int (*func)(void*, SOLID_CPU_CONTEXT*)¶
割り込み発生時に呼び出される関数
-
void *param¶
割り込み発生時に関数に引き渡される第一引数
-
int intno¶
割り込み状態¶
SOLID_INTC_Register¶
-
int SOLID_INTC_Register(SOLID_INTC_HANDLER *pHandler)¶
割り込み用のハンドラを登録します
ハンドラを登録した割り込みはDisable状態のままですので、使用する前に
SOLID_INTC_Enable
を呼び出してください。ハンドラは必ずSOLID_INTC_UnRegister()まで確保されている、かつ書き込み可能な領域 (.bss/.data領域またはmalloc等で確保した領域)を使用してください。
SGIおよびPPI(intno:0-31)は、割り込みを受け取るCPU毎に登録が必要です。 各CPUでこのAPIを使用して個別のハンドラを登録してください。
- パラメータ
pHandler -- 登録するハンドラ
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_UnRegister¶
-
int SOLID_INTC_UnRegister(SOLID_INTC_HANDLER *pHandler)¶
割り込み用のハンドラの登録を解除します
SGIおよびPPI(intno:0-31)は、割り込みを受け取るCPU毎に登録の解除が必要です。 各CPUでこのAPIを使用して個別のハンドラの登録の解除をしてください。
- パラメータ
pHandler -- 登録を解除するハンドラ
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
ソフトウェア割り込み通知先用マクロ¶
SOLID_INTC_CallSGI¶
-
int SOLID_INTC_CallSGI(int id, uint32_t cpuBits)¶
ソフトウェア割り込み(SGI)を発生させます
割り込みコントローラの機能であり、ソフトウェア割り込み命令(SWI)とは異なります
- パラメータ
id -- 割り込み番号(0-31)
cpuBits -- 発生させるCPUマスク (SOLID_INTC_CPUBITS_XXX, またはbit0:CPU0, bit1:CPU1,...)
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_CallSGIEx¶
-
int SOLID_INTC_CallSGIEx(int id, uint32_t cpuBits, uint32_t nsatt)¶
ソフトウェア割り込み(SGI)をNSATT(ノンセキュア指定)付きで発生させます
割り込みコントローラの機能であり、ソフトウェア割り込み命令(SWI)とは異なります
- パラメータ
id -- 割り込み番号(0-31)
cpuBits -- 発生させるCPUマスク (SOLID_INTC_CPUBITS_XXX, またはbit0:CPU0, bit1:CPU1,...)
nsatt -- SGI発行時のNSATTの値(0または1)
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_Disable¶
-
int SOLID_INTC_Disable(int intno)¶
指定された割り込みの通知を禁止状態にします
SGIおよびPPI(intno:0-31)は、CPU毎に設定が独立しています。 設定を変更したいCPUで、設定を変更するか、:any: SOLID_INTC_DisableM を使用してください
- パラメータ
intno -- 割り込み番号
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_Enable¶
-
int SOLID_INTC_Enable(int intno)¶
指定された割り込みの通知を許可状態にします
SGIおよびPPI(intno:0-31)は、CPU毎に設定が独立しています。 設定を変更したいCPUで、設定を変更するか、:any: SOLID_INTC_EnableM を使用してください
- パラメータ
intno -- 割り込み番号
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_GetStatus¶
-
int SOLID_INTC_GetStatus(int intno, uint32_t *pStatus)¶
指定された割り込みの状態を取得します
SGIおよびPPI(intno:0-31)は、CPU毎に値が独立しています。 取得できる値はそのCPUの状態となります。
- パラメータ
intno -- 割り込み番号
pStatus -- 状態を格納するバッファ ( SOLID管理メモリ領域 (SOLID_INTC_STATUS_XXX) がOR状態で入ります )
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_SetPriorityMask¶
-
int SOLID_INTC_SetPriorityMask(int threshold)¶
割り込みコントローラの割り込みマスク設定を変更します。
この設定で変更できるのはこのAPIを呼び出したCPUのGICCの設定のみです。
- パラメータ
threshold -- 割り込みマスク
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_GetPriorityMask¶
-
int SOLID_INTC_GetPriorityMask(void)¶
割り込みコントローラの割り込みマスク設定を取得します。
取得できるのはこのAPIを呼び出したCPUのGICCの値です。
- 戻り値
現在の割り込みマスク値
SOLID_INTC_GetPriorityLevel¶
-
int SOLID_INTC_GetPriorityLevel(void)¶
割り込みコントローラの割り込み優先度の最大レベルを取得します。
- 戻り値
最大レベル値
SOLID_INTC_GetIntPriority¶
-
int SOLID_INTC_GetIntPriority(int intno, int *pPriority)¶
指定された割り込みの優先度を取得します。
優先度の値は0(最高)~ :any: SOLID_INTC_GetPriorityLevel() -1(最低)が戻ります。
SGIおよびPPI(intno:0-31)は、CPU毎に設定が独立しています。
- パラメータ
intno -- 割り込み番号
pPriority -- 優先度を格納するバッファ
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_SetIntPriority¶
-
int SOLID_INTC_SetIntPriority(int intno, int priority)¶
指定された割り込みの優先度を変更します。
優先度の値は0(最高)~ :any: SOLID_INTC_GetPriorityLevel() -1(最低)を指定できます。
SGIおよびPPI(intno:0-31)は、CPU毎に設定が独立しています。 設定を変更したいCPUで設定を変更するか、:any: SOLID_INTC_SetIntPriorityM を使用してください
- パラメータ
intno -- 割り込み番号
priority -- 優先度
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_GetIntConfig¶
-
int SOLID_INTC_GetIntConfig(int intno, int *pConfig)¶
指定された割り込みのConfigを取得します。
- パラメータ
intno -- 割り込み番号
pConfig -- Configを格納するバッファ
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_SetIntConfig¶
-
int SOLID_INTC_SetIntConfig(int intno, int config)¶
指定された割り込みのConfigを変更します。
- パラメータ
intno -- 割り込み番号
config -- Config値(下位2ビットのみ有効)
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_ClearPending¶
-
int SOLID_INTC_ClearPending(int intno)¶
指定された割り込みのPendingビット(割り込み待ち状態)をクリアします。
GICがv1かつintnoがSGI(0-15)の場合、ハードウェアの制限としてクリアできません。
- パラメータ
intno -- 割り込み番号
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_SetPending¶
-
int SOLID_INTC_SetPending(int intno)¶
指定された割り込みのPendingビット(割り込み待ち状態)をセットします。
GICがv1かつintnoがSGI(0-15)の場合、ハードウェアの制限としてセットできません。
- パラメータ
intno -- 割り込み番号
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_IsPending¶
-
int SOLID_INTC_IsPending(int intno)¶
指定された割り込みのPending状態を取得します
- パラメータ
intno -- 割り込み番号
- 戻り値
0: 割り込みのPending状態なし
それ以外: 割り込みのPending状態あり
SOLID_INTC_GetGroup¶
-
int SOLID_INTC_GetGroup(int intno, int *pGroup)¶
指定された割り込みのGroup(0または1)を取得します
ノンセキュア状態(:any: SOLID_TZ が normal)では常に1が戻ります。
- パラメータ
intno -- 割り込み番号
pGroup -- groupを格納するバッファ
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_SetGroup¶
-
int SOLID_INTC_SetGroup(int intno, int group)¶
指定された割り込みのGroup(0または1)を取得します
ノンセキュア状態(:any: SOLID_TZ が normal)では無効となります。
- パラメータ
intno -- 割り込み番号
group -- 指定するgroup
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SMP用API¶
SOLID_INTC_RegisterWithTargetProcess¶
-
int SOLID_INTC_RegisterWithTargetProcess(SOLID_INTC_HANDLER *pHandler, char mask)¶
割り込み通知先CPUを指定して割り込み用ハンドラを登録します。
- パラメータ
pHandler -- 登録するハンドラ
mask -- 通知先CPU(bit0:CP0,bit1:CPU1,...)
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_SetTargetProcess¶
-
int SOLID_INTC_SetTargetProcess(int intno, char mask)¶
指定された割り込みの割り込み通知先CPUを変更します。
- パラメータ
intno -- 割り込み番号
mask -- 通知先CPU(bit0:CP0,bit1:CPU1,...)
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_GetTargetProcess¶
-
int SOLID_INTC_GetTargetProcess(int intno, char *pMask)¶
指定された割り込みの割り込み通知先CPUを取得します。
- パラメータ
intno -- 割り込み番号
pMask -- 通知先CPU(bit0:CP0,bit1:CPU1,...)を格納するバッファ
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_DisableM¶
-
int SOLID_INTC_DisableM(int intno)¶
指定された割り込みの通知を全てのCPUで禁止状態にします
このAPI中で割り込み/SGIを使用して他CPUとの連携を行います。他CPUが割り込み禁止で何らかの処理待ちを 行っている場合、デッドロックが発生する可能性があります
- パラメータ
intno -- 割り込み番号
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_EnableM¶
-
int SOLID_INTC_EnableM(int intno)¶
指定された割り込みの通知を全てのCPUで許可状態にします
このAPI中で割り込み/SGIを使用して他CPUとの連携を行います。他CPUが割り込み禁止で何らかの処理待ちを 行っている場合、デッドロックが発生する可能性があります
- パラメータ
intno -- 割り込み番号
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_SetIntPriorityM¶
-
int SOLID_INTC_SetIntPriorityM(int intno, int priority)¶
指定された割り込みの通知を全てのCPUで禁止状態にします
このAPI中で割り込み/SGIを使用して他CPUとの連携を行います。他CPUが割り込み禁止で何らかの処理待ちを 行っている場合、デッドロックが発生する可能性があります
優先度の値は0(最高)~ :any: SOLID_INTC_GetPriorityLevel() -1(最低)を指定できます。
- パラメータ
intno -- 割り込み番号
priority -- 優先度
- 戻り値
SOLID_ERR_OK
: 正常終了それ以外: エラー