macOS SierraでBitVisorのコンパイル

新型MBPをげっとしたので，BitVisorをコンパイルしてみようと思います．

ちなみに，BitVisorのコンパイルについては昨年のadvent calenderにもあります (linux, windows, mac)．
- [BitVisor のコンパイル](http://qiita.com/shina/items/8579d1c17962b0842431)

MacでのBitVisorの利用についても昨年のACにあります．
- [MacでBitVisor](http://qiita.com/hdk_2/items/6c73aac9df758dc896c1)


## 目次
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->

- [環境](#%E7%92%B0%E5%A2%83)
- [bitvisor.elfのコンパイル](#bitvisorelf%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB)
  - [準備](#%E6%BA%96%E5%82%99)
  - [コンパイル](#%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB)
- [VMMローダのコンパイル](#vmm%E3%83%AD%E3%83%BC%E3%83%80%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB)
- [おまけ: rtagsの利用](#%E3%81%8A%E3%81%BE%E3%81%91-rtags%E3%81%AE%E5%88%A9%E7%94%A8)
- [まとめ](#%E3%81%BE%E3%81%A8%E3%82%81)

<!-- END doctoc generated TOC please keep comment here to allow auto update -->

## 環境
- PC: MacBook Pro (13-inch, Late 2016, Four Thunderbolt 3 Ports)
- OS: macOS Sierra 10.12.1
- CPU: 3.3 GHz Intel Core i7

## bitvisor.elfのコンパイル
### 準備
macでデフォルトで入っているのはclangです．clangでBitVisorがコンパイルできるのかよく分かりませんが，面倒そうな気がするのでここは素直にgccを使います．

幸いSierra用にhomebrewのformulaを用意してくれている人がいるので，それを利用することにします．
- https://github.com/sevki/homebrew-gcc_cross_compilers

```sh
% brew tap sevki/homebrew-gcc_cross_compilers
% brew install sevki/gcc_cross_compilers/x86_64-elf-gcc
```

自分の環境では1時間程度かかりました．正常にインストールが完了すれば`/usr/local/bin`以下に`x86_64-elf-{gcc,ld,as}`みたいな感じでgccやbinutilsが入ります．


また，`make config`で設定をインタラクティブに変更したい場合は，`dialog`をインストールしておきます．

```sh
% brew install dialog
```

このmacの`dialog`はlinuxの`whiptail`と違い出力結果が`""`で囲まれないようなので，以下のようにbitvisor/config.shを修正する必要があります（なんか`--quoted`オプション等つけても駄目でした）．

```diff
diff -r 76db0ae4260b config.sh
--- a/config.sh Mon Sep 12 20:01:54 2016 +0900
+++ b/config.sh Mon Dec 05 04:20:49 2016 +0900
@@ -31,7 +31,7 @@
     help="${line#*#}"
     value=0
     for i; do
-       case "$i" in \""$name"\")
+       case "$i" in "$name")
            value=1
        esac
     done
```

### コンパイル
```sh
% hg clone https://bitbucket.org/bitvisor/bitvisor
% cd bitvisor
% make config
% make -j4 CC=x86_64-elf-gcc AR=x86_64-elf-ar OBJCOPY=x86_64-elf-objcopy SIZE=x86_64-elf-size
```
コンパイルが正常に終わればbitvisor.elfができます．

ちなみに，32bitでコンパイル（`CONFIG_64=0`）しようとしたらインラインアセンブラ周りでエラーがでました．
x64のレジスタを割り当ててる感じだったのでレジスタ割り当てを変更すればコンパイルできるのかもしれません（試してません）．

## VMMローダのコンパイル
VMMのローダもコンパイルしたい場合は，[昨年のadvent calenderの記事同様に](http://qiita.com/shina/items/8579d1c17962b0842431#mac)，bootloaderusb.sのアセンブラを修正します．

```diff
diff -r 76db0ae4260b boot/loader/bootloaderusb.s
--- a/boot/loader/bootloaderusb.s       Mon Sep 12 20:01:54 2016 +0900
+++ b/boot/loader/bootloaderusb.s       Mon Dec 05 04:24:18 2016 +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
```

それから，

```sh
% make CC=x86_64-elf-gcc -C boot/loader
```

でboot/loaderにbootloader, bootloaderusbができます．


UEFIのローダを作成するにはmingwが必要です（PEフォーマットを生成するため）．
こちらもSierra用にformulaを用意してくれている人がいるので，それを利用します．
- https://github.com/cosmo0920/homebrew-mingw_w64

```sh
% brew tap cosmo0920/homebrew-mingw_w64
% brew install cosmo0920/homebrew-mingw_w64/x86-64-w64-mingw32-gcc
```

またインストールが終わるまで気長に待ちます．それから，

```sh
% make EXE_CC=x86_64-w64-mingw32-gcc -C boot/uefi-loader
```

boot/uefi-loader/loadvmm.efiができていれば完了です．

## おまけ: rtagsの利用
おまけとして3日目の記事にあったrtagsの利用も試してみます．
- [Rtags は BitVisor の開発を楽になるか?](http://qiita.com/deep_tkkn/items/eb24cb2f0713c7fc4162)

rtagsのインストール

```sh
% brew install llvm --with-libcxx --with-clang --without-assertions --with-rtti
% git clone https://github.com/Andersbakken/rtags
% cd rtags
% cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DLIBCLANG_LLVM_CONFIG_EXECUTABLE=/usr/local/opt/llvm/bin/llvm-config .
% make -j4
% make install
```

bearのインストール

```sh
% git clone https://github.com/rizsotto/Bear
% mkdir build
% cd build
% cmake ..
% make
% make install
```

コンパイル

```
% cd bitvisor/
% make clean
% bear make -j4 CC=x86_64-elf-gcc AR=x86_64-elf-ar OBJCOPY=x86_64-elf-objcopy SIZE=x86_64-elf-size
% rdm &
% rc -J .
```

[vim-rtags](https://github.com/lyuts/vim-rtags)で少し触ってみましたが，とりえあず動いているようです．

## まとめ
macOS SierraでBitVisorをコンパイルする方法を紹介しました．


新型MBPでもBitVisorは動作します（たぶん?）．
macでbitvisorの動作を簡単にチェックする方法がよく分からなかったので，とりあえずbitvisor有無でVT-xの有効無効をチェックしてみました．

- BitVisor無し
![](https://i.gyazo.com/77f009b4491eb81f38347955f0dbca53.png)

- BitVisor有り
![](https://i.gyazo.com/32ddae9f8555561b34359ed82f5822ff.png)


とりあえずbitvisor有りの方はVT-xが無効になってることが分かります．（近い将来nestedに対応する予定?なので将来的にはこの結果は変わるかもしれませんね!）


本当はネットワークのフックでも試そうかと思ってましたが，急に体調が悪くなって寒気と頭痛が半端じゃないのでまたの機会にしたいと思います．
それでは．