榮樂 英樹
株式会社イーゲル
2024-03-29 BitVisor Summit 12
BitVisor 2023年から2024年3
月の主な変更点
1
2
BitVisor 2023年から2024年3月
の主な変更点
 Network
– WireGuard対応
– TLS対応
– lwIPアップデート
– バグ修正
 Core
– EPT/NP 1GiBページ対応
– 新CPU対応
– QEMU+Linux KVM対応
 追加ファイル/API
– .clang-format
– ドキュメント
– MAX, MIN
– 乱数
– クイックソート
– Unix epoch time
 その他
– コード整理と改良
– バグ修正
3
Network: WireGuard (VPN) 対応
https://github.com/smartalock/wireguard-lwip
を取り込んだ
make config: WIREGUARD=1
defconfig/bitvisor.conf: config.wg.*にWireGuardの設定、さらに
TCP/IPスタックを有効化
テスト用echoサーバー・クライアントの他、telnet_dbgshも動作
する
ゲスト通信を強制的にWireGuardトンネルに流すモード

defconfig/bitvisor.conf: net=ipwggos, config.wg_gos.*にゲストにDHCPで返すアドレス
等を設定
4
Network: TLS対応
https://github.com/Mbed-TLS/mbedtls
を取り込んだ
make config: TLS=1
defconfig/bitvisor.conf: config.tls.*に証明書の設定
TLS通信使用例として、テスト用echoサーバー・クラ
イアントにTLS対応版を追加した
5
Network: lwIPアップデート
2.0.3から2.1.3にアップデートした
6
Network: バグ修正
テスト用echoクライアントのメモリーリーク修正
AQC107 10GbE: 送信リングバッファーのwrappingバ
グ修正

大量のパケットをまとめて送信した時に、リングバッファーのサイズマ
イナス1しか入れられないところ、サイズちょうどまで入れてしまって
いた
virtio-netの割り込み抑制のレースコンディションを修
正
7
Core: EPT/NP 1GiBページ対応
 背景: EPT/NPのテーブルサイズが大きい!
 大きかった原因:

CPUごとにテーブルを作るため数が増える (特にCPU数が多い場合)

2MiBページのため1GiBごとに4KiBのテーブルひとつ分を消費する (特にRAM容量が大き
い場合)
 検討した対応策:

CPU間でテーブルを共有する - TLBシュートダウンがネック

1GiBページに対応してテーブルを減らす
 実装した対応策: 1GiBページ対応

MMIOフックへの影響を最小限にするため、4GiB以上のアドレス、かつ、RAM領域に限る
8
Core: 新CPU対応
5-level paging (LA57)

今は使われると困るので、とりあえず隠蔽による対応とした
tpause, umonitor and umwait (WAITPKG) 対応

VT-xのゲストでは、VMCSで明示的に許可されていないと使用できない
ので、許可するようにした

Linux KVM上では、直接はWAITPKGが使えても、nested virtualization
のVMCSには許可設定できない構成となっていることがあるため、その
ような場合はWAITPKGを隠蔽する
9
Core: QEMU+Linux KVM対応
(1/2)
BIOSのPIOによるATAストレージ読み取りエラー回避策

Debianが使用しているSeaBIOSが、DMAを使わない設定となっているため (Debian
bug #934134)、INS命令によるATAストレージ読み取りが行われる

INS命令のメモリー書き込みがEPT violationになると、読み取り内容が失われてしま
うため、ストレージ読み取りエラーが発生する

回避のため、先頭1MiBをマップした状態で起動するようにした
xHCI para pass-through driverの修正

レジスターアクセスのビット幅がコンパイラー最適化で変わってしまうことがない
ようにした

Run/Stopをセットする際に一時的にEvent Ring Dequeue Pointerレジスターが不正
な値になっていたのを修正した
10
Core: QEMU+Linux KVM対応
(2/2)
Local APICのフック

以前のLinux KVMはVT-xのwait-for-SIPIステートに対応していなかった
(Linux 5.11より前)

BitVisorに、wait-for-SIPIステートの対応チェックと、未対応の場合のエ
ミュレーションを実装した
●
SVM環境では以前からエミュレーションのため同じものを利用している

Local APICをパススルーにしてenable_apicv=Y (デフォルト) のLinux
KVMを使うと依然として問題が発生するため、その回避用にLocal APIC
を常にパススルーにしない設定を追加した
●
config.vmm.localapic_intercept=1で有効
11
追加ファイル/API: .clang-format
clang-formatバージョン15以降で使える書式ファイル

バージョン14ではasmの書式がおかしくなる
コード全体に適用するのではなく、追加部分に適用の上、必要
に応じて手で微調整をするか、差分を見て書式ミスがないかを
チェックする使い方を想定している

追加部分に適用: hg diff | clang-format-diff-15 -ip1
 差分を見る: hg diff | clang-format-diff-15 -p1

例えば、下のように桁の位置を合わせて見やすくするための追加のスペースは、削
除されてしまうことがある
func (foo, 5);
func (foo, 10);
12
追加ファイル/API: ドキュメント
 docsディレクトリにMarkdownで簡単なドキュメントを置くようにした
 現状

getting_started.md - 最初に試す時の説明

driver_guide.md - PCI para pass-through driverの書き方

Mbed-TLS.md - TLS設定方法

wireguard.md - WireGuard設定方法

wireguard_guest_os.md - ゲスト通信を強制的にWireGuardトンネルに流すモードの設定方法
 今後の目標: バージョン1.1のマニュアル (2010年12月) の内容を網羅で
きると嬉しい
13
追加ファイル/API: MAX, MIN
#include <common.h>
MAX(a, b)
MIN(a, b)
よく出てきがちな大小比較をマクロにした
storage実装でのみ使われていたmin関数 (int型用、なぜ
かstring.hに存在していた) を削除し、代わりに導入し
たもの
14
追加ファイル/API: 乱数
#include <core/random.h>
unsigned int random_num_hw (unsigned int
retry_times, unsigned int *out_num);

ハードウェアの乱数生成器 (RDRAND命令) を用いた乱数取得

1が返されると*out_numに返された値が有効、0は無効
unsigned int random_num_sw (void);

簡単な疑似乱数
15
追加ファイル/API:
クイックソート
#include <core/qsort.h>
void qsort (void *base, size_t nmemb,
size_t size, int (*cmp) (const void *,
const void *));
標準Cライブラリーのqsort相当
initfuncのソートがバブルソートのようなものだったの
を置き換えたのと、新たにメモリーマップのソートを
するのに使用
16
追加ファイル/API:
Unix epoch time
#include <core/time.h>
void get_epoch_time (long long *second,
int *microsecond);
起動時に現在時刻を取得し、そこからの経過時間を足
して現在のUnix epoch timeとして返す

経過時間は既存のget_time()を使用しているため、ゲストの動作によっ
てはズレることがある
WireGuard, TLSとSQLiteで使用
17
その他: コード整理と改良 (1/2)
 x86依存部分の分離
 使われていなかったMAP_UEFI_MMIOを削除
 gmm_pass: 不必要なincludeを削除、他から使われていない関数をstaticに
変更
 timer: 処理を整理しコメントを追加、メモリー書き込み回数を削減
 リンク時の警告requires executable stackを抑制
(-Wa,--noexecstackオプション)
 tools/log: 新しいバージョンのLinuxに対応
 time: TSC周波数をCPUIDで取得できる場合はそれを使うように変更 (起動
時間0.6秒短縮・時刻情報の精度向上)
18
その他: コード整理と改良 (2/2)
EPT/NP: 処理を整理しcur_moveの呼び出し回数を削減した
VT-x: INVEPT命令を必要時のみ使うように改良した
VT-x: CR0のPEとPGビットの変更に伴うVM Exitを減らした
VT-x nested virtualization

ゲストがVPIDを使えるようにした

TLBフラッシュを必要時のみ行うようにした
make compile_commands.jsonに対応した

clangd用
19
その他: バグ修正 (1/7)
uhci, ehci, xhci: ファームウェアドライバー切り離し
ACPI: RESET_REG_SUPの確認

RESET_REGが使えない環境は見たことがないため気づかなかったが、使えない環境が
あり得る
boot/uefi-loader-login: module2.binサイズ

64KiBまでだったのを1MiBまでに増やした

1MiBちょうどの場合は続きがある可能性があるのでエラーとした
CPUID 0x40000000 - 0x4FFFFFFFの隠し方を修正

仮想マシンに使われるCPUID

0を返すのではなく、highest basic information leafを返す
20
その他: バグ修正 (2/7)
crypto: LONG_MIN, LONG_MAXとULONG_MAXを修正

32ビット用の値に固定されていた
並列ビルド時のSQLiteビルドエラーを修正
vmmcall_log: 古いmapmem_gphysが残っていてビルドエラーになっ
ていたのを修正
NMIのIRET命令によるブロック解除のバグを修正

IRET命令でEPT violationやページフォールトの際はIRETを再実行するためNMIブロック設
定

IRET命令エミュレーションの時にブロック解除
NVMe暗号化のレースコンディション修正
21
その他: バグ修正 (3/7)
Start-up IPI (SIPI) の取りこぼし (1) 問題

Wait-for-SIPIステートでなければSIPIは失われる

UEFI環境では、ゲストが最初にINITを送る時にVMMがAPを開始するが、
APがwait-for-SIPIステートに入る前にBSPのゲストが再開してSIPIを
送ってしまい、取りこぼすケースがあった (macOS 13で発生)
BSP VM ───┐ ┌─┬───────
BSP VMM └─┬───┘ │
. │ ┊
AP VM │ ┊ ╒═════
AP VMM └───────┘
BSP VM INIT
BSP VMM SIPI
.
AP VM
AP VMM Wait-for-SIPI
・ ───────────────→ (時間)
22
その他: バグ修正 (4/7)
Start-up IPI (SIPI) の取りこぼし (1) 対策

Wait-for-SIPIステートに入るVMLAUNCHまでBSPが待つ実装を追加し
た

厳密にはVMLAUNCHを実行して実際にステートに入るまで待たないと
いけないが、実装はVMLAUNCHの直前まで待つもので、実用上は問題
ない見込み
BSP VM ───┐ ┌─┬───────
BSP VMM └─┬───╍╍╍╍╍┘ │
. │ │
AP VM │ ╒══╡ ┌───
AP VMM └───────┘ └───┘
BSP VM INIT 待ち
BSP VMM SIPI
.
AP VM
AP VMM
・ ───────────────→ (時間)
23
その他: バグ修正 (5/7)
Start-up IPI (SIPI) の取りこぼし (2) 問題

AP開始済みの状態で、INITを受けてからwait-for-SIPIステートに入るま
でに時間がかかりすぎて取りこぼすケースが、特にnested virtualization
で見られた
BSP VM ───┬─────┬────────
. │ │
. │ ┊
AP VM ───┤ ┊ ╒══════
AP VMM └───────┘
BSP VM
. INIT SIPI
.
AP VM
AP VMM Wait-for-SIPI
・ ───────────────→ (時間)
24
その他: バグ修正 (6/7)
Start-up IPI (SIPI) の取りこぼし (2) 対策

INITを受けたらなるべく早くwait-for-SIPIステートに入るようにした

特にLinux KVMではステートだけでも先にVMWRITEしておくと失われ
なくなるようだ
BSP VM ───┬─────┬────────
. │ │
. │ │
AP VM ───┤ ╒═══╡ ┌────
AP VMM └─┘ └───┘
BSP VM
. INIT SIPI
.
AP VM
AP VMM
・ ───────────────→ (時間)
25
その他: バグ修正 (7/7)
Wait-for-SIPIステートにおける割り込みの問題を修正
a)VT-xで、wait-for-SIPIステートに入る時にまだ割り込みのイベントデリバ
リーが残っていると、VM entry failure panicとなる問題
b)VT-xで、wait-for-SIPIステートに入る直前にNMIが発生すると、割り込みの
イベントデリバリーを設定してしまう問題
c)Wait-for-SIPIのエミュレーション (SVMの場合、または、VT-xで
config.vmm.localapic_intercept=1またはwait-for-SIPIに対応していない場合)
の間にNMIが発生すると、SIPIの直後にNMIを発生させてしまう問題
.
. │ │
. │ │
AP VM ───┤ ╒═══╡ ┌────
AP VMM └─┘ └───┘
. INIT SIPI
.
AP VM
AP VMM
・ ───────────→ (時間)
c)NMIが発生
a), b) panic
c)NMIを発生
b)NMIが発生
26
今後の予定
Aarch64対応
make config改良
Nested virtualization改良
3.0リリース
27
BitVisor 2023年から2024年3月
の主な変更点
 Network
– WireGuard対応
– TLS対応
– lwIPアップデート
– バグ修正
 Core
– EPT/NP 1GiBページ対応
– 新CPU対応
– QEMU+Linux KVM対応
 追加ファイル/API
– .clang-format
– ドキュメント
– MAX, MIN
– 乱数
– クイックソート
– Unix epoch time
 その他
– コード整理と改良
– バグ修正
最新リポジトリ
http://bitvisor.sf.net

More Related Content

PDF
BitVisor Summit 7「2. BitVisor 2018年の主な変更点」
PDF
BitVisor Summit 11「1. BitVisor 2022年の主な変更点」
PDF
BitVisor Summit 8「2. BitVisor 2019年の主な変更点」
PDF
BitVisor Summit 13 「BitVisor 2024年4月から2025年3月の主な変更点」
PDF
BitVisor Summit 9「2. BitVisor 2020年の主な変更点」
PDF
20130209勉強会
PDF
BitVisor Summit 10「1. BitVisor 2021年の主な変更点」
PDF
20150713-OpenStack-5thbirthday-kilo-liberty-and-towards
BitVisor Summit 7「2. BitVisor 2018年の主な変更点」
BitVisor Summit 11「1. BitVisor 2022年の主な変更点」
BitVisor Summit 8「2. BitVisor 2019年の主な変更点」
BitVisor Summit 13 「BitVisor 2024年4月から2025年3月の主な変更点」
BitVisor Summit 9「2. BitVisor 2020年の主な変更点」
20130209勉強会
BitVisor Summit 10「1. BitVisor 2021年の主な変更点」
20150713-OpenStack-5thbirthday-kilo-liberty-and-towards

