[BitVisor-devel:131] BitVisor 3.0 released

Hideki EIRAKU hdk @ igel.co.jp
2024年 8月 20日 (火) 18:30:11 JST


こんにちは。

BitVisor 3.0 のリリースをお知らせできることをうれしく思います。

    https://sourceforge.net/projects/bitvisor/files/bitvisor/3.0/

BitVisor 3.0 と BitVisor 2.0 との違いは以下の通りです。

============================================================
大きな変更

- AArch64 support
- Switch to Kconfig
- Refactoring for AArch64 support
- VT-d DMA remapping pass-through support
- Improve UEFI code

------------------------------------------------------------
AArch64 support

AArch64に対応しました。使い方についてはdocs/getting_started.mdを、実装
についてはdocs/aarch64/overview.mdを参照してください。

------------------------------------------------------------
Switch to Kconfig

make configがKconfigに切り替わりました。.configファイルにfoo=0, foo=1
形式で書かれていた従来の内容を引き継ぐには、foo=n, foo=y形式に置換する
必要があります。

従来のmake configとは異なり、Kconfigは依存関係の情報を持つことができま
す。例えば、CONFIG_DISABLE_SLEEPはCONFIG_ACPI_DSDTに依存します。この情
報によって、正しくない選択を防ぐことができます。

------------------------------------------------------------
Refactoring for AArch64 support

アーキテクチャー依存部分を分離するためのリファクタリングを行いました。

------------------------------------------------------------
VT-d DMA remapping pass-through support

VT-d DMA remappingパススルーに対応しました。make configで
CONFIG_DMAR_PASS_THROUGH=yにすると有効になります。有効にすると、ゲスト
オペレーティングシステムがVT-dを使うことができます。VMMの領域を、RMRR
に追加することで、VMMの領域に対するDMAが使えるようにします。また、パラ
パススルードライバーがゲストオペレーティングシステムのDMA領域にアクセ
スする時に、仮想アドレスからの変換を行います。

本機能のため、アドレス空間"as"が導入されました。"as"に関連する変更を以
下に示します:

- 従来のmapmem_gphysは廃止され、代わりにアドレス空間を指定する
  mapmem_asが導入されました。
- パススルーの仮想マシンに対するアドレス空間として、グローバル変数
  as_passvmが追加されました。
- struct vcpuには仮想マシンのアドレス空間として"as"が追加されました。
  しかし、現在はパススルーの仮想マシンしかないため、as_passvmと同一で
  す。
- struct pci_deviceに、DMAのためのアドレス空間としてas_dmaが追加されま
  した。as_dmaは、本機能が有効でない場合はas_passvmと同一となり、有効
  の場合はそのデバイスに対応するアドレス空間を示します。

as_dmaはDMAのためのものであることに注意してください。デバイスのレジス
ターにアクセスするにはas_passvmを使用します。

------------------------------------------------------------
Improve UEFI code

- UEFI対応に使用していたEDKをEDK2に変更しました。
- UEFIアプリケーションのビルドに使用していたMinGWをClangに変更しました。
- UEFIアプリケーションのビルド用にMakefile.uefi.commonを追加しました。

============================================================
新しいデバイス対応

- NVMe
- Marvell (Aquantia) AQC107
- Realtek RTL8168

------------------------------------------------------------
NVMe

NVMeに対応しました。vmm.driver.pciに、driver=nvmeと指定することで有効
になります。ataおよびahciと比べてより拡張性が高い実装となっています。
以下のパラメーターがあります:

- storage_io: 1にすると、storage_ioが有効になります。
- ext: encryptにすると、ストレージ暗号化が有効になります。その他の拡張
  を実装して追加することもできます。
- filter_msi: 1にすると、MSIフィルターが有効になります。ゲストオペレー
  ティングシステムがMSIを有効にしている時に、割り込みマスクがセットさ
  れた状態で発生した割り込みを破棄します。ゲストオペレーティングシステ
  ムがコントローラーリセットをして正常に起動しない場合に使用します。

また、ANS2にも対応しています。vmm.driver.pciに、driver=nvme_appleと指
定することで有効になります。上のパラメーターに加え、ans2_wrapperパラメー
ターがあります。本パラメーターを1にすると、ANS2のハードウェア暗号化が
隠蔽されます。

------------------------------------------------------------
Marvell (Aquantia) AQC107

Marvell (Aquantia) AQC107に対応しました。make configでCONFIG_NET_AQ=y
とし、vmm.driver.pciに、driver=aq,virtio=1と指定することで有効になりま
す。virtio-netのみの対応です。

------------------------------------------------------------
Realtek RTL8168

Realtek GbE NICに対応しました。FreeBSDのコードを取り込んでいます。make
configでCONFIG_NET_RE=yとし、vmm.driver.pciに、driver=reと指定すること
で有効になります。デバイス隠蔽モード (net=ipのような) か、または、
virtio-netのみの対応です。

============================================================
仮想デバイス対応

- 仮想virtio-net

------------------------------------------------------------
仮想virtio-net

仮想virtio-netデバイスに対応しました。以下のように指定することで、仮想
virtio-netデバイスがVMMのTCP/IPスタックとつながります:

vmm.driver.pci_virtual="driver=virtio-net, net=ip"

既存のnetインターフェイスを流用していますが、netインターフェイスの仮想
デバイス側は使用せず、物理デバイス側が仮想マシンにつながります。そのた
め、tty=1を指定してVMMログを仮想マシンに送ることもできます。

============================================================
ネットワーク改良・機能追加

- Add WireGuard
- Add WireGuard Guest OS
- Add TLS
- Update lwIP
- Virtio 1.1 support (virtio-net) / VT-d pass-through support
- Improve TCP/IP performance
- bnx: add hotplugpass option

------------------------------------------------------------
Add WireGuard

WireGuardに対応しました。ip/wireguard/wireguard-lwip/ディレクトリに
wireguard-lwipを取り込んでいます。make configでCONFIG_WIREGUARD=yにす
ると有効になります。VMMのTCP/IPスタックを使用する際、WireGuard VPNトン
ネルが使用できます。詳しくはdocs/wireguard.mdを参照してください。

------------------------------------------------------------
Add WireGuard Guest OS

ゲストオペレーティングシステムの通信をWireGuard VPNトンネルに流す機能
を追加しました。既存のIPsec VPNとは異なり、TCP/IPスタックを用いていま
す。そのため、VMMもトンネルを通して通信できます。詳しくは
docs/wireguard_guest_os.mdを参照してください。

------------------------------------------------------------
Add TLS

TLSに対応しました。ip/mbedtls/mbedtls-2.28.6/ディレクトリにMbed TLSを
取り込んでいます。make configでCONFIG_TLS=yにすると有効になります。詳
しくはdocs/Mbed-TLS.mdを参照してください。

------------------------------------------------------------
Update lwIP

lwIPを2.1.3にアップデートしました。

------------------------------------------------------------
Virtio 1.1 support (virtio-net) / VT-d pass-through support

virtio-netについて、virtio 1.1に対応しました。VT-d DMA remappingパスス
ルーのため、virtio 1.1で定義されているVIRTIO_F_ACCESS_PLATFORMに対応し
ました。

------------------------------------------------------------
Improve TCP/IP performance

VMMでTCP/IPスタックを使用し、ゲストオペレーティングシステムの通信がパ
ススルーとなるnet=ippassについて、不必要な受信パケットをフィルタリング
するnet=ippassfilterとnet=ippassfilter2が追加されました。VMMおよびゲス
トオペレーティングシステムのそれぞれで不必要と考えられるパケットを受信
直後に破棄することで、それぞれのTCP/IPスタックの負荷を減らします。
net=ippassfilterは完全にフィルタリングし、net=ippassfilter2はゲストオ
ペレーティングシステムのフィルタリングが100パケット連続にならないよう
にします。net=ippassfilter2はLinuxのnobody caredエラーを回避するために
追加されました。

その他の改善:

- virtio-net: try to submit packets in a batch to the device driver
- ip: avoid using ntohs() in ip_main_input()
- ip: reduce lwip_htons and lwip_htonl overhead
- ip: reduce number of alloc/free/memcpy when a packet has been received

------------------------------------------------------------
bnx: add hotplugpass option

bnx driverにhotplugpassオプションが追加されました。hotplugpass=1が指定
されると、VMM起動後にホットプラグされたbnxデバイスはパススルーになりま
す。

============================================================
コア改良・機能追加

- dres_reg
- VT-x unsafe nested virtualization
- Nested Virtualizationの改良
- VT-x性能改善
- 大容量メモリー・多数CPUコア対応
- Improve heap allocation
- Improve process features
- 新CPU対応
- New machines support
- QEMU+Linux KVM対応
- Improve handling INIT
- Improve debug features
- Improve panic routine
- Improve string routines
- Introduce MAPMEM_CANFAIL and MAPMEM_UC flag
- PKRU state pass-through
- Conceal SMX

------------------------------------------------------------
dres_reg

デバイスレジスターのアクセスと、デバイスレジスターアクセスのトラップに
関する処理を共通化するdres_regを導入しました。

------------------------------------------------------------
VT-x unsafe nested virtualization

VT-xのunsafe nested virtualizationに対応しました。

------------------------------------------------------------
Nested Virtualizationの改良

Partially safe modeに対応しました。Partially safe modeでは、RAMをパス
スルーとした仮想マシンを用いた攻撃を防止します。VT-xでは、EPTのシャドー
を作成して、SVMでは、RVIを隠蔽してVMMのRVIを適用することにより実現しま
す。

詳しくはdocs/nested_virtualization.mdを参照してください。

------------------------------------------------------------
VT-x性能改善

- INVEPT命令の使い方を改善し、必要な時のみ使うようにしました。
- Unrestricted guestが有効な場合、CR0のPEビットおよびCR4のPGEビットの
  変更のVM exitをしないようにしました。
- PCIDに対応しました。

------------------------------------------------------------
大容量メモリー・多数CPUコア対応

近年のRAM容量増加とCPUコア数増加に伴うVMMのメモリ不足問題に対応するた
め、以下の変更を行いました:

- EPTおよびRVIで、1GiBページが使用可能であれば使用するようにしました。
- EPTおよびRVIのために、各論理プロセッサごとに1024ページを確保していた
  のを大きく削減し、16ページから始め、必要に応じて256ページまで増やす
  ようにしました。

さらに、次項のヒープアロケーションの改善も、CPUコア数増加に対応するも
のとなっています。

------------------------------------------------------------
Improve heap allocation

ヒープアロケーションを改善し、使われていない領域を減らしました。例えば、
VMMが、x86 64ビット用のstruct vcpu、0x80630バイトをアロケートする時、
従来は内部で0x100000バイトをアロケートしていましたが、現在は0x81000バ
イトとなります。struct vcpuは論理プロセッサごとにアロケートされる構造
体であるため、この0x7f000バイトの差は、コア数が多いほど大きくなります。

さらに、ページサイズより小さなアロケーションにおいて、線形探索を避ける
ことにより、性能を改善しました。128バイトから2048バイトまでの"small"ア
ロケーションは、struct pageに追加された最大32ビットのビットマップとリ
ストを使用して管理されます。16, 32および64バイトの"tiny"アロケーション
は、32倍のサイズの"small"アロケーションに、追加の32ビットのビットマッ
プとリストを使用して管理されます。

------------------------------------------------------------
Improve process features

プロセス機能を以下のように改善しました。

- プロセスの読み取り専用セグメントが共有マップになりました。大きなtext
  セクションを持つプロセスを実行した時に、textセクションがヒープにコピー
  されないため、ヒープの使用量が削減されます。

- 名前無しのmsgregisterとmsgsenddescに対応しました。msgregister()に名
  前NULLを指定して、名前無しの関数ポインターを登録できます。返されたディ
  スクリプターにMSGSENDDESC_MYFUNCフラグをORしてmsgsenddesc()を呼び出
  すことで、他のプロセスへ転送できます。従来は名前を使用してどのプロセ
  スからもmsgopen()できていましたが、名前無しの関数ポインターは
  msgopen()ができないため、特定のプロセスからのみ呼び出し可能なコール
  バックに使用できます。

------------------------------------------------------------
新CPU対応

新しいCPUに対応しました。

- LA57 (5-level paging) を隠蔽するようにしました。
- WAITPKG (TPAUSE, UMONITORおよびUMWAIT命令) に対応しました。
- AVX512に対応しました。
- Memory Protection Extension (MPX)のパススルーに対応しました。
- Hardware Feedback Interfaceに対応しました。
- Processor Traceに対応しました。vmm.allow_ptにより、パススルーにする
  か隠蔽にするかを以下のように選択します:
  - 0: Processor Traceは隠蔽されます。
  - 1: Processor Traceはアドレス変換ありのパススルーとなるか、または、
    CPUがアドレス変換に対応していない場合は隠蔽されます。
  - 2: Processor Traceはアドレス変換なしのパススルーとなります。

------------------------------------------------------------
New machines support

新しいマシンで発生する問題を修正しました。

- 新しいMacファームウェアとmacOSで発生する問題を修正しました。
  - NVMeのdisconnectionが失敗しないようにする回避策が追加されました。
  - ファームウェアが特権レベル3を使用できるようにしました。
  - ファームウェアがCR4.SMEP=1 and EFER.NXE=1を使っている場合にも動作
    するようにしました。
  - virtio-netのVIRTIO_NET_F_CTRL_VQとVIRTIO_NET_F_CTRL_RXに対応しまし
    た。
- 新しい富士通PCファームウェアで発生する問題を修正しました。
  - InstallConfigurationTableが使用された場合にもACPIのテーブルの変更
    が適用されるようにしました。

------------------------------------------------------------
QEMU+Linux KVM対応

BitVisorをQEMU+Linux KVM上で動作させるための修正:

- CPUIDの0x40000000から0x4FFFFFFFの範囲を隠蔽するようにしました。この
  範囲はLinux KVMなどのVMMで使用されており、パススルーとしているとそれ
  らのVMMの機能が使用され、BitVisorは対応していないためエラーが発生す
  る場合がありました。
- Blocking by STIビットがセットされた状態で外部割り込みによるVM exitが
  発生するとpanicしていた問題を修正しました。
- DMAを使用せずATAのストレージ読み取りを行うBIOSにおいて、INS命令のメ
  モリ書き込みでVM exitが発生することによるデータ破損を避けるため、RAM
  の先頭1MiBを最初にマップするようにしました。
- Linux KVMのAPICVが有効だとlocal APICのパススルーにより問題が発生する
  ことがあります。その問題はvmm.localapic_intercept=1とすることで回避
  できるようにしました。

QEMU+Linux KVMがBIOS環境の場合、CONFIG_TCG_BIOS=yだとQEMUが異常終了し
てしまうことがあります。

------------------------------------------------------------
Improve handling INIT

- VT-x環境におけるwait-for-SIPIエミュレーションに対応: wait-for-SIPI
  stateに対応していないプロセッサ、または、vmm.localapic_intercept=1で
  有効化されます。
- ゲストオペレーティングシステムから送られたSIPIが失われる問題の回避策:
  INITによるVM exitからなるべく早くwait-for-SIPIに遷移するようにしまし
  た。
- Wait-for-SIPIとpending割り込みのpanicの修正: Pending割り込みが残った
  ままwait-for-SIPI stateになった時のpanicを修正しました。
- Wait-for-SIPIとNMIの問題の修正: Wait-for-SIPIのエミュレーションの間の
  NMIを破棄していなかった問題を修正しました。
- VMRUN命令直前のINIT処理の修正: VMRUN命令実行直前にINITがNMIと同様に
  チェックされるようにしました。

------------------------------------------------------------
Improve debug features

- debugコマンドのdump memoryコマンドに長さオプションを追加しました。
- CONFIG_DEBUG_SERIALを追加しました。x86ビルドでは、これをyにすると、
  仮想シリアルデバイスがI/Oポート0x400に追加されます。Linuxのパラメー
  ターに "earlyprintk=serial,0x400,keep" を指定することで、Linuxの
  early console出力をVMMのログとして得られます。
- デバッグ用telnetサーバーを追加しました。vmm.telnet_dbgsh=1にすると、
  TCP/IPスタックを利用して、telnetポートでdbgshにアクセスできます。
  Panicした時は、TCP/IPスタックとネットワークデバイスドライバーの動作
  に支障がない場合に限りアクセスできます。vmm.telnet_dbgsh=1の場合、
  panic時のキーボードやシリアルポートによるシェルアクセスは無効になり
  ます。

------------------------------------------------------------
Improve panic routine

- プロセッサ数が6より多い場合でもレジスターダンプをすべて出力するよう
  にしました。
- panic処理中にpanicが発生した時に、無限ループを回避しながらできるだけ
  情報を出力するようにしました。

------------------------------------------------------------
Improve string routines

- 性能を改善しました。
- 必要のないコードがオブジェクトに残らないようにしました。

------------------------------------------------------------
Introduce MAPMEM_CANFAIL and MAPMEM_UC flag

mapmem_hphysおよびmapmem_as関数のフラグにMAPMEM_CANFAILとMAPMEM_UCが追
加されました。

MAPMEM_CANFAILフラグがあると、マップに失敗した時にNULLを返します。この
フラグがないと、マップに失敗した時にpanicします。ドライバーでNULLチェッ
クがされていない部分が多かったことと、NULLの時に動作を継続できる処理が
coreの一部のみだったため、このフラグを導入しました。

MAPMEM_UCフラグは、uncacheableを意味します。MAPMEM_PCD, MAPMEM_PWTおよ
びMAPMEM_PATはx86専用ですが、MAPMEM_UCはx86とAArch64のどちらでも使用で
きます。

------------------------------------------------------------
PKRU state pass-through

PKRU stateをパススルーとしました。これはnested virtualizationを使う
BitVisor上でVMware Workstationが動作しない問題を回避します。

------------------------------------------------------------
Conceal SMX

SMXを隠蔽しました。これはWindows 10 Fall Creators UpdateにおいてGETSEC
VM exitを原因とするpanicを回避します。

============================================================
その他の機能追加

- SQLite
- Add UEFI Graphics Output Protocol VGA driver
- シンプルな追加機能 (コード以外)
- シンプルな追加機能 (コード)

------------------------------------------------------------
SQLite

SQLite RDBMSが追加されました。process/sqlite/sqlite3.cにamalgamation版
のSQLiteを取り込んでいます。make configでCONFIG_SQLITE=yにすると有効に
なります。process/sqlite/ディレクトリ上の保護ドメインで使用することが
できます。sqliteexampleという名前の使用例が入っています。有効にすると、
dbgshからsqliteexampleを実行して試すことができます。現在のところ64ビッ
ト環境のみの対応です。

------------------------------------------------------------
Add UEFI Graphics Output Protocol VGA driver

UEFI Graphics Output Protocol VGA driverが追加されました。make config
でCONFIG_VGA_UEFI=yにすると有効になります。CONFIG_TTY_VGAと組み合わせ
て画面へのログ出力に使用できます。その他の画面出力に使用するコードを追
加できます。ただし、UEFIファームウェアのGraphics Output Protocolがフレー
ムバッファーの情報を提供している場合に限り動作します。また、ゲストオペ
レーティングシステムのグラフィックスデバイスドライバーのロード後は正し
く表示されない場合があります。

------------------------------------------------------------
シンプルな追加機能 (コード以外)

開発および使用に便利なファイルおよび機能が追加されました:

- .clang-formatファイルが追加されました。clang-formatバージョン15以降
  で使用できます。コード全体に適用するのではなく、追加部分に適用し、適
  用後に必要に応じて手で修正を加える使い方が想定されています。
- compile_commands.jsonファイルを生成するMakefileルールが追加されまし
  た。
- ドキュメントを置くためのdocs/ディレクトリが追加されました。いくつか
  はすでにドキュメントが追加されています。

------------------------------------------------------------
シンプルな追加機能 (コード)

以下の関数およびマクロが追加されました:

- MAX, MINマクロが追加されました。ストレージ実装にあったmin関数は削除
  されました。
- 乱数を得るrandom_num_hw関数とrandom_num_sw関数が追加されました。
- クイックソートを行うqsort関数が追加されました。
- Unix epoch timeを得るget_epoch_time関数が追加されました。起動時に取
  得した時刻とget_time関数の返り値から計算するので、正確ではありません。

============================================================
様々な修正

virtio-netの様々な問題を修正しました:

- virtio_net: fix buffer overflow in case of sending too large packet
- virtio_net: add MAPMEM_WRITE to mapmem_as() in do_net_ctrl() for correctness
- virtio_net: restore unconditional vnet->intr_clear() behavior
- virtio_net: make virtio_net_msix() fill data properly for read-only address
- virtio_net: avoid hardcoding queue size
- virtio_net: expose PCI_COMMAND_MEMENABLE
- virtio_net: use MAPMEM_WRITE when mapping buffer in do_net_send()
- virtio_net: do not clear legacy interrupt when triggering MSI
- virtio_net: suppress interrupts while receive ring buffer is full

bnx driverの様々な問題を修正しました:

