# PLIC（Platform-Level Interrupt Controller）依存部 設計メモ
- 作成者: 本田晋也
- 最終更新: 2024年04月23日

# PLIC依存部の位置づけ

PLIC依存部は，カーネルのターゲット依存部の中で，PLICに準拠した割込みコントローラを持つチップに共通に使用できる部分である．

# PLIC依存部を構成するファイル

PLIC依存部は，次の2つのファイルで構成される．

- arch/riscv_gcc/common/
	- plic_kernel_impl.h	カーネルの割込みPLIC依存部のヘッダファイル
	- plic_kernel_impl.c	カーネルの割込みPLIC依存部
	- plic_kernel.trb 		カーネルの割込みPLIC依存部のパス2の生成スクリプト

カーネルの割込みPLIC依存部のアセンブリ言語部に関しては用意しない．以下の内容をアセンブリ言語の関数として用意する必要があるが，ローカル割込みコントローラの操作も必要となるため，チップ依存部で定義することとする．

- 割込み入口処理での割込みコントローラ操作
- 割込み出口処理での割込みコントローラ操作
- CPU例外発生前の割込み優先度の取得
- CPU例外ハンドラ呼出し前の割込みコントローラ操作
- CPU例外ハンドラ呼出し後の割込みコントローラ操作


# チップ依存のパラメータ

## アプリケーションから参照できるパラメータ

target_kernel.h（または，そこからインクルードされるファイル）で，以下の定数をマクロ定義しておく．

(1) TMIN_INTPRI			割込み優先度の最小値（最高値）
(2) TMAX_INTPRI			割込み優先度の最大値（最低値）

TMAX_INTPRIは，-1に定義する．TMAX_INTPRIは，ターゲットチップのPLICでサポートする割込み優先度の段数に定義する．

## カーネル内部で使用するパラメータ

target_kernel_impl.h（または，そこからインクルードされるファイル）からgic_kernel_impl.hをインクルードする前に，必要に応じて，以下の定数をマクロ定義しておく．

- PLIC_TNUM_INTNO		割込みの数

ターゲットチップのPLICがサポートする割込みの数．

- PLIC_BASE			PLICのベースアドレス

PLICのベースアドレス．

# チップ依存の関数

target_kernel.h（または，そこからインクルードされるファイル）で，以下の関数を定義する．

-  uint_t get_my_plic_cidx(void)  自プロセッサのPLICのコンテキストINDEXの取得

自プロセッサのM-mode割込みのPLICのコンテキストINDEXを取得する．

# パス2の生成スクリプトのチップ依存部

target_kernel.trb（または，そこからインクルードされるファイル）で，以下を定義する．

-  pid2cidx(pid)  プロセッサIDからPLICのコンテキストINDEXへの変換

プロセッサIDからPLICのコンテキストINDEXへ変換する関数．

- plic_intno_list  PLICで使用可能な割込み番号のリスト

0 からPLICで使用可能な割込み番号のリストをグローバル変数としてして定義する．


# 割込み要求のクリア

PLICでは，割込み要求ラインがエッジトリガである場合のトリガされた割込み要求のクリアはハードウェアで行われるため，割込みハンドラの出入口処理で行う必要はない．

# 割込み禁止・許可

PLICは割込み先のコンテキストを指定するレジスタを持たず，コンテキストごとの割込み許可レジスタを持つ．

そのため，割込みの禁止・許可時は割込み先のコンテキストを取得する必要がある．そのため，以下のデータ構造を kernel_cfg.c に生成する．

割込み要求ラインの割込み先のコンテキストINDEXを保持するテーブルどのコンテキストにも割り付けない場合は0xffを設定する． 

以上
