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.

[参考译文] RM48L952:SafeTI:不提供检查数据中止是否由 SafeTI 代码引起的方法

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/603064/rm48l952-safeti-does-not-provide-a-method-to-check-if-the-data-abort-is-caused-by-safeti-code

器件型号:RM48L952

您好(再次)、

即使实际的中止处理程序不在 SafeTI 的范围内(根据安全手册)、SafeTI 仍应提供一种方法让应用程序询问"此中止是否由它引起"。

如果应用程序被迫破解 SafeTI 私有部分的入口并"猜测"哪些类型的错误会被破解、则当前的解决方案是不可接受的。 是的、演示代码提供了一个如何检查错误的示例、但它是完全混乱的、#if 0类型的编码、类似的模式在一个之后重复一个、此时可以执行1个简单的函数调用来使代码更可读(轴编码器检查)、 此外、注释描述了数据故障地址的预期值与实际使用的值不同、依此类推。

因此、基本上这种接口应该存在并由 SafeTI 提供、其中应该存在来自演示应用的异常处理程序的屏蔽中止检查代码
布尔型 bMaskDataAbort( void )

如果不可能(对于某些与函数调用相关的问题、尽管尚未遇到)、则安全手册或其他官方机构应提供"已批准的代码"、用户应将其复制并粘贴到其自身的异常处理程序、以屏蔽由 SafeTI 实际测试导致的故障。


还需要询问"此故障注入测试是否正在运行"、还应提供相应的接口、以便进行适当的检查以确保呼叫真正因故障注入而产生:
布尔型 bFaultInjectionActive (sl_SelfTestType eTest)

演示应用示例代码不提供故障注入示例、但正确的"尽可能多的限制检查"需要使用 sl_priv.c (测试活动检查)、因此也应提供此代码并将其置于 SafeTI 之下、 目前、我必须使用 sl_prive 方法手动创建、并挖掘 SafeTI 的功能、以便还能检查 FDIAGCTRL 是否具有正确的值。 如果 FDIAGCTRL 设置不正确、则这是实际故障、该故障是在测试活动 标志设置和实际故障注入之间发生的
if (((sl_FLAG_GET ((Int32) FLASH_ADDRESS_奇 偶校验_FAULT_INject)))&(((sl_flashWREG->FDIAGCTRL & 0x7U)== 7U)))

    (笑声) 执行一些自己的应用特定故障注入魔术(例如调用 ESM 回调处理程序并检查它是否注意到了此故障注入)


我怀疑这是因为它甚至是"正确的"、很可能也应该从该寄存器检查"F021F_FDCTRL_DMODE_TEST_MODE"位、而且很可能还应该检查 FPAROVR 寄存器内容、 在当前的形式中、演示应用中使用的测试模式仍然是可以接受的(!= 0)... 由于 SafeTI 对寄存器设置的了解程度和了解程度都很高、因此集成商不应寻求 SafeTI 实际执行的操作、以便能够捕获/过滤正确的情况...

基本上、故障注入查询的内容应该是这样的、为了有效、每个故障注入测试应该有一个单独的函数、以避免第一级"如果这种情况发生、否则会进行其他测试"。

布尔型 bFaultInjectionActive (sl_SelfTestType eTest)

    布尔 bReturn = false;

    if (eTest == FLASH_ADDRESS_奇 偶校验_FAULT_INject)
   {
       if (sl_FLAG_GET (eTest== true)
       {
         if (某些寄存器正好位于 SafeTI 将它们放置在该值中)
           {
               bReturn = true;
           }
  }
  返回 bReturn;




下面是演示应用程序0xFFF81000与实际使用的0xFFFFFF0900之间的误导性注释示例、现在我应该将这种代码放入我的应用程序(我已经测试此测试、0xFFFF0900是正确的、所以这只是注释错误、但仍然如此)。。。。
   /*
   *由于访问外设段1互连而导致的 DAbort
    * 0x00000008表示它是由读取引起的外部中止、是 AXI 解码错误
    * 0xFFF81000是被访问用来创建外设段1互连错误陷阱 AXI 解码错误的保留位置
    *
   if ((TRUE =sl_FLAG_GET (PERIPHSEGINTRCNT_RESERVE_ACCESS)))&&
      ((0x00000008u =(0x00000008u &_SL_GET_DataFault_Status ()))&&
      (0xFFFF0900 =_SL_GET_DataFault_Address ())){
      maskDAbort = true;
   }

只需一个位或一个工作、就可以将其写入更易读的格式、从而减少每个 IF 的2个代码行、并且无法进行某种类型的!= vs =错误地进行多个类似检查之一
   if (bDataAbortAxiDecoder ((Int32) PERIPHSEGINTRCNT_RESERTED_ACCESS,0x00000008u,0xFFFFFF0900U)//注意:值与注释中的值不同
   {
       maskDAbort = true;
   }