割り込みコントローラ
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:
高
- 最大レベル値 - 1:
低
最大レベル値 は、
SOLID_INTC_GetPriorityLevel()
で取得できる値です。
-
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マスク (ソフトウェア割り込み通知先用マクロ, または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マスク (ソフトウェア割り込み通知先用マクロ, または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で、設定を変更するか、
SOLID_INTC_DisableM
を使用してください- パラメータ:
intno -- 割り込み番号
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_Enable
-
int SOLID_INTC_Enable(int intno)
指定された割り込みの通知を許可状態にします
SGIおよびPPI(intno:0-31)は、CPU毎に設定が独立しています。 設定を変更したいCPUで、設定を変更するか、
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_GetMinIntNo
-
int SOLID_INTC_GetMinIntNo(void)
割り込みコントローラの割り込み番号の最小値を取得します。
- 戻り値:
最小値
SOLID_INTC_GetMaxIntNo
-
int SOLID_INTC_GetMaxIntNo(void)
割り込みコントローラの割り込み番号の最大値を取得します。
- 戻り値:
最大値
SOLID_INTC_GetIntPriority
-
int SOLID_INTC_GetIntPriority(int intno, int *pPriority)
指定された割り込みの優先度を取得します。
優先度の値は0(最高)~
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(最高)~
SOLID_INTC_GetPriorityLevel()
-1(最低)を指定できます。SGIおよびPPI(intno:0-31)は、CPU毎に設定が独立しています。 設定を変更したいCPUで設定を変更するか、
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)を取得します
ノンセキュア状態(
SOLID_TZ
が normal)では常に1が戻ります。- パラメータ:
intno -- 割り込み番号
pGroup -- groupを格納するバッファ
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_SetGroup
-
int SOLID_INTC_SetGroup(int intno, int group)
指定された割り込みのGroup(0または1)を取得します
ノンセキュア状態(
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:CPU0, bit1:CPU1, ...)
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_SetTargetProcess
-
int SOLID_INTC_SetTargetProcess(int intno, char mask)
指定された割り込みの割り込み通知先CPUを変更します。
- パラメータ:
intno -- 割り込み番号
mask -- 通知先CPU(bit0:CPU0, bit1:CPU1, ...)
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_INTC_GetTargetProcess
-
int SOLID_INTC_GetTargetProcess(int intno, char *pMask)
指定された割り込みの割り込み通知先CPUを取得します。
- パラメータ:
intno -- 割り込み番号
pMask -- 通知先CPU(bit0:CPU0, 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(最高)~
SOLID_INTC_GetPriorityLevel()
-1(最低)を指定できます。- パラメータ:
intno -- 割り込み番号
priority -- 優先度
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー