実行トレース機能

実行トレース機能は、デバッガがプログラムの実行をトレースするための機能である。実行トレースはフックルーチンを設定することによって行う。

td_hok_svc - システムコール・拡張SVCのフックルーチン定義

C言語インタフェース

#include <tk/dbgspt.h>

ER ercd = td_hok_svc (CONST TD_HSVC *hsvc );

パラメータ

CONST TD_HSVC* hsvc SVC Hook Routineフックルーチン定義情報

hsvc の内容

FP enter Hook Routine before Calling呼出前のフックルーチン
FP leave Hook Routine after Calling呼出後のフックルーチン

リターンパラメータ

ER ercd Error Codeエラーコード

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

システムコールおよび拡張SVCの呼出前後に、フックルーチンを設定する。hsvcNULL を指定することによりフックルーチンを解除する。

トレースの対象となるのは、T-Kernel/OSのシステムコール(tk_~)、および拡張SVCである。ただし、実装によるが、一般に tk_ret_int はトレースの対象とならない。

T-Kernel/DSのシステムコール(td_~)は、トレースの対象とならない。

フックルーチンは、フック対象となるシステムコールや拡張SVCを呼び出したタスクの準タスク部として実行される。そのため、例えばフックルーチン内での自タスクは、システムコールや拡張SVCを呼び出したタスクと同じである。

システムコール内でタスクディスパッチや割込みが起こる場合があるため、enter()leave() が常にペアで連続して呼び出されるとは限らない。また、システムコールから戻らない場合は、leave() は呼び出されない。

void *enter (FN fncd , TD_CALINF *calinf , ... );

FN fncd  機能コード

<0 システムコール

≧0 拡張SVC

TD_CALINF* calinf  呼出元情報
  ...  パラメータ(可変個数)

戻値  leave() に引き渡す任意の値

typedef struct td_calinf {
      システムコール・拡張SVCの呼出元(アドレス)を特定するための情報で、
      スタックのバックトレースを行うための情報が含まれることが望ましい。
      内容は実装定義となる。
      一般的には、スタックポインタやプログラムカウンタなどのレジスタの値である。
} TD_CALINF;

システムコールまたは拡張SVCを呼び出す直前に呼び出される。

戻値に返された値は、そのまま対応する leave() に渡される。これにより、enter()leave() のペアの確認や任意の情報の受け渡しを行うことができる。

exinf = enter(fncd, &calinf, ... )
ret = システムコール・拡張SVCの実行
leave(fncd , ret, exinf)

  • システムコールの場合

    パラメータは、システムコールのパラメータと同じとなる。

    例 1. tk_wai_sem( ID semid, INT cnt, TMO tmout )の場合

    enter(TFN_WAI_SEM, &calinf, semid, cnt, tmout)
  • 拡張SVCの場合

    パラメータは、拡張SVCハンドラに渡されるパケットの状態となる。

    fncd も拡張SVCハンドラに渡されるものと同一である。

    enter (FN fncd , TD_CALINF *calinf , void *pk_para );

    void leave (FN fncd , INT ret , void *exinf );

    FN fncd  機能コード
    INT ret  システムコールまたは拡張SVCの戻値
    void* exinf   enter() で戻された任意の値

システムコールまたは拡張SVCから戻った直後に呼び出される。

システムコールまたは拡張SVCが呼び出された後(システムコールまたは拡張SVCの実行中)にフックルーチンが設定された場合、enter() が呼び出されずに leave() のみ呼び出される場合がある。このような場合、exinf には NULL が渡される。

逆に、システムコールまたは拡張SVCが呼び出された後フックルーチンが解除された場合、enter() が呼び出されて、leave() が呼び出されない場合がある。

td_hok_dsp - タスクディスパッチのフックルーチン定義

C言語インタフェース

#include <tk/dbgspt.h>

ER ercd = td_hok_dsp (CONST TD_HDSP *hdsp );

パラメータ

CONST TD_HDSP* hdsp Dispatcher Hook Routineフックルーチン定義情報

hdsp の内容

FP exec Hook Routine when Execution Starts実行開始時のフックルーチン
FP stop Hook Routine when Execution Stops実行停止時のフックルーチン

リターンパラメータ

