BitVisor のコンパイル

Linux, Windows, Mac で BitVisor をコンパイルする方法を紹介します。

# Linux
まずはコンパイル環境を整えます。

Fedora の場合は以下のとおりです。

```bash
$ sudo dnf -y install mercurial make gcc mingw64-gcc
```

CentOS の場合は以下のとおりです。

```bash
$ sudo yum -y install mercurial make gcc epel-release
$ sudo yum -y --enablerepo=epel install mingw64-gcc
```

Ubuntu の場合は以下のとおりです。

```bash
$ sudo apt-get -y install mercurial make gcc mingw-w64
```

次に、BitVisor の最新版を BitBucket から取得してコンパイルします。

```bash
$ hg clone https://bitbucket.org/bitvisor/bitvisor
$ cd bitvisor
$ make
$ make -C boot/loader
$ make -C boot/uefi-loader
```

以下のファイルが生成されていたら成功です。

* bitvisor.elf
* boot/loader/bootloader
* boot/loader/bootloaderusb
* boot/uefi-loader/loadvmm.efi

とても簡単ですね。

# Windows
ここでは MSYS2 を使った方法を紹介します。

まずは、下記の「MSYS2 installer」のページに従って MSYS2 をインストールしてください。64bit版 (msys2_x86_64-????????.exe) を選択します。 
http://msys2.github.io/

インストールされた「MSYS2 Shell」を起動して、コマンドプロンプトを表示します。

次に、クロスコンパイラをインストールするための設定をします。下記のページにある crossgcc を使用します。
http://osdn.jp/projects/msys2-crossgcc/

(1) /etc/pacman.conf に crossgcc のリポジトリを追記します。

```bash
$ cat >> /etc/pacman.conf
[crossgcc]
SigLevel = Optional TrustAll
Server = http://osdn.dl.osdn.jp/msys2-crossgcc/62918
(Ctrl+Dを入力）
```

(2) パッケージ一覧を更新してから、必要なパッケージをインストールします。

```bash
$ pacman -Sy
$ pacman -S make wget patch x86_64-elf-gcc gcc
```

次に BitVisor の最新版を BitBucket から取得します。mercurial がシンボリックリンクをうまく扱えないようなので、zip ファイルをダウンロードします。URL は下記の BitBucket のダウンロードのページから最新のものを取得して、ファイル名を適宜調整してください。
https://bitbucket.org/bitvisor/bitvisor/downloads

```bash
$ wget https://bitbucket.org/bitvisor/bitvisor/get/dd0b81c76707.zip
$ unzip dd0b81c76707.zip
$ cd bitvisor-bitvisor-dd0b81c76707
```

アセンブラが古いので、以下のようにパッチを当てます。

```bash
$ patch -p1 -s
--- a/boot/loader/bootloaderusb.s	2015-12-08 00:00:00.000000000 +0900
+++ b/boot/loader/bootloaderusb.s	2015-12-08 00:00:00.000000000 +0900
@@ -194,7 +194,7 @@
 	# Make a multiboot info
 	lea	4(%bp),%edi
 	push	%edi			# Clear multiboot info
-	lea	88/4(%eax),%ecx
+	lea	22(%eax),%ecx
 	rep	stosl
 	pop	%ebx
 	mov	%dl,15(%ebx)		# Write a drive number
(Ctrl-Dを入力）
```

最後に、適宜クロスコンパイラを指定して、コンパイルします。

```bash
$ make CC=x86_64-elf-gcc
$ make CC=x86_64-elf-gcc -C boot/loader
$ make EXE_CC=gcc -C boot/uefi-loader
```

以下のファイルが生成されていたら成功です。

* bitvisor.elf
* boot/loader/bootloader
* boot/loader/bootloaderusb
* boot/uefi-loader/loadvmm.efi

# Mac
ここでは MacPorts を使った方法を紹介します。

下記のページに従って、MacPorts をインストールします。
https://www.macports.org/install.php

1. Xcode 及び Xcode Command Line Tools のインストール
2. Xcode のライセンス同意
3. OS X のバージョンに合った MacPorts のインストール

必要なパッケージをインストールします。

```bash
$ sudo port install mercurial x86_64-elf-gcc wget
```
クロスコンパイラをダウンロードして展開します。

```bash
$ mkdir mingw64-gcc
$ cd mingw64-gcc
$ wget http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Automated%20Builds/mingw-w64-bin_i686-darwin_20130622.tar.bz2
$ tar xvf mingw-w64-bin_i686-darwin_20130622.tar.bz2
```

BitVisor の最新版を BitBucket から取得します。また、アセンブラが古いのでパッチを当てます。

```bash
$ hg clone https://bitbucket.org/bitvisor/bitvisor
$ cd bitvisor
$ patch -p1 -s
--- a/boot/loader/bootloaderusb.s	2015-12-08 00:00:00.000000000 +0900
+++ b/boot/loader/bootloaderusb.s	2015-12-08 00:00:00.000000000 +0900
@@ -194,7 +194,7 @@
 	# Make a multiboot info
 	lea	4(%bp),%edi
 	push	%edi			# Clear multiboot info
-	lea	88/4(%eax),%ecx
+	lea	22(%eax),%ecx
 	rep	stosl
 	pop	%ebx
 	mov	%dl,15(%ebx)		# Write a drive number
(Ctrl-Dを入力）
```

クロスコンパイラを用いてコンパイルします。

```bash
$ make CC=x86_64-elf-gcc AR=x86_64-elf-ar OBJCOPY=x86_64-elf-objcopy SIZE=x86_64-elf-size
$ make CC=x86_64-elf-gcc -C boot/loader
$ make EXE_CC=~/mingw64-gcc/bin/x86_64-w64-mingw32-gcc -C boot/uefi-loader
```

以下のファイルが生成されていたら成功です。

* bitvisor.elf
* boot/loader/bootloader
* boot/loader/bootloaderusb
* boot/uefi-loader/loadvmm.efi

※12/9: Mac での loadvmm.efi の生成方法を追記