工具/软件:
尊敬的专家:
我将 j784s4_evm 与 SDK10 配合使用。
我只想从 R5F 访问 TCM 存储器、出于安全原因、这很有用。
我希望其他内核 (R5F、C7X 和 A72) 无法访问此存储器。
您能举个例子吗?
感谢你的帮助
Charles
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.
工具/软件:
尊敬的专家:
我将 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
尊敬的 Diwakar Dhyani:
我将背景区域的优先级 ID 从 197 更改为 195
第一墙有 4 个区域。 是否可以设置 1 个 包含每个内存 (ATCM、BTCM、ICACHE 和 DCache) 的背景区域、然后设置 哪个起始地址和结束地址值?
因为、如果我分别为每个存储器设置 1 个后台区域、那么不会有任何区域可用于设置前台区域以进行滤波
谢谢
Charles
尊敬的 Diwakar Dhyani:
很抱歉、我与防火墙 ID 混淆了。 我找到了两个不同的防火墙 ID 列表
谢谢
Charles
尊敬的 Charles:
[引述 userid=“545647" url="“ url="~“~/support/processors-group/processors/f/processors-forum/1559896/processor-sdk-j784s4-lock-r5f-tcm-access/6008001这个头文件由 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