ON Semiconductor / mbed-os

Dependents:   mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510

Committer:
group-onsemi
Date:
Wed Jan 25 20:34:15 2017 +0000
Revision:
0:098463de4c5d
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-onsemi 0:098463de4c5d 1 /*
group-onsemi 0:098463de4c5d 2 * Copyright (c) 2016, ARM Limited, All Rights Reserved
group-onsemi 0:098463de4c5d 3 * SPDX-License-Identifier: Apache-2.0
group-onsemi 0:098463de4c5d 4 *
group-onsemi 0:098463de4c5d 5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
group-onsemi 0:098463de4c5d 6 * not use this file except in compliance with the License.
group-onsemi 0:098463de4c5d 7 * You may obtain a copy of the License at
group-onsemi 0:098463de4c5d 8 *
group-onsemi 0:098463de4c5d 9 * http://www.apache.org/licenses/LICENSE-2.0
group-onsemi 0:098463de4c5d 10 *
group-onsemi 0:098463de4c5d 11 * Unless required by applicable law or agreed to in writing, software
group-onsemi 0:098463de4c5d 12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
group-onsemi 0:098463de4c5d 13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
group-onsemi 0:098463de4c5d 14 * See the License for the specific language governing permissions and
group-onsemi 0:098463de4c5d 15 * limitations under the License.
group-onsemi 0:098463de4c5d 16 */
group-onsemi 0:098463de4c5d 17
group-onsemi 0:098463de4c5d 18 #ifndef __PAGE_ALLOCATOR_CONFIG_H__
group-onsemi 0:098463de4c5d 19 #define __PAGE_ALLOCATOR_CONFIG_H__
group-onsemi 0:098463de4c5d 20 /* This file can be compiled externally to provide the page allocator algorithm
group-onsemi 0:098463de4c5d 21 * for devices NOT supported by uVisor. For this purpose this file is copied as
group-onsemi 0:098463de4c5d 22 * is into the target build folder and compiled by the target build system. */
group-onsemi 0:098463de4c5d 23
group-onsemi 0:098463de4c5d 24 /* We can only protect a small number of pages efficiently, so there should be
group-onsemi 0:098463de4c5d 25 * a relatively low limit to the number of pages.
group-onsemi 0:098463de4c5d 26 * By default a maximum of 16 pages are allowed. This can only be overwritten
group-onsemi 0:098463de4c5d 27 * by the porting engineer for the current platform. */
group-onsemi 0:098463de4c5d 28 #ifndef UVISOR_PAGE_MAX_COUNT
group-onsemi 0:098463de4c5d 29 #define UVISOR_PAGE_MAX_COUNT (16UL)
group-onsemi 0:098463de4c5d 30 #endif
group-onsemi 0:098463de4c5d 31 /* The number of pages is decided by the page size. A small page size leads to
group-onsemi 0:098463de4c5d 32 * a lot of pages, however, number of pages is capped for efficiency.
group-onsemi 0:098463de4c5d 33 * Furthermore, when allocating large continous memory, a too small page size
group-onsemi 0:098463de4c5d 34 * will lead to allocation failures. This can only be overwritten
group-onsemi 0:098463de4c5d 35 * by the porting engineer for the current platform. */
group-onsemi 0:098463de4c5d 36 #ifndef UVISOR_PAGE_SIZE_MINIMUM
group-onsemi 0:098463de4c5d 37 #define UVISOR_PAGE_SIZE_MINIMUM (1024UL)
group-onsemi 0:098463de4c5d 38 #endif
group-onsemi 0:098463de4c5d 39
group-onsemi 0:098463de4c5d 40 /* Defines the number of uint32_t page owner masks in the owner map.
group-onsemi 0:098463de4c5d 41 * +8 is used for ARMv7-M MPUs, where a shift of up to 7-bits may be required
group-onsemi 0:098463de4c5d 42 * to align MPU regions. */
group-onsemi 0:098463de4c5d 43 #define UVISOR_PAGE_MAP_COUNT ((UVISOR_PAGE_MAX_COUNT + 31 + 8) / 32)
group-onsemi 0:098463de4c5d 44
group-onsemi 0:098463de4c5d 45 /* The page box_id is the box id which is 8-bit large. */
group-onsemi 0:098463de4c5d 46 typedef uint8_t page_owner_t;
group-onsemi 0:098463de4c5d 47 /* Define a unused value for the page table. */
group-onsemi 0:098463de4c5d 48 #define UVISOR_PAGE_UNUSED ((page_owner_t) (-1))
group-onsemi 0:098463de4c5d 49 /* Contains the total number of available pages. */
group-onsemi 0:098463de4c5d 50 extern uint8_t g_page_count_total;
group-onsemi 0:098463de4c5d 51 /* Contains the shift of the page owner mask. */
group-onsemi 0:098463de4c5d 52 extern uint8_t g_page_map_shift;
group-onsemi 0:098463de4c5d 53 /* Contains the ARMv7-MPU rounded page end. */
group-onsemi 0:098463de4c5d 54 extern uint32_t g_page_head_end_rounded;
group-onsemi 0:098463de4c5d 55
group-onsemi 0:098463de4c5d 56 /** Sets the page bit in the page map array.
group-onsemi 0:098463de4c5d 57 * @param map an array of `uint32_t` containing the page map
group-onsemi 0:098463de4c5d 58 * @param page the index of the page to be set
group-onsemi 0:098463de4c5d 59 */
group-onsemi 0:098463de4c5d 60 static inline void page_allocator_map_set(uint32_t * const map, uint8_t page)
group-onsemi 0:098463de4c5d 61 {
group-onsemi 0:098463de4c5d 62 page += g_page_map_shift;
group-onsemi 0:098463de4c5d 63 map[page / 32] |= (1UL << (page % 32));
group-onsemi 0:098463de4c5d 64 }
group-onsemi 0:098463de4c5d 65
group-onsemi 0:098463de4c5d 66 /** Clears the page bit in the page map array.
group-onsemi 0:098463de4c5d 67 * @param map an array of `uint32_t` containing the page map
group-onsemi 0:098463de4c5d 68 * @param page the index of the page to be set
group-onsemi 0:098463de4c5d 69 */
group-onsemi 0:098463de4c5d 70 static inline void page_allocator_map_clear(uint32_t * const map, uint8_t page)
group-onsemi 0:098463de4c5d 71 {
group-onsemi 0:098463de4c5d 72 page += g_page_map_shift;
group-onsemi 0:098463de4c5d 73 map[page / 32] &= ~(1UL << (page % 32));
group-onsemi 0:098463de4c5d 74 }
group-onsemi 0:098463de4c5d 75
group-onsemi 0:098463de4c5d 76 /** Check if the page bit is set int the page map array.
group-onsemi 0:098463de4c5d 77 * @param map an array of `uint32_t` containing the page map
group-onsemi 0:098463de4c5d 78 * @param page the index of the page to be set
group-onsemi 0:098463de4c5d 79 * @retval 0 if page bit is not set
group-onsemi 0:098463de4c5d 80 * @retval 1 if page bit is set
group-onsemi 0:098463de4c5d 81 */
group-onsemi 0:098463de4c5d 82 static inline int page_allocator_map_get(const uint32_t * const map, uint8_t page)
group-onsemi 0:098463de4c5d 83 {
group-onsemi 0:098463de4c5d 84 page += g_page_map_shift;
group-onsemi 0:098463de4c5d 85 return (map[page / 32] >> (page % 32)) & 0x1;
group-onsemi 0:098463de4c5d 86 }
group-onsemi 0:098463de4c5d 87
group-onsemi 0:098463de4c5d 88 #endif /* __PAGE_ALLOCATOR_CONFIG_H__ */