- QEMU: https://github.com/tokyo4j/qemu/tree/page-success-exception
- xv6: https://github.com/tokyo4j/xv6-riscv/tree/page-success-exception
git clone https://github.com/tokyo4j/page-success-exception
cd page-success-exception
git submodule update --init
just xv6
just qemu-setup
just qemu
just run-xv6xv6 kernel is booting
init: starting sh
$ etest
[ECREATE] id:1
start=1000, end=4000
enclave_size=3000
[EADD] id:1 va:1000->pa:87f2a000
[EADD] id:1 va:2000->pa:87f29000
[EADD] id:1 va:3000->pa:87f28000
[EENTER] id:1 pc:1000
[EEXIT]
result=213D0- Page success例外: TLBミスでPage table walkが成功した後にM-modeに投げられる例外
- M-modeの例外ハンドラはアドレス変換を承認または拒否することができる
- アドレス変換を承認して
mret命令を実行すると、TLBエントリが埋められ、S-mode/U-modeでの実行が再開される - アドレス変換を拒否して
mret命令を実行すると、再びPage success例外が投げられる(要検討)
- アドレス変換を承認して
- M-modeの例外ハンドラはアドレス変換を承認または拒否することができる
- 2つのCSRを追加:
mpsec: Page success exception control register1を書き込むとPage success例外を有効化2を書き込むとPage success例外を無効化4を書き込むとアドレス変換を承認8を書き込むとアドレス変換を拒否
mpsepa: Page success exception physical address register- Page success例外が発生したアドレス変換における物理アドレス
- Note: 仮想アドレスは
mtvalを参照
- 3つの例外を追加:
- Page instruction fetch success exception (mcause=0x18)
- Page load success exception (mcause=0x19)
- Page store success exception (mcause=0x1a)
struct mtte {
uint64 va;
uint8 id;
};AMD SEV-SNPにおけるRMPと同様、全ての物理メモリページのEnclave IDと仮想アドレスを保持する
- Page success例外を有効化
- M-mode用の割り込みベクタを設定
- Page success例外: MTTを参照してメモリアクセスを制限
- ファームウェアへのアクセスを拒否
- Enclaveから通常のOS/アプリの命令フェッチを拒否
- Enclaveからの全てのメモリアクセスで、仮想アドレスとEnclave IDがMTTエントリと一致することを確認
- 通常のOS/アプリからEnclaveのメモリへのアクセスを拒否
- Illegal Instruction例外:
a0レジスタの内容に応じてECREATE、EADD、EENTER、EEXIT命令を実行ECREATE():- Enclaveの実行コンテキストを作成し、Enclave IDを返す
- S-modeから実行
EADD(id, epc_pa, va):- 通常の物理メモリページをEnclaveに割り当てる
- S-modeから実行
id: Enclave IDepc_pa: 割り当てる物理メモリページのアドレスva: マッピングする仮想アドレス
EENTER(id, pc):- Enclaveの実行を開始
- U-modeから実行
id: 実行するEnclaveのIDpc: ジャンプするコードの仮想アドレス
EEXIT()- Enclaveの実行を終了し、通常のアプリに戻る
- U-modeから実行
u64 ecreate(void)void eadd(enclave_id, va)- プロセスにおいて
vaにマッピングされている物理ページを、EADD命令によってEnclaveに割り当てる
- プロセスにおいて
ecreate()システムコールでEnclaveを作成eadd()システムコールで、Enclaveで実行するプログラム及びスタック領域を割り当てEENTER命令でenclave_entry()にジャンプし、Enclaveの実行を開始enclave_entry()は使用するスタックを切り替えた後enclave_main()にジャンプenclave_main()はフィボナッチ数列を計算し、32番の要素をfib_resultに保存enclave_entry()がEEXIT命令を実行し、通常のアプリにジャンプfib_resultの内容を出力
just qemu-setup
just qemu
just linux-setup
just linux
just xvisor-setup
just xvisor
just opensbi
just busybox-setup
just fs-xvisor
just run-xvisorjust qemu-setup
just qemu
just linux-setup
just linux
just opensbi
just busybox-setup
just fs-linux
just run-linux