aboutsummaryrefslogtreecommitdiff
path: root/spm
diff options
context:
space:
mode:
authorAntonio Nino Diaz <antonio.ninodiaz@arm.com>2018-07-03 14:39:47 +0100
committerAntonio Nino Diaz <antonio.ninodiaz@arm.com>2018-12-11 15:04:14 +0000
commit43ef393092738fd1664fefca8d178575b57cfa89 (patch)
tree4ece98d9e6ba4bc08933d37d10b2e4a0cadadfc5 /spm
parente46924ea53f8c2c300b1ab1cf9e0c5676511ae67 (diff)
downloadtf-a-tests-43ef393092738fd1664fefca8d178575b57cfa89.tar.gz
cactus: Update service handling loop
Also, add test to check SPRT version. Change-Id: I4e47bba998b86f460df3407d147735e873fd6cf3 Signed-off-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
Diffstat (limited to 'spm')
-rw-r--r--spm/cactus/cactus.h6
-rw-r--r--spm/cactus/cactus.mk8
-rw-r--r--spm/cactus/cactus_main.c68
-rw-r--r--spm/cactus/cactus_service_loop.c40
-rw-r--r--spm/cactus/cactus_tests_misc.c21
5 files changed, 89 insertions, 54 deletions
diff --git a/spm/cactus/cactus.h b/spm/cactus/cactus.h
index fb8155fbc..2f12f5ce7 100644
--- a/spm/cactus/cactus.h
+++ b/spm/cactus/cactus.h
@@ -26,10 +26,4 @@ extern uintptr_t __BSS_START__, __BSS_END__;
#define CACTUS_BSS_START ((uintptr_t)&__BSS_START__)
#define CACTUS_BSS_END ((uintptr_t)&__BSS_END__)
-/*
- * Once Cactus has finished its initialisation, this is the function it will
- * jump to to handle runtime services for the rest of its lifetime.
- */
-__dead2 void secure_services_loop(void);
-
#endif /* __CACTUS_H__ */
diff --git a/spm/cactus/cactus.mk b/spm/cactus/cactus.mk
index 6f912e729..6ba0db004 100644
--- a/spm/cactus/cactus.mk
+++ b/spm/cactus/cactus.mk
@@ -4,6 +4,8 @@
# SPDX-License-Identifier: BSD-3-Clause
#
+include lib/sprt/sprt_client.mk
+
CACTUS_INCLUDES := \
-Iinclude \
-Iinclude/common \
@@ -14,18 +16,19 @@ CACTUS_INCLUDES := \
-Iinclude/lib/${ARCH} \
-Iinclude/lib/stdlib \
-Iinclude/lib/stdlib/sys \
+ -Iinclude/lib/sprt \
-Iinclude/lib/utils \
-Iinclude/lib/xlat_tables \
-Iinclude/runtime_services \
-Iinclude/runtime_services/secure_el0_payloads \
-Ispm/cactus \
-Ispm/common \
+ ${SPRT_LIB_INCLUDES}
CACTUS_SOURCES := \
$(addprefix spm/cactus/, \
aarch64/cactus_entrypoint.S \
cactus_main.c \
- cactus_service_loop.c \
cactus_tests_memory_attributes.c \
cactus_tests_misc.c \
cactus_tests_system_setup.c \
@@ -53,7 +56,8 @@ CACTUS_SOURCES += \
CACTUS_SOURCES += drivers/arm/pl011/${ARCH}/pl011_console.S \
lib/${ARCH}/cache_helpers.S \
lib/${ARCH}/misc_helpers.S \
- ${STDLIB_SOURCES}
+ ${STDLIB_SOURCES} \
+ ${SPRT_LIB_SOURCES}
CACTUS_LINKERFILE := spm/cactus/cactus.ld.S
diff --git a/spm/cactus/cactus_main.c b/spm/cactus/cactus_main.c
index 889c1740d..bfbfa48c5 100644
--- a/spm/cactus/cactus_main.c
+++ b/spm/cactus/cactus_main.c
@@ -5,12 +5,15 @@
*/
#include <assert.h>
+#include <cactus_def.h>
#include <console.h>
#include <debug.h>
+#include <errno.h>
#include <pl011.h>
#include <plat_arm.h>
#include <platform_def.h>
-#include <sp_helpers.h>
+#include <sprt_client.h>
+#include <sprt_svc.h>
#include <std_svc.h>
#include "cactus.h"
@@ -50,6 +53,38 @@ static void cactus_print_memory_layout(void)
(void *)(CACTUS_TEST_MEM_BASE + CACTUS_TEST_MEM_SIZE));
}
+static void cactus_message_handler(struct sprt_queue_entry_message *message)
+{
+ u_register_t ret0 = 0U, ret1 = 0U, ret2 = 0U, ret3 = 0U;
+
+ if (message->type == SPRT_MSG_TYPE_SERVICE_REQUEST) {
+ switch (message->args[1]) {
+
+ case CACTUS_PRINT_MAGIC:
+ INFO("Cactus: Magic: 0x%x\n", CACTUS_MAGIC_NUMBER);
+ ret0 = SPRT_SUCCESS;
+ break;
+
+ case CACTUS_GET_MAGIC:
+ ret1 = CACTUS_MAGIC_NUMBER;
+ ret0 = SPRT_SUCCESS;
+ break;
+
+ default:
+ NOTICE("Cactus: Unhandled Service ID 0x%x\n",
+ (unsigned int)message->args[1]);
+ ret0 = SPRT_NOT_SUPPORTED;
+ break;
+ }
+ } else {
+ NOTICE("Cactus: Unhandled Service type 0x%x\n",
+ (unsigned int)message->type);
+ ret0 = SPRT_NOT_SUPPORTED;
+ }
+
+ sprt_message_end(message, ret0, ret1, ret2, ret3);
+}
+
void __dead2 cactus_main(void)
{
console_init(PL011_UART2_BASE,
@@ -76,5 +111,34 @@ void __dead2 cactus_main(void)
/*
* Handle secure service requests.
*/
- secure_services_loop();
+ sprt_initialize_queues((void *)CACTUS_SPM_BUF_BASE);
+
+ while (1) {
+ struct sprt_queue_entry_message message;
+
+ /*
+ * Try to fetch a message from the blocking requests queue. If
+ * it is empty, try to fetch from the non-blocking requests
+ * queue. Repeat until both of them are empty.
+ */
+ while (1) {
+ int err = sprt_get_next_message(&message,
+ SPRT_QUEUE_NUM_BLOCKING);
+ if (err == -ENOENT) {
+ err = sprt_get_next_message(&message,
+ SPRT_QUEUE_NUM_NON_BLOCKING);
+ if (err == -ENOENT) {
+ break;
+ } else {
+ assert(err == 0);
+ cactus_message_handler(&message);
+ }
+ } else {
+ assert(err == 0);
+ cactus_message_handler(&message);
+ }
+ }
+
+ sprt_wait_for_messages();
+ }
}
diff --git a/spm/cactus/cactus_service_loop.c b/spm/cactus/cactus_service_loop.c
deleted file mode 100644
index 4b202ada2..000000000
--- a/spm/cactus/cactus_service_loop.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2018, Arm Limited. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <assert.h>
-#include <debug.h>
-#include <sp_helpers.h>
-#include <sprt_svc.h>
-#include <spm_svc.h>
-#include <string.h>
-
-__dead2 void secure_services_loop(void)
-{
- int32_t event_status_code;
- svc_args svc_values = { 0 };
-
- /*
- * The first time this loop is executed corresponds to when Cactus has
- * finished initialising its run time environment and is ready to handle
- * secure service requests.
- */
- NOTICE("Cactus: Signal end of init to SPM\n");
- event_status_code = SPRT_SUCCESS;
-
- while (1) {
- svc_values.arg0 = SPRT_REQUEST_COMPLETE_BLOCKING_AARCH64;
- svc_values.arg1 = event_status_code;
- int32_t event_id = sp_svc(&svc_values);
-
- switch (event_id) {
-
- default:
- NOTICE("Unhandled Service ID 0x%x\n", event_id);
- event_status_code = SPRT_NOT_SUPPORTED;
- break;
- }
- }
-}
diff --git a/spm/cactus/cactus_tests_misc.c b/spm/cactus/cactus_tests_misc.c
index bb8eaa77d..62d7ad3a2 100644
--- a/spm/cactus/cactus_tests_misc.c
+++ b/spm/cactus/cactus_tests_misc.c
@@ -9,6 +9,8 @@
#include <errno.h>
#include <sp_helpers.h>
#include <spm_svc.h>
+#include <sprt_client.h>
+#include <sprt_svc.h>
#include <types.h>
#include "cactus.h"
@@ -25,15 +27,26 @@ void misc_tests(void)
announce_test_section_start(test_sect_desc);
- const char *test_version = "SPM version check";
+ const char *test_version_spm = "SPM version check";
- announce_test_start(test_version);
+ announce_test_start(test_version_spm);
svc_args svc_values = { SPM_VERSION_AARCH32 };
ret = sp_svc(&svc_values);
INFO("Version = 0x%x (%u.%u)\n", ret,
- (ret >> 16) & 0x7FFF, ret & 0xFFFF);
+ (ret >> SPM_VERSION_MAJOR_SHIFT) & SPM_VERSION_MAJOR_MASK,
+ ret & SPM_VERSION_MINOR_MASK);
expect(ret, SPM_VERSION_COMPILED);
- announce_test_end(test_version);
+ announce_test_end(test_version_spm);
+
+ const char *test_version_sprt = "SPRT version check";
+
+ announce_test_start(test_version_sprt);
+ ret = sprt_version();
+ INFO("Version = 0x%x (%u.%u)\n", ret,
+ (ret >> SPRT_VERSION_MAJOR_SHIFT) & SPRT_VERSION_MAJOR_MASK,
+ ret & SPRT_VERSION_MINOR_MASK);
+ expect(ret, SPRT_VERSION_COMPILED);
+ announce_test_end(test_version_sprt);
announce_test_section_end(test_sect_desc);
}