割り込みコントローラ

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

説明

割り込みハンドラ登録用構造体

定義

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のみ有効 -1を指定した場合はconfigを変更しません

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_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_INTC_UnRegister

int SOLID_INTC_UnRegister(SOLID_INTC_HANDLER *pHandler)

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

SGIおよびPPI(intno:0-31)は、割り込みを受け取るCPU毎に登録の解除が必要です。 各CPUでこのAPIを使用して個別のハンドラの登録の解除をしてください。

パラメータ

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, uint32_t cpuBits)

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

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

パラメータ
  • id -- 割り込み番号(0-31)

  • cpuBits -- 発生させるCPUマスク (SOLID_INTC_CPUBITS_XXX, またはbit0:CPU0, bit1:CPU1,...)

戻り値

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_INTC_Disable

int SOLID_INTC_Disable(int intno)

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

SGIおよびPPI(intno:0-31)は、CPU毎に設定が独立しています。 設定を変更したいCPUで、設定を変更するか、:any: SOLID_INTC_DisableM を使用してください

パラメータ

intno -- 割り込み番号

戻り値

SOLID_INTC_Enable

int SOLID_INTC_Enable(int intno)

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

SGIおよびPPI(intno:0-31)は、CPU毎に設定が独立しています。 設定を変更したいCPUで、設定を変更するか、:any: SOLID_INTC_EnableM を使用してください

パラメータ

intno -- 割り込み番号

戻り値

SOLID_INTC_GetStatus

int SOLID_INTC_GetStatus(int intno, uint32_t *pStatus)

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

SGIおよびPPI(intno:0-31)は、CPU毎に値が独立しています。 取得できる値はそのCPUの状態となります。

パラメータ
戻り値

SOLID_INTC_SetPriorityMask

int SOLID_INTC_SetPriorityMask(int threshold)

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

この設定で変更できるのはこのAPIを呼び出したCPUのGICCの設定のみです。

パラメータ

threshold -- 割り込みマスク

戻り値

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(最高)~ :any: SOLID_INTC_GetPriorityLevel() -1(最低)が戻ります。

SGIおよびPPI(intno:0-31)は、CPU毎に設定が独立しています。

パラメータ
  • intno -- 割り込み番号

  • pPriority -- 優先度を格納するバッファ

戻り値

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_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 -- 割り込み番号

戻り値

SOLID_INTC_SetPending

int SOLID_INTC_SetPending(int intno)

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

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

パラメータ

intno -- 割り込み番号

戻り値

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_INTC_SetGroup

int SOLID_INTC_SetGroup(int intno, int group)

指定された割り込みのGroup(0または1)を取得します

ノンセキュア状態(:any: SOLID_TZ が normal)では無効となります。

パラメータ
  • intno -- 割り込み番号

  • group -- 指定するgroup

戻り値

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,...)を格納するバッファ

戻り値

SOLID_INTC_DisableM

int SOLID_INTC_DisableM(int intno)

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

このAPI中で割り込み/SGIを使用して他CPUとの連携を行います。他CPUが割り込み禁止で何らかの処理待ちを 行っている場合、デッドロックが発生する可能性があります

パラメータ

intno -- 割り込み番号

戻り値

SOLID_INTC_EnableM

int SOLID_INTC_EnableM(int intno)

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

このAPI中で割り込み/SGIを使用して他CPUとの連携を行います。他CPUが割り込み禁止で何らかの処理待ちを 行っている場合、デッドロックが発生する可能性があります

パラメータ

intno -- 割り込み番号

戻り値

SOLID_INTC_SetIntPriorityM

int SOLID_INTC_SetIntPriorityM(int intno, int priority)

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

このAPI中で割り込み/SGIを使用して他CPUとの連携を行います。他CPUが割り込み禁止で何らかの処理待ちを 行っている場合、デッドロックが発生する可能性があります

優先度の値は0(最高)~ :any: SOLID_INTC_GetPriorityLevel() -1(最低)を指定できます。

パラメータ
  • intno -- 割り込み番号

  • priority -- 優先度

戻り値