/**************************************************************************//* *//* Copyright (c) Microsoft Corporation. All rights reserved. *//* *//* This software is licensed under the Microsoft Software License *//* Terms for Microsoft Azure RTOS. Full text of the license can be *//* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA *//* and in the root directory of this software. *//* */.../**************************************************************************/.../**************************************************************************//**************************************************************************//** *//** ThreadX Component *//** *//** Module *//** */.../**************************************************************************//**************************************************************************/.../**************************************************************************//* *//* APPLICATION INTERFACE DEFINITION RELEASE *//* *//* txm_module_port.h Cortex-M4/GNU *//* 6.1.9 *//* AUTHOR *//* *//* Scott Larson, Microsoft Corporation *//* *//* DESCRIPTION *//* *//* This file defines the basic module constants, interface structures, *//* and function prototypes. *//* *//* RELEASE HISTORY *//* *//* DATE NAME DESCRIPTION *//* *//* 10-15-2021 Scott Larson Initial Version 6.1.9 *//* */.../**************************************************************************/#ifndefTXM_MODULE_PORT_H#defineTXM_MODULE_PORT_H/* Determine if the optional Modules user define file should be used. */#ifdefTXM_MODULE_INCLUDE_USER_DEFINE_FILE/* Yes, include the user defines in txm_module_user.h. The defines in this file may alternately be defined on the command line. *//* ... */#include"txm_module_user.h"/* ... */#endif/* It is assumed that the base ThreadX tx_port.h file has been modified to add the following extensions to the ThreadX thread control block (this code should replace the corresponding macro define in tx_port.h):#define TX_THREAD_EXTENSION_2 VOID *tx_thread_module_instance_ptr; \ VOID *tx_thread_module_entry_info_ptr; \ ULONG tx_thread_module_current_user_mode; \ ULONG tx_thread_module_user_mode; \ ULONG tx_thread_module_saved_lr; \ VOID *tx_thread_module_kernel_stack_start; \ VOID *tx_thread_module_kernel_stack_end; \ ULONG tx_thread_module_kernel_stack_size; \ VOID *tx_thread_module_stack_ptr; \ VOID *tx_thread_module_stack_start; \ VOID *tx_thread_module_stack_end; \ ULONG tx_thread_module_stack_size; \ VOID *tx_thread_module_reserved;The following extensions must also be defined in tx_port.h:#define TX_EVENT_FLAGS_GROUP_EXTENSION VOID *tx_event_flags_group_module_instance; \ VOID (*tx_event_flags_group_set_module_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *group_ptr);#define TX_QUEUE_EXTENSION VOID *tx_queue_module_instance; \ VOID (*tx_queue_send_module_notify)(struct TX_QUEUE_STRUCT *queue_ptr);#define TX_SEMAPHORE_EXTENSION VOID *tx_semaphore_module_instance; \ VOID (*tx_semaphore_put_module_notify)(struct TX_SEMAPHORE_STRUCT *semaphore_ptr);#define TX_TIMER_EXTENSION VOID *tx_timer_module_instance; \ VOID (*tx_timer_module_expiration_function)(ULONG id);*//* ... *//* Define the kernel stack size for a module thread. */#ifndefTXM_MODULE_KERNEL_STACK_SIZE#defineTXM_MODULE_KERNEL_STACK_SIZE768#endif/* For the following 3 access control settings, change TEX and C, B, S (bits 21 through 16 of MPU_RASR) * to reflect your system memory attributes (cache, shareable, memory type). *//* ... *//* Code region access control: privileged read-only, outer & inner write-back, normal memory, shareable. */#ifndefTXM_MODULE_MPU_CODE_ACCESS_CONTROL#defineTXM_MODULE_MPU_CODE_ACCESS_CONTROL0x06070000#endif/* Data region access control: execute never, read/write, outer & inner write-back, normal memory, shareable. */#ifndefTXM_MODULE_MPU_DATA_ACCESS_CONTROL#defineTXM_MODULE_MPU_DATA_ACCESS_CONTROL0x13070000#endif/* Shared region access control: execute never, read-only, outer & inner write-back, normal memory, shareable. */#ifndefTXM_MODULE_MPU_SHARED_ACCESS_CONTROL#defineTXM_MODULE_MPU_SHARED_ACCESS_CONTROL0x12070000#endif/* Define constants specific to the tools the module can be built with for this particular modules port. */#defineTXM_MODULE_IAR_COMPILER0x00000000#defineTXM_MODULE_RVDS_COMPILER0x01000000#defineTXM_MODULE_GNU_COMPILER0x02000000#defineTXM_MODULE_COMPILER_MASK0xFF000000#defineTXM_MODULE_OPTIONS_MASK0x000000FF/* Define the properties for this particular module port. */#defineTXM_MODULE_MEMORY_PROTECTION_ENABLED6 defines#ifdefTXM_MODULE_MEMORY_PROTECTION_ENABLED#defineTXM_MODULE_REQUIRE_ALLOCATED_OBJECT_MEMORY#else#defineTXM_MODULE_REQUIRE_LOCAL_OBJECT_MEMORY#endif#defineTXM_MODULE_USER_MODE0x00000001#defineTXM_MODULE_MEMORY_PROTECTION0x00000002#defineTXM_MODULE_SHARED_EXTERNAL_MEMORY_ACCESS0x00000004/* Define the supported options for this module. */#defineTXM_MODULE_MANAGER_SUPPORTED_OPTIONS(TXM_MODULE_USER_MODE|TXM_MODULE_MEMORY_PROTECTION|TXM_MODULE_SHARED_EXTERNAL_MEMORY_ACCESS)#defineTXM_MODULE_MANAGER_REQUIRED_OPTIONS0/* Define offset adjustments according to the compiler used to build the module. */#defineTXM_MODULE_IAR_SHELL_ADJUST24#defineTXM_MODULE_IAR_START_ADJUST28#defineTXM_MODULE_IAR_STOP_ADJUST32#defineTXM_MODULE_IAR_CALLBACK_ADJUST44#defineTXM_MODULE_RVDS_SHELL_ADJUST0#defineTXM_MODULE_RVDS_START_ADJUST0#defineTXM_MODULE_RVDS_STOP_ADJUST0#defineTXM_MODULE_RVDS_CALLBACK_ADJUST0#defineTXM_MODULE_GNU_SHELL_ADJUST24#defineTXM_MODULE_GNU_START_ADJUST28#defineTXM_MODULE_GNU_STOP_ADJUST32#defineTXM_MODULE_GNU_CALLBACK_ADJUST44/* Define other module port-specific constants. *//* Define INLINE_DECLARE to inline for GNU compiler. */#defineINLINE_DECLAREinline18 defines#ifdefTXM_MODULE_MANAGER_16_MPU/* Define the number of MPU entries assigned to the code and data sections. On some Cortex-M7 parts, there are 16 total entries. ThreadX uses one for access to the kernel entry function, thus 15 remain for code and data protection. *//* ... */#defineTXM_MODULE_MPU_TOTAL_ENTRIES16#defineTXM_MODULE_MPU_CODE_ENTRIES4#defineTXM_MODULE_MPU_DATA_ENTRIES4#defineTXM_MODULE_MPU_SHARED_ENTRIES3#defineTXM_MODULE_MPU_KERNEL_ENTRY_INDEX0#defineTXM_MODULE_MPU_SHARED_INDEX9#defineTXM_ENABLE_REGION0x017 defines/* There are 2 registers to set up each MPU region: MPU_RBAR, MPU_RASR. */typedefstructTXM_MODULE_MPU_INFO_STRUCT{ULONGtxm_module_mpu_region_address;ULONGtxm_module_mpu_region_attribute_size;...}TXM_MODULE_MPU_INFO;/* Shared memory region attributes. */#defineTXM_MODULE_MANAGER_SHARED_ATTRIBUTE_WRITE1#defineTXM_MODULE_MANAGER_ATTRIBUTE_WRITE_MPU_BIT0x01000000/* Define the port-extensions to the module manager instance structure. */#defineTXM_MODULE_MANAGER_PORT_EXTENSION\TXM_MODULE_MPU_INFOtxm_module_instance_mpu_registers[TXM_MODULE_MPU_TOTAL_ENTRIES];\ULONGtxm_module_instance_shared_memory_count;\ULONGtxm_module_instance_shared_memory_address[TXM_MODULE_MPU_SHARED_ENTRIES];\ULONGtxm_module_instance_shared_memory_length[TXM_MODULE_MPU_SHARED_ENTRIES];.../* ... */#else/* TXM_MODULE_MANAGER_16_MPU is not defined *//* Define the number of MPU entries assigned to the code and data sections. On Cortex-M3, M4, and some M7 parts, there are 8 total entries. ThreadX uses one for access to the kernel entry function, thus 7 remain for code and data protection. *//* ... */#defineTXM_MODULE_MANAGER_CODE_MPU_ENTRIES4#defineTXM_MODULE_MANAGER_DATA_MPU_ENTRIES3#defineTXM_MODULE_MANAGER_SHARED_MPU_INDEX8#defineTXM_MODULE_MANAGER_SHARED_MPU_REGION4/* Shared memory region attributes. */#defineTXM_MODULE_MANAGER_SHARED_ATTRIBUTE_WRITE1#defineTXM_MODULE_MANAGER_ATTRIBUTE_WRITE_MPU_BIT0x01000000/* Define the port-extensions to the module manager instance structure. */#defineTXM_MODULE_MANAGER_PORT_EXTENSION\ULONGtxm_module_instance_mpu_registers[16];\ULONGtxm_module_instance_shared_memory_address;\ULONGtxm_module_instance_shared_memory_length;...7 defines/* ... */#endif/* TXM_MODULE_MANAGER_16_MPU *//* Define the memory fault information structure that is populated when a memory fault occurs. */typedefstructTXM_MODULE_MANAGER_MEMORY_FAULT_INFO_STRUCT{TX_THREAD*txm_module_manager_memory_fault_info_thread_ptr;VOID*txm_module_manager_memory_fault_info_code_location;ULONGtxm_module_manager_memory_fault_info_shcsr;ULONGtxm_module_manager_memory_fault_info_cfsr;ULONGtxm_module_manager_memory_fault_info_mmfar;ULONGtxm_module_manager_memory_fault_info_bfar;ULONGtxm_module_manager_memory_fault_info_control;ULONGtxm_module_manager_memory_fault_info_sp;ULONGtxm_module_manager_memory_fault_info_r0;ULONGtxm_module_manager_memory_fault_info_r1;ULONGtxm_module_manager_memory_fault_info_r2;ULONGtxm_module_manager_memory_fault_info_r3;ULONGtxm_module_manager_memory_fault_info_r4;ULONGtxm_module_manager_memory_fault_info_r5;ULONGtxm_module_manager_memory_fault_info_r6;ULONGtxm_module_manager_memory_fault_info_r7;ULONGtxm_module_manager_memory_fault_info_r8;ULONGtxm_module_manager_memory_fault_info_r9;ULONGtxm_module_manager_memory_fault_info_r10;ULONGtxm_module_manager_memory_fault_info_r11;ULONGtxm_module_manager_memory_fault_info_r12;ULONGtxm_module_manager_memory_fault_info_lr;ULONGtxm_module_manager_memory_fault_info_xpsr;...}TXM_MODULE_MANAGER_MEMORY_FAULT_INFO;#defineTXM_MODULE_MANAGER_FAULT_INFO\TXM_MODULE_MANAGER_MEMORY_FAULT_INFO_txm_module_manager_memory_fault_info;.../* Define the macro to check the code alignment. */#defineTXM_MODULE_MANAGER_CHECK_CODE_ALIGNMENT(module_location,code_alignment)\{\ULONGtemp;\temp=(ULONG)module_location;\temp=temp&(code_alignment-1);\if(temp)\{\_tx_mutex_put(&_txm_module_manager_mutex);\return(TXM_MODULE_ALIGNMENT_ERROR);\...}\...}.../* Define the macro to adjust the alignment and size for code/data areas. */#defineTXM_MODULE_MANAGER_ALIGNMENT_ADJUST(module_preamble,code_size,code_alignment,data_size,data_alignment)_txm_module_manager_alignment_adjust(module_preamble,&code_size,&code_alignment,&data_size,&data_alignment);/* Define the macro to adjust the symbols in the module preamble. */#defineTXM_MODULE_MANAGER_CALCULATE_ADJUSTMENTS(properties,shell_function_adjust,start_function_adjust,stop_function_adjust,callback_function_adjust)\if((properties&TXM_MODULE_COMPILER_MASK)==TXM_MODULE_IAR_COMPILER)\{\shell_function_adjust=TXM_MODULE_IAR_SHELL_ADJUST;\start_function_adjust=TXM_MODULE_IAR_START_ADJUST;\stop_function_adjust=TXM_MODULE_IAR_STOP_ADJUST;\callback_function_adjust=TXM_MODULE_IAR_CALLBACK_ADJUST;\...}\elseif((properties&TXM_MODULE_COMPILER_MASK)==TXM_MODULE_RVDS_COMPILER)\{\shell_function_adjust=TXM_MODULE_RVDS_SHELL_ADJUST;\start_function_adjust=TXM_MODULE_RVDS_START_ADJUST;\stop_function_adjust=TXM_MODULE_RVDS_STOP_ADJUST;\callback_function_adjust=TXM_MODULE_RVDS_CALLBACK_ADJUST;\...}\else\{\shell_function_adjust=TXM_MODULE_GNU_SHELL_ADJUST;\start_function_adjust=TXM_MODULE_GNU_START_ADJUST;\stop_function_adjust=TXM_MODULE_GNU_STOP_ADJUST;\callback_function_adjust=TXM_MODULE_GNU_CALLBACK_ADJUST;\...}.../* Define the macro to populate the thread control block with module port-specific information. Check if the module is in user mode and set up txm_module_thread_entry_info_kernel_call_dispatcher accordingly.*//* ... */#defineTXM_MODULE_MANAGER_THREAD_SETUP(thread_ptr,module_instance)\thread_ptr->tx_thread_module_current_user_mode=module_instance->txm_module_instance_property_flags&TXM_MODULE_USER_MODE;\thread_ptr->tx_thread_module_user_mode=module_instance->txm_module_instance_property_flags&TXM_MODULE_USER_MODE;\if(thread_ptr->tx_thread_module_user_mode)\{\thread_entry_info->txm_module_thread_entry_info_kernel_call_dispatcher=_txm_module_manager_user_mode_entry;\...}\else\{\thread_entry_info->txm_module_thread_entry_info_kernel_call_dispatcher=_txm_module_manager_kernel_dispatch;\...}.../* Define the macro to populate the module control block with module port-specific information. If memory protection is enabled, set up the MPU registers.*//* ... */#defineTXM_MODULE_MANAGER_MODULE_SETUP(module_instance)\if(module_instance->txm_module_instance_property_flags&TXM_MODULE_USER_MODE)\{\if(module_instance->txm_module_instance_property_flags&TXM_MODULE_MEMORY_PROTECTION)\{\_txm_module_manager_mm_register_setup(module_instance);\...}\...}\else\{\/* Do nothing. */\...}.../* Define the macro to perform port-specific functions when unloading the module. *//* Nothing needs to be done for this port. */#defineTXM_MODULE_MANAGER_MODULE_UNLOAD(module_instance)7 defines/* Define the macros to perform port-specific checks when passing pointers to the kernel. *//* Define macro to make sure object is inside the module's data. */#ifdefTXM_MODULE_MANAGER_16_MPU#defineTXM_MODULE_MANAGER_CHECK_INSIDE_DATA(module_instance,obj_ptr,obj_size)\_txm_module_manager_inside_data_check(module_instance,obj_ptr,obj_size).../* ... */#else#defineTXM_MODULE_MANAGER_CHECK_INSIDE_DATA(module_instance,obj_ptr,obj_size)\/* Check for overflow. */\(((obj_ptr)<((obj_ptr)+(obj_size)))&&\/* Check if it's inside module data. */\((((obj_ptr)>=(ALIGN_TYPE)module_instance->txm_module_instance_data_start)&&\(((obj_ptr)+(obj_size))<=((ALIGN_TYPE)module_instance->txm_module_instance_data_end+1)))||\/* Check if it's inside shared memory. */\(((obj_ptr)>=(ALIGN_TYPE)module_instance->txm_module_instance_shared_memory_address)&&\(((obj_ptr)+(obj_size))<=(ALIGN_TYPE)(module_instance->txm_module_instance_shared_memory_address+module_instance->txm_module_instance_shared_memory_length))))).../* ... */#endif/* Define some internal prototypes to this module port. */#ifndefTX_SOURCE_CODE#definetxm_module_manager_memory_fault_notify_txm_module_manager_memory_fault_notify#endif#defineTXM_MODULE_MANAGER_ADDITIONAL_PROTOTYPES\VOID_txm_module_manager_alignment_adjust(TXM_MODULE_PREAMBLE*module_preamble,ULONG*code_size,ULONG*code_alignment,ULONG*data_size,ULONG*data_alignment);\VOID_txm_module_manager_memory_fault_handler(VOID);\UINT_txm_module_manager_memory_fault_notify(VOID(*notify_function)(TX_THREAD*,TXM_MODULE_INSTANCE*));\VOID_txm_module_manager_mm_register_setup(TXM_MODULE_INSTANCE*module_instance);\ULONG_txm_power_of_two_block_size(ULONGsize);\ULONG_txm_module_manager_calculate_srd_bits(ULONGblock_size,ULONGlength);\ULONG_txm_module_manager_region_size_get(ULONGblock_size);\UINT_txm_module_manager_inside_data_check(TXM_MODULE_INSTANCE*module_instance,ALIGN_TYPEobj_ptr,UINTobj_size);...#defineTXM_MODULE_MANAGER_VERSION_ID\CHAR_txm_module_manager_version_id[]=\"Copyright (c) Microsoft Corporation. All rights reserved. * ThreadX Module Cortex-M4/GNU Version 6.1.9 *";.../* ... */...#endif