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 #define TX_SOURCE_CODE
24 
25 #include "tx_api.h"
26 #include "txm_module.h"
27 
28 /**************************************************************************/
29 /*                                                                        */
30 /*  FUNCTION                                               RELEASE        */
31 /*                                                                        */
32 /*    _txm_module_manager_setup_mpu_registers              RXv2/IAR       */
33 /*                                                           6.1.9        */
34 /*  AUTHOR                                                                */
35 /*                                                                        */
36 /*    Scott Larson, Microsoft Corporation                                 */
37 /*                                                                        */
38 /*  DESCRIPTION                                                           */
39 /*                                                                        */
40 /*    This function sets up the RX MPU register definitions based         */
41 /*    on the module's memory characteristics.                             */
42 /*                                                                        */
43 /*  INPUT                                                                 */
44 /*                                                                        */
45 /*    module_instance                   Pointer to module instance        */
46 /*                                                                        */
47 /*  OUTPUT                                                                */
48 /*                                                                        */
49 /*    MPU specifications for module                                       */
50 /*                                                                        */
51 /*  CALLS                                                                 */
52 /*                                                                        */
53 /*    none                                                                */
54 /*                                                                        */
55 /*  CALLED BY                                                             */
56 /*                                                                        */
57 /*    _txm_module_manager_thread_create                                   */
58 /*                                                                        */
59 /*  RELEASE HISTORY                                                       */
60 /*                                                                        */
61 /*    DATE              NAME                      DESCRIPTION             */
62 /*                                                                        */
63 /*  10-15-2021      Scott Larson            Initial Version 6.1.9         */
64 /*                                                                        */
65 /**************************************************************************/
_txm_module_manager_setup_mpu_registers(TXM_MODULE_INSTANCE * module_instance)66 VOID  _txm_module_manager_setup_mpu_registers(TXM_MODULE_INSTANCE *module_instance)
67 {
68 
69 ULONG   region_size;
70 ULONG   region_start_page_register;
71 ULONG   region_end_page_register;
72 
73     /* Setup region 0 for the ThreadX trampoline code.  */
74     region_start_page_register = (ULONG) _txm_module_manager_user_mode_entry;
75     region_start_page_register = region_start_page_register & 0xFFFFFFF0;
76     module_instance -> txm_module_instance_mpu_registers[0] = region_start_page_register;
77     /* Region 0 End page is 2 pages away (for a total of 3 pages).
78      * Set reading permitted, writing prohibited, execution permitted, enable region. */
79     module_instance -> txm_module_instance_mpu_registers[1] = (region_start_page_register + 0x20) | 0x0B;
80 
81     /* Place the trampoline protection in the MPU registers  */
82     RSPAGE0 = module_instance -> txm_module_instance_mpu_registers[0];
83     REPAGE0 = module_instance -> txm_module_instance_mpu_registers[1];
84 
85     /* Setup region 1 for code area.  */
86     /* Set reading permitted, writing prohibited, execution permitted, enable region. */
87     region_start_page_register =    (ULONG) module_instance -> txm_module_instance_code_start;
88     region_size =                   (ULONG) module_instance -> txm_module_instance_code_size;
89 
90     region_end_page_register =      (region_start_page_register + region_size - 1) & 0xFFFFFFF0;
91     region_start_page_register =    region_start_page_register & 0xFFFFFFF0;
92 
93     module_instance -> txm_module_instance_mpu_registers[2] = region_start_page_register;
94     module_instance -> txm_module_instance_mpu_registers[3] = region_end_page_register | 0x0B;
95 
96     /* Setup region 2 for data area.  */
97     /* Set reading permitted, writing permitted, execution prohibited, enable region. */
98     region_start_page_register =    (ULONG) module_instance -> txm_module_instance_data_start;
99     region_size =                   (ULONG) module_instance -> txm_module_instance_data_size;
100 
101     region_end_page_register =      (region_start_page_register + region_size - 1) & 0xFFFFFFF0;
102     region_start_page_register =    region_start_page_register & 0xFFFFFFF0;
103 
104     module_instance -> txm_module_instance_mpu_registers[4] = region_start_page_register;
105     module_instance -> txm_module_instance_mpu_registers[5] = region_end_page_register | 0x0D;
106 
107 }
108