This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMDS570LS31HDK:PMM/PSCON 数据中止注入测试在不中止的情况下通过。

Guru**** 1513510 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LC4357, TMS570LS3137
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1224715/tmds570ls31hdk-pmm-pscon-data-abort-injection-test-passes-without-aborting

器件型号:TMDS570LS31HDK
主题中讨论的其他器件:HALCOGENTMS570LC4357TMS570LS3137

在实施 SafeTI SDL PSCON 自检"PSCON_PMA_TEST"时、我注意到一个与相关主题类似的错误。

在用户模式下、测试会写入 GLOBALCTRL1.AUTO_CLK_WAKE_ENA、希望收到中止、然后比较错误写入之前和之后的寄存器值、以确保其未被修改。

在测试中、写入寄存器不会更改该值、不过不会触发数据中止或以其他方式触发。 该测试通过、因为未修改寄存器、但这无法测试实际的中止行为。

发生这种情况的原因是什么?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Robin、

    我们已着手解决您的问题、并将很快提供更新。

    --
    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Robin、

    您是否有经过测试的代码、能否附上代码一次以便在结束时轻松触发问题?

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jagadish、您好!

    不幸的是,我不能分享整个来源,但我可以分享更多关于正在发生的测试。

    sl_selftest.c 文件中的以下行旨在触发 dabort:

    请注意、在调用该行之前、上面设置的 PRCKEYREG 实际上已经设置为0x0:

    我们也可以在第2459行的 regbackup 变量中看到这一点、该变量也设置为0x0:

    我想知道是否遗漏了某种设置步骤? 在主程序中、我在启用所有测试的情况下调用 HALCoGen 默认 sys_startup:

    在此启动完成后、我只需调用该套件的 SafeTI 测试函数。 对于 PMM:

    bool runSafeTiPsconTests() {
        bool slRet = false;
        SL_SelfTest_Result failInfoPscon = ST_FAIL;     /* PSCON Failure information. */
    
        /* Run PSCON selftest Error Forcing test. */
        slRet = SL_SelfTest_PSCON(PSCON_SELF_TEST_ERROR_FORCING, true, &failInfoPscon);
        if ( (slRet != true) || (failInfoPscon != ST_PASS) ) {
            return false;
        }
    
        /* Stop PBIST Execution. */
        slRet = SL_SelfTest_PBIST_StopExec();
        if (slRet != true) {
            return false;
        }
    
        /* Run PSCON selftest Error Forcing Fault Injection test. */
        slRet = SL_SelfTest_PSCON(PSCON_SELF_TEST_ERROR_FORCING_FAULT_INJECT , true, &failInfoPscon);
        if ( (slRet != true) || (failInfoPscon != ST_PASS) ) {
            return false;
        }   
    
        /* Stop PBIST Execution. */
        slRet = SL_SelfTest_PBIST_StopExec();
        if (slRet != true) {
            return false;
        }
    
        /* Run PSCON Error forcing test. */
        slRet = SL_SelfTest_PSCON(PSCON_ERROR_FORCING, true, &failInfoPscon);
        if ( (slRet != true) || (failInfoPscon != ST_PASS) ) {
            return false;
        }
    
        /* Stop PBIST Execution. */
        slRet = SL_SelfTest_PBIST_StopExec();
        if (slRet != true) {
            return false;
        }
    
        /* Run PSCON Error Forcing Fault Injection test. */
        slRet = SL_SelfTest_PSCON(PSCON_ERROR_FORCING_FAULT_INJECT, true, &failInfoPscon);
        if ( (slRet != true) || (failInfoPscon != ST_PASS) ) {
            return false;
        }
    
        /* Stop PBIST Execution. */
        slRet = SL_SelfTest_PBIST_StopExec();
        if (slRet != true) {
            return false;
        }
    
        /* Run PSCON Privilege Mode User Access test.
         * Test tries to write to GLOBALCTRL1->AUTO_CLK_WAKE_ENA while in user mode. Should trigger an abort.
         * Checks to see if the register was written to and restores state.
         * Tests whether the PSCON can detect an user access violation.
         */
        /* This test requires user mode. System mode is restored from the dabort interrupt. */
        /* USER MODE BEGIN */
        portSWITCH_TO_USER_MODE();
        slRet = SL_SelfTest_PSCON(PSCON_PMA_TEST, true, &failInfoPscon); //! passes but does not actually abort
        /* USER MODE END */
        if ( (slRet != true) || (failInfoPscon != ST_PASS) ) {
            return false;
        }
    
        /* Stop PBIST Execution. */
        slRet = SL_SelfTest_PBIST_StopExec();
        if (slRet != true) {
            return false;
        }
    
        clearSafeTiFlags();
    
        /* All tests passed. */
        return true;
    }


    在此之前、所有其他测试都通过。 是否缺少设置步骤? 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Robin、

    感谢您分享所有详细信息、我将进行测试并为您提供更新。

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Robin、

    我可以看到您在 TMS570LS3137中提到的问题、我还使用 TMS570LC4357进行了验证、在写入时可以看到"_dabort"异常、但在 TMS570LS3137中、我无法看到这个异常。

    在提供更新前、让我进一步分析一下。

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jagadish、您好、感谢您对此的回答。 这有什么更新吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Robin、

    是否有此更新?

    还不是 Robin、给我更多的时间进行分析。

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jagadish、您好、正在检查此项目。 谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jagadish、您好、正在检查分析结果。 谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Robin、

    您的观察结果是正确的。  在用户模式下写入 PMM 寄存器的 WP 位不会生成中止。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、QJ:

    感谢您的回复。 那么、解决此问题的权变措施是什么? 理想情况下、我们希望避免修改 SafeTI 源代码、因为这样做会使我们无法轻松认证代码。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    sl_pmmREG->PRCKEYREG = 0x0000000FU;不会更改此寄存器的值。 不需要解决方法。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    那么、在这种情况下、测试中的注释是否不正确? 在初始 POST 的屏幕截图中、对 GLOBALCTRL1.AUTO_CLK_WAKE_ENA 进行写入应该会触发中止、但不会触发。 由于我们在此测试中进入了用户模式、因此我们需要使用中断在测试后重置我们的特权。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此在这种情况下,测试中的注释是否不正确?

    你是对的。 SDL 中的注释不正确。 我很抱歉这个误导性的评论。  

    由于我们在测试时进入用户模式,我们需要使用中断来在测试后重置我们的特权。

    是的、必须在 ISR 中从用户切换到特权。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢澄清 QJ! 非常感谢。