ベクタ
SOLID-OSでは、ベクタ発生時に登録した関数を呼び出すことができます。
関数は、コアサービスが内部で所有しているスタックを使用して、SVC(AArch32時)/EL1h(AArch64時)モードで呼び出されます。
登録がなければ、例外発生時にデフォルトの動作が呼び出されます。 JTAGデバッガが接続されている場合は、予め埋め込まれているブレークポイント命令によって 実行が停止し、IDE上に発生した例外の種類などの情報が表示されます。
ベクタ関連のAPIを使用するには、solid_vector.h
をインクルードしてください。
#include "solid_vector.h"
API
ベクタ番号(AArch32)
-
SOLID_VECTOR_UNDEF
-
SOLID_VECTOR_SWI
-
SOLID_VECTOR_PREFETCH
-
SOLID_VECTOR_DATAABORT
-
SOLID_VECTOR_IRQ
-
SOLID_VECTOR_FIQ
定数
名前
値
説明
SOLID_VECTOR_UNDEF
0
未定義命令
SOLID_VECTOR_SWI
1
ソフトウェア割り込み
SOLID_VECTOR_PREFETCH
2
プリフェッチアボート
SOLID_VECTOR_DATAABORT
3
データアボート
SOLID_VECTOR_IRQ
4
割り込み要求
SOLID_VECTOR_FIQ
5
高速割り込み要求
ベクタ番号(AArch64)
SOLID_VECTOR_HANDLER
-
typedef struct _SOLID_VECTOR_HANDLER_ SOLID_VECTOR_HANDLER
-
struct _SOLID_VECTOR_HANDLER_
説明
ベクタハンドラ登録用構造体
定義
typedef struct _SOLID_VECTOR_HANDLER_ { struct _SOLID_VECTOR_HANDLER_ *pNext; int (*func)(void*, SOLID_CPU_CONTEXT*); void* param; } SOLID_VECTOR_HANDLER;
メンバー
-
struct _SOLID_VECTOR_HANDLER_ *pNext
コアサービス側で使用
-
int (*func)(void*, SOLID_CPU_CONTEXT*)
ベクタ発生時に呼び出される関数。第一引数にparam, 第二引数にベクタが発行した時点のコンテキストが渡されます。
-
void *param
ベクタ発生時に呼び出される関数に渡す引数
-
struct _SOLID_VECTOR_HANDLER_ *pNext
SOLID_VECTOR_Register
-
int SOLID_VECTOR_Register(int vec, SOLID_VECTOR_HANDLER *pHandler)
割り込みベクタのハンドラを登録します
ハンドラは必ず
SOLID_VECTOR_UnRegister
まで確保されている、かつ書き込み可能な領域 (.bss/.data領域またはmalloc()
等で確保した領域)を使用してください。- パラメータ:
vec -- 登録する ベクタ番号( SOLID_VECTOR_XXX )
pHandler -- 登録するハンドラ
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_VECTOR_UnRegister
-
int SOLID_VECTOR_UnRegister(int vec, SOLID_VECTOR_HANDLER *pHandler)
割り込みベクタのハンドラの登録を解除します
- パラメータ:
vec -- 登録を解除する ベクタ番号( SOLID_VECTOR_XXX )
pHandler -- 登録を解除するハンドラ
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_VECTOR_IsInInterrupt
-
int SOLID_VECTOR_IsInInterrupt(void)
割り込みベクタ処理中かどうかを判定する
- 戻り値:
0: 割り込み処理中でない
1: 割り込み処理中である
SOLID_SVC_HANDLER
-
typedef struct _SOLID_SVC_HANDLER_ SOLID_SVC_HANDLER
-
struct _SOLID_SVC_HANDLER_
説明
SVC(SWI)割り込みハンドラ登録用構造体
定義
typedef struct _SOLID_SVC_HANDLER_ { struct _SOLID_SVC_HANDLER_ *pNext; int (*func)(void*, int, SOLID_CPU_CONTEXT*); void* param; int startSvcNo; int endSvcNo; } SOLID_SVC_HANDLER;
メンバー
-
struct _SOLID_SVC_HANDLER_ *pNext
コアサービス側で使用
-
int (*func)(void*, int, SOLID_CPU_CONTEXT*)
SVC(SWI)割り込み発生時に呼び出される関数。第一引数にparam、第二引数に発生したSVC番号、第三引数にSVCを発行したコンテキスト(PCはSVCの次の命令)が渡されます。
-
void *param
発生時に呼び出される関数に渡す引数
-
int startSvcNo
対応するSVC(SWI)割り込みの開始番号
-
int endSvcNo
対応するSVC(SWI)割り込みの終了番号
-
struct _SOLID_SVC_HANDLER_ *pNext
SOLID_SVC_Register
-
int SOLID_SVC_Register(SOLID_SVC_HANDLER *pHandler)
SVC(SWI)割り込みのハンドラを登録します
ハンドラは必ず
SOLID_SVC_UnRegister
まで確保されている、かつ書き込み可能な領域 (.bss/.data領域またはmalloc()
等で確保した領域)を使用してください。- パラメータ:
pHandler -- 登録するハンドラ
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー
SOLID_SVC_UnRegister
-
int SOLID_SVC_UnRegister(SOLID_SVC_HANDLER *pHandler)
SVC(SWI)割り込みのハンドラの登録を解除します
- パラメータ:
pHandler -- 登録を解除するハンドラ
- 戻り値:
SOLID_ERR_OK
: 正常終了それ以外: エラー