Blog posts by @retrage

mirror of https://retrage.github.io/

EDK2におけるDebugPrintErrorLevel

EDK2のコードにはDebugPrint()が多く埋め込まれている. この関数は第一引数にErrorLevelをとり, ビルド時に与えるPcdDebugPrintErrorLevelを変えることによりデバッグ出力を制御できる. この値は*.dscに以下のような記述をすることで設定できる.

[PcdsFixedAtBuild.common]
  gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|0x80000000

このとき,どのような値を設定すればいいのかわからなくなるのでメモとしてまとめた.

続きを読む

OVMFのデバッグ

ここではgdbを用いたOVMFのデバッグ方法について説明する. すでにOVMFのデバッグについて書かれた記事[1]が存在するが, ここでは特別なツールなどは使わずに通常のgdbでOVMFをデバッグする.

続きを読む

LLVMのEFI Byte Codeバックエンドを作る

ここでは開発しているLLVMEFI Byte Code (EBC)バックエンドの概要と EBCバックエンド固有の問題などについてみていく.

ソースコードは以下で公開している.

続きを読む

文鎮化したMinnowboardを復旧させる

MinnowboardIntel Atomを搭載した シングルボードコンピュータである. Minnowboardを使った実験で誤ったファームウェアを書き込んでしまい brick (文鎮化) させてしまったので SPI Flashを外部から書き換えることで復旧させる.

続きを読む

正規表現からLLVM IRを生成する

正規表現は文字列マッチングなどに広く用いられている形式言語であるが, 等価な決定性有限オートマトン(DFA)に変換できることが知られている. google/redgrep は与えられた正規表現から等価なDFAに相当するネイティブコードを LLVMにより生成する. ここではredgrepを改造して 正規表現からどのようなLLVM IRが生成されるのかをみてみる.

redllというツールを追加した.コードは

に置いてある.

使い方

最初にLLVMソースコードをダウンロードして ビルドしてローカルの適当な場所にインストールしておく. redgrepは新しいLLVMを要求するのでLLVM 8.0.0あたりを入れておく. redgrepのビルドが通るようにパスを通す.

$ export LLVM_CONFIG=/path/to/bin/llvm-config

とかやってからredgrepをビルドする.

$ ./redll "regex"

で遊べる.

例: "a"

試しに正規表現パターン"a"がどのようになるのかを以下に示す.

$ ./redll "a"
; dfa is 3 states
; ModuleID = 'M'
source_filename = "M"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"

; Function Attrs: norecurse nounwind readonly
define i1 @F(i8* nocapture readonly, i64) local_unnamed_addr #0 {
entry:
  %2 = icmp eq i64 %1, 0
  br i1 %2, label %return_true, label %3

return_true:                                      ; preds = %3, %entry
  ret i1 false

; <label>:3:                                      ; preds = %entry
  %4 = load i8, i8* %0, align 1
  %cond = icmp eq i8 %4, 97
  br i1 %cond, label %5, label %return_true

; <label>:5:                                      ; preds = %3
  %6 = icmp eq i64 %1, 1
  ret i1 %6
}

attributes #0 = { norecurse nounwind readonly }

ここではFという関数があり, 入力が0であればfalseを返し, そうでなければ入力から1文字取り出し 97=aであれば1=trueを返す, というような状態機械になっていることがわかる.

まとめ

他にも色々面白く遊べるはずなので試してほしい.

参考文献

技術書典6で新刊「UEFI読本 GRUB編」を頒布

2019年4月14日に池袋サンシャインシティで開催される 技術書典6において「海洋軟件」として 新刊「UEFI読本 GRUB編」を頒布する。 既刊「UEFI読本 基礎編 Linux編」も基礎編を分離し 「UEFI読本 Linux編」として頒布する。 配置先は「う27」である。

続きを読む