toppers / athrill-target-rh850f1x

RH850F1x Target dependencies for Athrill
Other
5 stars 5 forks source link

割り込み要求クリア処理の不具合修正 #12

Closed tmori closed 3 years ago

tmori commented 3 years ago

割り込み要求クリアに関するHW仕様は以下となっている.

エッジ検出で、周辺モジュールからの割り込み要求の直後( CPU によって割り込みが受け付けられる前)に、 RFxxx ビットに "0" を書き込んだ場合

一方で,現状のAthrillの実装は,以下となっている.

  1. デバイスが割り込み通知をする(CPU受付前と解釈)
  2. 割り込みマスク設定されている間(CPU受付前と解釈)
  3. 割り込みマスク解除後(CPU受付されたと解釈)
  4. PSW.IDビットがたっていて割り込み発生させることができない(CPU受付されたと解釈)

上記のうち,3, 4 もCPU受付前と解釈すべきと思われるため,1~4のすべての条件をCPU受付前と判断し,割り込み要求をクリアする.

クリア処理は以下.

ファイル名:intc_config.c 関数名:intc_hook_update_ic_upperbit

tmori commented 3 years ago

本修正と併せて,以下の不具合を修正する. exception_queueは,レベルごとに検索しないといけないのに,ExceptionId_UserIntrだけをチェックしている.

        {
            ListEntry_Foreach(&intc_control[coreId].exception_queue[ExceptionId_UserIntr].pending, req) {
                ino_regaddr= IC_ADDRESS(req->data.intno);
                if ((ino_regaddr == regaddr) && req->data.status == ExceptionRequestStatus_RUNNABLE) {
                    ListEntry_RemoveEntry(&intc_control[coreId].exception_queue[ExceptionId_UserIntr].pending, req);
                    ListEntry_Free(&intc_control[coreId].exception_queue[ExceptionId_UserIntr].pending, req);
                    return;
                }
            }
        }
tmori commented 3 years ago

なお,本件,以下のコードで再現させることができる.

    SuspendAllInterrupts();
    //ここで 172の割り込みを発生させる
  //CPUが割り込み受け付けるが,割り禁状態なのでペンディングしている
    // ここで割り込み要求クリアされるが,
  // Athrill的には,CPU受付までいってしまっているので,クリアされない
    ClearInterrupt(172);
    ResumeAllInterrupts();
   // なので,ここで割り込みが発生する.
  // その直後,以下のログがでる
  // ERROR:hook_UserIntr_Raised() not found req:intno = 172