ベクタ

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_SYNC
SOLID_VECTOR_IRQ
SOLID_VECTOR_FIQ
SOLID_VECTOR_SERR

定数

名前

説明

SOLID_VECTOR_SYNC

0

Synchronous Exception

SOLID_VECTOR_IRQ

1

IRQ割り込み

SOLID_VECTOR_FIQ

2

FIQ割り込み

SOLID_VECTOR_SERR

3

SError

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

ベクタ発生時に呼び出される関数に渡す引数

SOLID_VECTOR_Register

int SOLID_VECTOR_Register(int vec, SOLID_VECTOR_HANDLER *pHandler)

割り込みベクタのハンドラを登録します

ハンドラは必ず SOLID_VECTOR_UnRegister まで確保されている、かつ書き込み可能な領域 (.bss/.data領域または malloc() 等で確保した領域)を使用してください。

パラメータ:
戻り値:

SOLID_VECTOR_UnRegister

int SOLID_VECTOR_UnRegister(int vec, SOLID_VECTOR_HANDLER *pHandler)

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

パラメータ:
戻り値:

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)割り込みの終了番号

SOLID_SVC_Register

int SOLID_SVC_Register(SOLID_SVC_HANDLER *pHandler)

SVC(SWI)割り込みのハンドラを登録します

ハンドラは必ず SOLID_SVC_UnRegister まで確保されている、かつ書き込み可能な領域 (.bss/.data領域または malloc() 等で確保した領域)を使用してください。

パラメータ:
  • pHandler -- 登録するハンドラ

戻り値:

SOLID_SVC_UnRegister

int SOLID_SVC_UnRegister(SOLID_SVC_HANDLER *pHandler)

SVC(SWI)割り込みのハンドラの登録を解除します

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

戻り値: