/* BEGIN_FILE_HDR ******************************************************************************** * NOTICE * This software is the property of HiRain Technologies. Any information * contained in this doc should not be reproduced, or used, or disclosed * without the written authorization from HiRain Technologies. ******************************************************************************** * File Name: Os_Mpu.c ******************************************************************************** * Project/Product: AUTOSAR OS PROJECT * Title: Os_Mpu.c * Author: Hirain ******************************************************************************** * Description: Define the Mpu functions of OS * ******************************************************************************** * Limitations : None * ******************************************************************************** * ******************************************************************************** * Revision History: * Reference to Os_Cpu.c File ******************************************************************************** * END_FILE_HDR*/ #include "Os_Internal.h" #define OS_START_SEC_CODE #include "Os_MemMap.h" #if (OS_ON == OS_MEM_PROTECTION_SUPPORT) /******************************************************************************* register memory (Kernel/Isr1) USER(task/Isr2) Region_0 all memory data rw r Region_1 Task/isr2 data rw rw Region_2 application data rw rw Region_3 task/isr2 stack rw rw ********************************************************************************/ /***************************************************************************** * Mpu private macro ******************************************************************************/ #define OS_PL_MPU_KERNEL_SET ((Os_uint32)0) #define OS_PL_MPU_TASK_ISR_SET ((Os_uint32)0x00001000) /* RAM memory information*/ #define OS_SRAM_BASE (0x1FFE0000U) #define OS_SRAM_END (0x20020000U) #define OS_FLASH_BASE (0x00000000U) #define OS_FLASH_END (0x001FFFFFU) /***************************************************************************** * Mpu private code ******************************************************************************/ /* BEGIN_FUNCTION_HDR ******************************************************************************** * Function Name: OsMpu_CheckEnable * * Description: Check MPU enable state * * Inputs: None * * * Outputs: None * * Limitations: None ******************************************************************************** END_FUNCTION_HDR*/ STATIC FUNC(Os_boolean, OS_CODE) OsMpu_CheckEnable ( void ) { Os_boolean ret = OS_FALSE; os_smpu_reg_t * SMPU = (os_smpu_reg_t *)(OS_SMPU_BASE_ADDR); if(SMPU->SMPU_CS.GLBEN == 1U) { ret = OS_TRUE; } return ret; } /* BEGIN_FUNCTION_HDR ******************************************************************************** * Function Name: OsMpu_SMPU_Init * * Description: Initializes the SMPU * * Inputs: region,smpuConfigStruct * * * Outputs: None * * Limitations: Select memory region protect unit Pointer to a SMPU configuration structure ******************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_SMPU_Init ( OS_SMPU_MemoryRegion_t region, const OS_SMPU_Config_t* smpuConfigStruct ) { os_smpu_reg_t * SMPU = (os_smpu_reg_t *)(OS_SMPU_BASE_ADDR); os_smpu_reg_w_t * SMPUw = (os_smpu_reg_w_t *)(OS_SMPU_BASE_ADDR); Os_uint32 retVal; SMPU->SMPU_MRCn_W[region].SMPU_MRCn_W0.SADDR = smpuConfigStruct->startAddress >> 0x05UL; SMPU->SMPU_MRCn_W[region].SMPU_MRCn_W1.EADDR = (smpuConfigStruct->endAddress - 1) >> 0x05UL; retVal = ((Os_uint32)(smpuConfigStruct->exeAllow) << ((Os_uint32)(smpuConfigStruct->busMaster) * 0x6UL)); retVal |= ((Os_uint32)(smpuConfigStruct->writeAllow) << ((Os_uint32)(smpuConfigStruct->busMaster) * 0x6UL + 0x1UL)); retVal |= ((Os_uint32)(smpuConfigStruct->readAllow) << ((Os_uint32)(smpuConfigStruct->busMaster) * 0x6UL + 0x2UL)); retVal |= ((Os_uint32)(smpuConfigStruct->supervisorModeAccess) & 0x03UL) << ((Os_uint32)smpuConfigStruct->busMaster * 0x6UL + 0x3UL); SMPUw->SMPU_MRCn_W[region].SMPU_MRCn_W2 &= ~(0x1FUL << (Os_uint32)smpuConfigStruct->busMaster * 0x6UL); SMPUw->SMPU_MRCn_W[region].SMPU_MRCn_W2 |= retVal; } /* BEGIN_FUNCTION_HDR ******************************************************************************** * Function Name: OsMpu_MrcEnable * * Description: Memory region n configuration enable * * Inputs: region * * * Outputs: None * * Limitations: Select memory region protect unit ******************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_MrcEnable ( OS_SMPU_MemoryRegion_t region ) { os_smpu_reg_t * SMPU = (os_smpu_reg_t *)(OS_SMPU_BASE_ADDR); SMPU->SMPU_MRCn_W[region].SMPU_MRCn_W3.EN = 1U; } /* BEGIN_FUNCTION_HDR ******************************************************************************** * Function Name: OsMpu_SMPU_Region_Init * * Description: Memory region n init * * Inputs: region,wAllow,xAllow,svrMode,startAddr,endAddr * * * Outputs: None * * Limitations: None ******************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_SMPU_Region_Init ( OS_SMPU_MemoryRegion_t region, Os_ControlState_t wAllow, Os_ControlState_t xAllow, OS_SMPU_SvrModeAccess_t svrMode, Os_uint32 startAddr, Os_uint32 endAddr ) { const OS_SMPU_Config_t SmpuConfig = { .busMaster = OS_SMPU_BUS_MASTER_0, .startAddress = startAddr, .endAddress = endAddr, .exeAllow = xAllow, .writeAllow = wAllow, .readAllow = OS_ENABLE, .supervisorModeAccess = svrMode }; OsMpu_SMPU_Init(region, &SmpuConfig); OsMpu_MrcEnable(region); } /***************************************************************************** * Os Internal code ******************************************************************************/ /* BEGIN_FUNCTION_HDR *********************************************************************************************** * Function Name: OsMpu_Checker * * Description: Check for memory protection errors * * Inputs: None * * * Outputs: None * * Limitations: None *********************************************************************************************** END_FUNCTION_HDR*/ FUNC(Os_boolean, OS_CODE) OsMpu_Checker ( void ) { Os_uint8 ret = OS_FALSE; os_smpu_reg_t * SMPU = (os_smpu_reg_t *)(OS_SMPU_BASE_ADDR); if((1 == SMPU->SMPU_CS.S0ERR) || (1 == SMPU->SMPU_CS.S1ERR) || (1 == SMPU->SMPU_CS.S2ERR) ||(1 == SMPU->SMPU_CS.S3ERR)) { ret = OS_TRUE; } return ret; } /* BEGIN_FUNCTION_HDR *********************************************************************************************** * Function Name: OsMpu_Init * * Description: Init mpu * * Inputs: Reference to core, * * * Outputs: None * * Limitations: None *********************************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_Init ( CoreIdType CoreID ) { /* Enable PFLASH region with all attributes, where puts code/readonly data*/ Os_boolean ret = OS_FALSE; ret = OsMpu_CheckEnable(); if(ret == OS_TRUE) { OsHook_FataErrReport(CoreID, E_OS_PL_SYSFATA_REG_ERR, OSServiceId_OsMpu_Init,\ OS_IE_NOMORE_INFO, OS_IE_NO_ERRPAR, OS_IE_NO_ERRPAR, OS_IE_NO_ERRPAR); } OsCpu_SYSCTRL_EnableModule(OS_SYSCTRL_SMPU); OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_0, OS_DISABLE, OS_ENABLE, OS_SMPU_ALL_ALLOWED, OS_FLASH_BASE, 0xFFFFFFFF); /* enable mpu */ OsMpu_Enable(CoreID); } /* BEGIN_FUNCTION_HDR ******************************************************************************** * Function Name: OsMpu_Enable * * Description: Enable MPU * * Inputs: Reference to core, * * * Outputs: None * * Limitations: None ******************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_Enable ( CoreIdType CoreID ) { (void)CoreID; os_smpu_reg_t * SMPU = (os_smpu_reg_t *)(OS_SMPU_BASE_ADDR); SMPU->SMPU_CS.GLBEN = 1U; } /* BEGIN_FUNCTION_HDR ******************************************************************************** * Function Name: OsMpu_Disable * * Description: Disable MPU * * Inputs: Reference to core, * * * Outputs: None * * Limitations: None ******************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_Disable ( CoreIdType CoreID ) { (void)CoreID; os_smpu_reg_t * SMPU = (os_smpu_reg_t *)(OS_SMPU_BASE_ADDR); SMPU->SMPU_CS.GLBEN = 0U; } /* BEGIN_FUNCTION_HDR ******************************************************************************** * Function Name: OsMpu_InIsr1 * * Description: None * * Inputs: CoreID * * Outputs: None * * Limitations: None ******************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_InIsr1 ( CoreIdType CoreID ) { OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_4, OS_DISABLE, OS_ENABLE, OS_SMPU_ALL_ALLOWED, OS_FLASH_BASE, 0XFFFFFFFF); } /* BEGIN_FUNCTION_HDR ******************************************************************************** * Function Name: OsMpu_OutIsr1 * * Description: None * * Inputs: CoreID * * Outputs: None * * Limitations: None ******************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_OutIsr1 ( CoreIdType CoreID ) { os_smpu_reg_t * SMPU = (os_smpu_reg_t *)(OS_SMPU_BASE_ADDR); SMPU->SMPU_MRCn_W[OS_SMPU_Memory_Region_4].SMPU_MRCn_W3.EN = 0U; } /* BEGIN_FUNCTION_HDR ******************************************************************************** * Function Name: OsMpu_SetTask * * Description: set mpu to task right, change the address range and set to set1 * * Inputs: CoreID, TaskID * * * Outputs: None * * Limitations: None ******************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_SetTask ( CoreIdType CoreID, TaskType TaskID ) { #if(OS_APPLICATION_NUMBER > 0) ApplicationType ApplID; #endif #if(OS_APPLICATION_NUMBER > 0) ApplID = Os_TaskCfg[TaskID].ApplID; /* if trusted application, just set to kernel set*/ if((TaskID == Os_CoreCfg[CoreID].idleTaskId) || (OS_TRUE == Os_AppCfg[ApplID].isTrusted)) { OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_0, OS_DISABLE, OS_ENABLE, OS_SMPU_ALL_ALLOWED, OS_FLASH_BASE, 0xFFFFFFFF); return; } #else (void)CoreID; #endif if(((Os_uint32)Os_TaskCfg[TaskID].lowAddr != (Os_uint32)NULL_PTR) && ((Os_uint32)Os_TaskCfg[TaskID].highAddr != (Os_uint32)NULL_PTR)) { OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_1, OS_ENABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, Os_TaskCfg[TaskID].lowAddr, Os_TaskCfg[TaskID].highAddr); } #if(OS_ON == OS_MEM_PROTECTION_CODE_APPLICATION_SUPPORT) OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_2, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].osCodeLowAddr, Os_AppCfg[ApplID].osCodeHighAddr); #else OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_2, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, OS_FLASH_BASE, OS_SRAM_END); #endif OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_3, OS_ENABLE, OS_ENABLE, OS_SMPU_ALL_ALLOWED, (Os_uint32)Os_TaskCfg[TaskID].OsTaskStkTop, (Os_uint32)Os_TaskCfg[TaskID].OsTaskStkBottom); #if(OS_APPLICATION_NUMBER > 0) #if(OS_ON == OS_MEM_PROTECTION_SUPPORT) switch(Os_AppCfg[ApplID].mpuDataNum) { #ifdef OS_SMPU_OS_APPDATA11 case 11: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA11, OS_ENABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].lowAddr[10], Os_AppCfg[ApplID].highAddr[10]); #endif #ifdef OS_SMPU_OS_APPDATA10 case 10: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA10, OS_ENABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].lowAddr[9], Os_AppCfg[ApplID].highAddr[9]); #endif #ifdef OS_SMPU_OS_APPDATA9 case 9: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA9, OS_ENABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].lowAddr[8], Os_AppCfg[ApplID].highAddr[8]); #endif #ifdef OS_SMPU_OS_APPDATA8 case 8: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA8, OS_ENABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].lowAddr[7], Os_AppCfg[ApplID].highAddr[7]); #endif #ifdef OS_SMPU_OS_APPDATA7 case 7: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA7, OS_ENABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].lowAddr[6], Os_AppCfg[ApplID].highAddr[6]); #endif #ifdef OS_SMPU_OS_APPDATA6 case 6: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA6, OS_ENABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].lowAddr[5], Os_AppCfg[ApplID].highAddr[5]); #endif #ifdef OS_SMPU_OS_APPDATA5 case 5: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA5, OS_ENABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].lowAddr[4], Os_AppCfg[ApplID].highAddr[4]); #endif #ifdef OS_SMPU_OS_APPDATA4 case 4: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA4, OS_ENABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].lowAddr[3], Os_AppCfg[ApplID].highAddr[3]); #endif #ifdef OS_SMPU_OS_APPDATA3 case 3: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA3, OS_ENABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].lowAddr[2], Os_AppCfg[ApplID].highAddr[2]); #endif #ifdef OS_SMPU_OS_APPDATA2 case 2: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA2, OS_ENABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].lowAddr[1], Os_AppCfg[ApplID].highAddr[1]); #endif #ifdef OS_SMPU_OS_APPDATA1 case 1: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA1, OS_ENABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].lowAddr[0], Os_AppCfg[ApplID].highAddr[0]); break; default: break; #endif } #endif #if(OS_ON == OS_MEM_PROTECTION_CODE_APPLICATION_SUPPORT) switch(Os_AppCfg[ApplID].mpuCodeNum) { #ifdef OS_SMPU_OS_APPCODE11 case 11: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE11, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[10], Os_AppCfg[ApplID].appCodeHighAddr[10]); #endif #ifdef OS_SMPU_OS_APPCODE10 case 10: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE10, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[9], Os_AppCfg[ApplID].appCodeHighAddr[9]); #endif #ifdef OS_SMPU_OS_APPCODE9 case 9: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE9, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[8], Os_AppCfg[ApplID].appCodeHighAddr[8]); #endif #ifdef OS_SMPU_OS_APPCODE8 case 8: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE8, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[7], Os_AppCfg[ApplID].appCodeHighAddr[7]); #endif #ifdef OS_SMPU_OS_APPCODE7 case 7: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE7, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[6], Os_AppCfg[ApplID].appCodeHighAddr[6]); #endif #ifdef OS_SMPU_OS_APPCODE6 case 6: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE6, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[5], Os_AppCfg[ApplID].appCodeHighAddr[5]); #endif #ifdef OS_SMPU_OS_APPCODE5 case 5: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE5, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[4], Os_AppCfg[ApplID].appCodeHighAddr[4]); #endif #ifdef OS_SMPU_OS_APPCODE4 case 4: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE4, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[3], Os_AppCfg[ApplID].appCodeHighAddr[3]); #endif #ifdef OS_SMPU_OS_APPCODE3 case 3: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE3, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[2], Os_AppCfg[ApplID].appCodeHighAddr[2]); #endif #ifdef OS_SMPU_OS_APPCODE2 case 2: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE2, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[1], Os_AppCfg[ApplID].appCodeHighAddr[1]); #endif #ifdef OS_SMPU_OS_APPCODE1 case 1: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE1, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[0], Os_AppCfg[ApplID].appCodeHighAddr[0]); break; #endif case 0: OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_2, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, OS_FLASH_BASE, 0xFFFFFFFF); break; default: break; } #endif #endif OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_0, OS_DISABLE, OS_DISABLE, OS_SMPU_ALL_ALLOWED, OS_FLASH_BASE, 0xFFFFFFFF); } /* BEGIN_FUNCTION_HDR *********************************************************************************************** * Function Name: OsMpu_SetISR * * Description: Set mpu to ISR right, change the address range and set to set1 * * Inputs: CoreID, TaskID * * * Outputs: None * * Limitations: None *********************************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_SetISR ( CoreIdType CoreID, ISRType ISRID ) { #if(OS_APPLICATION_NUMBER > 0) ApplicationType ApplID; #endif #if(OS_APPLICATION_NUMBER > 0) ApplID = Os_ISRCfg[ISRID].ApplID; /* if trusted application, just set to kernel set*/ if((ISRID == Os_CoreCfg[CoreID].sysCntIsrId) || (OS_TRUE == Os_AppCfg[ApplID].isTrusted)) { OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_0, OS_DISABLE, OS_ENABLE, OS_SMPU_ALL_ALLOWED, OS_FLASH_BASE, 0xFFFFFFFF); return; } #else (void)CoreID; #endif if(((Os_uint32)Os_ISRCfg[ISRID].lowAddr != (Os_uint32)NULL_PTR) && ((Os_uint32)Os_ISRCfg[ISRID].highAddr != (Os_uint32)NULL_PTR)) { OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_1, OS_ENABLE, OS_DISABLE, OS_SMPU_READ_WRITE_ALLOWED, Os_ISRCfg[ISRID].lowAddr, Os_ISRCfg[ISRID].highAddr); } #if(OS_ON == OS_MEM_PROTECTION_CODE_APPLICATION_SUPPORT) OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_2, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].osCodeLowAddr, Os_AppCfg[ApplID].osCodeHighAddr); #else OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_2, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, OS_FLASH_BASE, 0xFFFFFFFF); #endif OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_3, OS_ENABLE, OS_ENABLE, OS_SMPU_ALL_ALLOWED, (Os_uint32)Os_ISRCfg[ISRID].OsIsrStkTop, (Os_uint32)Os_ISRCfg[ISRID].OsIsrStkBottom); #if(OS_APPLICATION_NUMBER > 0) #if(OS_ON == OS_MEM_PROTECTION_SUPPORT) switch(Os_AppCfg[ApplID].mpuDataNum) { #ifdef OS_SMPU_OS_APPDATA11 case 11: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA11, OS_ENABLE, OS_DISABLE, OS_SMPU_READ_WRITE_ALLOWED, Os_AppCfg[ApplID].lowAddr[10], Os_AppCfg[ApplID].highAddr[10]); #endif #ifdef OS_SMPU_OS_APPDATA10 case 10: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA10, OS_ENABLE, OS_DISABLE, OS_SMPU_READ_WRITE_ALLOWED, Os_AppCfg[ApplID].lowAddr[9], Os_AppCfg[ApplID].highAddr[9]); #endif #ifdef OS_SMPU_OS_APPDATA9 case 9: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA9, OS_ENABLE, OS_DISABLE, OS_SMPU_READ_WRITE_ALLOWED, Os_AppCfg[ApplID].lowAddr[8], Os_AppCfg[ApplID].highAddr[8]); #endif #ifdef OS_SMPU_OS_APPDATA8 case 8: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA8, OS_ENABLE, OS_DISABLE, OS_SMPU_READ_WRITE_ALLOWED, Os_AppCfg[ApplID].lowAddr[7], Os_AppCfg[ApplID].highAddr[7]); #endif #ifdef OS_SMPU_OS_APPDATA7 case 7: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA7, OS_ENABLE, OS_DISABLE, OS_SMPU_READ_WRITE_ALLOWED, Os_AppCfg[ApplID].lowAddr[6], Os_AppCfg[ApplID].highAddr[6]); #endif #ifdef OS_SMPU_OS_APPDATA6 case 6: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA6, OS_ENABLE, OS_DISABLE, OS_SMPU_READ_WRITE_ALLOWED, Os_AppCfg[ApplID].lowAddr[5], Os_AppCfg[ApplID].highAddr[5]); #endif #ifdef OS_SMPU_OS_APPDATA5 case 5: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA5, OS_ENABLE, OS_DISABLE, OS_SMPU_READ_WRITE_ALLOWED, Os_AppCfg[ApplID].lowAddr[4], Os_AppCfg[ApplID].highAddr[4]); #endif #ifdef OS_SMPU_OS_APPDATA4 case 4: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA4, OS_ENABLE, OS_DISABLE, OS_SMPU_READ_WRITE_ALLOWED, Os_AppCfg[ApplID].lowAddr[3], Os_AppCfg[ApplID].highAddr[3]); #endif #ifdef OS_SMPU_OS_APPDATA3 case 3: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA3, OS_ENABLE, OS_DISABLE, OS_SMPU_READ_WRITE_ALLOWED, Os_AppCfg[ApplID].lowAddr[2], Os_AppCfg[ApplID].highAddr[2]); #endif #ifdef OS_SMPU_OS_APPDATA2 case 2: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA2, OS_ENABLE, OS_DISABLE, OS_SMPU_READ_WRITE_ALLOWED, Os_AppCfg[ApplID].lowAddr[1], Os_AppCfg[ApplID].highAddr[1]); #endif #ifdef OS_SMPU_OS_APPDATA1 case 1: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPDATA1, OS_ENABLE, OS_DISABLE, OS_SMPU_READ_WRITE_ALLOWED, Os_AppCfg[ApplID].lowAddr[0], Os_AppCfg[ApplID].highAddr[0]); break; default: break; #endif } #endif #if(OS_ON == OS_MEM_PROTECTION_CODE_APPLICATION_SUPPORT) switch(Os_AppCfg[ApplID].mpuCodeNum) { #ifdef OS_SMPU_OS_APPCODE11 case 11: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE11, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[10], Os_AppCfg[ApplID].appCodeHighAddr[10]); #endif #ifdef OS_SMPU_OS_APPCODE10 case 10: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE10, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[9], Os_AppCfg[ApplID].appCodeHighAddr[9]); #endif #ifdef OS_SMPU_OS_APPCODE9 case 9: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE9, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[8], Os_AppCfg[ApplID].appCodeHighAddr[8]); #endif #ifdef OS_SMPU_OS_APPCODE8 case 8: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE8, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[7], Os_AppCfg[ApplID].appCodeHighAddr[7]); #endif #ifdef OS_SMPU_OS_APPCODE7 case 7: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE7, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[6], Os_AppCfg[ApplID].appCodeHighAddr[6]); #endif #ifdef OS_SMPU_OS_APPCODE6 case 6: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE6, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[5], Os_AppCfg[ApplID].appCodeHighAddr[5]); #endif #ifdef OS_SMPU_OS_APPCODE5 case 5: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE5, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[4], Os_AppCfg[ApplID].appCodeHighAddr[4]); #endif #ifdef OS_SMPU_OS_APPCODE4 case 4: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE4, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[3], Os_AppCfg[ApplID].appCodeHighAddr[3]); #endif #ifdef OS_SMPU_OS_APPCODE3 case 3: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE3, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[2], Os_AppCfg[ApplID].appCodeHighAddr[2]); #endif #ifdef OS_SMPU_OS_APPCODE2 case 2: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE2, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[1], Os_AppCfg[ApplID].appCodeHighAddr[1]); #endif #ifdef OS_SMPU_OS_APPCODE1 case 1: OsMpu_SMPU_Region_Init(OS_SMPU_OS_APPCODE1, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, Os_AppCfg[ApplID].appCodeLowAddr[0], Os_AppCfg[ApplID].appCodeHighAddr[0]); break; #endif case 0: OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_2, OS_DISABLE, OS_ENABLE, OS_SMPU_SAME_WITH_USERMODE, OS_FLASH_BASE, 0xFFFFFFFF); break; default: break; } #endif #endif OsMpu_SMPU_Region_Init(OS_SMPU_Memory_Region_0, OS_DISABLE, OS_DISABLE, OS_SMPU_SAME_WITH_USERMODE, OS_FLASH_BASE, 0xFFFFFFFF); } /* BEGIN_FUNCTION_HDR *********************************************************************************************** * Function Name: OsMpu_ProtectionISR * * Description: set mpu to task right, change the address range and set to set1 * * Inputs: CoreID, TaskID * * * Outputs: None * * Limitations: None *********************************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_ProtectionISR ( void ) { CoreIdType CoreID; OsCpu_SetControl(OsCpu_GetControl() & ~((Os_uint32)OS_PL_UNPRIVILEGED_MASK)); /* nPRIV=1: unprivileged */ CoreID = OsCpu_GetCoreID(); OsMpu_SetKernel(CoreID); OsCpu_MPUFlag = OS_TRUE; OsHook_ProtectionHook(CoreID, E_OS_PROTECTION_MEMORY); } /* BEGIN_FUNCTION_HDR *********************************************************************************************** * Function Name: OsMpu_ClearRegion * * Description: disable region descriptor * * Inputs: None * * Outputs: None * * Limitations: None *********************************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_ClearRegion ( void ) { os_smpu_reg_t * SMPU = (os_smpu_reg_t *)(OS_SMPU_BASE_ADDR); SMPU->SMPU_MRCn_W[OS_SMPU_Memory_Region_3].SMPU_MRCn_W3.EN = 0U; #ifdef OS_SMPU_OS_DATA SMPU->SMPU_MRCn_W[OS_SMPU_OS_DATA].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPDATA11 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPDATA11].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPDATA10 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPDATA10].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPDATA9 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPDATA9].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPDATA8 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPDATA8].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPDATA7 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPDATA7].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPDATA6 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPDATA6].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPDATA5 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPDATA5].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPDATA4 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPDATA4].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPDATA3 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPDATA3].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPDATA2 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPDATA2].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPDATA1 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPDATA1].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPCODE11 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPCODE11].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPCODE10 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPCODE10].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPCODE9 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPCODE9].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPCODE8 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPCODE8].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPCODE7 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPCODE7].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPCODE6 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPCODE6].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPCODE5 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPCODE5].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPCODE4 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPCODE4].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPCODE3 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPCODE3].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPCODE2 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPCODE2].SMPU_MRCn_W3.EN = 0U; #endif #ifdef OS_SMPU_OS_APPCODE1 SMPU->SMPU_MRCn_W[OS_SMPU_OS_APPCODE1].SMPU_MRCn_W3.EN = 0U; #endif } /* BEGIN_FUNCTION_HDR *********************************************************************************************** * Function Name: OsMpu_CheckOsTaskMemoryAccess * * Description: * * Inputs: * * * Outputs: None * * Limitations: None *********************************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_CheckOsTaskMemoryAccess ( TaskType TaskID, ApplicationType tempOsAppId, Os_AddrType startAddress, Os_AddrType endAddress, AccessType *checkResult ) { } /* BEGIN_FUNCTION_HDR *********************************************************************************************** * Function Name: OsMpu_CheckOsIsrMemoryAccess * * Description: * * Inputs: * * * Outputs: None * * Limitations: None *********************************************************************************************** END_FUNCTION_HDR*/ FUNC(void, OS_CODE) OsMpu_CheckOsIsrMemoryAccess ( ISRType ISRID, ApplicationType tempOsAppId, Os_AddrType startAddress, Os_AddrType endAddress, AccessType *checkResult ) { } #endif/*#if(OS_ON == OS_MEM_PROTECTION_SUPPORT)*/ #define OS_STOP_SEC_CODE #include "Os_MemMap.h"