mruby on EFI Shellのビルド

※この記事では後々mrbgemsを追加していく事などを意図してmrubyをビルドする事に拘っているが、単にmrubyをUEFIで試してみたいだけならば自分でビルドする必要はない。ここのHow to useからリンクされている"download page"をクリックすればダウンロードできる。

前回の記事をベースにmruby on EFI Shellのビルドを行う。

他のmruby on EFI Shellのビルド方法のメモ()は日付が2年前になっておりディストリやgccのバージョン、EDK2のコードがこのときからかなり変わってはいるが、手順に大きな変更は見られなかった。

まず、Conf/tools_def.txtのGCC44_ALL_CC_FLAGSから-Werrorを取り除く。

DEFINE GCC44_ALL_CC_FLAGS            = -g -fshort-wchar -fno-strict-aliasing -Wall -Wno-array-bounds -ffunction-sections 
-fdata-sections -c -include AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings

AppPkgにmrubyを追加する。

cd AppPkg/Applications
git clone https://github.com/masamitsu-murase/mruby_on_efi_shell.git mruby
cd mruby
git submodule update --init --recursive
cd mruby
rake
cd ..
ruby override/override.rb

AppPkg/AppPkg.dscを開いて[Components]にAppPkg/Applications/mruby/mruby.infを足す。

diff --git a/AppPkg/AppPkg.dsc b/AppPkg/AppPkg.dsc
index 424434c..e34ceb6 100644
--- a/AppPkg/AppPkg.dsc
+++ b/AppPkg/AppPkg.dsc
@@ -112,6 +112,7 @@
   AppPkg/Applications/Main/Main.inf          # Simple invocation. No other LibC
   AppPkg/Applications/Enquire/Enquire.inf    #
   AppPkg/Applications/ArithChk/ArithChk.inf  #
+  AppPkg/Applications/mruby/mruby.inf

 #### A simple fuzzer for OrderedCollectionLib, in particular for
 #### BaseOrderedCollectionRedBlackTreeLib.

LibCにパッチを当てる。

diff --git a/StdLib/LibC/Main/Main.c b/StdLib/LibC/Main/Main.c
index b203d15..f22edcf 100644
--- a/StdLib/LibC/Main/Main.c
+++ b/StdLib/LibC/Main/Main.c
@@ -31,7 +31,7 @@
 #include  <MainData.h>
 #include  <unistd.h>

-extern int main( int, char**);
+extern int EFIAPI main( int, char**);^M
 extern int __sse2_available;

mrubyをビルド。

build

前回と同様の手順でovmfディレクトリにmruby.efiをコピーしてくる。

cd ~/ovmf
cp ~/edk2/Build/AppPkg/DEBUG_GCC49/X64/mruby.efi .

それっぽいサンプルコードを用意する。

sort.rb
[10,2,4,1].sort.each{|i| p i}
fib.rb
def fib(n)
    return 0 if n == 0
    return 1 if n == 1
    fib(n-2) + fib(n-1)
end

p fib(10)

QEMUを起動、UEFIから実行してみる。

qemu-system-x86_64 -nographic -bios OVMF.fd -hda fat:.

UEFI Interactive Shell v2.0
EDK II
UEFI v2.40 (EDK II, 0x00010000)
Mapping table
      FS0: Alias(s):HD7a1:;BLK3:
          PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)
     BLK2: Alias(s):
          PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
     BLK4: Alias(s):
          PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
     BLK0: Alias(s):
          PciRoot(0x0)/Pci(0x1,0x0)/Floppy(0x0)
     BLK1: Alias(s):
          PciRoot(0x0)/Pci(0x1,0x0)/Floppy(0x1)
Press ESC in 1 seconds to skip startup.nsh or any other key to continue.
Shell> fs0:
FS0:\> dir
Directory of: FS0:\
02/10/2014  12:42               4,210  LICENSE
12/03/2014  06:27                  96  fib.rb
02/10/2014  12:30              10,573  README
02/10/2014  12:42           1,048,576  OVMF.fd
12/03/2014  06:28                  30  sort.rb
02/10/2014  12:42                 130  BUILD_INFO
12/03/2014  06:47             525,440  mruby.efi
12/02/2014  22:06               1,540  NvVars
          8 File(s)   1,590,595 bytes
          0 Dir(s)
FS0:\> mruby fib.rb
55
FS0:\> mruby sort.rb
1
2
4
10