FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

T-HeadのRISC-V Androidのビルドをトレースしてみる

中国のAlibabaグループの半導体を司る、T-HeadがAndroidRISC-Vに移植したことを発表し、そのソースコードGitHub上に公開した。 やり方は一応簡単なはずなので、再現してみることにした。

github.com

一応断っておくと、非常に多くのディスク、CPU、メモリを必要とする。私のメインマシンであるSurface Laptop2(4コア16GB)では全く歯が立たなかった。WSLでのビルドは互換性などの問題でビルドがうまく行かない可能性があるのでやめた方がいいい。私はAWSのかなり強力なインスタンス(EPYC 16コア、128GB、500GB)を用意してようやくビルドに成功した。

上記のリポジトリをダウンロードすると、reproduce.shというのがあるので基本的にこれを実行すれば問題ないのだが、どうもURLのいくつが中国向けになっているようなのでこれを修正していく。具体的には日本国内ではAndroidリポジトリなどは普通に日本のサイトを見ればよいはずなので、以下のように修正した。

  • reproduce.sh
diff --git a/reproduce.sh b/reproduce.sh
index 560c844..f523215 100755
--- a/reproduce.sh
+++ b/reproduce.sh
@@ -4,7 +4,8 @@ SCRIPT_PATH=`realpath $0`
 export AOSP_RISCV_TOP=`dirname $SCRIPT_PATH`
 export AOSP_RISCV_PATCH_TOP=${AOSP_RISCV_TOP}/patches
 export AOSP_RISCV_BUILD_TOP=${AOSP_RISCV_TOP}/aosp
-export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
+# export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
+export REPO_URL='http://android.googlesource.com/tools/repo'

 #check path
 if [ -z $AOSP_RISCV_TOP -o $AOSP_RISCV_TOP = "" ] ; then
@@ -46,7 +47,7 @@ fi
 if [ ! -f ${AOSP_RISCV_TOP}/stages/.stamp_repo_sync ]; then
     mkdir -p ${AOSP_RISCV_BUILD_TOP}
     cd ${AOSP_RISCV_BUILD_TOP}
-    repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android10-release;
+    repo init -u https://android.googlesource.com/platform/manifest -b android10-release;
     cp ${AOSP_RISCV_PATCH_TOP}/manifest/default.xml ${AOSP_RISCV_BUILD_TOP}/.repo/manifests/default.xml
     repo sync
     cd ${AOSP_RISCV_TOP}

さらにrepoコマンドをダウンロードする必要がある。

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/repo
chmod +x ${HOME}/repo
export PATH=${HOME}/:{PATH}

そしてreproduce.shコマンドを実行する。

途中でエラーで落ちてしまったが、どうもAndroidのビルド要件以外にClangビルド用のパッケージが必要らしい。

gen-attributes/gen/llvm/IR/Attributes.inc.d -o out/soong/.intermediates/external/llvm/llvm-gen-attributes/gen/llvm/IR/Attributes.inc external/llvm/include/llvm/IR/Attributes.td
out/soong/host/linux-x86/bin/llvm-tblgen: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
$ sudo apt install libncurses5-dev libncurses5

これでとりあえず最後までビルドできたので、手順に従ってエミュレートを実行してみる。

cd /home/ubuntu/work2/aosp-riscv/aosp
source ./build/envsetup.sh
lunch aosp_riscv64-eng
emulator -selinux permissive -qemu -smp 2 -m 3800M -bios /home/ubuntu/work2/aosp-riscv/aosp/prebuilts/qemu-kernel/riscv64/ranchu/fw_jump.bin

Androidエミュレータが立ち上がった!

f:id:msyksphinz:20210227161117p:plain:w350
f:id:msyksphinz:20210227161140p:plain:w350

しかしとてつもなく遅い。ブート完了まで30分程度はかかっただろうか。やはりQEMU上で実行するのは遅いんだなあ...