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.

[参考译文] PROCESSOR-SDK-J784S4:锁定 R5f TCM 访问

Guru**** 2540720 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1559896/processor-sdk-j784s4-lock-r5f-tcm-access

部件号:PROCESSOR-SDK-J784S4


工具/软件:

尊敬的专家:

我将 j784s4_evm 与 SDK10 配合使用。

我只想从 R5F 访问 TCM 存储器、出于安全原因、这很有用。

我希望其他内核 (R5F、C7X 和 A72) 无法访问此存储器。

您能举个例子吗?

感谢你的帮助

Charles

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

    我在 BTCM 存储器上设置了防火墙。

    我在所有 BTCM 存储器上将区域 0 设置为后台区域、并启用每次访问。

    然后、我 在前 4KO 上将区域 1 设置为前台区域 、并禁用每次访问。

    但是、当我在设置防火墙后写入存储器时、内核会崩溃、而不是到达错误处理程序函数。

    这是我的代码:

    #include <ti/board/board.h>
    #include <ti/board/board_cfg.h>
    #include <ti/board/src/j784s4_evm/include/board_utils.h>
    #include <ti/board/src/j784s4_evm/include/board_internal.h>
    #include <ti/drv/sciclient/sciclient.h>
    #include <ti\csl\arch\csl_arch.h>
    #include <ti/osal/osal.h>
    #include <ti/csl/soc.h>
    #include <ti/csl/soc/j784s4/src/csl_soc_firewalls.h>
    
    /*######################################################
     *  DEFINES
     *  ----------------------------------------------------*/
    #define SCICLIENT_APP_SEC_SUPV_WRITE_MASK         (0x00000001U)
    #define SCICLIENT_APP_SEC_SUPV_READ_MASK          (0x00000002U)
    #define SCICLIENT_APP_SEC_SUPV_CACHEABLE_MASK     (0x00000004U)
    #define SCICLIENT_APP_SEC_SUPV_DEBUG_MASK         (0x00000008U)
    #define SCICLIENT_APP_SEC_USER_WRITE_MASK         (0x00000010U)
    #define SCICLIENT_APP_SEC_USER_READ_MASK          (0x00000020U)
    #define SCICLIENT_APP_SEC_USER_CACHEABLE_MASK     (0x00000040U)
    #define SCICLIENT_APP_SEC_USER_DEBUG_MASK         (0x00000080U)
    #define SCICLIENT_APP_NONSEC_SUPV_WRITE_MASK      (0x00000100U)
    #define SCICLIENT_APP_NONSEC_SUPV_READ_MASK       (0x00000200U)
    #define SCICLIENT_APP_NONSEC_SUPV_CACHEABLE_MASK  (0x00000400U)
    #define SCICLIENT_APP_NONSEC_SUPV_DEBUG_MASK      (0x00000800U)
    #define SCICLIENT_APP_NONSEC_USER_WRITE_MASK      (0x00001000U)
    #define SCICLIENT_APP_NONSEC_USER_READ_MASK       (0x00002000U)
    #define SCICLIENT_APP_NONSEC_USER_CACHEABLE_MASK  (0x00004000U)
    #define SCICLIENT_APP_NONSEC_USER_DEBUG_MASK      (0x00008000U)
    
    #define SCICLIENT_APP_ENABLE_ALL                  (0xffffU)
    
    #define APP_R5F_HOST_ID      (TISCI_HOST_ID_MAIN_0_R5_0)
    #define APP_PRIVID           (212)
    #define APP_FWL_ID           (CSL_STD_FW_R5FSS0_CORE0_BTCM0_ID)
    #define APP_ADDRESS_START    (CSL_STD_FW_R5FSS0_CORE0_BTCM0_CORE0_BTCM_START)
    #define APP_ADDRESS_END      (CSL_STD_FW_R5FSS0_CORE0_BTCM0_CORE0_BTCM_END)
    
    
    #define APP_SIZE             (1024)
    
    /*######################################################
     *  GLOBAL VARIABLES
     *  ----------------------------------------------------*/
    
    volatile uint32_t gAbortRecieved = 0U;
    
    /*######################################################
     *  STATIC FUNCTIONS
     *  ----------------------------------------------------*/
    
    static void Sciclient_fw_abort_C_handler()
    {
        gAbortRecieved++;
    }
    
    /*######################################################
     *  FUNCTIONS
     *  ----------------------------------------------------*/
    
    void firewall_init()
    {
        const uint32_t permForNoAccess = 0;
    
        const uint32_t permForAccess =
                SCICLIENT_APP_SEC_SUPV_WRITE_MASK | SCICLIENT_APP_SEC_SUPV_READ_MASK |
                SCICLIENT_APP_SEC_SUPV_CACHEABLE_MASK | SCICLIENT_APP_SEC_SUPV_DEBUG_MASK |
                SCICLIENT_APP_SEC_USER_WRITE_MASK | SCICLIENT_APP_SEC_USER_READ_MASK |
                SCICLIENT_APP_SEC_USER_CACHEABLE_MASK | SCICLIENT_APP_SEC_USER_DEBUG_MASK |
                SCICLIENT_APP_NONSEC_SUPV_WRITE_MASK | SCICLIENT_APP_NONSEC_SUPV_READ_MASK |
                SCICLIENT_APP_NONSEC_SUPV_CACHEABLE_MASK | SCICLIENT_APP_NONSEC_SUPV_DEBUG_MASK |
                SCICLIENT_APP_NONSEC_USER_WRITE_MASK | SCICLIENT_APP_NONSEC_USER_READ_MASK |
                SCICLIENT_APP_NONSEC_USER_CACHEABLE_MASK | SCICLIENT_APP_NONSEC_USER_DEBUG_MASK;
    
        struct tisci_msg_fwl_change_owner_info_req req = {
          .fwl_id      = (uint16_t) APP_FWL_ID,
          .region      = (uint16_t) 0,
          .owner_index = (uint8_t) APP_R5F_HOST_ID
          };
    
        struct tisci_msg_fwl_set_firewall_region_req req_fw_set_background = {
            .fwl_id            = (uint16_t) APP_FWL_ID,
            .region            = (uint16_t) 0,
            .n_permission_regs = (uint32_t) 3,
            .control           = (uint32_t) 0x10A,
            .permissions[0]    = (uint32_t) 197 << 16 | permForAccess,
            .permissions[1]    = (uint32_t) 0,
            .permissions[2]    = (uint32_t) 0,
            .start_address     = APP_ADDRESS_START,
            .end_address       = APP_ADDRESS_END
        };  
     
        struct tisci_msg_fwl_set_firewall_region_req req_fw_block_access = {
          .fwl_id            = (uint16_t) APP_FWL_ID,
          .region            = (uint16_t) 1,
          .n_permission_regs = (uint32_t) 3,
          .control           = (uint32_t) 0xA,
          .permissions[0]    = (uint32_t) APP_PRIVID << 16 | permForNoAccess,
          .permissions[1]    = (uint32_t) 0,
          .permissions[2]    = (uint32_t) 0,
          .start_address     = APP_ADDRESS_START,
          .end_address       = APP_ADDRESS_START + (APP_SIZE - 1) * 4
        };
    
        struct tisci_msg_fwl_change_owner_info_resp resp = {0};
        struct tisci_msg_fwl_set_firewall_region_resp resp_fw_block_access = {0};
        struct tisci_msg_fwl_set_firewall_region_resp resp_fw_set_background = {0};
        
        uint32_t timeout = 0xFFFFFFFFU;
        int32_t ret = CSL_PASS;
    
        PRINT_LOG("init firewall\n");
    
        /* Register exception handler */
        /* This is needed for data abort which should occur during writing to firewalled region */
        printf("setting firewall handler\n");
        CSL_R5ExptnHandlers sciclientR5ExptnHandlers;
        Intc_InitExptnHandlers(&sciclientR5ExptnHandlers);
        sciclientR5ExptnHandlers.dabtExptnHandler = &Sciclient_fw_abort_C_handler;
        Intc_RegisterExptnHandlers(&sciclientR5ExptnHandlers);
    
        ret = Sciclient_firewallChangeOwnerInfo(&req, &resp, timeout);
        if (ret != CSL_PASS)
        {
          PRINT_LOG("failed change owner region 0\n");
        }
    
        req.region = 1;
        ret = Sciclient_firewallChangeOwnerInfo(&req, &resp, timeout);
        if (ret != CSL_PASS)
        {
          PRINT_LOG("failed change owner region 1\n");
        }
    
        if (ret == CSL_PASS)
        {
            /* Set background region */
            ret = Sciclient_firewallSetRegion(&req_fw_set_background, &resp_fw_set_background, timeout);
            if (ret != CSL_PASS)
            {
              PRINT_LOG("failed setting firewall background region\n");
            }
            ret = Sciclient_firewallSetRegion(&req_fw_block_access, &resp_fw_block_access, timeout);
            if (ret != CSL_PASS)
            {
              PRINT_LOG("failed setting firewall region\n");
            }
        }
    
        PRINT_LOG("init done !!\n");
    }
    
    /**
     * \brief   This Task test safety firewall r5f BTCM memory
     *
     * \param   
     *
     * \retval  
     */
    void vTaskTestSafety(void *pvParameters)
    {   
        bool run = true;
        uint32_t data_index = 0;
        volatile uint32_t* addr = NULL;
    
        PRINT_LOG("\r\n********************************************\r\n");
        PRINT_LOG("\r\n[FreeRTOS] SAFETY tests ... start !!!\r\n");
        PRINT_LOG("\r\n********************************************\r\n");
    
        firewall_init();
    
        /* read and write data */
        addr = (uint32_t*) APP_ADDRESS_START + 0x40; /* add offset (rsvd in linker) */
        for (data_index = 0; data_index < APP_SIZE; data_index++)
        {
            addr[data_index] = data_index;
        }
    
        CacheP_wbInv((const void*)addr, APP_SIZE * sizeof(uint32_t));
    
        for (data_index = 0; data_index < 20; data_index++)
        {
            PRINT_LOG("@0x%x = 0x%x\n", (uint32_t) &addr[data_index], addr[data_index]);
        }
    
        printf( "%d/%d error received\n", gAbortRecieved, APP_SIZE + 20);
    
        while(run)
        {
            BOARD_delay(10000);
        }
        
        vTaskDelete( NULL );
    }

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

    尊敬的 Charles:

    [引述 userid=“545647" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1559896/processor-sdk-j784s4-lock-r5f-tcm-access/6004328

    我在所有 BTCM 存储器上将区域 0 设置为后台区域、并启用每次访问。

    [/报价]

    在后台区域中、似乎不是这样、您正在阻止对每个区域的访问。

    197 是 阻止所有人的 PRIV ID。允许所有人的 PRIV ID 为 195。

    后台防火墙配置还有一个问题。 防火墙 ID 2768 保护除 BTCM 之外的其他区域。

    CORE0_ATCM 0x05C00000 0x05C0FFFF
    CORE0_BTCM 0x05C10000 0x05C1FFFF
    CORE0_ICACHE 0x4E00000000 0x4E007FFFFF
    CORE0_DCache 0x4E00800000 0x4E00FFFFFF

    目前、应用程序仅配置对 BTCM 的访问。 由于这些防火墙以白名单形式运行、因此这会无意中阻止对其他存储区域 (ATCM、ICACHE 和 DCache) 的访问。 因此、我们需要配置它在后台区域中保护的完整地址范围。

    此致
    Diwakar

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

    尊敬的 

    我将背景区域的优先级 ID 从 197 更改为 195

    第一墙有 4 个区域。 是否可以设置 1 个 包含每个内存 (ATCM、BTCM、ICACHE 和 DCache) 的背景区域、然后设置 哪个起始地址和结束地址值?

    因为、如果我分别为每个存储器设置 1 个后台区域、那么不会有任何区域可用于设置前台区域以进行滤波

    谢谢

    Charles

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

    尊敬的 Charls:

    firwall 有 4 个地区。 是否可以设置 包括每个内存 (ATCM、BTCM、ICACHE 和 DCache) 的 1 个背景区域、然后设置 起始地址和结束地址的值?

    是的、这是可能的、在后台区域中设置地址范围、例如此  0x00000000 - 0xFFFFFFFFFFFFFF。

    此致
    Diwakar

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

    尊敬的 Diwakar Dhyani:

    我 已经设置了后台区域  0x00000000 - 0xFFFFFFFFFFFFFF

    禁止从每个器件访问 BTCM 存储器

    当我尝试从 R5F 和 C7X 访问存储器时、内核崩溃。 这是 正常行为吗?

    谢谢

    Charles

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

    尊敬的 Charles:

    这种行为是正常的。 由于我们将 防火墙配置为阻止对该存储器区域的所有访问、因此 R5F 或 C7X 处理器访问该区域的任何尝试都会故意生成总线错误。

    此致
    Diwakar

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

    尊敬的 Diwakar Dhyani:

    很抱歉、我与防火墙 ID 混淆了。 我找到了两个不同的防火墙 ID 列表

    • 在 pdk : csl_soc_firewalls.h 中、定义 SOC 的防火墙 ID -->、我在其中找到了 BTCM 防火墙 ID
    • 在 PDK 的 sciclient 文档中、列出防火墙 ID 和 priv-ID 列表-->/sciclient/sysfw/binaries/system-firmware-public-documentation/5_soc_doc/j784s4/firewalls.html soc
      • Sciclient 防火墙示例使用此列表

    谢谢  

    Charles

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

     尊敬的 Charles:

    [引述 userid=“545647" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1559896/processor-sdk-j784s4-lock-r5f-tcm-access/6008001
    • 在 pdk : csl_soc_firewalls.h 中、定义 SOC 的防火墙 ID -->、我在其中找到了 BTCM 防火墙 ID
    [/报价]

    这个头文件由 PDK 在内部使用、而 j784s4/firewalls.html 文件用作面向公众的文档。

    RTOS SDK 包含公共文档和其他组件。 您可以 在此处访问相同的公共文档

    该表概述了 TIFS 在初始化过程中应用的默认防火墙配置。 TIFS 在启动时自动使用这些设置配置这些防火墙。 但是、它并不涉及所有防火墙配置。

    此致
    Diwakar

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

    尊敬的 Diwakar Dhyani:

    最后一点是我无法到达数据中止异常处理程序

    我在 MCU2_0 上运行我的代码、
    我属于“hwip_data_abort_handler_c"内“内的无限循环
    -->这表示指向处理程序的指针为空

    我找到了其他执行相同操作的函数:“dataAbortExptnHandler_c"</s>“

    但  “hwip_data_abort_handler_c"和“和“dataAbortExptnHandler_c"都“都  使用相同的全局 var “gExptnHandlers"</s>“

    当我直接调用这些函数时、到达处理程序。

    这是我如何设置我的处理程序:

    CSL_R5ExptnHandlers sciclientR5ExptnHandlers;
    Intc_InitExptnHandlers(&sciclientR5ExptnHandlers);
    sciclientR5ExptnHandlers.dabtExptnHandler = &Sciclient_fw_abort_C_handler;
    Intc_RegisterExptnHandlers(&sciclientR5ExptnHandlers);

    谢谢

    Charles

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

    尊敬的 Charles:

    您能否详细说明您的用例是否要在防火墙异常情况下处理数据中止?

    此致
    Diwakar

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

    尊敬的 Diwakar Dhyani:

    问题 本身就消失了。

    感谢你的帮助

    我正在关闭此帖子

    Charles