1 /**************************************************************************/ 2 /* */ 3 /* Copyright (c) Microsoft Corporation. All rights reserved. */ 4 /* */ 5 /* This software is licensed under the Microsoft Software License */ 6 /* Terms for Microsoft Azure RTOS. Full text of the license can be */ 7 /* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */ 8 /* and in the root directory of this software. */ 9 /* */ 10 /**************************************************************************/ 11 12 13 /**************************************************************************/ 14 /**************************************************************************/ 15 /** */ 16 /** ThreadX Component */ 17 /** */ 18 /** Module Manager */ 19 /** */ 20 /**************************************************************************/ 21 /**************************************************************************/ 22 23 24 /**************************************************************************/ 25 /* */ 26 /* COMPONENT DEFINITION RELEASE */ 27 /* */ 28 /* txm_module_manager_util.h PORTABLE C */ 29 /* 6.3.0 */ 30 /* AUTHOR */ 31 /* */ 32 /* Scott Larson, Microsoft Corporation */ 33 /* */ 34 /* DESCRIPTION */ 35 /* */ 36 /* This file declares prototypes of utility functions used by the */ 37 /* module manager. */ 38 /* */ 39 /* RELEASE HISTORY */ 40 /* */ 41 /* DATE NAME DESCRIPTION */ 42 /* */ 43 /* 09-30-2020 Scott Larson Initial Version 6.1 */ 44 /* 04-02-2021 Scott Larson Modified comment(s) and */ 45 /* optimized object checks, */ 46 /* resulting in version 6.1.6 */ 47 /* 10-31-2023 Tiejun Zhou Modified comment(s) and */ 48 /* improved object check, */ 49 /* resulting in version 6.3.0 */ 50 /* */ 51 /**************************************************************************/ 52 53 #ifndef TXM_MODULE_MANAGER_UTIL_H 54 #define TXM_MODULE_MANAGER_UTIL_H 55 56 /* Define check macros for modules. */ 57 58 #define TXM_MODULE_MANAGER_CHECK_OUTSIDE_DATA(module_instance, obj_ptr, obj_size) \ 59 (!(TXM_MODULE_MANAGER_CHECK_INSIDE_DATA(module_instance, obj_ptr, obj_size))) 60 61 #define TXM_MODULE_MANAGER_CHECK_INSIDE_CODE(module_instance, obj_ptr, obj_size) \ 62 (((obj_ptr) < ((obj_ptr) + (obj_size))) && \ 63 ((obj_ptr) >= (ALIGN_TYPE) module_instance -> txm_module_instance_code_start) && \ 64 (((obj_ptr) + (obj_size)) <= ((ALIGN_TYPE) module_instance -> txm_module_instance_code_end + 1))) 65 66 #define TXM_MODULE_MANAGER_CHECK_OUTSIDE_CODE(module_instance, obj_ptr, obj_size) \ 67 (!(TXM_MODULE_MANAGER_CHECK_INSIDE_CODE(module_instance, obj_ptr, obj_size))) 68 69 /* Add sizeof(TXM_MODULE_ALLOCATED_OBJECT) to pool start because the object can't exist before that. */ 70 #define TXM_MODULE_MANAGER_CHECK_INSIDE_OBJ_POOL(module_instance, obj_ptr, obj_size) \ 71 ((_txm_module_manager_object_pool_created == TX_TRUE) && \ 72 ((obj_ptr) < ((obj_ptr) + (obj_size))) && \ 73 (((obj_ptr) >= ((ALIGN_TYPE) _txm_module_manager_object_pool.tx_byte_pool_start + sizeof(TXM_MODULE_ALLOCATED_OBJECT))) && \ 74 (((obj_ptr) + (obj_size)) <= (ALIGN_TYPE) (_txm_module_manager_object_pool.tx_byte_pool_start + _txm_module_manager_object_pool.tx_byte_pool_size)))) 75 76 /* Define macros for module. */ 77 78 #define TXM_MODULE_MANAGER_ENSURE_INSIDE_MODULE(module_instance, obj_ptr, obj_size) \ 79 (TXM_MODULE_MANAGER_CHECK_INSIDE_DATA(module_instance, obj_ptr, obj_size) || \ 80 TXM_MODULE_MANAGER_CHECK_INSIDE_CODE(module_instance, obj_ptr, obj_size)) 81 82 #define TXM_MODULE_MANAGER_ENSURE_INSIDE_MODULE_DATA(module_instance, obj_ptr, obj_size) \ 83 TXM_MODULE_MANAGER_CHECK_INSIDE_DATA(module_instance, obj_ptr, obj_size) 84 85 #define TXM_MODULE_MANAGER_ENSURE_OUTSIDE_MODULE(module_instance, obj_ptr, obj_size) \ 86 (TXM_MODULE_MANAGER_CHECK_OUTSIDE_DATA(module_instance, obj_ptr, obj_size) && \ 87 TXM_MODULE_MANAGER_CHECK_OUTSIDE_CODE(module_instance, obj_ptr, obj_size)) 88 89 #define TXM_MODULE_MANAGER_ENSURE_INSIDE_OBJ_POOL(module_instance, obj_ptr, obj_size) \ 90 TXM_MODULE_MANAGER_CHECK_INSIDE_OBJ_POOL(module_instance, obj_ptr, obj_size) 91 92 /* Define macros for parameter types. */ 93 94 /* Buffers we read from can be in RW/RO/Shared areas. */ 95 #define TXM_MODULE_MANAGER_PARAM_CHECK_BUFFER_READ(module_instance, buffer_ptr, buffer_size) \ 96 ((TXM_MODULE_MANAGER_ENSURE_INSIDE_MODULE(module_instance, buffer_ptr, buffer_size)) || \ 97 ((void *) (buffer_ptr) == TX_NULL)) 98 99 /* Buffers we write to can only be in RW/Shared areas. */ 100 #define TXM_MODULE_MANAGER_PARAM_CHECK_BUFFER_WRITE(module_instance, buffer_ptr, buffer_size) \ 101 ((TXM_MODULE_MANAGER_ENSURE_INSIDE_MODULE_DATA(module_instance, buffer_ptr, buffer_size)) || \ 102 ((void *) (buffer_ptr) == TX_NULL)) 103 104 /* Kernel objects should be outside the module at the very least. */ 105 #define TXM_MODULE_MANAGER_PARAM_CHECK_OBJECT_FOR_USE(module_instance, obj_ptr, obj_size) \ 106 (TXM_MODULE_MANAGER_ENSURE_OUTSIDE_MODULE(module_instance, obj_ptr, obj_size) || \ 107 (_txm_module_manager_created_object_check(module_instance, (void *)obj_ptr) == TX_FALSE) || \ 108 ((void *) (obj_ptr) == TX_NULL)) 109 110 /* When creating an object, the object must be inside the object pool. */ 111 #define TXM_MODULE_MANAGER_PARAM_CHECK_OBJECT_FOR_CREATION(module_instance, obj_ptr, obj_size) \ 112 ((TXM_MODULE_MANAGER_ENSURE_INSIDE_OBJ_POOL(module_instance, obj_ptr, obj_size) && \ 113 (_txm_module_manager_object_size_check(obj_ptr, obj_size) == TX_SUCCESS)) || \ 114 (_txm_module_manager_created_object_check(module_instance, (void *)obj_ptr) == TX_FALSE) || \ 115 ((void *) (obj_ptr) == TX_NULL)) 116 117 /* Strings we dereference can be in RW/RO/Shared areas. */ 118 #define TXM_MODULE_MANAGER_PARAM_CHECK_DEREFERENCE_STRING(module_instance, string_ptr) \ 119 ((TXM_MODULE_MANAGER_ENSURE_INSIDE_MODULE(module_instance, string_ptr, 1)) || \ 120 ((void *) (string_ptr) == TX_NULL)) 121 122 #define TXM_MODULE_MANAGER_UTIL_MAX_VALUE_OF_TYPE_UNSIGNED(type) ((1ULL << (sizeof(type) * 8)) - 1) 123 124 #define TXM_MODULE_MANAGER_UTIL_MATH_ADD_ULONG(augend, addend, result) \ 125 if ((ULONG)-1 - (augend) < (addend)) \ 126 { \ 127 return(TXM_MODULE_MATH_OVERFLOW); \ 128 } \ 129 else \ 130 { \ 131 (result) = (augend) + (addend); \ 132 } 133 134 /* Define utility functions. */ 135 136 UINT _txm_module_manager_object_memory_check(TXM_MODULE_INSTANCE *module_instance, ALIGN_TYPE object_ptr, ULONG object_size); 137 UINT _txm_module_manager_object_size_check(ALIGN_TYPE object_ptr, ULONG object_size); 138 UINT _txm_module_manager_object_name_compare(CHAR *object_name1, UINT object_name1_length, CHAR *object_name2); 139 UCHAR _txm_module_manager_created_object_check(TXM_MODULE_INSTANCE *module_instance, void *object_ptr); 140 UINT _txm_module_manager_util_code_allocation_size_and_alignment_get(TXM_MODULE_PREAMBLE *module_preamble, ULONG *code_alignment_dest, ULONG *code_allocation_size_dest); 141 142 #endif 143