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.
Dependents: mbed-TFT-example-NCS36510 mbed-Accelerometer-example-NCS36510 mbed-Accelerometer-example-NCS36510
features/FEATURE_UVISOR/source/page_allocator_config.h@0:098463de4c5d, 2017-01-25 (annotated)
- Committer:
- group-onsemi
- Date:
- Wed Jan 25 20:34:15 2017 +0000
- Revision:
- 0:098463de4c5d
Initial commit
Who changed what in which revision?
| User | Revision | Line number | New 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__ */ |