割り込みコントローラ

SOLID-OSでは、割り込み要求発生時に、登録した関数を呼び出すことができます。

関数は、コアサービスが内部で所有しているスタックを使用して、SVCモードで呼び出されます。

割り込みコントローラ関連のAPIを使用するには、solid_intc.h をインクルードしてください。

#include "solid_intc.h"

API

SOLID_INTC_HANDLER

typedef struct _SOLID_INTC_HANDLER_ 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;

メンバー

intno

割り込み番号

0-15:SGI (CallSGIで生成)
16-31:PPI (各コア個別の割り込み)
31-255:SPI (通常の割り込み)
priority
処理優先度 0: 高 - 255: 低
config

割り込み設定(ICFGR) 2bitのみ有効

SGI:無効
PPI:実装依存
SPI:0X/レベルトリガ 1X:エッジトリガ
func
割り込み発生時に呼び出される関数
param
割り込み発生時に関数に引き渡される第一引数

割り込み状態

SOLID_INTC_STATUS_ENABLED
SOLID_INTC_STATUS_PENDING
SOLID_INTC_STATUS_ACTIVE

定数

名前 説明
SOLID_INTC_STATUS_ENABLED 0x00000001 割り込みが有効になっていることを示します。
SOLID_INTC_STATUS_PENDING 0x00000002 割り込みが発生しているが、処理待ちであることを示します。
SOLID_INTC_STATUS_ACTIVE 0x00000004 割り込み処理を実行中であることを示します。 ただし、SOLIDでは多重割り込みに対応するため、割り込み処理を受け付けた時点で実行中をクリアします。

SOLID_INTC_Register

int SOLID_INTC_Register(SOLID_INTC_HANDLER *pHandler)

割り込み用のハンドラを登録します

ハンドラを登録した割り込みはDisable状態のままですので、使用する前に SOLID_INTC_Enable() を呼び出してください。

パラメータ:pHandler -- 登録するハンドラ
戻り値:

SOLID_INTC_UnRegister

int SOLID_INTC_UnRegister(SOLID_INTC_HANDLER *pHandler)

割り込み用のハンドラの登録を解除します

パラメータ:pHandler -- 登録を解除するハンドラ
戻り値:

ソフトウェア割り込み通知先用マクロ

SOLID_INTC_CPUBITS_ALL
SOLID_INTC_CPUBITS_OTHERS
SOLID_INTC_CPUBITS_SELF

定数

名前 説明
SOLID_INTC_CPUBITS_ALL -1UL 全てのCPUに対してソフトウェア割り込みを通知します。
SOLID_INTC_CPUBITS_OTHERS -2UL 自CPU以外のCPUに対してソフトウェア割り込みを通知します。
SOLID_INTC_CPUBITS_SELF -3UL 自CPUに対してソフトウェア割り込みを通知します。

SOLID_INTC_CallSGI

int SOLID_INTC_CallSGI(int id, unsigned long cpuBits)

ソフトウェア割り込み(SGI)を発生させます

割り込みコントローラの機能であり、ソフトウェア割り込み命令(SWI)とは異なります

パラメータ:
  • id -- 割り込み番号(0-31)
  • cpuBits -- 発生させるCPUマスク (SOLID_INTC_CPUBITS_XXX, またはbit0:CPU0, bit1:CPU1,...)
戻り値:

SOLID_INTC_Disable

int SOLID_INTC_Disable(int intno)

指定された割り込みの通知を禁止状態にします

パラメータ:intno -- 割り込み番号
戻り値:

SOLID_INTC_Enable

int SOLID_INTC_Enable(int intno)

指定された割り込みの通知を許可状態にします

パラメータ:intno -- 割り込み番号
戻り値:

SOLID_INTC_GetStatus

int SOLID_INTC_GetStatus(int intno, unsigned long *pStatus)

指定された割り込みの状態を取得します

param intno:

割り込み番号

param pStatus:

状態を格納するバッファ (SOLID_INTC_STATUS_XXX がOR状態で入ります)

return:

SOLID_INTC_SetPriorityMask

int SOLID_INTC_SetPriorityMask(int threshold)

割り込みコントローラの割り込みマスク設定を変更します。

パラメータ:threshold -- 割り込みマスク
戻り値:

SOLID_INTC_GetPriorityMask

int SOLID_INTC_GetPriorityMask(void)

割り込みコントローラの割り込みマスク設定を取得します。

戻り値:現在の割り込みマスク値

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)

指定された割り込みの優先度を取得します。

パラメータ:
  • intno -- 割り込み番号
  • pPriority -- 優先度を格納するバッファ
戻り値:

SOLID_INTC_SetIntPriority

int SOLID_INTC_SetIntPriority(int intno, int priority)

指定された割り込みの優先度を変更します。

パラメータ:
  • intno -- 割り込み番号
  • priority -- 優先度
戻り値:

SOLID_INTC_GetIntConfig

int SOLID_INTC_GetIntConfig(int intno, int *pConfig)

指定された割り込みのConfigを取得します。

パラメータ:
  • intno -- 割り込み番号
  • pConfig -- Configを格納するバッファ
戻り値:

SOLID_INTC_SetIntConfig

int SOLID_INTC_SetIntConfig(int intno, int config)

指定された割り込みのConfigを変更します。

パラメータ:
  • intno -- 割り込み番号
  • config -- Config値(下位2ビットのみ有効)
戻り値:

SOLID_INTC_ClearPending

int SOLID_INTC_ClearPending(int intno)

指定された割り込みのPendingビット(割り込み待ち状態)をクリアします。

GICがv1かつintnoがSGI(0-15)の場合、ハードウェアの制限としてクリアできません。

パラメータ:intno -- 割り込み番号
戻り値:

SMP用API

SOLID_INTC_RegisterWithTargetProcess

int SOLID_INTC_RegisterWithTargetProcess(SOLID_INTC_HANDLER *pHandler, char mask)

割り込み通知先CPUを指定して割り込み用ハンドラを登録します。

パラメータ:
  • pHandler -- 登録するハンドラ
  • mask -- 通知先CPU(bit0:CP0,bit1:CPU1,...)
戻り値:

SOLID_INTC_SetTargetProcess

int SOLID_INTC_SetTargetProcess(int intno, char mask)

指定された割り込みの割り込み通知先CPUを変更します。

パラメータ:
  • intno -- 割り込み番号
  • mask -- 通知先CPU(bit0:CP0,bit1:CPU1,...)
戻り値:

SOLID_INTC_SetTargetProcess

int SOLID_INTC_GetTargetProcess(int intno, char *pMask)

指定された割り込みの割り込み通知先CPUを取得します。

パラメータ:
  • intno -- 割り込み番号
  • pMask -- 通知先CPU(bit0:CP0,bit1:CPU1,...)を格納するバッファ
戻り値: