| #include <app_memory/app_memdomain.h> |
| #include <misc/dlist.h> |
| #include <stdarg.h> |
| #include <string.h> |
| |
| /* |
| * Initializes a double linked-list for the calculation of |
| * memory subsections. |
| */ |
| sys_dlist_t app_mem_list = SYS_DLIST_STATIC_INIT(&app_mem_list); |
| |
| /* |
| * The following zeroizes each "bss" part of each subsection |
| * as per the entries in the list. |
| */ |
| void app_bss_zero(void) |
| { |
| sys_dnode_t *node, *next_node; |
| |
| SYS_DLIST_FOR_EACH_NODE_SAFE(&app_mem_list, node, next_node) |
| { |
| struct app_region *region = |
| CONTAINER_OF(node, struct app_region, lnode); |
| memset(region->bmem_start, 0, region->bmem_size); |
| } |
| } |
| |
| /* |
| * The following calculates the size of each subsection and adds |
| * the computed sizes to the region structures. These calculations |
| * are needed both for zeroizing "bss" parts of the partitions and |
| * for the creation of the k_mem_partition. |
| */ |
| void app_calc_size(void) |
| { |
| sys_dnode_t *node, *next_node; |
| |
| SYS_DLIST_FOR_EACH_NODE_SAFE(&app_mem_list, node, next_node) |
| { |
| if (sys_dlist_is_tail(&app_mem_list, node)) { |
| struct app_region *region = |
| CONTAINER_OF(node, struct app_region, lnode); |
| region->bmem_size = |
| _app_smem_end - |
| (char *)region->bmem_start; |
| region->dmem_size = |
| (char *)region->bmem_start - |
| (char *)region->dmem_start; |
| region->smem_size = |
| region->bmem_size + region->dmem_size; |
| region->partition[0].size = |
| region->dmem_size + region->bmem_size; |
| } else { |
| struct app_region *region = |
| CONTAINER_OF(node, struct app_region, lnode); |
| struct app_region *nRegion = |
| CONTAINER_OF(next_node, struct app_region, |
| lnode); |
| region->bmem_size = |
| (char *)nRegion->dmem_start - |
| (char *)region->bmem_start; |
| region->dmem_size = |
| (char *)region->bmem_start - |
| (char *)region->dmem_start; |
| region->smem_size = |
| region->bmem_size + region->dmem_size; |
| region->partition[0].size = |
| region->dmem_size + region->bmem_size; |
| } |
| } |
| } |
| |
| /* |
| * "Initializes" by calculating subsection sizes and then |
| * zeroizing "bss" regions. |
| */ |
| void appmem_init_app_memory(void) |
| { |
| app_calc_size(); |
| app_bss_zero(); |
| } |