- bnx: rework on bnx_reset()
- bnx: clean up bnx_intr_disable()/bnx_intr_enable()
- bnx: use MAC address provided by firmware if available
- bnx: clear status word before proceeding to read producer/consumer index
- bnx: refer producer/consumer indexes directly instead of copying them
- bnx: receive all packets in the buffer at once
- bnx: fix unexpected delay of received packets
- bnx: ignore firmware's MAC address for Thunderbolt to Ethernet devices
- bnx: replace 0x0204 offset with BNXREG_HMBOX_INTR_CLR

pro1000 driverの様々な問題を修正しました:

- pro1000: improve TX initialization for QEMU e1000e
- pro1000: set ITR to improve RX throughput on old models
- pro1000: add 8086:15e3 I219-LM
- pro1000: add 8086:156f I219-LM
- pro1000: add 8086:15be I219-V
- pro1000: add 8086:15bd I219-LM
- pro1000: map registers with MAPMEM_UC as well
- pro1000: send only if the link is up
- pro1000: ICS register is write-only
- pro1000: take care of 64-bit address in write_mydesc()
- pro1000: clean up magic numbers
- pro1000: generate virtio interrupts properly on recent Linux guest

xhci driverの様々な問題を修正しました:

- drivers/usb/xhci: force the compiler to access registers with the correct size
- drivers/usb/xhci: fix "ERDP out of bounds" error when running on QEMU
- xhci: always write host value to the controller when guest writes to ERDP
- xhci: introduce host controller states and check them
- xhci: read capability registers using 32-bit aligned access
- xhci: trigger a panic on data inconsistency in the driver
- xhci: update VMM state upon detecting a controller error
- xhci: optimize struct xhci_guest_data
- xhci: release guest's ERST data just before changing the controller state to RUNNING
- xhci: reallocate the VMM's event ring if the size of the ring changes
- xhci: initialize the event ring and related data just before ERSTBA writing
- xhci: process the current state of the event ring properly
- xhci: allow variable size access to the capability registers
- xhci: switch to a big lock during xHCI register access
- xhci: remove "state_saved" member and panic when CRS bit is set
- xhci: rename "xhci_hc_reset()" and call it at the proper time
- xhci: support UEFI xHCI driver
- xhci: xHCI Local Memory Capability reports size in 1KB block
- xhci: rename 'offset' to 'field_offset' for naming consistency
- xhci: support USB_HOOK_DISCARD

プロセスの様々な問題を修正しました:

- process: msgsenddesc is only allowed with desc returned by newprocess
- process: add some sanity checks of system call arguments
- msg, process: copy strings until NUL
- process: check array index limit
- Makefile: strip process elf files
- process: clear TF on syscall
- process: disable syscall/sysret by default

TCP/IPスタックのechoクライアントの問題を修正しました:

- ip/echoctl: move the assignment of 'echo_client_pcb' into connected
- ip/echoctl: fix the memory leaking issue in echo-client
- ip/echoctl: add an optional parameter for client connect to assign netif
- ip/echoctl: recycle the pcb after disconnected from remote server

boot/uefi-loader-loginの問題を修正しました:

- boot/uefi-loader-login: extend maximum module2.bin size to 1MiB
- boot/uefi-loader-login: print error when module2.bin is too large

coreの様々な問題を修正しました:

