Android 13 には、リクエストされた MTE モードをブートローダーに伝えるユーザー空間用の ABI が導入されています。これを使用すると、ハードウェアはサポートされているがデフォルトでは初期設定で MTE が有効になっていないデバイスで MTE を有効にしたり、逆に初期設定で MTE が有効になっているデバイスで MTE を無効にしたりできます。
ブートローダーのサポート
この ABI をサポートするには、ブートローダーが misc パーティションから(bootloader_message.h で定義されている)misc_memtag_message を読み取る必要があります。
有効な misc_memtag_message が見つかると(MISC_VIRTUAL_AB_MAGIC_HEADER が一致し、バージョン番号がサポートされている場合)、ブートローダーは次の演算を行います。
memtag = (default_memtag && !(misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_OFF)) ||
misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG ||
misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_ONCE
memtag_kernel = misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_KERNEL ||
misc.memtag_mode & MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE
default_memtag は、SKU のデフォルトの memtag のオン / オフ設定です。memtag が true の場合、ブートローダーは MTE タグ予約を設定し、下位の例外レベルでタグのチェックを有効にし、DT を介してタグ予約リージョンをカーネルに伝えます。memtag が false の場合、ブートローダーはカーネルのコマンドラインに arm64.nomte を追加します。
memtag_kernel が true の場合、ブートローダーはカーネルのコマンドラインに kasan=on を追加します。
ブートローダーは、起動ごとに MISC_MEMTAG_MODE_MEMTAG_ONCE と MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCE をクリアする必要があります。
ブートローダーが fastboot oem mte をサポートしている場合、オンであれば、MISC_MEMTAG_MODE_{MEMTAG, MEMTAG_ONLY, MEMTAG_OFF} を (1, 0, 0) に設定し、オフであれば、他のフラグを保持しながら (0, 0, 1) に設定します。
ユーザー空間をサポートするために mtectrl バイナリをビルドするようプロダクトを設定する必要があります。次に、ro.arm64.memtag.bootctl_supported システム プロパティを設定して、ブートローダーが memtag メッセージをサポートしていることをシステムに示します。
ユーザー インターフェース
ro.arm64.memtag.bootctl_supported プロパティが設定されている場合、開発者向けオプション メニューのボタンを使って、ユーザーは MTE を有効にした状態で 1 回再起動できます。この場合の対象ユーザーは、MTE でアプリをテストするアプリ デベロッパーです。
システム プロパティ
高度な使い方として、システム プロパティ arm64.memtag.bootctl は次の値からなるカンマ区切りのリストを取得できます。
-
memtag: ユーザー空間の MTE を永続的に有効にする(
MISC_MEMTAG_MODE_MEMTAGを設定) -
memtag-once: ユーザー空間の MTE を 1 回有効にする(
MISC_MEMTAG_MODE_MEMTAG_ONCEを設定) -
memtag-kernel: カーネル空間の MTE を有効にする(
MISC_MEMTAG_MODE_MEMTAG_KERNELを設定) -
memtag-kernel-once: カーネル空間の MTE を 1 回有効にする(
MISC_MEMTAG_MODE_MEMTAG_KERNEL_ONCEを設定) -
memtag-off: MTE を無効にする(
MISC_MEMTAG_MODE_MEMTAG_OFFを設定)
新しい設定はブートローダーによって適用されるため、有効にするにはシステムを再起動する必要があります。