BSD界隈四方山話

第132回CPUマイクロコードのアップデート方法(FreeBSD)

CPUマイクロコードのアップデート

プロセッサのセキュリティ脆弱性「Meltdown」「Spectre」に関しては毎日のようにプロセッサメーカやオペレーティングシステムベンダ/プロジェクト、そのほか関連するチップメーカやソフトウェアベンダから報道が行われています。この状況は今後しばらく続くものと見られます。

「Meltdown」に関してはオペレーティングシステム側で対処が可能だと考えられています。対処方法はいくつかありまして、比較的簡単に対処できるが動作がすごく遅くなるものと、最近のプロセッサに実装されている機能を使うようにカーネルを作り替える方法(実装には結構時間がかかる)などがあります。どのオペレーティングシステムも最終的に後者の実装を行っていくことになると思います。

「Spectre」ですが、これは基本的に解決することができないと考えられています。オペレーティングシステムによっては緩和策を実装していますが、抜本的な修正は難しいというのが現状です。また、解決策にはなりませんが、プロセッサのマイクロコードが「Spectre」の危険性を緩和するためにアップデートされていますし、今提供されていないプロセッサのマイクロコードもアップデートの提供が予定されています。

FreeBSDではFreeBSD 7.2で導入されたcpucontrol(8)というコマンドを使ってプロセッサのマイクロコードをアップデートできます(Intel、AMDなどに対応⁠⁠。マイクロコード(ファームウェア)とアップデート機能がdevcpu-data(sysutils/devcpu-data)というパッケージにまとまっていますので、基本的にはこのパッケージをインストールして設定を行っておけば、システム起動時に最新のマイクロコードが読み込まれるようになります。

まず、pkg(8)やports(7)を使ってdevcpu-dataをインストールします。

 devcpu-dataをインストール
# pkg install devcpu-data

次に、/etc/rc.confに次の設定を追加します。

リスト /etc/rc.confに追加する設定
microcode_update_enable="YES"

これでシステム起動時ごとにマイクロコードがアップデートされるようになります。システム起動時に実行される処理は、次のようにservice microcode_update startを実行した場合と同じです。内部でcpucontrol(8)コマンドが呼ばれてマイクロコードがアップデートされます。この例ですと、マイクロコードがリビジョン0x1cから0x23へアップデートされていることがわかります。

 マイクロコードを手動でアップデートする場合
# service microcode_update start
Updating cpucodes...
/usr/local/share/cpucontrol/m32306c3_00000023.fw: updating cpu /dev/cpuctl0 from rev 0x1c to rev 0x23... done.
/usr/local/share/cpucontrol/m32306c3_00000023.fw: updating cpu /dev/cpuctl1 from rev 0x1c to rev 0x23... done.
/usr/local/share/cpucontrol/m32306c3_00000023.fw: updating cpu /dev/cpuctl2 from rev 0x1c to rev 0x23... done.
/usr/local/share/cpucontrol/m32306c3_00000023.fw: updating cpu /dev/cpuctl3 from rev 0x1c to rev 0x23... done.
Done.
#

読み込んだマイクロコードはシステムを再起動するまで有効です。マイクロコードがすでに最新版であったり、すでに最新のバージョンが読み込まれていたりすると、service microcode_update startを実行してもアップデート情報は表示されません。

 アップデートするものがないとアップデート情報は表示されない
# service microcode_update start
Updating cpucodes...
Done.
#

service microcode_update startでは、具体的には次のようにcpucontrol(8)コマンドをプロセッサのコアの数だけ実行しています(cpucontrol(8)コマンドの実行にはcpuctl(4)カーネルモジュールを読み込んでおく必要があります⁠⁠。マイクロコード(ファームウェア)は/usr/local/share/cpuctl/に置いてある必要があります。devcpu-dataをインストールしてあればマイクロコード(ファームウェア)は/usr/local/share/cpuctl/に置いてあります。

 cpucontrol(8)コマンドでマイクロコードをアップデート
# kldload cpuctl
# cpucontrol -uv /dev/cpuctl0
/usr/local/share/cpucontrol/m32306c3_00000023.fw: updating cpu /dev/cpuctl0 from rev 0x1c to rev 0x23... done.
#

いったんマイクロコードをアップデートするとシステムを再起動するまではそれが使われることになるので、cpucontrol(8)コマンドでもう一度アップデートを実行しても、次のようにアップデートは実施されません。

 再度アップデートしてみる
# cpucontrol -uv /dev/cpuctl0
cpucontrol: skipping /usr/local/share/cpucontrol/m32306c3_00000023.fw of rev 0x23: up to date
#

マイクロコード(ファームウェア)のアップデートはこれまでそれほど実施する必要のあるものではなかったので、アップデート方法を知らない方も多いんじゃないかと思います。執筆段階ですでにIntelの最新のマイクロコード(ファームウェア)を使うようにアップデートが行われています。今後AMDからも最新のマイクロコードが発表される予定になっているので、しばらくはアップデートが続くのではないかと思います。このアップデートで「Spectre」の脆弱性が対処されるわけではありませんが、気になる場合にはアップデートしてみてもよいのではないかと思います。

マイクロコードのアップデート方法はDragonFly BSDでも同じです。パッケージなどからdevcpu-dataパッケージをインストールし、/etc/rc.conf ファイルに「microcode_update_enable=⁠YES⁠⁠」の設定を追加してください。

FreeBSD勉強会

2018年2月8日(木)19:00~ 第68回カーネルソースコードを読んでみよう!(ヴァル研 セミナールーム)

なにげなく使っているオペレーティングシステムですが、その中身を読むことというのはあんまりないのではないでしょうか。そもそもどこから読めばよいかわからない、そんな方が多いんじゃないかと思います。今回のFreeBSD勉強会では、読みやすそうなところをみつくろって、とりあえずカーネルのソースコードを読んでみよう、というのをやってみようと思います。

本勉強会への参加者には抽選か勝ち抜きかでデーモンTシャツなどのグッズをお渡しします :)

参加登録はこちらから。

FreeBSD勉強会 発表者募集

FreeBSD勉強会では発表者を募集しています。FreeBSDに関して発表を行いたい場合、@daichigotoまでメッセージをお願いします。30分~1時間ほどの発表資料を作成していただき発表をお願いできればと思います。

おすすめ記事

記事・ニュース一覧