diff --git a/features/FEATURE_UVISOR/AUTHORS.txt b/features/FEATURE_UVISOR/AUTHORS.txt index 7f5adde714..590795bdc9 100644 --- a/features/FEATURE_UVISOR/AUTHORS.txt +++ b/features/FEATURE_UVISOR/AUTHORS.txt @@ -1,13 +1,13 @@ - 569 Milosch Meriac - 478 Alessandro Angelino - 73 Jaeden Amero - 54 Niklas Hauser - 3 Hugo Vincent + 584 Milosch Meriac + 501 Alessandro Angelino + 95 Jaeden Amero + 61 Niklas Hauser + 4 Irit Arkin 3 JaredCJR 3 Jim Huang - 2 Vincenzo Frascino + 3 Hugo Vincent 2 tonyyanxuan + 2 Vincenzo Frascino 1 Aksel Skauge Mellbye - 1 Irit Arkin - 1 Nathan Chong 1 ccli8 + 1 Nathan Chong diff --git a/features/FEATURE_UVISOR/VERSION.txt b/features/FEATURE_UVISOR/VERSION.txt index 70449b9e7a..332a47bc87 100644 --- a/features/FEATURE_UVISOR/VERSION.txt +++ b/features/FEATURE_UVISOR/VERSION.txt @@ -1 +1 @@ -v0.25.1 +v0.26.1 diff --git a/features/FEATURE_UVISOR/importer/Makefile b/features/FEATURE_UVISOR/importer/Makefile index 395b9079b3..26f0cf35d1 100644 --- a/features/FEATURE_UVISOR/importer/Makefile +++ b/features/FEATURE_UVISOR/importer/Makefile @@ -96,6 +96,12 @@ publish: rsync TARGET_M3 TARGET_M4 # # Rename target directorires to TARGET_* filters... $(foreach target, $(TARGET_TRANSLATION),mv $(TARGET_SUPPORTED)/$(subst .,,$(suffix $(target))) $(TARGET_SUPPORTED)/TARGET_$(basename $(target));) + # + # Updating checked out version tag + git -C $(UVISOR_DIR) describe --tags --abbrev=40 --dirty > $(TARGET_PREFIX)VERSION.txt + # + # Updated list of authors, sorted by contributions + git -C $(UVISOR_DIR) shortlog -s -n > $(TARGET_PREFIX)AUTHORS.txt uvisor-compile: $(UVISOR_GIT_CFG) make -C $(UVISOR_DIR) @@ -104,12 +110,6 @@ update: $(UVISOR_GIT_CFG) # # Updating to latest uVisor library version git -C $(UVISOR_DIR) pull --rebase - # - # Updating checked out version tag - git -C $(UVISOR_DIR) describe --tags --abbrev=40 --dirty > $(TARGET_PREFIX)VERSION.txt - # - # Updated list of authors, sorted by contributions - git -C $(UVISOR_DIR) shortlog -s -n > $(TARGET_PREFIX)AUTHORS.txt $(UVISOR_GIT_CFG): rm -rf $(UVISOR_DIR) diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/api.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/api.h new file mode 100644 index 0000000000..8340d234bc --- /dev/null +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/api.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2016, ARM Limited, All Rights Reserved + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef __UVISOR_API_H__ +#define __UVISOR_API_H__ + +#include "rt_OsEventObserver.h" +#include "api/inc/uvisor_exports.h" +#include "api/inc/unvic_exports.h" +#include "api/inc/debug_exports.h" +#include "api/inc/halt_exports.h" +#include "api/inc/pool_queue_exports.h" +#include "api/inc/page_allocator_exports.h" +#include + +#define UVISOR_API_MAGIC 0x5C9411B4 +#define UVISOR_API_VERSION (10) + +UVISOR_EXTERN_C_BEGIN + +extern void uvisor_init(void); + +typedef struct { + uint32_t magic; + uint32_t (*get_version)(uint32_t); + + void (*init)(void); + + void (*irq_enable)(uint32_t irqn); + void (*irq_disable)(uint32_t irqn); + void (*irq_disable_all)(void); + void (*irq_enable_all)(void); + void (*irq_set_vector)(uint32_t irqn, uint32_t vector); + uint32_t (*irq_get_vector)(uint32_t irqn); + void (*irq_set_priority)(uint32_t irqn, uint32_t priority); + uint32_t (*irq_get_priority)(uint32_t irqn); + void (*irq_set_pending)(uint32_t irqn); + uint32_t (*irq_get_pending)(uint32_t irqn); + void (*irq_clear_pending)(uint32_t irqn); + int (*irq_get_level)(void); + void (*irq_system_reset)(TResetReason reason); + + int (*page_malloc)(UvisorPageTable * const table); + int (*page_free)(const UvisorPageTable * const table); + + int (*box_namespace)(int box_id, char *box_namespace, size_t length); + + void (*debug_init)(const TUvisorDebugDriver * const driver); + void (*error)(THaltUserError reason); + void (*vmpu_mem_invalidate)(void); + + int (*pool_init)(uvisor_pool_t *, void *, size_t, size_t, int); + int (*pool_queue_init)(uvisor_pool_queue_t *, uvisor_pool_t *, void *, size_t, size_t, int); + uvisor_pool_slot_t (*pool_allocate)(uvisor_pool_t *, uint32_t); + void (*pool_queue_enqueue)(uvisor_pool_queue_t *, uvisor_pool_slot_t); + uvisor_pool_slot_t (*pool_free)(uvisor_pool_t *, uvisor_pool_slot_t); + uvisor_pool_slot_t (*pool_queue_dequeue)(uvisor_pool_queue_t *, uvisor_pool_slot_t); + uvisor_pool_slot_t (*pool_queue_dequeue_first)(uvisor_pool_queue_t *); + uvisor_pool_slot_t (*pool_queue_find_first)(uvisor_pool_queue_t *, TQueryFN_Ptr, void *); + + OsEventObserver os_event_observer; +} UVISOR_PACKED UvisorApi; + +extern UvisorApi uvisor_api; + +static UVISOR_FORCEINLINE uint32_t uvisor_get_version(void) +{ + return uvisor_api.get_version(UVISOR_API_VERSION); +} + +UVISOR_EXTERN_C_END + +#endif /* __UVISOR_API_H__ */ diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/box_config.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/box_config.h index b6594282ab..4ce03721e4 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/box_config.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/box_config.h @@ -24,6 +24,7 @@ #include UVISOR_EXTERN const uint32_t __uvisor_mode; +UVISOR_EXTERN void const * const main_cfg_ptr; #define UVISOR_DISABLED 0 #define UVISOR_PERMISSIVE 1 @@ -58,7 +59,7 @@ UVISOR_EXTERN const uint32_t __uvisor_mode; acl_list_count \ }; \ \ - extern const __attribute__((section(".keep.uvisor.cfgtbl_ptr_first"), aligned(4))) void * const main_cfg_ptr = &main_cfg; + UVISOR_EXTERN const __attribute__((section(".keep.uvisor.cfgtbl_ptr_first"), aligned(4))) void * const main_cfg_ptr = &main_cfg; /* Creates a global page heap with at least `minimum_number_of_pages` each of size `page_size` in bytes. * The total page heap size is at least `minimum_number_of_pages * page_size`. */ @@ -106,7 +107,10 @@ UVISOR_EXTERN const uint32_t __uvisor_mode; acl_list_count \ }; \ \ - extern const __attribute__((section(".keep.uvisor.cfgtbl_ptr"), aligned(4))) void * const box_name ## _cfg_ptr = &box_name ## _cfg; + UVISOR_EXTERN const __attribute__((section(".keep.uvisor.cfgtbl_ptr"), aligned(4))) void * const box_name ## _cfg_ptr = &box_name ## _cfg; + +#define UVISOR_BOX_EXTERN(box_name) \ + UVISOR_EXTERN const __attribute__((section(".keep.uvisor.cfgtbl_ptr"), aligned(4))) void * const box_name ## _cfg_ptr; #define __UVISOR_BOX_CONFIG_NOCONTEXT(box_name, acl_list, stack_size) \ __UVISOR_BOX_CONFIG(box_name, acl_list, UVISOR_ARRAY_COUNT(acl_list), stack_size, 0) \ @@ -153,13 +157,4 @@ UVISOR_EXTERN const uint32_t __uvisor_mode; #define uvisor_ctx (*__uvisor_ps) -/* Copy the box namespace of the specified box ID to the memory provided by - * box_namespace. The box_namespace's length must be at least - * MAX_BOX_NAMESPACE_LENGTH bytes. Return how many bytes were copied into - * box_namespace. Return UVISOR_ERROR_INVALID_BOX_ID if the provided box ID is - * invalid. Return UVISOR_ERROR_BUFFER_TOO_SMALL if the provided box_namespace - * is too small to hold MAX_BOX_NAMESPACE_LENGTH bytes. Return - * UVISOR_ERROR_BOX_NAMESPACE_ANONYMOUS if the box is anonymous. */ -UVISOR_EXTERN int uvisor_box_namespace(int box_id, char *box_namespace, size_t length); - #endif /* __UVISOR_API_BOX_CONFIG_H__ */ diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/box_id.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/box_id.h index 5ef573db01..6d03ff7c5c 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/box_id.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/box_id.h @@ -17,13 +17,29 @@ #ifndef __UVISOR_API_BOX_ID_H__ #define __UVISOR_API_BOX_ID_H__ -#include "api/inc/uvisor_exports.h" +#include "api/inc/api.h" + +UVISOR_EXTERN_C_BEGIN /* Return the numeric box ID of the current box. */ -UVISOR_EXTERN int uvisor_box_id_self(void); +int uvisor_box_id_self(void); /* Return the numeric box ID of the box that is calling through the most recent * secure gateway. Return -1 if there is no secure gateway calling box. */ -UVISOR_EXTERN int uvisor_box_id_caller(void) UVISOR_DEPRECATED; +int uvisor_box_id_caller(void) UVISOR_DEPRECATED; + +/* Copy the box namespace of the specified box ID to the memory provided by + * box_namespace. The box_namespace's length must be at least + * MAX_BOX_NAMESPACE_LENGTH bytes. Return how many bytes were copied into + * box_namespace. Return UVISOR_ERROR_INVALID_BOX_ID if the provided box ID is + * invalid. Return UVISOR_ERROR_BUFFER_TOO_SMALL if the provided box_namespace + * is too small to hold MAX_BOX_NAMESPACE_LENGTH bytes. Return + * UVISOR_ERROR_BOX_NAMESPACE_ANONYMOUS if the box is anonymous. */ +static UVISOR_FORCEINLINE int uvisor_box_namespace(int box_id, char *box_namespace, size_t length) +{ + return uvisor_api.box_namespace(box_id, box_namespace, length); +} + +UVISOR_EXTERN_C_END #endif /* __UVISOR_API_BOX_ID_H__ */ diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/debug.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/debug.h index a170d46c79..22e4a24e00 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/debug.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/debug.h @@ -20,6 +20,13 @@ #include "api/inc/debug_exports.h" #include "api/inc/uvisor_exports.h" -UVISOR_EXTERN void uvisor_debug_init(const TUvisorDebugDriver * const driver); +UVISOR_EXTERN_C_BEGIN + +static UVISOR_FORCEINLINE void uvisor_debug_init(const TUvisorDebugDriver * const driver) +{ + uvisor_api.debug_init(driver); +} + +UVISOR_EXTERN_C_END #endif /* __UVISOR_API_DEBUG_H__ */ diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/error.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/error.h index b7da1cc14b..85f8a492bc 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/error.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/error.h @@ -19,7 +19,15 @@ #include "api/inc/halt_exports.h" #include "api/inc/uvisor_exports.h" +#include "api/inc/api.h" -UVISOR_EXTERN void uvisor_error(THaltUserError reason); +UVISOR_EXTERN_C_BEGIN + +static UVISOR_FORCEINLINE void uvisor_error(THaltUserError reason) +{ + uvisor_api.error(reason); +} + +UVISOR_EXTERN_C_END #endif /* __UVISOR_API_ERROR_H__ */ diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/export_table_exports.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/export_table_exports.h deleted file mode 100644 index 64aa11ef85..0000000000 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/export_table_exports.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2016, ARM Limited, All Rights Reserved - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#ifndef __UVISOR_API_EXPORT_TABLE_EXPORTS_H__ -#define __UVISOR_API_EXPORT_TABLE_EXPORTS_H__ - -#include "rt_OsEventObserver.h" -#include "api/inc/pool_queue_exports.h" -#include - -/* If this magic doesn't match what you get in a TUvisorExportTable, then you - * didn't find a TUvisorExportTable and all bets are off as to what will be - * contained in what you found. */ -#define UVISOR_EXPORT_MAGIC 0x5C9411B4 - -/* This is the export table API version. If this version doesn't match what you - * get in TUvisorExportTable, then you need a different header file to - * understand the TUvisorExportTable. */ -#define UVISOR_EXPORT_VERSION 0 - -typedef struct { - /* magic and version must be present as the first two elements in this - * table so that across various versions of the table layout, the table can - * be interpreted correctly. */ - uint32_t magic; - uint32_t version; - - OsEventObserver os_event_observer; - - UvisorPoolTable pool; - - /* This must be the last element of the table so that uvisor-input.S can - * export the size statically. */ - uint32_t size; -} TUvisorExportTable; - -static inline TUvisorExportTable const * uvisor_export_table(void) -{ - /* Defined in uvisor-input.S */ - extern uint32_t uvisor_config; - extern uint32_t uvisor_export_table_size; - - uintptr_t uvisor_config_addr = (uintptr_t) &uvisor_config; - return (TUvisorExportTable *) (uvisor_config_addr - uvisor_export_table_size); -} - -#endif diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/halt_exports.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/halt_exports.h index 77ecc588c8..89de61bdd3 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/halt_exports.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/halt_exports.h @@ -25,6 +25,7 @@ #define UVISOR_ERROR_OUT_OF_STRUCTURES (-7) #define UVISOR_ERROR_INVALID_PARAMETERS (-8) #define UVISOR_ERROR_NOT_IMPLEMENTED (-9) +#define UVISOR_ERROR_TIMEOUT (-10) #define UVISOR_ERROR_CLASS_MASK (0xFFFF0000UL) diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/interrupts.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/interrupts.h index 579f015a9d..3ede2b6c26 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/interrupts.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/interrupts.h @@ -19,18 +19,60 @@ #include "api/inc/unvic_exports.h" #include "api/inc/uvisor_exports.h" +#include "api/inc/api.h" #include -UVISOR_EXTERN void vIRQ_SetVector(uint32_t irqn, uint32_t vector); -UVISOR_EXTERN uint32_t vIRQ_GetVector(uint32_t irqn); -UVISOR_EXTERN void vIRQ_EnableIRQ(uint32_t irqn); -UVISOR_EXTERN void vIRQ_DisableIRQ(uint32_t irqn); -UVISOR_EXTERN void vIRQ_ClearPendingIRQ(uint32_t irqn); -UVISOR_EXTERN void vIRQ_SetPendingIRQ(uint32_t irqn); -UVISOR_EXTERN uint32_t vIRQ_GetPendingIRQ(uint32_t irqn); -UVISOR_EXTERN void vIRQ_SetPriority(uint32_t irqn, uint32_t priority); -UVISOR_EXTERN uint32_t vIRQ_GetPriority(uint32_t irqn); -UVISOR_EXTERN int vIRQ_GetLevel(void); +UVISOR_EXTERN_C_BEGIN + +static UVISOR_FORCEINLINE void vIRQ_SetVector(uint32_t irqn, uint32_t vector) +{ + uvisor_api.irq_set_vector(irqn, vector); +} + +static UVISOR_FORCEINLINE uint32_t vIRQ_GetVector(uint32_t irqn) +{ + return uvisor_api.irq_get_vector(irqn); +} + +static UVISOR_FORCEINLINE void vIRQ_EnableIRQ(uint32_t irqn) +{ + uvisor_api.irq_enable(irqn); +} + +static UVISOR_FORCEINLINE void vIRQ_DisableIRQ(uint32_t irqn) +{ + uvisor_api.irq_disable(irqn); +} + +static UVISOR_FORCEINLINE void vIRQ_ClearPendingIRQ(uint32_t irqn) +{ + uvisor_api.irq_clear_pending(irqn); +} + +static UVISOR_FORCEINLINE void vIRQ_SetPendingIRQ(uint32_t irqn) +{ + uvisor_api.irq_set_pending(irqn); +} + +static UVISOR_FORCEINLINE uint32_t vIRQ_GetPendingIRQ(uint32_t irqn) +{ + return uvisor_api.irq_get_pending(irqn); +} + +static UVISOR_FORCEINLINE void vIRQ_SetPriority(uint32_t irqn, uint32_t priority) +{ + uvisor_api.irq_set_priority(irqn, priority); +} + +static UVISOR_FORCEINLINE uint32_t vIRQ_GetPriority(uint32_t irqn) +{ + return uvisor_api.irq_get_priority(irqn); +} + +static UVISOR_FORCEINLINE int vIRQ_GetLevel(void) +{ + return uvisor_api.irq_get_level(); +} /** Disable all interrupts for the currently active box. * @@ -51,7 +93,10 @@ UVISOR_EXTERN int vIRQ_GetLevel(void); * vIRQ_EnableAll(); counter = 0; IRQs are now re-enabled. * * where some_function() also has a disable/enable pair. */ -UVISOR_EXTERN void vIRQ_DisableAll(void); +static UVISOR_FORCEINLINE void vIRQ_DisableAll(void) +{ + uvisor_api.irq_disable_all(); +} /** Re-enable all interrupts that were previously disabled for the currently * active box. @@ -59,12 +104,20 @@ UVISOR_EXTERN void vIRQ_DisableAll(void); * This function only re-enables interrupt if the uVisor internal counter is set * to 0, to make sure that nested disabling of IRQs is still effective. See * ::vIRQ_DisableAll for more information. */ -UVISOR_EXTERN void vIRQ_EnableAll(void); +static UVISOR_FORCEINLINE void vIRQ_EnableAll(void) +{ + uvisor_api.irq_enable_all(); +} /** Reset the device. * @warning Currently only the debug box can reset the device. * @param reason[in] Reason for rebooting. Currently not used. */ -UVISOR_EXTERN void vIRQ_SystemReset(TResetReason reason); +static UVISOR_FORCEINLINE void vIRQ_SystemReset(TResetReason reason) +{ + return uvisor_api.irq_system_reset(reason); +} + +UVISOR_EXTERN_C_END #endif /* __UVISOR_API_INTERRUPTS_H__ */ diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/page_allocator.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/page_allocator.h index 7dae4b694f..35ab826c8b 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/page_allocator.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/page_allocator.h @@ -19,22 +19,36 @@ #include "api/inc/uvisor_exports.h" #include "api/inc/page_allocator_exports.h" +#include "api/inc/api.h" #include +UVISOR_EXTERN_C_BEGIN + /* Allocate a number of requested pages with the requested page size. * @param table.page_size[in] Must be equal to the current page size * @param table.page_count[in] The number of pages to be allocated * @param table.page_origins[out] Pointers to the page origins. The table must be large enough to hold page_count entries. * @returns Non-zero on failure with failure class `UVISOR_ERROR_CLASS_PAGE`. See `UVISOR_ERROR_PAGE_*`. */ -UVISOR_EXTERN int uvisor_page_malloc(UvisorPageTable * const table); +static UVISOR_FORCEINLINE int uvisor_page_malloc(UvisorPageTable * const table) +{ + return uvisor_api.page_malloc(table); +} /* Free the pages associated with the table, only if it passes validation. * @returns Non-zero on failure with failure class `UVISOR_ERROR_CLASS_PAGE`. See `UVISOR_ERROR_PAGE_*`. */ -UVISOR_EXTERN int uvisor_page_free(const UvisorPageTable * const table); +static UVISOR_FORCEINLINE int uvisor_page_free(const UvisorPageTable * const table) +{ + return uvisor_api.page_free(table); +} /* @returns the active page size for one page. */ -UVISOR_EXTERN uint32_t uvisor_get_page_size(void); +static UVISOR_FORCEINLINE uint32_t uvisor_get_page_size(void) +{ + return __uvisor_page_size; +} + +UVISOR_EXTERN_C_END #endif /* __UVISOR_API_PAGE_ALLOCATOR_H__ */ diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/pool_queue_exports.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/pool_queue_exports.h index 7748886d19..38f1f139d4 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/pool_queue_exports.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/pool_queue_exports.h @@ -194,15 +194,4 @@ static inline void * uvisor_pool_pointer_to(uvisor_pool_t * pool, uvisor_pool_sl return (uint8_t *) pool->array + pool->stride * slot; } -typedef struct { - int (*init)(uvisor_pool_t *, void *, size_t, size_t, int); - int (*queue_init)(uvisor_pool_queue_t *, uvisor_pool_t *, void *, size_t, size_t, int); - uvisor_pool_slot_t (*allocate)(uvisor_pool_t *, uint32_t); - void (*queue_enqueue)(uvisor_pool_queue_t *, uvisor_pool_slot_t); - uvisor_pool_slot_t (*free)(uvisor_pool_t *, uvisor_pool_slot_t); - uvisor_pool_slot_t (*queue_dequeue)(uvisor_pool_queue_t *, uvisor_pool_slot_t); - uvisor_pool_slot_t (*queue_dequeue_first)(uvisor_pool_queue_t *); - uvisor_pool_slot_t (*queue_find_first)(uvisor_pool_queue_t *, TQueryFN_Ptr, void *); -} UvisorPoolTable; - #endif diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/register_gateway.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/register_gateway.h index 532554f85a..ade380b82c 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/register_gateway.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/register_gateway.h @@ -19,6 +19,7 @@ #include "api/inc/register_gateway_exports.h" #include "api/inc/uvisor_exports.h" +#include "api/inc/svc_exports.h" #include /** Get the offset of a struct member. @@ -26,6 +27,9 @@ */ #define __UVISOR_OFFSETOF(type, member) ((uint32_t) (&(((type *)(0))->member))) +/** Generate the SVCall opcode from the SVC ID. */ +#define UVISOR_SVC_OPCODE(id) ((uint16_t) (0xDF00 | ((id) & 0xFF))) + /** Generate the opcode of the 16-bit Thumb-2 16-bit T2 encoding of the branch * instruction. * @internal diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/svc_exports.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/svc_exports.h index 2d53006188..8d434f8815 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/svc_exports.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/svc_exports.h @@ -18,6 +18,7 @@ #define __UVISOR_API_SVC_EXPORTS_H__ #include "api/inc/uvisor_exports.h" +#include "api/inc/api.h" #include /* An SVCall takes a 8bit immediate, which is used as follows: @@ -88,31 +89,6 @@ UVISOR_SVC_FAST_INDEX(index) | \ UVISOR_SVC_FAST_NARGS_SET(nargs))) -/* SVC immediate values for custom table */ -#define UVISOR_SVC_ID_ISR_SET UVISOR_SVC_CUSTOM_TABLE(1) -#define UVISOR_SVC_ID_ISR_GET UVISOR_SVC_CUSTOM_TABLE(2) -#define UVISOR_SVC_ID_IRQ_ENABLE UVISOR_SVC_CUSTOM_TABLE(3) -#define UVISOR_SVC_ID_IRQ_DISABLE UVISOR_SVC_CUSTOM_TABLE(4) -#define UVISOR_SVC_ID_IRQ_PEND_CLR UVISOR_SVC_CUSTOM_TABLE(5) -#define UVISOR_SVC_ID_IRQ_PEND_SET UVISOR_SVC_CUSTOM_TABLE(6) -#define UVISOR_SVC_ID_IRQ_PEND_GET UVISOR_SVC_CUSTOM_TABLE(7) -#define UVISOR_SVC_ID_IRQ_PRIO_SET UVISOR_SVC_CUSTOM_TABLE(8) -#define UVISOR_SVC_ID_IRQ_PRIO_GET UVISOR_SVC_CUSTOM_TABLE(9) -#define UVISOR_SVC_ID_BENCHMARK_CFG UVISOR_SVC_CUSTOM_TABLE(10) -#define UVISOR_SVC_ID_BENCHMARK_RST UVISOR_SVC_CUSTOM_TABLE(11) -#define UVISOR_SVC_ID_BENCHMARK_STOP UVISOR_SVC_CUSTOM_TABLE(12) -#define UVISOR_SVC_ID_HALT_USER_ERR UVISOR_SVC_CUSTOM_TABLE(13) -#define UVISOR_SVC_ID_IRQ_LEVEL_GET UVISOR_SVC_CUSTOM_TABLE(14) -#define UVISOR_SVC_ID_BOX_ID_SELF UVISOR_SVC_CUSTOM_TABLE(15) -#define UVISOR_SVC_ID_BOX_ID_CALLER UVISOR_SVC_CUSTOM_TABLE(16) -#define UVISOR_SVC_ID_BOX_NAMESPACE_FROM_ID UVISOR_SVC_CUSTOM_TABLE(17) -#define UVISOR_SVC_ID_DEBUG_REBOOT UVISOR_SVC_CUSTOM_TABLE(18) -#define UVISOR_SVC_ID_DEBUG_REGISTER_BOX UVISOR_SVC_CUSTOM_TABLE(19) -#define UVISOR_SVC_ID_IRQ_DISABLE_ALL UVISOR_SVC_CUSTOM_TABLE(20) -#define UVISOR_SVC_ID_IRQ_ENABLE_ALL UVISOR_SVC_CUSTOM_TABLE(21) -#define UVISOR_SVC_ID_PAGE_MALLOC UVISOR_SVC_CUSTOM_TABLE(22) -#define UVISOR_SVC_ID_PAGE_FREE UVISOR_SVC_CUSTOM_TABLE(23) - /* SVC immediate values for hardcoded table (call from unprivileged) */ #define UVISOR_SVC_ID_UNVIC_OUT UVISOR_SVC_FIXED_TABLE(0, 0) /* Deprecated: UVISOR_SVC_ID_CX_IN(nargs) UVISOR_SVC_FIXED_TABLE(1, nargs) */ @@ -124,42 +100,4 @@ /* SVC immediate values for hardcoded table (call from privileged) */ #define UVISOR_SVC_ID_UNVIC_IN UVISOR_SVC_FIXED_TABLE(0, 0) -/** Generate the SVCall opcode from the SVC ID. */ -#define UVISOR_SVC_OPCODE(id) ((uint16_t) 0xDF00 | (uint8_t) ((id) & 0xFF)) - -/* macro to execute an SVCall; additional metadata can be provided, which will - * be appended right after the svc instruction */ -/* note: the macro is implicitly overloaded to allow 0 to 4 32bits arguments */ -#if defined(__CC_ARM) - -#elif defined(__GNUC__) - -#define UVISOR_SVC(id, metadata, ...) \ - ({ \ - UVISOR_MACRO_REGS_ARGS(uint32_t, ##__VA_ARGS__); \ - UVISOR_MACRO_REGS_RETVAL(uint32_t, res); \ - asm volatile( \ - "svc %[svc_id]\n" \ - metadata \ - : UVISOR_MACRO_GCC_ASM_OUTPUT(res) \ - : UVISOR_MACRO_GCC_ASM_INPUT(__VA_ARGS__), \ - [svc_id] "I" ((id) & 0xFF) \ - ); \ - res; \ - }) - -#define UVISOR_FUNCTION_CALL(dst_fn, ...) \ - ({ \ - UVISOR_MACRO_REGS_ARGS(uint32_t, ##__VA_ARGS__); \ - UVISOR_MACRO_REGS_RETVAL(uint32_t, res); \ - asm volatile( \ - "bl " UVISOR_TO_STRING(dst_fn) "\n" \ - : UVISOR_MACRO_GCC_ASM_OUTPUT(res) \ - : UVISOR_MACRO_GCC_ASM_INPUT(__VA_ARGS__) \ - ); \ - res; \ - }) - -#endif /* defined(__CC_ARM) || defined(__GNUC__) */ - #endif /* __UVISOR_API_SVC_EXPORTS_H__ */ diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/unvic_exports.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/unvic_exports.h index 50f917fb85..69474793a3 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/unvic_exports.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/unvic_exports.h @@ -21,7 +21,7 @@ /* this value refers to the minimum allowable priority in the physical NVIC * module, but not in the virtualised one (vIRQ) */ -#define __UVISOR_NVIC_MIN_PRIORITY ((uint32_t) 1) +#define __UVISOR_NVIC_MIN_PRIORITY ((uint32_t) 2) /* this is the maximum priority allowed for the vIRQ module */ /* users of uVisor APIs can use this to determine the maximum level of diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/uvisor-lib.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/uvisor-lib.h index 64e3be5c1b..edb0ba2289 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/uvisor-lib.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/uvisor-lib.h @@ -25,7 +25,7 @@ #if defined(UVISOR_PRESENT) && UVISOR_PRESENT == 1 /* Library header files */ -#include "api/inc/benchmark.h" +#include "api/inc/api.h" #include "api/inc/box_config.h" #include "api/inc/box_id.h" #include "api/inc/debug.h" @@ -37,6 +37,7 @@ #include "api/inc/rpc_gateway.h" #include "api/inc/secure_access.h" #include "api/inc/uvisor_semaphore.h" +#include "api/inc/vmpu.h" #else /* defined(UVISOR_PRESENT) && UVISOR_PRESENT == 1 */ @@ -56,11 +57,9 @@ UVISOR_EXTERN int uvisor_lib_init(void); * target platform. */ #include "api/inc/debug_exports.h" #include "api/inc/context_exports.h" -#include "api/inc/export_table_exports.h" #include "api/inc/halt_exports.h" #include "api/inc/register_gateway_exports.h" #include "api/inc/rpc_gateway_exports.h" -#include "api/inc/svc_exports.h" #include "api/inc/priv_sys_hook_exports.h" #include "api/inc/unvic_exports.h" #include "api/inc/uvisor_exports.h" diff --git a/features/FEATURE_UVISOR/includes/uvisor/api/inc/benchmark.h b/features/FEATURE_UVISOR/includes/uvisor/api/inc/vmpu.h similarity index 60% rename from features/FEATURE_UVISOR/includes/uvisor/api/inc/benchmark.h rename to features/FEATURE_UVISOR/includes/uvisor/api/inc/vmpu.h index b3e0c6c792..ca6f5634df 100644 --- a/features/FEATURE_UVISOR/includes/uvisor/api/inc/benchmark.h +++ b/features/FEATURE_UVISOR/includes/uvisor/api/inc/vmpu.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2015, ARM Limited, All Rights Reserved + * Copyright (c) 2013-2016, ARM Limited, All Rights Reserved * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -14,14 +14,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#ifndef __UVISOR_API_BENCHMARK_H__ -#define __UVISOR_API_BENCHMARK_H__ +#ifndef __UVISOR_API_VMPU_H__ +#define __UVISOR_API_VMPU_H__ #include "api/inc/uvisor_exports.h" -#include +#include "api/inc/api.h" -UVISOR_EXTERN void uvisor_benchmark_configure(void); -UVISOR_EXTERN void uvisor_benchmark_start(void); -UVISOR_EXTERN uint32_t uvisor_benchmark_stop(void); +UVISOR_EXTERN_C_BEGIN -#endif /* __UVISOR_API_BENCHMARK_H__ */ +/* Invalidate all regions in the MPU, forcing subsequent memory accesses to + * fault. */ +static UVISOR_FORCEINLINE void uvisor_vmpu_mem_invalidate(void) +{ + uvisor_api.vmpu_mem_invalidate(); +} + +UVISOR_EXTERN_C_END + +#endif /* __UVISOR_API_VMPU_H__ */ diff --git a/features/FEATURE_UVISOR/source/page_allocator.c_inc b/features/FEATURE_UVISOR/source/page_allocator.c_inc index 871eb3d082..fa6d71576f 100644 --- a/features/FEATURE_UVISOR/source/page_allocator.c_inc +++ b/features/FEATURE_UVISOR/source/page_allocator.c_inc @@ -23,8 +23,8 @@ #include #include "page_allocator.h" #include "page_allocator_faults.h" -#include "mpu/vmpu_unpriv_access.h" -#include "mpu/vmpu.h" +#include "vmpu_unpriv_access.h" +#include "vmpu.h" #include "halt.h" #include "context.h" diff --git a/features/FEATURE_UVISOR/source/rtx/uvisor_semaphore.c b/features/FEATURE_UVISOR/source/rtx/uvisor_semaphore.c index be34c08a7b..97cd09ea95 100644 --- a/features/FEATURE_UVISOR/source/rtx/uvisor_semaphore.c +++ b/features/FEATURE_UVISOR/source/rtx/uvisor_semaphore.c @@ -35,7 +35,7 @@ int __uvisor_semaphore_pend(UvisorSemaphore * s, uint32_t timeout_ms) } if (num_available_tokens == 0) { - return UVISOR_ERROR_OUT_OF_STRUCTURES; + return UVISOR_ERROR_TIMEOUT; } return 0; diff --git a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_ARM_BEETLE_SOC/TARGET_DEBUG/TARGET_M3/libconfiguration_beetle_cortex_m3_0x20000000_0x140.a b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_ARM_BEETLE_SOC/TARGET_DEBUG/TARGET_M3/libconfiguration_beetle_cortex_m3_0x20000000_0x140.a index 82f0425942..b320eb3714 100644 Binary files a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_ARM_BEETLE_SOC/TARGET_DEBUG/TARGET_M3/libconfiguration_beetle_cortex_m3_0x20000000_0x140.a and b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_ARM_BEETLE_SOC/TARGET_DEBUG/TARGET_M3/libconfiguration_beetle_cortex_m3_0x20000000_0x140.a differ diff --git a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_ARM_BEETLE_SOC/TARGET_RELEASE/TARGET_M3/libconfiguration_beetle_cortex_m3_0x20000000_0x140.a b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_ARM_BEETLE_SOC/TARGET_RELEASE/TARGET_M3/libconfiguration_beetle_cortex_m3_0x20000000_0x140.a index c0a286c320..abd73345c8 100644 Binary files a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_ARM_BEETLE_SOC/TARGET_RELEASE/TARGET_M3/libconfiguration_beetle_cortex_m3_0x20000000_0x140.a and b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_ARM_BEETLE_SOC/TARGET_RELEASE/TARGET_M3/libconfiguration_beetle_cortex_m3_0x20000000_0x140.a differ diff --git a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_DEBUG/TARGET_M3/libconfiguration_efm32_cortex_m3_p1.a b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_DEBUG/TARGET_M3/libconfiguration_efm32_cortex_m3_p1.a index 1df03a95e3..156afe0647 100644 Binary files a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_DEBUG/TARGET_M3/libconfiguration_efm32_cortex_m3_p1.a and b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_DEBUG/TARGET_M3/libconfiguration_efm32_cortex_m3_p1.a differ diff --git a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_DEBUG/TARGET_M4/libconfiguration_efm32_cortex_m4_p1.a b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_DEBUG/TARGET_M4/libconfiguration_efm32_cortex_m4_p1.a index b23250df3a..f8edab03a6 100644 Binary files a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_DEBUG/TARGET_M4/libconfiguration_efm32_cortex_m4_p1.a and b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_DEBUG/TARGET_M4/libconfiguration_efm32_cortex_m4_p1.a differ diff --git a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_RELEASE/TARGET_M3/libconfiguration_efm32_cortex_m3_p1.a b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_RELEASE/TARGET_M3/libconfiguration_efm32_cortex_m3_p1.a index 2bd980af35..e13001ae40 100644 Binary files a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_RELEASE/TARGET_M3/libconfiguration_efm32_cortex_m3_p1.a and b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_RELEASE/TARGET_M3/libconfiguration_efm32_cortex_m3_p1.a differ diff --git a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_RELEASE/TARGET_M4/libconfiguration_efm32_cortex_m4_p1.a b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_RELEASE/TARGET_M4/libconfiguration_efm32_cortex_m4_p1.a index 3716dcd7f7..d87e933d57 100644 Binary files a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_RELEASE/TARGET_M4/libconfiguration_efm32_cortex_m4_p1.a and b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_EFM32/TARGET_RELEASE/TARGET_M4/libconfiguration_efm32_cortex_m4_p1.a differ diff --git a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_MCU_K64F/TARGET_DEBUG/TARGET_M4/libconfiguration_kinetis_cortex_m4_0x1fff0000.a b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_MCU_K64F/TARGET_DEBUG/TARGET_M4/libconfiguration_kinetis_cortex_m4_0x1fff0000.a index 23a463ee18..8927c95089 100644 Binary files a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_MCU_K64F/TARGET_DEBUG/TARGET_M4/libconfiguration_kinetis_cortex_m4_0x1fff0000.a and b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_MCU_K64F/TARGET_DEBUG/TARGET_M4/libconfiguration_kinetis_cortex_m4_0x1fff0000.a differ diff --git a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_MCU_K64F/TARGET_RELEASE/TARGET_M4/libconfiguration_kinetis_cortex_m4_0x1fff0000.a b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_MCU_K64F/TARGET_RELEASE/TARGET_M4/libconfiguration_kinetis_cortex_m4_0x1fff0000.a index 88c0818ed9..f88af7878c 100644 Binary files a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_MCU_K64F/TARGET_RELEASE/TARGET_M4/libconfiguration_kinetis_cortex_m4_0x1fff0000.a and b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_MCU_K64F/TARGET_RELEASE/TARGET_M4/libconfiguration_kinetis_cortex_m4_0x1fff0000.a differ diff --git a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_STM32F4/TARGET_DEBUG/TARGET_M4/libconfiguration_stm32_cortex_m4_0x10000000_0x0.a b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_STM32F4/TARGET_DEBUG/TARGET_M4/libconfiguration_stm32_cortex_m4_0x10000000_0x0.a index 81d410822a..160cf22f72 100644 Binary files a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_STM32F4/TARGET_DEBUG/TARGET_M4/libconfiguration_stm32_cortex_m4_0x10000000_0x0.a and b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_STM32F4/TARGET_DEBUG/TARGET_M4/libconfiguration_stm32_cortex_m4_0x10000000_0x0.a differ diff --git a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_STM32F4/TARGET_RELEASE/TARGET_M4/libconfiguration_stm32_cortex_m4_0x10000000_0x0.a b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_STM32F4/TARGET_RELEASE/TARGET_M4/libconfiguration_stm32_cortex_m4_0x10000000_0x0.a index ef9dd331fe..4ac74c50a2 100644 Binary files a/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_STM32F4/TARGET_RELEASE/TARGET_M4/libconfiguration_stm32_cortex_m4_0x10000000_0x0.a and b/features/FEATURE_UVISOR/targets/TARGET_UVISOR_SUPPORTED/TARGET_STM32F4/TARGET_RELEASE/TARGET_M4/libconfiguration_stm32_cortex_m4_0x10000000_0x0.a differ