Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
unsupported_page_allocator.c
00001 /* 00002 * Copyright (c) 2015-2016, ARM Limited, All Rights Reserved 00003 * SPDX-License-Identifier: Apache-2.0 00004 * 00005 * Licensed under the Apache License, Version 2.0 (the "License"); you may 00006 * not use this file except in compliance with the License. 00007 * You may obtain a copy of the License at 00008 * 00009 * http://www.apache.org/licenses/LICENSE-2.0 00010 * 00011 * Unless required by applicable law or agreed to in writing, software 00012 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 00013 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00014 * See the License for the specific language governing permissions and 00015 * limitations under the License. 00016 */ 00017 #include "uvisor-lib/uvisor-lib.h" 00018 00019 #if !(defined(UVISOR_PRESENT) && (UVISOR_PRESENT == 1)) 00020 00021 #include "cmsis.h" 00022 00023 /* This is the fallback implementation for using the page allocator from uVisor 00024 * inside an OS as a normal function. 00025 * Be aware that the page allocator is not re-entrant, so the OS must provide a 00026 * mutex implementation to enable thread-safety! 00027 */ 00028 #define DPRINTF(...) {} 00029 #define g_active_box 0 00030 #define vmpu_is_box_id_valid(...) 0 00031 #define vmpu_public_flash_addr(...) 1 00032 #define vmpu_sram_addr(...) 1 00033 #define HALT_ERROR(id, ...) {} 00034 #define UVISOR_PAGE_ALLOCATOR_MUTEX_AQUIRE page_allocator_mutex_aquire() 00035 #define UVISOR_PAGE_ALLOCATOR_MUTEX_RELEASE osMutexRelease(g_page_allocator_mutex_id) 00036 #define page_allocator_reset_faults(...) {} 00037 00038 /* Forward declaration of the page allocator API. */ 00039 int page_allocator_malloc(UvisorPageTable * const table); 00040 int page_allocator_free(const UvisorPageTable * const table); 00041 00042 int uvisor_page_malloc(UvisorPageTable *const table) 00043 { 00044 return page_allocator_malloc(table); 00045 } 00046 00047 int uvisor_page_free(const UvisorPageTable *const table) 00048 { 00049 return page_allocator_free(table); 00050 } 00051 00052 /* Implement mutex for page allocator. */ 00053 static osMutexId g_page_allocator_mutex_id = NULL; 00054 static int32_t g_page_allocator_mutex_data[4]; 00055 static const osMutexDef_t g_page_allocator_mutex = { g_page_allocator_mutex_data }; 00056 00057 static void page_allocator_mutex_aquire() 00058 { 00059 if (g_page_allocator_mutex_id == NULL) { 00060 /* Create mutex if not already done. */ 00061 g_page_allocator_mutex_id = osMutexCreate(&g_page_allocator_mutex); 00062 if (g_page_allocator_mutex_id == NULL) { 00063 /* Mutex failed to be created. */ 00064 return; 00065 } 00066 } 00067 00068 osMutexWait(g_page_allocator_mutex_id, osWaitForever); 00069 } 00070 00071 /* Alignment of MPU regions is not required anymore, however we still require 00072 * a 32B alignment, to have some page size granularity. */ 00073 static inline int vmpu_is_region_size_valid(uint32_t size) 00074 { 00075 return ((size & ~31) == size); 00076 } 00077 static inline uint32_t vmpu_round_up_region(uint32_t addr, uint32_t size) 00078 { 00079 if (!vmpu_is_region_size_valid(size)) { 00080 return 0; 00081 } 00082 const uint32_t mask = size - 1; 00083 /* Adding the mask can overflow. */ 00084 const uint32_t rounded_addr = addr + mask; 00085 /* Check for overflow. */ 00086 if (rounded_addr < addr) { 00087 /* This means the address was too large to align. */ 00088 return 0; 00089 } 00090 /* Mask the rounded address to get the aligned address. */ 00091 return (rounded_addr & ~mask); 00092 } 00093 static inline uint32_t page_table_read(uint32_t addr) 00094 { 00095 return *((uint32_t *) addr); 00096 } 00097 static inline void page_table_write(uint32_t addr, uint32_t data) 00098 { 00099 *((uint32_t *) addr) = data; 00100 } 00101 00102 /* Include the original page allocator source directly. */ 00103 #include "../page_allocator.c_inc" 00104 00105 #endif
Generated on Tue Jul 12 2022 18:19:35 by
