aarch64: Add PubSub events to capture security state transitions

Add events that trigger before entry to normal/secure world.  The
events trigger after the normal/secure context has been restored.

Similarly add events that trigger after leaving normal/secure world.
The events trigger after the normal/secure context has been saved.

Change-Id: I1b48a7ea005d56b1f25e2b5313d77e67d2f02bc5
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
This commit is contained in:
Dimitris Papastamos 2017-10-13 15:27:58 +01:00
parent a2ef56af18
commit 17b4c0dd0a
3 changed files with 41 additions and 19 deletions

View File

@ -2309,6 +2309,12 @@ PE only; it won't cause handlers to execute on a different PE.
Note that publishing an event on a PE blocks until all the subscribed handlers
finish executing on the PE.
ARM Trusted Firmware generic code publishes and subscribes to some events
within. Platform ports are discouraged from subscribing to them. These events
may be withdrawn, renamed, or have their semantics altered in the future.
Platforms may however register, publish, and subscribe to platform-specific
events.
Publish and Subscribe Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -2339,22 +2345,6 @@ implement:
SUBSCRIBE_TO_EVENT(foo, foo_handler);
Available Events
~~~~~~~~~~~~~~~~
ARM Trusted Firmware core makes some events available by default. They're listed
below, along with information as to when they're published, and the arguments
passed to subscribed handlers.
Other EL3 components that are conditionally compiled in may make their own
events available, but aren't documented here.
- ``psci_cpu_on_finish``
- When: Published on a PE after it's finished its power-up sequence.
- Argument: ``NULL``.
Performance Measurement Framework
---------------------------------

View File

@ -16,3 +16,21 @@
* initialization.
*/
REGISTER_PUBSUB_EVENT(psci_cpu_on_finish);
#ifdef AARCH64
/*
* These events are published by the AArch64 context management framework
* after the secure context is restored/saved via
* cm_el1_sysregs_context_{restore,save}() API.
*/
REGISTER_PUBSUB_EVENT(cm_entering_secure_world);
REGISTER_PUBSUB_EVENT(cm_exited_secure_world);
/*
* These events are published by the AArch64 context management framework
* after the normal context is restored/saved via
* cm_el1_sysregs_context_{restore,save}() API.
*/
REGISTER_PUBSUB_EVENT(cm_entering_normal_world);
REGISTER_PUBSUB_EVENT(cm_exited_normal_world);
#endif /* AARCH64 */

View File

@ -13,6 +13,7 @@
#include <interrupt_mgmt.h>
#include <platform.h>
#include <platform_def.h>
#include <pubsub_events.h>
#include <smcc_helpers.h>
#include <string.h>
#include <utils.h>
@ -421,9 +422,8 @@ void cm_prepare_el3_exit(uint32_t security_state)
}
}
el1_sysregs_context_restore(get_sysregs_ctx(ctx));
cm_set_next_context(ctx);
cm_el1_sysregs_context_restore(security_state);
cm_set_next_eret_context(security_state);
}
/*******************************************************************************
@ -440,6 +440,13 @@ void cm_el1_sysregs_context_save(uint32_t security_state)
el1_sysregs_context_save(get_sysregs_ctx(ctx));
el1_sysregs_context_save_post_ops();
#if IMAGE_BL31
if (security_state == SECURE)
PUBLISH_EVENT(cm_exited_secure_world);
else
PUBLISH_EVENT(cm_exited_normal_world);
#endif
}
void cm_el1_sysregs_context_restore(uint32_t security_state)
@ -450,6 +457,13 @@ void cm_el1_sysregs_context_restore(uint32_t security_state)
assert(ctx);
el1_sysregs_context_restore(get_sysregs_ctx(ctx));
#if IMAGE_BL31
if (security_state == SECURE)
PUBLISH_EVENT(cm_entering_secure_world);
else
PUBLISH_EVENT(cm_entering_normal_world);
#endif
}
/*******************************************************************************