Similar to BitVisor Summit 12「BitVisor 2023年から2024年3 月の主な変更点」 (18)

PDF
OpenStack 2014.1 (Icehouse Release)
PDF
BHyVe: The BSD Hypervisor
PDF
第12回CloudStackユーザ会_ApacheCloudStack最新情報
PPTX
VIRLとPyATSで実現するネットワークCI
PPTX
2016-11-30 BitVisor Summit 5 「BitVisorの現状と今後」(公開版)
PDF
2015-11-26 BitVisor Summit 4(公開版)
PDF
BitVisor Summit 2 「BitVisorの現状と今後」
PDF
BitVisor Summit 3 「BitVisorの現状と今後」
PDF
余ったPCをルータに変える、ソフトウェアルータ「SEIL/x86」
 
PDF
01_2021年上半期 AWS IoT サービスアップデート
PDF
Ivsctonightandday2016winter moringsession awsreinvent2016recap
PDF
20130319勉強会
PDF
Osc2009 Do Xen Hara
PDF
SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月
PDF
IOS/IOS-XE 運用管理機能アップデート
PPTX
20170804 IOS/IOS-XE運用管理機能アップデート
PDF
OpenStack on OpenStack with CI
PDF
もしCloudStackのKVMホストでPCIパススルーできるようになったら
OpenStack 2014.1 (Icehouse Release)
BHyVe: The BSD Hypervisor
第12回CloudStackユーザ会_ApacheCloudStack最新情報
VIRLとPyATSで実現するネットワークCI
2016-11-30 BitVisor Summit 5 「BitVisorの現状と今後」(公開版)
2015-11-26 BitVisor Summit 4(公開版)
BitVisor Summit 2 「BitVisorの現状と今後」
BitVisor Summit 3 「BitVisorの現状と今後」
余ったPCをルータに変える、ソフトウェアルータ「SEIL/x86」
 
