Skip to content

Commit 40042f0

Browse files
authored
Merge pull request #4295 from Patater/armv8m
Update uVisor to v0.28.1
2 parents 0da63ee + 3ef7845 commit 40042f0

File tree

44 files changed

+588
-173
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+588
-173
lines changed

features/FEATURE_UVISOR/AUTHORS.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
597 Alessandro Angelino
12
592 Milosch Meriac
2-
554 Alessandro Angelino
3-
105 Jaeden Amero
4-
65 Niklas Hauser
3+
144 Jaeden Amero
4+
80 Niklas Hauser
55
5 Irit Arkin
66
3 JaredCJR
77
3 AnotherButler

features/FEATURE_UVISOR/VERSION.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v0.27.0-23-g8231ae897dadbb1c3eeb79ae2103d308d28c7e14
1+
v0.28.1

features/FEATURE_UVISOR/includes/uvisor-lib/rtx/process_malloc.h

Lines changed: 0 additions & 37 deletions
This file was deleted.

features/FEATURE_UVISOR/includes/uvisor-lib/rtx/secure_allocator.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,18 @@ void * secure_malloc(
7070
SecureAllocator allocator,
7171
size_t size);
7272

73+
/** Drop-in for `aligned_alloc`. */
74+
void * secure_aligned_alloc(
75+
SecureAllocator allocator,
76+
size_t alignment,
77+
size_t size);
78+
79+
/** Drop-in for `calloc`. */
80+
void * secure_calloc(
81+
SecureAllocator allocator,
82+
size_t nmemb,
83+
size_t size);
84+
7385
/** Drop-in for `realloc`. */
7486
void * secure_realloc(
7587
SecureAllocator allocator,

features/FEATURE_UVISOR/includes/uvisor-lib/uvisor-lib.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040

4141
/* The uVisor API main header file will use the above definitions. */
4242
#include "uvisor/api/inc/uvisor-lib.h"
43-
#include "uvisor-lib/rtx/process_malloc.h"
4443
#include "uvisor-lib/rtx/rtx_box_index.h"
4544
#include "uvisor-lib/rtx/secure_allocator.h"
4645

features/FEATURE_UVISOR/includes/uvisor/api/inc/api.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@
1919

2020
#include "rt_OsEventObserver.h"
2121
#include "api/inc/uvisor_exports.h"
22-
#include "api/inc/unvic_exports.h"
22+
#include "api/inc/virq_exports.h"
2323
#include "api/inc/debug_exports.h"
2424
#include "api/inc/halt_exports.h"
2525
#include "api/inc/pool_queue_exports.h"
2626
#include "api/inc/page_allocator_exports.h"
27+
#include "api/inc/uvisor_spinlock_exports.h"
2728
#include <stdint.h>
2829

2930
#define UVISOR_API_MAGIC 0x5C9411B4
@@ -37,7 +38,7 @@ typedef struct {
3738
uint32_t magic;
3839
uint32_t (*get_version)(uint32_t);
3940

40-
void (*init)(void);
41+
void (*init)(uint32_t caller);
4142

4243
void (*irq_enable)(uint32_t irqn);
4344
void (*irq_disable)(uint32_t irqn);
@@ -60,17 +61,23 @@ typedef struct {
6061

6162
void (*debug_init)(const TUvisorDebugDriver * const driver);
6263
void (*error)(THaltUserError reason);
64+
void (*start)(void);
6365
void (*vmpu_mem_invalidate)(void);
6466

65-
int (*pool_init)(uvisor_pool_t *, void *, size_t, size_t, int);
66-
int (*pool_queue_init)(uvisor_pool_queue_t *, uvisor_pool_t *, void *, size_t, size_t, int);
67-
uvisor_pool_slot_t (*pool_allocate)(uvisor_pool_t *, uint32_t);
67+
int (*pool_init)(uvisor_pool_t *, void *, size_t, size_t);
68+
int (*pool_queue_init)(uvisor_pool_queue_t *, uvisor_pool_t *, void *, size_t, size_t);
69+
uvisor_pool_slot_t (*pool_allocate)(uvisor_pool_t *);
6870
void (*pool_queue_enqueue)(uvisor_pool_queue_t *, uvisor_pool_slot_t);
6971
uvisor_pool_slot_t (*pool_free)(uvisor_pool_t *, uvisor_pool_slot_t);
7072
uvisor_pool_slot_t (*pool_queue_dequeue)(uvisor_pool_queue_t *, uvisor_pool_slot_t);
7173
uvisor_pool_slot_t (*pool_queue_dequeue_first)(uvisor_pool_queue_t *);
7274
uvisor_pool_slot_t (*pool_queue_find_first)(uvisor_pool_queue_t *, TQueryFN_Ptr, void *);
7375

76+
void (*spin_init)(UvisorSpinlock * spinlock);
77+
bool (*spin_trylock)(UvisorSpinlock * spinlock);
78+
void (*spin_lock)(UvisorSpinlock * spinlock);
79+
void (*spin_unlock)(UvisorSpinlock * spinlock);
80+
7481
OsEventObserver os_event_observer;
7582
} UVISOR_PACKED UvisorApi;
7683

features/FEATURE_UVISOR/includes/uvisor/api/inc/box_config.h

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,16 @@
2222
#include "api/inc/rpc_exports.h"
2323
#include <stddef.h>
2424
#include <stdint.h>
25+
#include <sys/reent.h>
2526

2627
UVISOR_EXTERN const uint32_t __uvisor_mode;
2728
UVISOR_EXTERN void const * const public_box_cfg_ptr;
2829

29-
typedef struct {
30-
void (*function)(const void *);
31-
size_t priority;
32-
size_t stack_size;
33-
} uvisor_box_main_t;
30+
/* All pointers in the box index need to be 4-byte aligned.
31+
* We therefore also need to round up all sizes to 4-byte multiples to
32+
* provide the space to be able to align the pointers to 4-bytes. */
33+
#define __UVISOR_BOX_ROUND_4(size) \
34+
(((size) + 3UL) & ~3UL)
3435

3536
#define UVISOR_DISABLED 0
3637
#define UVISOR_PERMISSIVE 1
@@ -53,7 +54,9 @@ typedef struct {
5354
{ \
5455
sizeof(RtxBoxIndex), \
5556
0, \
57+
0, \
5658
sizeof(uvisor_rpc_t), \
59+
sizeof(uvisor_ipc_t), \
5760
0, \
5861
}, \
5962
0, \
@@ -83,12 +86,13 @@ typedef struct {
8386
UVISOR_STACK_SIZE_ROUND( \
8487
( \
8588
(UVISOR_MIN_STACK(stack_size) + \
86-
(context_size) + \
87-
(__uvisor_box_heapsize) + \
88-
sizeof(RtxBoxIndex) + \
89-
sizeof(uvisor_rpc_outgoing_message_queue_t) + \
90-
sizeof(uvisor_rpc_incoming_message_queue_t) + \
91-
sizeof(uvisor_rpc_fn_group_queue_t) \
89+
__UVISOR_BOX_ROUND_4(context_size) + \
90+
__UVISOR_BOX_ROUND_4(__uvisor_box_heapsize) + \
91+
__UVISOR_BOX_ROUND_4(sizeof(RtxBoxIndex)) + \
92+
__UVISOR_BOX_ROUND_4(sizeof(uvisor_rpc_outgoing_message_queue_t)) + \
93+
__UVISOR_BOX_ROUND_4(sizeof(uvisor_rpc_incoming_message_queue_t)) + \
94+
__UVISOR_BOX_ROUND_4(sizeof(uvisor_rpc_fn_group_queue_t)) + \
95+
__UVISOR_BOX_ROUND_4(sizeof(struct _reent)) \
9296
) \
9397
* 8) \
9498
/ 6)]; \
@@ -99,7 +103,9 @@ typedef struct {
99103
{ \
100104
sizeof(RtxBoxIndex), \
101105
context_size, \
106+
sizeof(struct _reent), \
102107
sizeof(uvisor_rpc_t), \
108+
sizeof(uvisor_ipc_t), \
103109
__uvisor_box_heapsize, \
104110
}, \
105111
UVISOR_MIN_STACK(stack_size), \

features/FEATURE_UVISOR/includes/uvisor/api/inc/cmsis_nvic_virtual.h

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,37 @@
1818
#define __UVISOR_API_NVIC_VIRTUAL_H__
1919

2020
#include "api/inc/interrupts.h"
21-
#include "api/inc/unvic_exports.h"
21+
#include "api/inc/virq_exports.h"
2222

23-
#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping
24-
#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping
25-
#define NVIC_EnableIRQ vIRQ_EnableIRQ
26-
#define NVIC_DisableIRQ vIRQ_DisableIRQ
27-
#define NVIC_GetPendingIRQ vIRQ_GetPendingIRQ
28-
#define NVIC_SetPendingIRQ vIRQ_SetPendingIRQ
29-
#define NVIC_ClearPendingIRQ vIRQ_ClearPendingIRQ
30-
#define NVIC_GetActive __NVIC_GetActive
31-
#define NVIC_SetPriority vIRQ_SetPriority
32-
#define NVIC_GetPriority vIRQ_GetPriority
33-
#define NVIC_SystemReset() vIRQ_SystemReset(RESET_REASON_NO_REASON)
23+
/* The NVIC APIs are only wrapped on ARMv7-M. */
24+
#if !defined(ARCH_CORE_ARMv8M) && !defined(TARGET_M33)
25+
26+
#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping
27+
#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping
28+
#define NVIC_EnableIRQ vIRQ_EnableIRQ
29+
#define NVIC_DisableIRQ vIRQ_DisableIRQ
30+
#define NVIC_GetPendingIRQ vIRQ_GetPendingIRQ
31+
#define NVIC_SetPendingIRQ vIRQ_SetPendingIRQ
32+
#define NVIC_ClearPendingIRQ vIRQ_ClearPendingIRQ
33+
#define NVIC_GetActive __NVIC_GetActive
34+
#define NVIC_SetPriority vIRQ_SetPriority
35+
#define NVIC_GetPriority vIRQ_GetPriority
36+
#define NVIC_SystemReset() vIRQ_SystemReset(RESET_REASON_NO_REASON)
37+
38+
#else
39+
40+
#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping
41+
#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping
42+
#define NVIC_EnableIRQ __NVIC_EnableIRQ
43+
#define NVIC_DisableIRQ __NVIC_DisableIRQ
44+
#define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ
45+
#define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ
46+
#define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ
47+
#define NVIC_GetActive __NVIC_GetActive
48+
#define NVIC_SetPriority __NVIC_SetPriority
49+
#define NVIC_GetPriority __NVIC_GetPriority
50+
#define NVIC_SystemReset() __NVIC_SystemReset()
51+
52+
#endif
3453

3554
#endif /* __UVISOR_API_NVIC_VIRTUAL_H__ */

features/FEATURE_UVISOR/includes/uvisor/api/inc/cmsis_vectab_virtual.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,17 @@
1919

2020
#include "api/inc/interrupts.h"
2121

22-
#define NVIC_SetVector vIRQ_SetVector
23-
#define NVIC_GetVector vIRQ_GetVector
22+
/* The NVIC APIs are only wrapped on ARMv7-M. */
23+
#if !defined(ARCH_CORE_ARMv8M) && !defined(TARGET_M33)
24+
25+
#define NVIC_SetVector vIRQ_SetVector
26+
#define NVIC_GetVector vIRQ_GetVector
27+
28+
#else
29+
30+
#define NVIC_SetVector __NVIC_SetVector
31+
#define NVIC_GetVector __NVIC_GetVector
32+
33+
#endif
2434

2535
#endif /* __UVISOR_API_VECTAB_VIRTUAL_H__ */

features/FEATURE_UVISOR/includes/uvisor/api/inc/halt_exports.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ typedef enum {
4949
FAULT_USAGE,
5050
FAULT_HARD,
5151
FAULT_DEBUG,
52+
FAULT_SECURE,
5253
__THALTERROR_MAX /* always keep as the last element of the enum */
5354
} THaltError;
5455

features/FEATURE_UVISOR/includes/uvisor/api/inc/interrupts.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#ifndef __UVISOR_API_INTERRUPTS_H__
1818
#define __UVISOR_API_INTERRUPTS_H__
1919

20-
#include "api/inc/unvic_exports.h"
20+
#include "api/inc/virq_exports.h"
2121
#include "api/inc/uvisor_exports.h"
2222
#include "api/inc/api.h"
2323
#include <stdint.h>
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
* Copyright (c) 2017, ARM Limited, All Rights Reserved
3+
* SPDX-License-Identifier: Apache-2.0
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License"); you may
6+
* not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
#ifndef __UVISOR_API_IPC_H__
18+
#define __UVISOR_API_IPC_H__
19+
20+
#include "api/inc/ipc_exports.h"
21+
#include "api/inc/uvisor_exports.h"
22+
#include <stdint.h>
23+
#include <stddef.h>
24+
25+
26+
/** Wait for any of the specified IPC operations to complete.
27+
*
28+
* @note This function currently spins, burning through power.
29+
*
30+
* @param[in] wait_tokens a bitfield of tokens to wait on
31+
* @param[out] done_tokens a bitfield which tokens completed
32+
* @param[in] timeout_ms how long to wait (in ms) for an IPC operation
33+
* before returning. 0 means don't wait at all. Any
34+
* other value means wait forever.
35+
* @return 0 on success, non-zero error code otherwise
36+
*/
37+
UVISOR_EXTERN int ipc_waitforany(uint32_t wait_tokens, uint32_t * done_tokens, uint32_t timeout_ms);
38+
39+
/** Wait for all of the specified IPC operations to complete.
40+
*
41+
* @note This function currently spins, burning through power.
42+
*
43+
* @param[in] wait_tokens a bitfield of tokens to wait on
44+
* @param[out] done_tokens a bitfield which tokens completed
45+
* @param[in] timeout_ms how long to wait (in ms) for an IPC operation
46+
* before returning. 0 means don't wait at all.
47+
* Any other value means wait forever.
48+
* @return 0 on success, non-zero error code otherwise
49+
*/
50+
UVISOR_EXTERN int ipc_waitforall(uint32_t wait_tokens, uint32_t * done_tokens, uint32_t timeout_ms);
51+
52+
/** Asynchronously send an IPC message
53+
*
54+
* @note The memory used for sending the message (pointed to by msg) must be
55+
* valid until after the send is complete.
56+
*
57+
* @param[in] desc an IPC descriptor for the message
58+
* @param[in] msg the message to send
59+
*
60+
* @return 0 on success, non-zero error code otherwise
61+
* */
62+
UVISOR_EXTERN int ipc_send(uvisor_ipc_desc_t * desc, const void * msg);
63+
64+
/** Asynchronously receive an IPC message
65+
*
66+
* @note The memory used for receiving the message (pointed to by msg) must be
67+
* valid until after the receive is complete.
68+
*
69+
* @param[inout] desc an IPC descriptor for the message
70+
* @param[out] msg the memory to copy the message to
71+
*
72+
* @return 0 on success, non-zero error code otherwise
73+
*/
74+
UVISOR_EXTERN int ipc_recv(uvisor_ipc_desc_t * desc, void * msg);
75+
76+
#endif /* __UVISOR_API_IPC_H__ */

0 commit comments

Comments
 (0)