借り初めのひみつきち

仮ブログです。

EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL を置き換える

UEFI で文字を表示するときは EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL を使うのが普通です。

UEFI では SIMPLE~という名前のつくプロトコルが多数ありますが SIMPLE と名前が付くものに限ってあまりシンプルじゃなかったりする世の中です。
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL は名前から純粋なテキスト出力ストリームのイメージがありましたが、実際に提供している機能は INT 0x10 のテキスト BIOS の置き換えを狙っているように見えます。

さて、そんな EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL ですが、不満はいろいろあります。

まず、実際にどのように表示されるかは機種によってけっこう異なります。
近年の安めで比較的小型の PC はスマフォやタブレット用の安い液晶を流用しているのでネイティブの画面が縦長方向 (Portrait) になっているものがよくあります*1が、その対応も機種によって大きく異なります。変に対応しようとしてバグってるものもあります。
さらに、 GOP (EFI_GRAPHICS_OUTPUT_PROTOCOL) との混在をあまり考えられていないようで、アプリケーションが GOP を利用した場合に両者の画面モードの整合性がとれなくなることがよくあります。

単純なテキストを表示するアプリケーションであれば必要な機能は概ね揃っておりますが、グラフィックスを使用するアプリケーションの場合には致命的な仕様がいくつかあるので EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL は使わないようにしたいです。

そんなわけで置き換えるライブラリを作りました。

本来であればちゃんと UEFI の流儀でプロトコル定義したいところですが、めんどうなので手抜きで SYSTEM TABLE の ConOut を置き換えるラッパーを作りました。
SYSTEM TABLE って直接書き換えても大丈夫なのかよくわからないので、実際にリリースするときは別の方法で実装します。たぶん。

f:id:neriring16:20180818021655p:plain

今作っているメニュー画面ですが、これが一行書き換えるだけでこうなります。

f:id:neriring16:20180818021703p:plain

megos といえばこのフォントなんですが、いまどきのモニターだと文字が小さすぎてちょっとよみずらいのが問題です・・

すべて自前で描画しているのでフォント変えて遊んでみるとこんな感じにもできます。

f:id:neriring16:20180818022544p:plain

*1:とくに Atom 系が多い