01_2021年上半期 AWS IoT サービスアップデート
Ivsctonightandday2016winter moringsession awsreinvent2016recap
20130319勉強会
Osc2009 Do Xen Hara
SR-IOV Networking in OpenStack - OpenStack最新情報セミナー 2016年3月
IOS/IOS-XE 運用管理機能アップデート
20170804 IOS/IOS-XE運用管理機能アップデート
OpenStack on OpenStack with CI
もしCloudStackのKVMホストでPCIパススルーできるようになったら
Ad

More from BitVisor (7)

PDF
BitVisor Summit 10「3. Thin Hypervisor on AArch64」
PDF
BitVisor Summit 11「2. BitVisor on Aarch64」
PDF
BitVisor Summit 8「3. AQC107 Driver and Changes coming to network API」
PDF
BitVisor Summit 7「8. ベアメタルクラウドにおけるハードウェア保護に関する研究 & Advent Calendar について」
PDF
BitVisor Summit 7「5. CTFVisor: BitVisorによるCTF作問・出題支援」
PDF
BitVisor Summit 7「4. BitVisorによるOSの見かけ上10倍速実行」
PDF
BitVisor Summit 7「3. Interesting Issues During NVMe Driver Development」
BitVisor Summit 10「3. Thin Hypervisor on AArch64」
BitVisor Summit 11「2. BitVisor on Aarch64」
BitVisor Summit 8「3. AQC107 Driver and Changes coming to network API」
BitVisor Summit 7「8. ベアメタルクラウドにおけるハードウェア保護に関する研究 & Advent Calendar について」
BitVisor Summit 7「5. CTFVisor: BitVisorによるCTF作問・出題支援」
BitVisor Summit 7「4. BitVisorによるOSの見かけ上10倍速実行」
BitVisor Summit 7「3. Interesting Issues During NVMe Driver Development」
Ad

