Microvisor is in a pre-release phase and the information contained in this document is subject to change. Some features referenced below may not be fully available until Microvisor's General Availability (GA) release.
Microvisor system calls include the following functions to manage notifications:
mvSetupNotifications()
mvCloseNotifications()
mvOpenSystemNotification()
mvCloseSystemNotification()
All of the functions described below return a 32-bit integer that is one of the values from the standard Microvisor enumeration MvStatus
. All possible error values for a given system call are provided with each function's description.
Success is always signaled by a return value of zero (MV_STATUS_OKAY
).
Instantiate a notification dispatch center
1extern enum MvStatus mvSetupNotifications(const struct MvNotificationSetup *setup,2MvNotificationHandle *handle);
Parameter | Description |
---|---|
setup | A pointer to non-secure memory in which notification setup data is stored by the application |
handle | A pointer to non-secure memory into which the notification center handle will be written by Microvisor |
Error Value | Description |
---|---|
MV_STATUS_PARAMETERFAULT | params or handle does not reference memory accessible to the application |
MV_STATUS_TOOMANYNOTIFICATIONBUFFERS | Microvisor cannot create the necessary notification center because the maximum has already been reached |
MV_STATUS_INVALIDBUFFERSIZE | The buffer size specified in setup is not a multiple of 16 bytes, or at least 32 bytes in size |
MV_STATUS_BUFFERALREADYINUSE | The specified buffer is already being used by another notification center |
MV_STATUS_INVALIDINTERRUPT | The IRQ specified in setup (see below) is not available to the application |
You configure the notification center by providing a pointer to a NotificationSetup
structure:
1struct MvNotificationSetup {2uint32_t irq;3struct MvNotification *buffer;4uint32_t buffer_size;5}
These properties are:
irq
— The number of the non-secure interrupt line that will be triggered to signal that a new notification has been posted. The call to mvSetupNotifications()
will return an error if this value indicates a secure interrupt, or has already been assigned to a notification center.buffer
— A pointer to a previously allocated buffer. It must be 8-byte aligned.buffer_size
— The size of the center's buffer in bytes. It must be at least 32 bytes and a multiple of 16 bytes.1// Central store for Microvisor resource handles used in this code.2struct {3MvNotificationHandle notification;4MvNetworkHandle network;5MvChannelHandle channel;6} http_handles = { 0, 0, 0 };78// Store for HTTP notification records.9// Holds four records at a time -- each record is 16 bytes.10volatile struct MvNotification http_notification_center[4] __attribute__((aligned(8)));1112// Clear the notification store13memset((void *)http_notification_center, 0xFF, sizeof(http_notification_center));1415// Configure a notification center for network-centric notifications16static struct MvNotificationSetup http_notification_setup = {17.irq = TIM8_BRK_IRQn,18.buffer = (struct MvNotification *)http_notification_center,19.buffer_size = sizeof(http_notification_center)20};2122// Ask Microvisor to establish the notification center23// and confirm that it has accepted the request24enum MvStatus status = mvSetupNotifications(&http_notification_setup, &http_handles.notification);25assert((status == MV_STATUS_OKAY) && "[ERROR] Could not set up HTTP channel NC");2627// Start the notification IRQ28NVIC_ClearPendingIRQ(TIM8_BRK_IRQn);29NVIC_EnableIRQ(TIM8_BRK_IRQn);30printf("[DEBUG] Notification center handle: %lu\n", (uint32_t)http_handles.notification);
For more details on Microvisor's notifications mechanism, please see Microvisor Notifications.
Halt the dispatch of messages from a notification center
extern enum MvStatus mvCloseNotifications(MvNotificationHandle *handle);
Parameter | Description |
---|---|
handle | A pointer to non-secure memory in which the notification center handle is stored by the application |
Error Value | Description |
---|---|
MV_STATUS_PARAMETERFAULT | handle does not reference memory accessible to the application |
MV_STATUS_INVALIDHANDLE | handle is invalid or identifies some other type of handle |
To stop receiving notifications from a specific notification center, call mvCloseNotifications()
and pass in a pointer to the memory in which the center's handle is stored.
If the center is in use by other objects — for example, the same center is dispatching notifications from a network and a channel — calling mvCloseNotifications()
will stop the delivery of notifications from all of its sources, and no error will be issued.
The center's non-secure interrupt will not be pended by Microvisor when the center is closed. If the interrupt has already been pended, it will not be cleared. This is the job of the application.
This example uses variables defined in the example above.
1// If we have a valid notification center handle, then ask Microvisor2// to tear down the center and confirm acceptance of the request.3if (http_handles.notification != 0) {4status = mvCloseNotifications(&http_handles.notification);5assert((status == MV_STATUS_OKAY) && "[ERROR] Could not close HTTP channel NC");6}
Start the dispatch of system messages to a notification center
1extern enum MvStatus mvOpenSystemNotification(const struct MvOpenSystemNotificationParams *params,2MvSystemEventHandle *handle);
Parameter | Description |
---|---|
params | A pointer to non-secure memory in which the notification parameters are stored by the application |
handle | A pointer to non-secure memory in which the handle of the system event sender is stored by the application |
Error Value | Description |
---|---|
MV_STATUS_UNAVAILABLE | System call has been made from an interrupt service routine |
MV_STATUS_PARAMETERFAULT | handle or params does not reference memory accessible to the application |
MV_STATUS_INVALIDHANDLE | handle is invalid or identifies some other type of handle |
To begin receiving system notifications, call mvOpenSystemNotification()
and pass in a pointer to the memory in which the system notification configuration is stored, and where a system event sender's handle will be stored.
The params
parameter takes a pointer to a MvOpenSystemNotificationParams
structure:
1struct MvOpenSystemNotificationParams {2MvNotificationHandle notification_handle;3uint32_t notification_tag;4enum MvSystemNotificationSource notification_source;5}
These properties are:
notification_handle
— The handle that will be issued for the notification center messages.notification_tag
— An arbitrary 32-bit value you can specify and which will then be included in all notifications relating to this center.notification_source
— One or more MvSystemNotificationSource
values OR'd to indicate the type(s) of notifications to be issued. See below.Available MvSystemNotificationSource
values include:
1enum MvSystemNotificationSource {2MV_SYSTEMNOTIFICATIONSOURCE_NETWORK,3MV_SYSTEMNOTIFICATIONSOURCE_UPDATE4};
Use MV_SYSTEMNOTIFICATIONSOURCE_UPDATE
to receive polite deployment notifications.
Halt the dispatch of system messages to a notification center
extern enum MvStatus mvCloseSystemNotification(MvSystemEventHandle *handle);
Parameter | Description |
---|---|
handle | A pointer to non-secure memory in which the handle of a system event sender is stored by the application |
Error Value | Description |
---|---|
MV_STATUS_UNAVAILABLE | System call has been made from an interrupt service routine |
MV_STATUS_INVALIDHANDLE | handle is invalid or identifies some other type of handle |
To stop receiving system notifications, call mvCloseSystemNotification()
and pass in the handle of the system event sender that was provided when you called mvOpenSystemNotification()
.
This call does not tear down the notification center to which system notifications are being sent.