私はS32G3 (Yocto BSP 43)に取り組んでおり、セキュア ブート (BL2) エラーを QSPI NOR に記録しようとしています。
BL2 の MMIO 読み取り/書き込み API を使用しようとしましたが、API 呼び出しの直後にブート プロセスが停止したようです。
xspi_read() / xspi_write() API を使用しようとしましたが、未定義の参照エラーで BL2 ビルドが失敗します。調査の結果、これらのAPIはATFに実装されていないことがわかりました。FSPIの読み取り/書き込みAPIも同様です。
セキュア ブートが有効な場合、BL2 からの読み取り/書き込みアクセスがサポートされているかどうかを確認してください。サポートされている場合、このCASEに推奨されるAPIを教えていただけますか?あるいは、BL2 からのログ記録やデータの永続化に関して実行可能なアプローチや推奨される代替方法についてご指導いただければ幸いです。
よろしくお願いします、
ジャヤシュリー
こんにちは@Jayashree 、
再度ご連絡いただきありがとうございます。いつでもサポートさせていただきます。あなたの質問に関して、過去に同様の実装を見たことはありません。ただし、ここに私の推奨事項があります:
xspi_read/xspi_write を使用するには、以下を含める必要があります。
#include
ソース ファイルでは、bl2_main() に xspi_write を追加してビルドできました。ビルド プロセスのみをテストしたことに注意してください。
bl_common.c#L94で行われたように、 io_read/io_write を使用することもできます。
MMIO の読み取り/書き込みについて言及しましたが、include/lib/mmio.h 内の関数のことを指しているのでしょうか?
これが役に立つかどうか教えてください
迅速なご対応ありがとうございます。あなたの提案に従って、推奨ヘッダーファイルをインクルードし、bl2_main.cでXSPI APIを呼び出そうとしました。ファイル。ただし、ビルド中に未定義の参照/シンボルエラーが依然として発生します。
ご参考までに、修正したファイルを下記に添付いたします。ご確認いただき、必要な構成やビルドの変更が不足している場合はお知らせいただけると幸いです。
/*
* Copyright (c) 2013-2023、Arm Limited および貢献者。
*
* SPDXライセンス識別子: BSD-3条項
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include <ドライバ/auth/auth_mod.h>
#include <ドライバ/auth/crypto_mod.h>
#include <ドライバ/console.h>
#include <ドライバ/fwu/fwu.h>
#include <ドライバ/nxp/flexspi/fspi_api.h>
#include
#include
#include
#include
#include "bl2_private.h"
#ifdef __aarch64__
#NEXT_IMAGE "BL31" を定義します
#それ以外
#NEXT_IMAGEを「BL32」と定義する
#endif
/* ================== NOR テスト構成 ================== */
#NOR_TEST_OFFSET 0x400U を定義します
#NOR_TEST_SIZE 4U を定義します
/* =================================================== */
#ENABLE_RUNTIME_INSTRUMENTATION の場合
PMF_REGISTER_SERVICE(bl_svc、PMF_RT_INSTR_SVC_ID、
BL_TOTAL_IDS、PMF_DUMP_ENABLE);
#endif
#RESET_TO_BL2の場合
/****************************************************************************************
* RESET_TO_BL2=1のときのBL2のセットアップ関数
**********************************************************************************/
void bl2_el3_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2,
u_register_t 引数3)
{
/* プラットフォーム固有の初期セットアップを実行する */
bl2_el3_early_platform_setup(arg0, arg1, arg2, arg3);
/* プラットフォーム固有のセットアップを後で実行します */
bl2_el3_plat_arch_setup();
#CTX_INCLUDE_PAUTH_REGSの場合
/*
* ARMv8.3-PAuthがレジスタが存在するかアクセス
* 保存中または復元中に障害が発生します。
*/
アサート(is_armv8_3_pauth_present());
#endif /* CTX_INCLUDE_PAUTH_REGS */
}
#else /* RESET_TO_BL2 */
/****************************************************************************************
* RESET_TO_BL2=0のときのBL2のセットアップ関数
**********************************************************************************/
void bl2_setup(u_register_t arg0, u_register_t arg1, u_register_t arg2,
u_register_t 引数3)
{
/* プラットフォーム固有の初期セットアップを実行する */
bl2_early_platform_setup2(引数0、引数1、引数2、引数3);
/* プラットフォーム固有のセットアップを後で実行します */
bl2_plat_arch_setup();
#CTX_INCLUDE_PAUTH_REGSの場合
/*
* ARMv8.3-PAuthがレジスタが存在するかアクセス
* 保存中または復元中に障害が発生します。
*/
アサート(is_armv8_3_pauth_present());
#endif /* CTX_INCLUDE_PAUTH_REGS */
}
#endif /* RESET_TO_BL2 */
/****************************************************************************************
* BL2で行うべきことは、さらに画像をロードし、制御を渡すことです。
※次回BLです。BL2 によって占有されていたメモリは、BL3x ステージによって再利用されます。BL2
* 完全に S-EL1 で実行されます。
**********************************************************************************/
void bl2_main(void)
{
エントリポイント情報t *次のbl_ep_info;
uint32_t write_val = 0xA5A5A5A5;
uint32_t read_val = 0;
整数rc;
#ENABLE_RUNTIME_INSTRUMENTATION の場合
PMF_CAPTURE_TIMESTAMP(bl_svc、BL2_ENTRY、PMF_CACHE_MAINT);
#endif
NOTICE("BL2: %s\n", バージョン文字列);
NOTICE("BL2: %s\n", build_message);
/* S-EL1 で残りの一般的なアーキテクチャ設定を実行します */
bl2_arch_setup();
#PSA_FWU_SUPPORTの場合
fwu_init();
#endif /* PSA_FWU_SUPPORT */
crypto_mod_init();
/* 認証モジュールを初期化する */
auth_mod_init();
/* メジャーブートバックエンドを初期化する */
bl2_plat_mboot_init();
/* ブートソースを初期化する */
bl2_plat_preload_setup();
/* ============================================================
* XSPI / NOR 直接アクセステスト(永続ログ記録実験)
* ============================================================== */
通知("\n=====================================================\n");
NOTICE("BL2: XSPI NOR 直接アクセス テスト\n");
NOTICE("BL2: NORオフセット = 0x%x\n", NOR_TEST_OFFSET);
通知("==================================================\n");
NOTICE("BL2: 0x%08xをNORに書き込み中\n", write_val);
rc = xspi_write(NOR_TEST_OFFSET、&write_val、sizeof(write_val));
(rc!=0)の場合 {
エラー("BL2: xspi_write が失敗しました (%d)\n", rc);
} それ以外 {
NOTICE("BL2: xspi_write OK\n");
}
NOTICE("BL2: NORから読み戻しています\n");
rc = xspi_read(NOR_TEST_OFFSET、&read_val、sizeof(read_val));
(rc!=0)の場合 {
エラー("BL2: xspi_read が失敗しました (%d)\n", rc);
} それ以外 {
NOTICE("BL2: xspi_read OK、値 = 0x%08x\n", read_val);
}
通知("==================================================\n");
NOTICE("BL2: XSPI NOR テストが完了しました。ブートを続行します\n");
通知("==================================================\n\n");
/* 後続のブートローダイメージをロードします。*/
next_bl_ep_info = bl2_load_images();
/* メジャーブートバックエンドを破棄する */
bl2_plat_mboot_finish();
#if !BL2_RUNS_AT_EL3
#ifndef __aarch64__
/*
* AArch32 状態の場合、BL1 と BL2 は MMU セットアップを共有します。
* BL2はBL1領域をマップしないので、MMUは
* BL1 に戻るには無効にする必要があります。
*/
_mmu_icache_secure() を無効にします。
#endif /* ! __aarch64__ */
#ENABLE_PAUTH の場合
/*
* 次回のブートイメージを実行する前にポインタ認証を無効にする
*/
pauth_disable_el1();
#endif /* ENABLE_PAUTH */
#ENABLE_RUNTIME_INSTRUMENTATION の場合
PMF_CAPTURE_TIMESTAMP(bl_svc、BL2_EXIT、PMF_CACHE_MAINT);
#endif
コンソールフラッシュ();
/*
* SMC 経由で次の BL イメージを BL1 に実行します。合格方法に関する情報
* BL32(存在する場合)およびBL33ソフトウェアイメージへの制御は
* 次の BL 画像に引数として渡されます。
*/
smc(BL1_SMC_RUN_IMAGE、(符号なしlong)next_bl_ep_info、0、0、0、0、0、0);
#else /* BL2_RUNS_AT_EL3 の場合 */
NOTICE("BL2: "NEXT_IMAGE"を起動しています\n");
print_entry_point_info(次のbl_ep_info);
#ENABLE_RUNTIME_INSTRUMENTATION の場合
PMF_CAPTURE_TIMESTAMP(bl_svc、BL2_EXIT、PMF_CACHE_MAINT);
#endif
コンソールフラッシュ();
#ENABLE_PAUTH の場合
/*
* 次回のブートイメージを実行する前にポインタ認証を無効にする
*/
pauth_disable_el3();
#endif /* ENABLE_PAUTH */
bl2_run_next_image(次のbl_ep_info);
#endif /* BL2_RUNS_AT_EL3 */
}
こんにちは@Jayashree 、
申し訳ありませんが、保存されていないバージョンのファイルをコンパイルしていた可能性があります。再試行しましたが、コンパイルできませんでした。何度も試行しましたが、できませんでした。現時点では、最初の返信で述べたように io_read/io_writ を使用するか、SPI ドライバを ATF に移植するためのベースとして、最近追加された A53 コア上の RTD を使用するデモ プロジェクトを使用するかの 2 つだけをお勧めします。
2 番目にアクセスするには、FlexNet にログインし、次のパスに従います。
オートモーティブ ソフトウェア – S32G リファレンスソフトウェア > オートモーティブ ソフトウェア – S32G RTD on A53 > RTD_ON_S32G A53_0.1.0ソリューションデモ
オプションのいずれかが表示されない場合は、flex net にログインしてこのリンクを使用してください。
これは単なる推奨事項であり、私の側ではテストされていないことに注意してください。ATF は A53 コアのブートの非常に初期段階であるため、どちらも回復不可能な問題が発生する可能性があります。
ご不便をおかけして申し訳ございません。
こんにちは、
ご返信ありがとうございます。
先ほど提案されたio_read/io_write APIを使ってみました。コードは正常にビルドされましたが、
書き込みや検索ができませんでした(下の画像を参照)
2 番目のアプローチに関しては、A53 コアで RTD デモを続行できませんでした。代わりに、U-Boot の SPI/NOR アクセス API を BL2 ステージに移植するという代替アプローチを試みました。ビルドの問題を解決し、バイナリを正常に生成できましたが、BL2 から SPI API が呼び出されるとすぐにブート プロセスが停止します。
この時点で、BL2 ステージで最小限のデータをログに記録または保持し、後で Linux からアクセスできるようにする他の推奨またはサポートされている代替手段があるかどうかを確認したかったのです。具体的には、S32G での早期ブート ログ記録のための安全なメカニズムやリファレンス・デザインはありますか。それとも、BL2 は基本的にこのようなユース ケースには適していないのでしょうか。
BL2/ATF はブートの非常に初期の段階であり、このような変更によって回復不可能な問題が発生する可能性があることは理解し認識していますが、皆様の経験に基づくガイダンスやベスト プラクティスがあれば非常に役立ちます。
ありがとう
こんにちは@Jayashree 、
問題を克服するために他のオプションを検索してみましたが、これを実現する方法に関する参考資料は見つかりませんでした。ご存知のとおり、ATF はブート プロセスの非常に早い段階で行われるため、フラッシュ メモリにアクセスすることは ATF の範囲外です。個人的な推奨としては、私が思いつく最も古いログはu-bootからのもので、ext4writeを使うことができます。そのためには、.configに次の設定を追加する必要があります。ファイル:
CONFIG_CMD_EXT4_WRITE=y
ext4 操作の詳細については、 https://docs.u-boot.org/en/latest/usage/filesystems/ext4.htmlを参照してください。
このコマンドを使用すると、Linux ファイルシステム内のファイルに書き込むことができます。
これが役に立つことを願っています
こんにちは、
フラッシュ アクセスに関する ATF/BL2 の制限についてご説明いただき、確認していただきありがとうございます。
BL2 自体から直接最小限の読み取り/書き込み操作を実行することが技術的に可能かどうかをまだ調査中です。これは通常の範囲外であることは承知していますが、実現可能性を確認したかったのです。具体的には、必要な MMC 依存関係を明示的に追加することで、BL2 から eMMC にアクセスできるかどうか疑問に思いました。コードベースを確認しているときに、mmc.c ですでにブロックレベルの読み取りおよび書き込み API が定義されていることに気付きました。BL2 で MMC サブシステムを十分早い段階で初期化し、最小限のログ記録の目的でこれらのブロック読み取り/書き込み関数を使用することは可能でしょうか?
私はそれに伴うリスクを十分に理解しており、このアプローチが根本的にサポートされていないのか、それとも単に推奨されていないのかを確認したかったのです。
サポートありがとうございます。
よろしくお願いします、
ジャヤシュリー
こんにちは@Jayashree 、
必要なクロックとモジュールをすべて初期化すれば理論的には可能ですが、詳細なガイダンスは提供できません。SD カードの構成方法とアクセス方法については、 Usdhc_Ip_example_S32G399A_M7サンプル プロジェクトを参照してください。Linux に必要なパーティションに干渉しないようにする必要があることに注意してください。この方法を採用する場合は、メモリの一部をログ用に予約し、他の目的には使用しないことをお勧めします。
よろしくお願いいたします。
こんにちは@Jayashree 、
PMF は Arm からも NXP からも提供されていないため、あまりサポートできません。ただし、モジュールの ARM ドキュメントhttps://trustedfirmware-a.readthedocs.io/en/latest/perf/psci-performance-instr.htmlを確認することをお勧めします。
こんにちは@alejandro_e 、
BL2 から eMMC に書き込めるようになったことを嬉しく思います。次のステップとして、データとともにタイムスタンプを記録したいと考えています。パフォーマンス測定フレームワーク (PMF) に遭遇しましたが、現段階でそれを有効にして使用する方法と、この機能にアクセスするためにどのマクロ フラグを有効にする必要があるかがわかりません。
どのように進めればよいかご指導いただけますでしょうか?
こんにちは@alejandro_e 、
ご返信ありがとうございます。
共有されたリンクは PSCI パフォーマンス計測を指していると思われますが、これは TF-A のタイムスタンプ収集に使用される一般的なパフォーマンス測定フレームワーク (PMF) とは異なるようです。
https://github.com/nxp-auto-linux/arm-trusted-firmware/blob/c834244b9c54c79e80315aecc9807f5b0eb79342...
TF-A のドキュメントによると、PMF はシステム カウンターに依存し、ビルド フラグによって有効にできる汎用フレームワークのようです。
PMF は TF-A 自体の一部なので、S32G プラットフォームで本当にサポートされていないかどうかを再確認していただけますか?
よろしくお願いします。
こんにちは@Jayashree 、
ご説明ありがとうございます。サポートに関しては、PMF ライブラリが正しく実行されるかどうかはわかりませんが、ドキュメント内にその参照が見つからなかったため、ご自身でテストする必要があります。また、その点に関して、弊社からガイダンスやサポートを十分に提供することはできません。
ご不便をおかけして申し訳ございません。