BitVisor Summit 12「BitVisor 2023年から2024年3 月の主な変更点」

  • 1. 榮樂 英樹 株式会社イーゲル 2024-03-29 BitVisor Summit 12 BitVisor 2023年から2024年3 月の主な変更点 1
  • 2. 2 BitVisor 2023年から2024年3月 の主な変更点  Network – WireGuard対応 – TLS対応 – lwIPアップデート – バグ修正  Core – EPT/NP 1GiBページ対応 – 新CPU対応 – QEMU+Linux KVM対応  追加ファイル/API – .clang-format – ドキュメント – MAX, MIN – 乱数 – クイックソート – Unix epoch time  その他 – コード整理と改良 – バグ修正
  • 3. 3 Network: WireGuard (VPN) 対応 https://github.com/smartalock/wireguard-lwip を取り込んだ make config: WIREGUARD=1 defconfig/bitvisor.conf: config.wg.*にWireGuardの設定、さらに TCP/IPスタックを有効化 テスト用echoサーバー・クライアントの他、telnet_dbgshも動作 する ゲスト通信を強制的にWireGuardトンネルに流すモード  defconfig/bitvisor.conf: net=ipwggos, config.wg_gos.*にゲストにDHCPで返すアドレス 等を設定
  • 4. 4 Network: TLS対応 https://github.com/Mbed-TLS/mbedtls を取り込んだ make config: TLS=1 defconfig/bitvisor.conf: config.tls.*に証明書の設定 TLS通信使用例として、テスト用echoサーバー・クラ イアントにTLS対応版を追加した
  • 6. 6 Network: バグ修正 テスト用echoクライアントのメモリーリーク修正 AQC107 10GbE: 送信リングバッファーのwrappingバ グ修正  大量のパケットをまとめて送信した時に、リングバッファーのサイズマ イナス1しか入れられないところ、サイズちょうどまで入れてしまって いた virtio-netの割り込み抑制のレースコンディションを修 正
  • 7. 7 Core: EPT/NP 1GiBページ対応  背景: EPT/NPのテーブルサイズが大きい!  大きかった原因:  CPUごとにテーブルを作るため数が増える (特にCPU数が多い場合)  2MiBページのため1GiBごとに4KiBのテーブルひとつ分を消費する (特にRAM容量が大き い場合)  検討した対応策:  CPU間でテーブルを共有する - TLBシュートダウンがネック  1GiBページに対応してテーブルを減らす  実装した対応策: 1GiBページ対応  MMIOフックへの影響を最小限にするため、4GiB以上のアドレス、かつ、RAM領域に限る
  • 8. 8 Core: 新CPU対応 5-level paging (LA57)  今は使われると困るので、とりあえず隠蔽による対応とした tpause, umonitor and umwait (WAITPKG) 対応  VT-xのゲストでは、VMCSで明示的に許可されていないと使用できない ので、許可するようにした  Linux KVM上では、直接はWAITPKGが使えても、nested virtualization のVMCSには許可設定できない構成となっていることがあるため、その ような場合はWAITPKGを隠蔽する
  • 9. 9 Core: QEMU+Linux KVM対応 (1/2) BIOSのPIOによるATAストレージ読み取りエラー回避策  Debianが使用しているSeaBIOSが、DMAを使わない設定となっているため (Debian bug #934134)、INS命令によるATAストレージ読み取りが行われる  INS命令のメモリー書き込みがEPT violationになると、読み取り内容が失われてしま うため、ストレージ読み取りエラーが発生する  回避のため、先頭1MiBをマップした状態で起動するようにした xHCI para pass-through driverの修正  レジスターアクセスのビット幅がコンパイラー最適化で変わってしまうことがない ようにした  Run/Stopをセットする際に一時的にEvent Ring Dequeue Pointerレジスターが不正 な値になっていたのを修正した
  • 10. 10 Core: QEMU+Linux KVM対応 (2/2) Local APICのフック  以前のLinux KVMはVT-xのwait-for-SIPIステートに対応していなかった (Linux 5.11より前)  BitVisorに、wait-for-SIPIステートの対応チェックと、未対応の場合のエ ミュレーションを実装した ● SVM環境では以前からエミュレーションのため同じものを利用している  Local APICをパススルーにしてenable_apicv=Y (デフォルト) のLinux KVMを使うと依然として問題が発生するため、その回避用にLocal APIC を常にパススルーにしない設定を追加した ● config.vmm.localapic_intercept=1で有効
  • 12. 12 追加ファイル/API: ドキュメント  docsディレクトリにMarkdownで簡単なドキュメントを置くようにした  現状  getting_started.md - 最初に試す時の説明  driver_guide.md - PCI para pass-through driverの書き方  Mbed-TLS.md - TLS設定方法  wireguard.md - WireGuard設定方法  wireguard_guest_os.md - ゲスト通信を強制的にWireGuardトンネルに流すモードの設定方法  今後の目標: バージョン1.1のマニュアル (2010年12月) の内容を網羅で きると嬉しい
  • 13. 13 追加ファイル/API: MAX, MIN #include <common.h> MAX(a, b) MIN(a, b) よく出てきがちな大小比較をマクロにした storage実装でのみ使われていたmin関数 (int型用、なぜ かstring.hに存在していた) を削除し、代わりに導入し たもの
  • 14. 14 追加ファイル/API: 乱数 #include <core/random.h> unsigned int random_num_hw (unsigned int retry_times, unsigned int *out_num);  ハードウェアの乱数生成器 (RDRAND命令) を用いた乱数取得  1が返されると*out_numに返された値が有効、0は無効 unsigned int random_num_sw (void);  簡単な疑似乱数
  • 15. 15 追加ファイル/API: クイックソート #include <core/qsort.h> void qsort (void *base, size_t nmemb, size_t size, int (*cmp) (const void *, const void *)); 標準Cライブラリーのqsort相当 initfuncのソートがバブルソートのようなものだったの を置き換えたのと、新たにメモリーマップのソートを するのに使用
  • 16. 16 追加ファイル/API: Unix epoch time #include <core/time.h> void get_epoch_time (long long *second, int *microsecond); 起動時に現在時刻を取得し、そこからの経過時間を足 して現在のUnix epoch timeとして返す  経過時間は既存のget_time()を使用しているため、ゲストの動作によっ てはズレることがある WireGuard, TLSとSQLiteで使用
  • 17. 17 その他: コード整理と改良 (1/2)  x86依存部分の分離  使われていなかったMAP_UEFI_MMIOを削除  gmm_pass: 不必要なincludeを削除、他から使われていない関数をstaticに 変更  timer: 処理を整理しコメントを追加、メモリー書き込み回数を削減  リンク時の警告requires executable stackを抑制 (-Wa,--noexecstackオプション)  tools/log: 新しいバージョンのLinuxに対応  time: TSC周波数をCPUIDで取得できる場合はそれを使うように変更 (起動 時間0.6秒短縮・時刻情報の精度向上)
  • 18. 18 その他: コード整理と改良 (2/2) EPT/NP: 処理を整理しcur_moveの呼び出し回数を削減した VT-x: INVEPT命令を必要時のみ使うように改良した VT-x: CR0のPEとPGビットの変更に伴うVM Exitを減らした VT-x nested virtualization  ゲストがVPIDを使えるようにした  TLBフラッシュを必要時のみ行うようにした make compile_commands.jsonに対応した  clangd用
  • 19. 19 その他: バグ修正 (1/7) uhci, ehci, xhci: ファームウェアドライバー切り離し ACPI: RESET_REG_SUPの確認  RESET_REGが使えない環境は見たことがないため気づかなかったが、使えない環境が あり得る boot/uefi-loader-login: module2.binサイズ  64KiBまでだったのを1MiBまでに増やした  1MiBちょうどの場合は続きがある可能性があるのでエラーとした CPUID 0x40000000 - 0x4FFFFFFFの隠し方を修正  仮想マシンに使われるCPUID  0を返すのではなく、highest basic information leafを返す
  • 20. 20 その他: バグ修正 (2/7) crypto: LONG_MIN, LONG_MAXとULONG_MAXを修正  32ビット用の値に固定されていた 並列ビルド時のSQLiteビルドエラーを修正 vmmcall_log: 古いmapmem_gphysが残っていてビルドエラーになっ ていたのを修正 NMIのIRET命令によるブロック解除のバグを修正  IRET命令でEPT violationやページフォールトの際はIRETを再実行するためNMIブロック設 定  IRET命令エミュレーションの時にブロック解除 NVMe暗号化のレースコンディション修正
  • 21. 21 その他: バグ修正 (3/7) Start-up IPI (SIPI) の取りこぼし (1) 問題  Wait-for-SIPIステートでなければSIPIは失われる  UEFI環境では、ゲストが最初にINITを送る時にVMMがAPを開始するが、 APがwait-for-SIPIステートに入る前にBSPのゲストが再開してSIPIを 送ってしまい、取りこぼすケースがあった (macOS 13で発生) BSP VM ───┐ ┌─┬─────── BSP VMM └─┬───┘ │ . │ ┊ AP VM │ ┊ ╒═════ AP VMM └───────┘ BSP VM INIT BSP VMM SIPI . AP VM AP VMM Wait-for-SIPI ・ ───────────────→ (時間)
  • 22. 22 その他: バグ修正 (4/7) Start-up IPI (SIPI) の取りこぼし (1) 対策  Wait-for-SIPIステートに入るVMLAUNCHまでBSPが待つ実装を追加し た  厳密にはVMLAUNCHを実行して実際にステートに入るまで待たないと いけないが、実装はVMLAUNCHの直前まで待つもので、実用上は問題 ない見込み BSP VM ───┐ ┌─┬─────── BSP VMM └─┬───╍╍╍╍╍┘ │ . │ │ AP VM │ ╒══╡ ┌─── AP VMM └───────┘ └───┘ BSP VM INIT 待ち BSP VMM SIPI . AP VM AP VMM ・ ───────────────→ (時間)
  • 23. 23 その他: バグ修正 (5/7) Start-up IPI (SIPI) の取りこぼし (2) 問題  AP開始済みの状態で、INITを受けてからwait-for-SIPIステートに入るま でに時間がかかりすぎて取りこぼすケースが、特にnested virtualization で見られた BSP VM ───┬─────┬──────── . │ │ . │ ┊ AP VM ───┤ ┊ ╒══════ AP VMM └───────┘ BSP VM . INIT SIPI . AP VM AP VMM Wait-for-SIPI ・ ───────────────→ (時間)
  • 24. 24 その他: バグ修正 (6/7) Start-up IPI (SIPI) の取りこぼし (2) 対策  INITを受けたらなるべく早くwait-for-SIPIステートに入るようにした  特にLinux KVMではステートだけでも先にVMWRITEしておくと失われ なくなるようだ BSP VM ───┬─────┬──────── . │ │ . │ │ AP VM ───┤ ╒═══╡ ┌──── AP VMM └─┘ └───┘ BSP VM . INIT SIPI . AP VM AP VMM ・ ───────────────→ (時間)
  • 25. 25 その他: バグ修正 (7/7) Wait-for-SIPIステートにおける割り込みの問題を修正 a)VT-xで、wait-for-SIPIステートに入る時にまだ割り込みのイベントデリバ リーが残っていると、VM entry failure panicとなる問題 b)VT-xで、wait-for-SIPIステートに入る直前にNMIが発生すると、割り込みの イベントデリバリーを設定してしまう問題 c)Wait-for-SIPIのエミュレーション (SVMの場合、または、VT-xで config.vmm.localapic_intercept=1またはwait-for-SIPIに対応していない場合) の間にNMIが発生すると、SIPIの直後にNMIを発生させてしまう問題 . . │ │ . │ │ AP VM ───┤ ╒═══╡ ┌──── AP VMM └─┘ └───┘ . INIT SIPI . AP VM AP VMM ・ ───────────→ (時間) c)NMIが発生 a), b) panic c)NMIを発生 b)NMIが発生
  • 27. 27 BitVisor 2023年から2024年3月 の主な変更点  Network – WireGuard対応 – TLS対応 – lwIPアップデート – バグ修正  Core – EPT/NP 1GiBページ対応 – 新CPU対応 – QEMU+Linux KVM対応  追加ファイル/API – .clang-format – ドキュメント – MAX, MIN – 乱数 – クイックソート – Unix epoch time  その他 – コード整理と改良 – バグ修正 最新リポジトリ http://bitvisor.sf.net