Closed tmori closed 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;
}
}
}
なお,本件,以下のコードで再現させることができる.
SuspendAllInterrupts();
//ここで 172の割り込みを発生させる
//CPUが割り込み受け付けるが,割り禁状態なのでペンディングしている
// ここで割り込み要求クリアされるが,
// Athrill的には,CPU受付までいってしまっているので,クリアされない
ClearInterrupt(172);
ResumeAllInterrupts();
// なので,ここで割り込みが発生する.
// その直後,以下のログがでる
// ERROR:hook_UserIntr_Raised() not found req:intno = 172
割り込み要求クリアに関するHW仕様は以下となっている.
一方で,現状のAthrillの実装は,以下となっている.
上記のうち,3, 4 もCPU受付前と解釈すべきと思われるため,1~4のすべての条件をCPU受付前と判断し,割り込み要求をクリアする.
クリア処理は以下.
ファイル名:intc_config.c 関数名:intc_hook_update_ic_upperbit