- vmmcall_boot, thread: make vmmcall_boot_thread run on CPU0 to avoid errors
- main: fix panic when booting with minios
- entry: clear %rbp before calling vmm_main
- cpuid_pass: apply correct value to OSXSAVE and PKE
- svm: conceal SVM-Lock feature
- svm: check unsafe_nested_virtualization in svm_msr.c
- sync all processors when resume from suspend-to-RAM
- cpu_interpreter: fix rep string behavior in case of exception or IOACT_RERUN
- cpu_interpreter: fix movabs instruction with 64bit offset support
- xsetbv_pass: fix panic if an exception occurs during xsetbv
- spt: remove incorrect fast path
- vt, svm: fix task switch updating instruction pointer properly
- vt: clear XSS-exiting bitmap properly
- msr_pass: workaround for processor stall during microcode update
- msr_pass: workaround for operating system panic during microcode update
- nmi: set %gs in the #NMI handler
- nmi: refactor NMI handler
- vt_main: use NMI-window exiting instead of skipping NMI check if other event injection exists
- vt, nmi: handle NMI around vmlaunch/vmresume properly
- vt_main: handle multiple NMIs properly
- svm_main: handle NMI better if other event injection exists when NMI comes
- svm: handle NMI around vmrun properly
- svm_main: handle multiple NMIs properly
- vt_main: do not clear first flag in NMI case
- vt, svm, cpu_interpreter: handle unblocking NMIs by IRET instruction properly
- vt, svm: initialize debug registers in vmctl.reset()
- vt: clear states in vt_reset()
- svm, vt: reset LDTR, TR, GDTR and IDTR properly
- msr_pass: handle IA32_TSC_ADJUST MSR properly
- mm: unlock mapmem_lock when mapmem fails
- mm: increase mapmem space to avoid panic in pci_init.c on 32bit environment
- mm: flush TLBs properly in the unmap_user_area() function
- ap: add eoi function
- ap: print AP message after loading segment and interrupt descriptor tables
- ap: map local APIC registers on start instead of on every use
- acpi: look at another RSDT if UEFI firmware provides ACPIv1 table at different address from ACPIv2 table
- acpi: disable VT-d by default
- acpi: check RESET_REG_SUP bit before reading RESET_REG
- acpi: check whether DSDT address is available before using
- calluefi: CR4.VMXE=0 for a VM
- uefi: check NULL pointer at the end of boot_options array
- time: initialize timediff properly for APs on UEFI environment
- time: update timediff properly on wakeup
- time: use clock information in CPUID if available

些細な問題や記述を修正しました:

- cpu_interpreter: fix default segment
- uefi: fix trivial sizeof incorrect variable name
- bnx: fix some trivial log mistakes in bnx_rx_ring_set() and bnx_tx_ring_set()
- constants: add comment "32-Bit Read-Only Data Fields" for VMCS definitions
- access EFER with 64bit width
- entry: minor fixes in uefi64_entry
- vt: check whether 2MiB page is supported for EPT
- cache: use proper constant name instead of + 1
- ieee1394: remove -DIEEE1394_CONCEALER and compile the driver if necessary
- move size_t definition from share/vmm_types.h to core/types.h
- boot: update login-simple to use config.h and vmm_types.h in include/share
- bitvisor.lds: replace spaces with tabs for indentation
- mm: use mapmem_hphys/mapmem_gphys instead of mapmem function
- crypto: fix LONG_MIN, LONG_MAX and ULONG_MAX
- ipchecksum: treat zero as described in RFC 1071

コンパイル・リンク時の警告を減らしました:

- Makefile: add -Wno-address-of-packed-member
- boot/login-simple: add -static option to suppress warnings
- tty: fix unused variable warnings when building with CONFIG_TTY_SERIAL=1

pciのルーチンを改良しました:

- pci_core: introduce pci_enable_device()
- pci: improve initialization loop to avoid unexpected result
- pci: introduce pci_find_cap_offset()
- pci: PCI PMIO is only relevant to x86
- pci: rename pci_save_config_addr() to pci_pmio_save_config_addr()
- pci: initial support for multiple PCI segments
- pci: avoid hard-coding maximum number of virtual devices
- pci: don't use memcpy() for accessing registers

不要なコードを削除しました:

- x86: remove unused code related to the legacy PIC
- Makefile.config: remove SELECT_AES_GLADMAN
- Makefile.config: remove SPINLOCK_DEBUG
- vt_ept, svm_np, mm, gmm_pass, Makefile: remove MAP_UEFI_MMIO and related funcs
- gmm_pass: make some functions static and remove unnecessary header
- uhci, ehci: remove unused variables
- core: remove vpn_ve code
- driver/core: remove unneeded header

新しいバージョンのコンパイラーとリンカーに対応しました:

- fix "cannot represent relocation type BFD_RELOC_X86_64_32S" error when compiling 32bit
- cpu_interpreter: 32bit compilation error workaround
- Makefile: add -Wa,--noexecstack option

その他の改良を行いました:

- LICENSE: remove unnecessary running number
- uhci, ehci, xhci: disconnection process to avoid bitvisor and firmware conflicts
- timer: clean up timer_thread()
- tools/log: newer Linux support
- storage: reorganize storage-related files
- drivers: ensure drivers can access devices by calling pci_enable_device()

楽しんで下さい!

-- 
Hideki EIRAKU <hdk @ igel.co.jp>


BitVisor-devel メーリングリストの案内