ER ercd Error Codeエラーコード

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

タスクディスパッチャに、フックルーチンを設定する。hdspNULLを指定することによりフックルーチンを解除する。

フックルーチンは、ディスパッチ禁止状態で呼び出される。フックルーチンでは、T-Kernel/OSのシステムコール(tk_~)および拡張SVCを呼び出してはいけない。T-Kernel/DSのシステムコール(td_~)は呼び出すことができる。

void exec (ID tskid , INT lsid );

ID tskid  実行を開始・再開するタスクのタスクID
INT lsid   tskid のタスクの論理空間ID

タスクの実行が開始・再開されるときに呼び出される。exec() が呼び出された時点で、すでに tskid のタスクはRUNNING状態となっており、論理空間も切り替えられている。ただし、tskid のタスクのプログラムコードが実行されるのは、exec() から戻った後である。

void stop (ID tskid , INT lsid , UINT tskstat );

ID tskid  実行を停止したタスクのタスクID
INT lsid   tskid のタスクの論理空間ID
UINT tskstat   tskid のタスクの状態

タスクが実行を停止した時に呼び出される。tskstat には、停止後のタスクの状態が示され、以下のいずれかとなる。

TTS_RDY READY状態 (実行可能状態)
TTS_WAI WAITING状態 (待ち状態)
TTS_SUS SUSPENDED状態 (強制待ち状態)
TTS_WAS WAITING-SUSPENDED状態 (二重待ち状態)
TTS_DMT DORMANT状態 (休止状態)
0NON-EXISTENT状態 (未登録状態)

stop() が呼び出された時点で、すでに tskid のタスクは tskstat で示した状態となっている。論理空間は不定である。

td_hok_int - 割込みハンドラのフックルーチン定義

C言語インタフェース

#include <tk/dbgspt.h>

ER ercd = td_hok_int (CONST TD_HINT *hint );

パラメータ

CONST TD_HINT* hint Interruption Handler Hook Routineフックルーチン定義情報

hint の内容

FP enter Hook Routine before Calling Handlerハンドラ呼出前のフックルーチン
FP leave Hook Routine after Calling Handlerハンドラ呼出後のフックルーチン

リターンパラメータ

ER ercd Error Codeエラーコード

利用可能なコンテキスト

タスク部準タスク部タスク独立部

解説

割込みハンドラの呼出前後に、フックルーチンを設定する。フックルーチンの設定は、例外・割込み要因ごとに独立に行うことはできない。すべての例外・割込み要因で共通のフックルーチンを1つのみ設定できる。

hintNULL を指定することによりフックルーチンを解除する。

フックルーチンはタスク独立部(割込みハンドラの一部)として呼び出される。したがって、フックルーチンからはタスク独立部から発行可能なシステムコールのみ呼び出すことができる。

なお、フックルーチンを設定できるのは、tk_def_intTA_HLNG 属性を指定して定義された割込みハンドラのみである。TA_ASM 属性の割込みハンドラのフックはできない。TA_ASM 属性の割込みハンドラをフックしたい場合は、例外・割込みベクタテーブルを直接操作してフックするなどの方法があるが、それらの方法は実装によって異なる。

void enter (UINT dintno );

void leave (UINT dintno );

UINT dintno  割込みハンドラ番号

enter() および leave() に渡される引数は、例外・割込みハンドラに渡される引数と同じものである。実装によっては、dintno 以外の情報も渡される場合がある。

フックルーチンは、高級言語対応ルーチンから次のようにして呼び出される。

enter(dintno);
inthdr(dintno); /* 例外・割込みハンドラ */
leave(dintno);

enter() は割込み禁止状態で呼び出されることになる。また、割込みを許可してはいけない。leave() は、inthdr() から戻ったときの状態となるため、割込み禁止状態は不確定である。

enter() では、inthdr() で得ることのできる情報と同じだけの情報を得ることができる。逆に、inthdr() で得ることのできない情報は enter() でも得ることはできない。enter() および inthdr() で得ることのできる情報としては、dintno が仕様としては保証されているが、それ以外の情報については実装定義である。なお、leave() では割込み禁止状態など各種の状態が変化している場合があるため、enter()inthdr() と同じだけの情報を得ることができるとは限らない。