feat(ffa-svc): add `ffa_func_name` and `ffa_error_name`
Adds helper functions for getting string representations of function
identifiers and error codes. This makes debug logs more readable than
printing the integer value.
Change-Id: I9e74c197686dc08e0c71886f641c60829587bad6
Signed-off-by: Karl Meakin <karl.meakin@arm.com>
diff --git a/include/runtime_services/ffa_svc.h b/include/runtime_services/ffa_svc.h
index 226bbd1..0e6081e 100644
--- a/include/runtime_services/ffa_svc.h
+++ b/include/runtime_services/ffa_svc.h
@@ -11,7 +11,10 @@
#include <smccc.h>
#include <uuid.h>
-/* FFA error codes. */
+/**
+ * FFA error codes.
+ * Don't forget to update `ffa_error_name` if you add a new one.
+ */
#define FFA_ERROR_NOT_SUPPORTED -1
#define FFA_ERROR_INVALID_PARAMETER -2
#define FFA_ERROR_NO_MEMORY -3
@@ -22,6 +25,33 @@
#define FFA_ERROR_ABORTED -8
#define FFA_ERROR_NO_DATA -9
+/* Return the name of the error code. */
+static inline const char *ffa_error_name(int32_t error)
+{
+ switch (error) {
+ case FFA_ERROR_NOT_SUPPORTED:
+ return "FFA_ERROR_NOT_SUPPORTED";
+ case FFA_ERROR_INVALID_PARAMETER:
+ return "FFA_ERROR_INVALID_PARAMETER";
+ case FFA_ERROR_NO_MEMORY:
+ return "FFA_ERROR_NO_MEMORY";
+ case FFA_ERROR_BUSY:
+ return "FFA_ERROR_BUSY";
+ case FFA_ERROR_INTERRUPTED:
+ return "FFA_ERROR_INTERRUPTED";
+ case FFA_ERROR_DENIED:
+ return "FFA_ERROR_DENIED";
+ case FFA_ERROR_RETRY:
+ return "FFA_ERROR_RETRY";
+ case FFA_ERROR_ABORTED:
+ return "FFA_ERROR_ABORTED";
+ case FFA_ERROR_NO_DATA:
+ return "FFA_ERROR_NO_DATA";
+ default:
+ return "UNKNOWN";
+ }
+}
+
/* The macros below are used to identify FFA calls from the SMC function ID */
#define FFA_FNUM_MIN_VALUE U(0x60)
#define FFA_FNUM_MAX_VALUE U(0x8C)
@@ -61,7 +91,10 @@
(OEN_STD_START << FUNCID_OEN_SHIFT) | \
((func_num) << FUNCID_NUM_SHIFT))
-/* FFA function numbers */
+/**
+ * FFA function numbers.
+ * Don't forget to update `ffa_func_name` if you add a new one.
+ */
#define FFA_FNUM_ERROR U(0x60)
#define FFA_FNUM_SUCCESS U(0x61)
#define FFA_FNUM_INTERRUPT U(0x62)
@@ -176,6 +209,103 @@
/* Implementation defined SMC64 FIDs */
#define FFA_CONSOLE_LOG_SMC64 FFA_FID(SMC_64, FFA_FNUM_CONSOLE_LOG)
+
+static inline const char *ffa_func_name(uint32_t func)
+{
+ switch (func) {
+ case FFA_ERROR:
+ return "FFA_ERROR";
+ case FFA_SUCCESS_SMC32:
+ return "FFA_SUCCESS_SMC32";
+ case FFA_INTERRUPT:
+ return "FFA_INTERRUPT";
+ case FFA_VERSION:
+ return "FFA_VERSION";
+ case FFA_FEATURES:
+ return "FFA_FEATURES";
+ case FFA_RX_RELEASE:
+ return "FFA_RX_RELEASE";
+ case FFA_RXTX_MAP_SMC32:
+ return "FFA_RXTX_MAP_SMC32";
+ case FFA_RXTX_UNMAP:
+ return "FFA_RXTX_UNMAP";
+ case FFA_PARTITION_INFO_GET:
+ return "FFA_PARTITION_INFO_GET";
+ case FFA_ID_GET:
+ return "FFA_ID_GET";
+ case FFA_MSG_POLL:
+ return "FFA_MSG_POLL";
+ case FFA_MSG_WAIT:
+ return "FFA_MSG_WAIT";
+ case FFA_MSG_YIELD:
+ return "FFA_MSG_YIELD";
+ case FFA_RUN:
+ return "FFA_RUN";
+ case FFA_MSG_SEND:
+ return "FFA_MSG_SEND";
+ case FFA_MSG_SEND_DIRECT_RESP_SMC32:
+ return "FFA_MSG_SEND_DIRECT_RESP_SMC32";
+ case FFA_MEM_DONATE_SMC32:
+ return "FFA_MEM_DONATE_SMC32";
+ case FFA_MEM_LEND_SMC32:
+ return "FFA_MEM_LEND_SMC32";
+ case FFA_MEM_SHARE_SMC32:
+ return "FFA_MEM_SHARE_SMC32";
+ case FFA_MEM_RETRIEVE_REQ_SMC32:
+ return "FFA_MEM_RETRIEVE_REQ_SMC32";
+ case FFA_MEM_RETRIEVE_RESP:
+ return "FFA_MEM_RETRIEVE_RESP";
+ case FFA_MEM_RELINQUISH:
+ return "FFA_MEM_RELINQUISH";
+ case FFA_MEM_RECLAIM:
+ return "FFA_MEM_RECLAIM";
+ case FFA_NOTIFICATION_BITMAP_CREATE:
+ return "FFA_NOTIFICATION_BITMAP_CREATE";
+ case FFA_NOTIFICATION_BITMAP_DESTROY:
+ return "FFA_NOTIFICATION_BITMAP_DESTROY";
+ case FFA_NOTIFICATION_BIND:
+ return "FFA_NOTIFICATION_BIND";
+ case FFA_NOTIFICATION_UNBIND:
+ return "FFA_NOTIFICATION_UNBIND";
+ case FFA_NOTIFICATION_SET:
+ return "FFA_NOTIFICATION_SET";
+ case FFA_NOTIFICATION_GET:
+ return "FFA_NOTIFICATION_GET";
+ case FFA_NOTIFICATION_INFO_GET:
+ return "FFA_NOTIFICATION_INFO_GET";
+ case FFA_SPM_ID_GET:
+ return "FFA_SPM_ID_GET";
+ case FFA_SUCCESS_SMC64:
+ return "FFA_SUCCESS_SMC64";
+ case FFA_RXTX_MAP_SMC64:
+ return "FFA_RXTX_MAP_SMC64";
+ case FFA_MSG_SEND_DIRECT_REQ_SMC64:
+ return "FFA_MSG_SEND_DIRECT_REQ_SMC64";
+ case FFA_MSG_SEND_DIRECT_RESP_SMC64:
+ return "FFA_MSG_SEND_DIRECT_RESP_SMC64";
+ case FFA_MEM_DONATE_SMC64:
+ return "FFA_MEM_DONATE_SMC64";
+ case FFA_MEM_LEND_SMC64:
+ return "FFA_MEM_LEND_SMC64";
+ case FFA_MEM_SHARE_SMC64:
+ return "FFA_MEM_SHARE_SMC64";
+ case FFA_MEM_RETRIEVE_REQ_SMC64:
+ return "FFA_MEM_RETRIEVE_REQ_SMC64";
+ case FFA_SECONDARY_EP_REGISTER_SMC64:
+ return "FFA_SECONDARY_EP_REGISTER_SMC64";
+ case FFA_NOTIFICATION_INFO_GET_SMC64:
+ return "FFA_NOTIFICATION_INFO_GET_SMC64";
+ case FFA_FEATURES_MEM_RETRIEVE_REQ_NS_SUPPORT:
+ return "FFA_FEATURES_MEM_RETRIEVE_REQ_NS_SUPPORT";
+ case FFA_PARTITION_INFO_GET_REGS_SMC64:
+ return "FFA_PARTITION_INFO_GET_REGS_SMC64";
+ case FFA_CONSOLE_LOG_SMC64:
+ return "FFA_CONSOLE_LOG_SMC64";
+ default:
+ return "UNKNOWN";
+ }
+}
+
/*
* Reserve a special value for traffic targeted to the Hypervisor or SPM.
*/
diff --git a/spm/cactus/cactus_main.c b/spm/cactus/cactus_main.c
index b3f7451..141f1fe 100644
--- a/spm/cactus/cactus_main.c
+++ b/spm/cactus/cactus_main.c
@@ -61,10 +61,12 @@
ffa_ret = ffa_msg_wait();
for (;;) {
- VERBOSE("Woke up with func id: %x\n", ffa_func_id(ffa_ret));
+ VERBOSE("Woke up with func id: %s\n",
+ ffa_func_name(ffa_func_id(ffa_ret)));
if (ffa_func_id(ffa_ret) == FFA_ERROR) {
- ERROR("Error: %x\n", ffa_error_code(ffa_ret));
+ ERROR("Error: %s\n",
+ ffa_error_name(ffa_error_code(ffa_ret)));
break;
}
@@ -72,8 +74,8 @@
ffa_func_id(ffa_ret) != FFA_MSG_SEND_DIRECT_REQ_SMC64 &&
ffa_func_id(ffa_ret) != FFA_INTERRUPT &&
ffa_func_id(ffa_ret) != FFA_RUN) {
- ERROR("%s(%u) unknown func id 0x%x\n",
- __func__, vm_id, ffa_func_id(ffa_ret));
+ ERROR("%s(%u) unknown func id %s\n", __func__, vm_id,
+ ffa_func_name(ffa_func_id(ffa_ret)));
break;
}
@@ -304,9 +306,8 @@
VERBOSE("Mapping RXTX Region\n");
CONFIGURE_AND_MAP_MAILBOX(mb, PAGE_SIZE, ret);
if (ffa_func_id(ret) != FFA_SUCCESS_SMC32) {
- ERROR(
- "Failed to map RXTX buffers. Error: %x\n",
- ffa_error_code(ret));
+ ERROR("Failed to map RXTX buffers. Error: %s\n",
+ ffa_error_name(ffa_error_code(ret)));
panic();
}
}
diff --git a/spm/common/sp_tests/sp_test_ffa.c b/spm/common/sp_tests/sp_test_ffa.c
index 219b149..63bf131 100644
--- a/spm/common/sp_tests/sp_test_ffa.c
+++ b/spm/common/sp_tests/sp_test_ffa.c
@@ -99,18 +99,20 @@
test_target.expected_ret : FFA_ERROR;
if (ffa_func_id(ffa_ret) != expected_ret) {
- ERROR("Unexpected return: %x (expected %x)."
+ ERROR("Unexpected return: %s (expected %s)."
" FFA_FEATURES test: %s.\n",
- ffa_func_id(ffa_ret), expected_ret,
+ ffa_func_name(ffa_func_id(ffa_ret)),
+ ffa_func_name(expected_ret),
test_target.test_name);
}
if (expected_ret == FFA_ERROR) {
if (ffa_error_code(ffa_ret) !=
FFA_ERROR_NOT_SUPPORTED) {
- ERROR("Unexpected error code: %x (expected %x)."
+ ERROR("Unexpected error code: %s (expected %s)."
" FFA_FEATURES test: %s.\n",
- ffa_error_code(ffa_ret), expected_ret,
+ ffa_error_name(ffa_error_code(ffa_ret)),
+ ffa_error_name(expected_ret),
test_target.test_name);
}
}
diff --git a/spm/ivy/app/ivy_main.c b/spm/ivy/app/ivy_main.c
index 1e2cd6a..861ef30 100644
--- a/spm/ivy/app/ivy_main.c
+++ b/spm/ivy/app/ivy_main.c
@@ -42,8 +42,8 @@
VERBOSE("Mapping RXTX Regions\n");
CONFIGURE_AND_MAP_MAILBOX(mb, PAGE_SIZE, ret);
if (ffa_func_id(ret) != FFA_SUCCESS_SMC32) {
- ERROR("Failed to map RXTX buffers. Error %x\n",
- ffa_error_code(ret));
+ ERROR("Failed to map RXTX buffers. Error %s\n",
+ ffa_error_name(ffa_error_code(ret)));
panic();
}
@@ -53,7 +53,8 @@
while (1) {
if (ffa_func_id(ret) != FFA_MSG_SEND_DIRECT_REQ_SMC32) {
- ERROR("unknown FF-A request %x\n", ffa_func_id(ret));
+ ERROR("unknown FF-A request %s\n",
+ ffa_func_name(ffa_func_id(ret)));
goto init;
}
diff --git a/tftf/tests/runtime_services/secure_service/spm_common.c b/tftf/tests/runtime_services/secure_service/spm_common.c
index ee25c82..45ab71a 100644
--- a/tftf/tests/runtime_services/secure_service/spm_common.c
+++ b/tftf/tests/runtime_services/secure_service/spm_common.c
@@ -21,24 +21,34 @@
bool is_ffa_call_error(struct ffa_value ret)
{
if (ffa_func_id(ret) == FFA_ERROR) {
- VERBOSE("FF-A call returned error (%x): %d\n",
- ffa_func_id(ret), ffa_error_code(ret));
+ VERBOSE("FF-A call returned error: %s\n",
+ ffa_error_name(ffa_error_code(ret)));
return true;
}
return false;
}
-bool is_expected_ffa_error(struct ffa_value ret, int32_t error_code)
+bool is_expected_ffa_error(struct ffa_value ret, int32_t expected_error)
{
- if (ffa_func_id(ret) == FFA_ERROR &&
- ffa_error_code(ret) == error_code) {
- return true;
+ uint32_t received_func;
+ int32_t received_error;
+
+ received_func = ffa_func_id(ret);
+ if (received_func != FFA_ERROR) {
+ ERROR("Expected FFA_ERROR, got %s instead\n",
+ ffa_func_name(received_func));
+ return false;
}
- ERROR("Expected FFA_ERROR(%x), code: %d, got %x %d\n",
- FFA_ERROR, error_code, ffa_func_id(ret), ffa_error_code(ret));
+ received_error = ffa_error_code(ret);
+ if (received_error != expected_error) {
+ ERROR("Expected %s, got %s instead\n",
+ ffa_error_name(expected_error),
+ ffa_error_name(received_error));
+ return false;
+ }
- return false;
+ return true;
}
/**
@@ -53,7 +63,7 @@
return true;
}
- VERBOSE("%x is not FF-A response.\n", ffa_func_id(ret));
+ VERBOSE("%s is not FF-A response.\n", ffa_func_name(ffa_func_id(ret)));
/* To log error in case it is FFA_ERROR*/
is_ffa_call_error(ret);
@@ -69,7 +79,8 @@
return true;
}
- VERBOSE("Expecting %x, FF-A return was %x\n", func_id, ffa_func_id(ret));
+ VERBOSE("Expecting %s, FF-A return was %s\n", ffa_func_name(func_id),
+ ffa_func_name(ffa_func_id(ret)));
return false;
}
@@ -231,8 +242,8 @@
ret = ffa_mem_retrieve_req(descriptor_size, descriptor_size);
if (ffa_func_id(ret) != FFA_MEM_RETRIEVE_RESP) {
- ERROR("%s: couldn't retrieve the memory page. Error: %d\n",
- __func__, ffa_error_code(ret));
+ ERROR("%s: couldn't retrieve the memory page. Error: %s\n",
+ __func__, ffa_error_name(ffa_error_code(ret)));
return false;
}
@@ -417,8 +428,8 @@
ffa_mem_relinquish_init(m, handle, 0, id);
ret = ffa_mem_relinquish();
if (ffa_func_id(ret) != FFA_SUCCESS_SMC32) {
- ERROR("%s failed to relinquish memory! error: %x\n",
- __func__, ffa_error_code(ret));
+ ERROR("%s failed to relinquish memory! error: %s\n", __func__,
+ ffa_error_name(ffa_error_code(ret)));
return false;
}
diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_interrupts.c b/tftf/tests/runtime_services/secure_service/test_ffa_interrupts.c
index 454ea05..d4c8048 100644
--- a/tftf/tests/runtime_services/secure_service/test_ffa_interrupts.c
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_interrupts.c
@@ -218,8 +218,10 @@
if ((ffa_func_id(ret_values) != FFA_ERROR) ||
(ffa_error_code(ret_values) != FFA_ERROR_BUSY)) {
- ERROR("Expected FFA_ERROR(BUSY)! Got %x(%x)\n",
- ffa_func_id(ret_values), ffa_error_code(ret_values));
+ ERROR("Expected FFA_ERROR(BUSY)! Got %s(%s)\n",
+ ffa_func_name(ffa_func_id(ret_values)),
+ ffa_error_name(ffa_error_code(ret_values)));
+
return TEST_RESULT_FAIL;
}
@@ -560,8 +562,9 @@
if ((ffa_func_id(ret_values) != FFA_ERROR) ||
(ffa_error_code(ret_values) != FFA_ERROR_BUSY)) {
- ERROR("Expected FFA_ERROR(BUSY)! Got %x(%x)\n",
- ffa_func_id(ret_values), ffa_error_code(ret_values));
+ ERROR("Expected FFA_ERROR(BUSY)! Got %s(%s)\n",
+ ffa_func_name(ffa_func_id(ret_values)),
+ ffa_error_name(ffa_error_code(ret_values)));
return TEST_RESULT_FAIL;
}
diff --git a/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c b/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
index 80a3015..567ac48 100644
--- a/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
+++ b/tftf/tests/runtime_services/secure_service/test_ffa_setup_and_discovery.c
@@ -94,19 +94,20 @@
>= test_target.version_added ?
test_target.expected_ret : FFA_ERROR;
if (ffa_func_id(ffa_ret) != expected_ret) {
- tftf_testcase_printf("%s returned %x, expected %x\n",
- test_target.test_name,
- ffa_func_id(ffa_ret),
- expected_ret);
+ tftf_testcase_printf(
+ "%s returned %s, expected %s\n",
+ test_target.test_name,
+ ffa_func_name(ffa_func_id(ffa_ret)),
+ ffa_func_name(expected_ret));
return TEST_RESULT_FAIL;
}
if ((expected_ret == FFA_ERROR) &&
(ffa_error_code(ffa_ret) != FFA_ERROR_NOT_SUPPORTED)) {
- tftf_testcase_printf("%s failed for the wrong reason: "
- "returned %x, expected %x\n",
- test_target.test_name,
- ffa_error_code(ffa_ret),
- FFA_ERROR_NOT_SUPPORTED);
+ tftf_testcase_printf(
+ "%s failed for the wrong reason: returned %s, expected %s\n",
+ test_target.test_name,
+ ffa_error_name(ffa_error_code(ffa_ret)),
+ ffa_error_name(FFA_ERROR_NOT_SUPPORTED));
return TEST_RESULT_FAIL;
}
}
@@ -225,7 +226,8 @@
*/
CONFIGURE_AND_MAP_MAILBOX(mb, PAGE_SIZE, ret);
if (ffa_func_id(ret) != expected_return) {
- ERROR("Failed to map RXTX buffers %x!\n", ffa_error_code(ret));
+ ERROR("Failed to map RXTX buffers: %s!\n",
+ ffa_error_name(ffa_error_code(ret)));
return TEST_RESULT_FAIL;
}
@@ -353,8 +355,8 @@
struct ffa_value ffa_ret = ffa_spm_id_get();
if (is_ffa_call_error(ffa_ret)) {
- ERROR("FFA_SPM_ID_GET call failed! Error code: 0x%x\n",
- ffa_error_code(ffa_ret));
+ ERROR("FFA_SPM_ID_GET call failed! Error code: %s\n",
+ ffa_error_name(ffa_error_code(ffa_ret)));
return TEST_RESULT_FAIL;
}