blob: a037c27cc6322695829c2b4b708e69061f774d89 [file] [log] [blame]
From a9edc50077d72cdd7e40ba3f03aee974848cd532 Mon Sep 17 00:00:00 2001
From: Imre Kis <imre.kis@arm.com>
Date: Tue, 19 Jul 2022 17:38:00 +0200
Subject: [PATCH 21/24] Add 64 bit direct message handling to libsp
* Change direct message struct to allow 64 bit arguments
* Add 64 bit direct message req/resp functions to FF-A layer
* Distinguish 32/64 bit messages on SP layer by field in sp_msg
* Update tests and mocks
The FF-A direct message response must match the request's 32/64bit mode
which is the responsibility of the callee and it should be validated by
the SPMC.
Signed-off-by: Imre Kis <imre.kis@arm.com>
Change-Id: Ibbd64ca0291dfe142a23471a649a07ba1a036824
Upstream-Status: Pending [In review]
Signed-off-by: Anton Antonov <Anton.Antonov@arm.com>
---
components/messaging/ffa/libsp/ffa.c | 84 ++-
.../libsp/ffa_direct_msg_routing_extension.c | 28 +-
.../messaging/ffa/libsp/include/ffa_api.h | 58 +-
.../ffa/libsp/include/ffa_api_defines.h | 5 +
.../ffa/libsp/include/ffa_api_types.h | 7 +-
.../ffa/libsp/include/sp_messaging.h | 9 +-
.../messaging/ffa/libsp/mock/mock_ffa_api.cpp | 100 +++-
.../messaging/ffa/libsp/mock/mock_ffa_api.h | 34 +-
.../ffa/libsp/mock/test/test_mock_ffa_api.cpp | 50 +-
components/messaging/ffa/libsp/sp_messaging.c | 74 ++-
.../messaging/ffa/libsp/test/test_ffa_api.cpp | 337 ++++++++++--
.../ffa/libsp/test/test_sp_messaging.cpp | 498 ++++++++++--------
.../rpc/ffarpc/caller/sp/ffarpc_caller.c | 31 +-
.../rpc/ffarpc/endpoint/ffarpc_call_ep.c | 4 +-
.../endpoint/sp/mm_communicate_call_ep.c | 16 +-
.../smm-gateway/common/smm_gateway_sp.c | 8 +-
16 files changed, 961 insertions(+), 382 deletions(-)
diff --git a/components/messaging/ffa/libsp/ffa.c b/components/messaging/ffa/libsp/ffa.c
index 374e940..caacc79 100644
--- a/components/messaging/ffa/libsp/ffa.c
+++ b/components/messaging/ffa/libsp/ffa.c
@@ -33,11 +33,20 @@ static inline void ffa_unpack_direct_msg(struct ffa_params *svc_result,
msg->function_id = svc_result->a0;
msg->source_id = (svc_result->a1 >> 16);
msg->destination_id = svc_result->a1;
- msg->args[0] = svc_result->a3;
- msg->args[1] = svc_result->a4;
- msg->args[2] = svc_result->a5;
- msg->args[3] = svc_result->a6;
- msg->args[4] = svc_result->a7;
+
+ if (FFA_IS_32_BIT_FUNC(msg->function_id)) {
+ msg->args.args32[0] = svc_result->a3;
+ msg->args.args32[1] = svc_result->a4;
+ msg->args.args32[2] = svc_result->a5;
+ msg->args.args32[3] = svc_result->a6;
+ msg->args.args32[4] = svc_result->a7;
+ } else {
+ msg->args.args64[0] = svc_result->a3;
+ msg->args.args64[1] = svc_result->a4;
+ msg->args.args64[2] = svc_result->a5;
+ msg->args.args64[3] = svc_result->a6;
+ msg->args.args64[4] = svc_result->a7;
+ }
}
/*
@@ -217,7 +226,7 @@ ffa_result ffa_msg_wait(struct ffa_direct_msg *msg)
if (result.a0 == FFA_ERROR) {
return ffa_get_errorcode(&result);
- } else if (result.a0 == FFA_MSG_SEND_DIRECT_REQ_32) {
+ } else if (FFA_TO_32_BIT_FUNC(result.a0) == FFA_MSG_SEND_DIRECT_REQ_32) {
ffa_unpack_direct_msg(&result, msg);
} else {
assert(result.a0 == FFA_SUCCESS_32);
@@ -227,13 +236,15 @@ ffa_result ffa_msg_wait(struct ffa_direct_msg *msg)
return FFA_OK;
}
-ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
- uint32_t a1, uint32_t a2, uint32_t a3,
- uint32_t a4, struct ffa_direct_msg *msg)
+static ffa_result ffa_msg_send_direct_req(uint32_t function_id, uint32_t resp_id,
+ uint16_t source, uint16_t dest,
+ uint64_t a0, uint64_t a1, uint64_t a2,
+ uint64_t a3, uint64_t a4,
+ struct ffa_direct_msg *msg)
{
struct ffa_params result = {0};
- ffa_svc(FFA_MSG_SEND_DIRECT_REQ_32,
+ ffa_svc(function_id,
SHIFT_U32(source, FFA_MSG_SEND_DIRECT_REQ_SOURCE_ID_SHIFT) |
dest, FFA_PARAM_MBZ, a0, a1, a2, a3, a4, &result);
@@ -244,7 +255,7 @@ ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
if (result.a0 == FFA_ERROR) {
return ffa_get_errorcode(&result);
- } else if (result.a0 == FFA_MSG_SEND_DIRECT_RESP_32) {
+ } else if (result.a0 == resp_id) {
ffa_unpack_direct_msg(&result, msg);
} else {
assert(result.a0 == FFA_SUCCESS_32);
@@ -254,13 +265,36 @@ ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
return FFA_OK;
}
-ffa_result ffa_msg_send_direct_resp(uint16_t source, uint16_t dest, uint32_t a0,
- uint32_t a1, uint32_t a2, uint32_t a3,
- uint32_t a4, struct ffa_direct_msg *msg)
+ffa_result ffa_msg_send_direct_req_32(uint16_t source, uint16_t dest,
+ uint32_t a0, uint32_t a1, uint32_t a2,
+ uint32_t a3, uint32_t a4,
+ struct ffa_direct_msg *msg)
+{
+ return ffa_msg_send_direct_req(FFA_MSG_SEND_DIRECT_REQ_32,
+ FFA_MSG_SEND_DIRECT_RESP_32,
+ source, dest, a0, a1, a2, a3, a4, msg);
+}
+
+ffa_result ffa_msg_send_direct_req_64(uint16_t source, uint16_t dest,
+ uint64_t a0, uint64_t a1, uint64_t a2,
+ uint64_t a3, uint64_t a4,
+ struct ffa_direct_msg *msg)
+{
+ return ffa_msg_send_direct_req(FFA_MSG_SEND_DIRECT_REQ_64,
+ FFA_MSG_SEND_DIRECT_RESP_64,
+ source, dest, a0, a1, a2, a3, a4, msg);
+}
+
+static ffa_result ffa_msg_send_direct_resp(uint32_t function_id,
+ uint16_t source, uint16_t dest,
+ uint64_t a0, uint64_t a1,
+ uint64_t a2, uint64_t a3,
+ uint64_t a4,
+ struct ffa_direct_msg *msg)
{
struct ffa_params result = {0};
- ffa_svc(FFA_MSG_SEND_DIRECT_RESP_32,
+ ffa_svc(function_id,
SHIFT_U32(source, FFA_MSG_SEND_DIRECT_RESP_SOURCE_ID_SHIFT) |
dest, FFA_PARAM_MBZ, a0, a1, a2, a3, a4, &result);
@@ -271,7 +305,7 @@ ffa_result ffa_msg_send_direct_resp(uint16_t source, uint16_t dest, uint32_t a0,
if (result.a0 == FFA_ERROR) {
return ffa_get_errorcode(&result);
- } else if (result.a0 == FFA_MSG_SEND_DIRECT_REQ_32) {
+ } else if (FFA_TO_32_BIT_FUNC(result.a0) == FFA_MSG_SEND_DIRECT_REQ_32) {
ffa_unpack_direct_msg(&result, msg);
} else {
assert(result.a0 == FFA_SUCCESS_32);
@@ -281,6 +315,24 @@ ffa_result ffa_msg_send_direct_resp(uint16_t source, uint16_t dest, uint32_t a0,
return FFA_OK;
}
+ffa_result ffa_msg_send_direct_resp_32(uint16_t source, uint16_t dest,
+ uint32_t a0, uint32_t a1, uint32_t a2,
+ uint32_t a3, uint32_t a4,
+ struct ffa_direct_msg *msg)
+{
+ return ffa_msg_send_direct_resp(FFA_MSG_SEND_DIRECT_RESP_32, source,
+ dest, a0, a1, a2, a3, a4, msg);
+}
+
+ffa_result ffa_msg_send_direct_resp_64(uint16_t source, uint16_t dest,
+ uint64_t a0, uint64_t a1, uint64_t a2,
+ uint64_t a3, uint64_t a4,
+ struct ffa_direct_msg *msg)
+{
+ return ffa_msg_send_direct_resp(FFA_MSG_SEND_DIRECT_RESP_64, source,
+ dest, a0, a1, a2, a3, a4, msg);
+}
+
ffa_result ffa_mem_donate(uint32_t total_length, uint32_t fragment_length,
void *buffer_address, uint32_t page_count,
uint64_t *handle)
diff --git a/components/messaging/ffa/libsp/ffa_direct_msg_routing_extension.c b/components/messaging/ffa/libsp/ffa_direct_msg_routing_extension.c
index 6813573..03a372f 100644
--- a/components/messaging/ffa/libsp/ffa_direct_msg_routing_extension.c
+++ b/components/messaging/ffa/libsp/ffa_direct_msg_routing_extension.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
- * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
*/
#include "ffa_direct_msg_routing_extension.h"
@@ -20,23 +20,23 @@ static uint16_t callee_id = SP_ID_INVALID;
static bool is_rc_message(const struct ffa_direct_msg *msg)
{
- return msg->args[0] & FFA_ROUTING_EXT_RC_BIT;
+ return msg->args.args32[0] & FFA_ROUTING_EXT_RC_BIT;
}
static bool is_error_message(const struct ffa_direct_msg *msg)
{
- return msg->args[0] & FFA_ROUTING_EXT_ERROR_BIT;
+ return msg->args.args32[0] & FFA_ROUTING_EXT_ERROR_BIT;
}
static ffa_result get_error_code_from_message(const struct ffa_direct_msg *msg)
{
- return (ffa_result)msg->args[1];
+ return (ffa_result)msg->args.args32[1];
}
static ffa_result send_rc_error_message(struct ffa_direct_msg *req,
ffa_result error_code)
{
- return ffa_msg_send_direct_resp(req->destination_id, req->source_id,
+ return ffa_msg_send_direct_resp_32(req->destination_id, req->source_id,
(FFA_ROUTING_EXT_ERROR_BIT |
FFA_ROUTING_EXT_RC_BIT),
error_code, 0, 0, 0, req);
@@ -45,7 +45,7 @@ static ffa_result send_rc_error_message(struct ffa_direct_msg *req,
static ffa_result send_rc_error_message_to_rc_root(struct ffa_direct_msg *resp,
ffa_result error_code)
{
- return ffa_msg_send_direct_req(own_id, callee_id,
+ return ffa_msg_send_direct_req_32(own_id, callee_id,
(FFA_ROUTING_EXT_RC_BIT |
FFA_ROUTING_EXT_ERROR_BIT),
error_code, 0, 0, 0, resp);
@@ -128,10 +128,10 @@ ffa_result ffa_direct_msg_routing_ext_req_post_hook(struct ffa_direct_msg *resp)
/* Forwarding RC request towards the root (normal world) */
state = forwarding;
- ffa_res = ffa_msg_send_direct_resp(own_id, caller_id,
- resp->args[0], resp->args[1],
- resp->args[2], resp->args[3],
- resp->args[4], &rc_resp);
+ ffa_res = ffa_msg_send_direct_resp_32(own_id, caller_id,
+ resp->args.args32[0], resp->args.args32[1],
+ resp->args.args32[2], resp->args.args32[3],
+ resp->args.args32[4], &rc_resp);
if (ffa_res != FFA_OK)
goto forward_ffa_error_to_rc_root;
@@ -145,9 +145,9 @@ ffa_result ffa_direct_msg_routing_ext_req_post_hook(struct ffa_direct_msg *resp)
/* Forwarding RC response towards the RC root. */
state = internal;
- ffa_res = ffa_msg_send_direct_req(
- own_id, callee_id, rc_resp.args[0], rc_resp.args[1],
- rc_resp.args[2], rc_resp.args[3], rc_resp.args[4],
+ ffa_res = ffa_msg_send_direct_req_32(
+ own_id, callee_id, rc_resp.args.args32[0], rc_resp.args.args32[1],
+ rc_resp.args.args32[2], rc_resp.args.args32[3], rc_resp.args.args32[4],
resp);
goto break_on_ffa_error;
@@ -197,7 +197,7 @@ void ffa_direct_msg_routing_ext_resp_error_hook(void)
void ffa_direct_msg_routing_ext_rc_req_pre_hook(struct ffa_direct_msg *req)
{
- req->args[0] = FFA_ROUTING_EXT_RC_BIT;
+ req->args.args32[0] = FFA_ROUTING_EXT_RC_BIT;
state = rc_root;
}
diff --git a/components/messaging/ffa/libsp/include/ffa_api.h b/components/messaging/ffa/libsp/include/ffa_api.h
index ec5cb04..4b7073b 100644
--- a/components/messaging/ffa/libsp/include/ffa_api.h
+++ b/components/messaging/ffa/libsp/include/ffa_api.h
@@ -126,8 +126,8 @@ ffa_result ffa_msg_wait(struct ffa_direct_msg *msg);
/** Messaging interfaces */
/**
- * @brief Sends a partition message in parameter registers as a request and
- * blocks until the response is available.
+ * @brief Sends a 32 bit partition message in parameter registers as a
+ * request and blocks until the response is available.
* @note The ffa_interrupt_handler function can be called during the
* execution of this function
*
@@ -138,13 +138,14 @@ ffa_result ffa_msg_wait(struct ffa_direct_msg *msg);
*
* @return The FF-A error status code
*/
-ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
- uint32_t a1, uint32_t a2, uint32_t a3,
- uint32_t a4, struct ffa_direct_msg *msg);
+ffa_result ffa_msg_send_direct_req_32(uint16_t source, uint16_t dest,
+ uint32_t a0, uint32_t a1, uint32_t a2,
+ uint32_t a3, uint32_t a4,
+ struct ffa_direct_msg *msg);
/**
- * @brief Sends a partition message in parameter registers as a response
- * and blocks until the response is available.
+ * @brief Sends a 64 bit partition message in parameter registers as a
+ * request and blocks until the response is available.
* @note The ffa_interrupt_handler function can be called during the
* execution of this function
*
@@ -155,9 +156,46 @@ ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
*
* @return The FF-A error status code
*/
-ffa_result ffa_msg_send_direct_resp(uint16_t source, uint16_t dest, uint32_t a0,
- uint32_t a1, uint32_t a2, uint32_t a3,
- uint32_t a4, struct ffa_direct_msg *msg);
+ffa_result ffa_msg_send_direct_req_64(uint16_t source, uint16_t dest,
+ uint64_t a0, uint64_t a1, uint64_t a2,
+ uint64_t a3, uint64_t a4,
+ struct ffa_direct_msg *msg);
+
+/**
+ * @brief Sends a 32 bit partition message in parameter registers as a
+ * response and blocks until the response is available.
+ * @note The ffa_interrupt_handler function can be called during the
+ * execution of this function
+ *
+ * @param[in] source Source endpoint ID
+ * @param[in] dest Destination endpoint ID
+ * @param[in] a0,a1,a2,a3,a4 Implementation defined message values
+ * @param[out] msg The response message
+ *
+ * @return The FF-A error status code
+ */
+ffa_result ffa_msg_send_direct_resp_32(uint16_t source, uint16_t dest,
+ uint32_t a0, uint32_t a1, uint32_t a2,
+ uint32_t a3, uint32_t a4,
+ struct ffa_direct_msg *msg);
+
+/**
+ * @brief Sends a 64 bit partition message in parameter registers as a
+ * response and blocks until the response is available.
+ * @note The ffa_interrupt_handler function can be called during the
+ * execution of this function
+ *
+ * @param[in] source Source endpoint ID
+ * @param[in] dest Destination endpoint ID
+ * @param[in] a0,a1,a2,a3,a4 Implementation defined message values
+ * @param[out] msg The response message
+ *
+ * @return The FF-A error status code
+ */
+ffa_result ffa_msg_send_direct_resp_64(uint16_t source, uint16_t dest,
+ uint64_t a0, uint64_t a1, uint64_t a2,
+ uint64_t a3, uint64_t a4,
+ struct ffa_direct_msg *msg);
/**
* Memory management interfaces
diff --git a/components/messaging/ffa/libsp/include/ffa_api_defines.h b/components/messaging/ffa/libsp/include/ffa_api_defines.h
index 95bcb0c..163a0cd 100644
--- a/components/messaging/ffa/libsp/include/ffa_api_defines.h
+++ b/components/messaging/ffa/libsp/include/ffa_api_defines.h
@@ -58,6 +58,11 @@
#define FFA_MEM_PERM_GET UINT32_C(0x84000088)
#define FFA_MEM_PERM_SET UINT32_C(0x84000089)
+/* Utility macros */
+#define FFA_TO_32_BIT_FUNC(x) ((x) & (~UINT32_C(0x40000000)))
+#define FFA_IS_32_BIT_FUNC(x) (((x) & UINT32_C(0x40000000)) == 0)
+#define FFA_IS_64_BIT_FUNC(x) (((x) & UINT32_C(0x40000000)) != 0)
+
/* Special value for MBZ parameters */
#define FFA_PARAM_MBZ UINT32_C(0x0)
diff --git a/components/messaging/ffa/libsp/include/ffa_api_types.h b/components/messaging/ffa/libsp/include/ffa_api_types.h
index 3686e2e..b1be7ac 100644
--- a/components/messaging/ffa/libsp/include/ffa_api_types.h
+++ b/components/messaging/ffa/libsp/include/ffa_api_types.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: BSD-3-Clause */
/*
- * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
*/
#ifndef LIBSP_INCLUDE_FFA_API_TYPES_H_
@@ -80,7 +80,10 @@ struct ffa_direct_msg {
uint32_t function_id;
uint16_t source_id;
uint16_t destination_id;
- uint32_t args[5];
+ union {
+ uint32_t args32[5];
+ uint64_t args64[5];
+ } args;
};
/**
diff --git a/components/messaging/ffa/libsp/include/sp_messaging.h b/components/messaging/ffa/libsp/include/sp_messaging.h
index 4bb45f7..7173a92 100644
--- a/components/messaging/ffa/libsp/include/sp_messaging.h
+++ b/components/messaging/ffa/libsp/include/sp_messaging.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: BSD-3-Clause */
/*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
*/
#ifndef LIBSP_INCLUDE_SP_MESSAGING_H_
@@ -9,6 +9,7 @@
#include "sp_api_defines.h"
#include "sp_api_types.h"
+#include <stdbool.h>
#include <stdint.h>
#ifdef __cplusplus
@@ -23,7 +24,11 @@ extern "C" {
struct sp_msg {
uint16_t source_id;
uint16_t destination_id;
- uint32_t args[SP_MSG_ARG_COUNT];
+ bool is_64bit_message;
+ union {
+ uint32_t args32[SP_MSG_ARG_COUNT];
+ uint64_t args64[SP_MSG_ARG_COUNT];
+ } args;
};
/**
diff --git a/components/messaging/ffa/libsp/mock/mock_ffa_api.cpp b/components/messaging/ffa/libsp/mock/mock_ffa_api.cpp
index ceebcbf..a01848c 100644
--- a/components/messaging/ffa/libsp/mock/mock_ffa_api.cpp
+++ b/components/messaging/ffa/libsp/mock/mock_ffa_api.cpp
@@ -140,13 +140,13 @@ ffa_result ffa_msg_wait(struct ffa_direct_msg *msg)
.returnIntValue();
}
-void expect_ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
- uint32_t a1, uint32_t a2, uint32_t a3,
- uint32_t a4,
- const struct ffa_direct_msg *msg,
- ffa_result result)
+void expect_ffa_msg_send_direct_req_32(uint16_t source, uint16_t dest,
+ uint32_t a0, uint32_t a1, uint32_t a2,
+ uint32_t a3, uint32_t a4,
+ const struct ffa_direct_msg *msg,
+ ffa_result result)
{
- mock().expectOneCall("ffa_msg_send_direct_req")
+ mock().expectOneCall("ffa_msg_send_direct_req_32")
.withUnsignedIntParameter("source", source)
.withUnsignedIntParameter("dest", dest)
.withUnsignedIntParameter("a0", a0)
@@ -158,12 +158,13 @@ void expect_ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
.andReturnValue(result);
}
-ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
- uint32_t a1, uint32_t a2, uint32_t a3,
- uint32_t a4, struct ffa_direct_msg *msg)
+ffa_result ffa_msg_send_direct_req_32(uint16_t source, uint16_t dest,
+ uint32_t a0, uint32_t a1, uint32_t a2,
+ uint32_t a3,uint32_t a4,
+ struct ffa_direct_msg *msg)
{
return mock()
- .actualCall("ffa_msg_send_direct_req")
+ .actualCall("ffa_msg_send_direct_req_32")
.withUnsignedIntParameter("source", source)
.withUnsignedIntParameter("dest", dest)
.withUnsignedIntParameter("a0", a0)
@@ -175,13 +176,49 @@ ffa_result ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
.returnIntValue();
}
-void expect_ffa_msg_send_direct_resp(uint16_t source, uint16_t dest,
+void expect_ffa_msg_send_direct_req_64(uint16_t source, uint16_t dest,
+ uint64_t a0, uint64_t a1, uint64_t a2,
+ uint64_t a3, uint64_t a4,
+ const struct ffa_direct_msg *msg,
+ ffa_result result)
+{
+ mock().expectOneCall("ffa_msg_send_direct_req_64")
+ .withUnsignedIntParameter("source", source)
+ .withUnsignedIntParameter("dest", dest)
+ .withUnsignedLongIntParameter("a0", a0)
+ .withUnsignedLongIntParameter("a1", a1)
+ .withUnsignedLongIntParameter("a2", a2)
+ .withUnsignedLongIntParameter("a3", a3)
+ .withUnsignedLongIntParameter("a4", a4)
+ .withOutputParameterReturning("msg", msg, sizeof(*msg))
+ .andReturnValue(result);
+}
+
+ffa_result ffa_msg_send_direct_req_64(uint16_t source, uint16_t dest,
+ uint64_t a0, uint64_t a1, uint64_t a2,
+ uint64_t a3, uint64_t a4,
+ struct ffa_direct_msg *msg)
+{
+ return mock()
+ .actualCall("ffa_msg_send_direct_req_64")
+ .withUnsignedIntParameter("source", source)
+ .withUnsignedIntParameter("dest", dest)
+ .withUnsignedLongIntParameter("a0", a0)
+ .withUnsignedLongIntParameter("a1", a1)
+ .withUnsignedLongIntParameter("a2", a2)
+ .withUnsignedLongIntParameter("a3", a3)
+ .withUnsignedLongIntParameter("a4", a4)
+ .withOutputParameter("msg", msg)
+ .returnIntValue();
+}
+
+void expect_ffa_msg_send_direct_resp_32(uint16_t source, uint16_t dest,
uint32_t a0, uint32_t a1, uint32_t a2,
uint32_t a3, uint32_t a4,
const struct ffa_direct_msg *msg,
ffa_result result)
{
- mock().expectOneCall("ffa_msg_send_direct_resp")
+ mock().expectOneCall("ffa_msg_send_direct_resp_32")
.withUnsignedIntParameter("source", source)
.withUnsignedIntParameter("dest", dest)
.withUnsignedIntParameter("a0", a0)
@@ -193,12 +230,12 @@ void expect_ffa_msg_send_direct_resp(uint16_t source, uint16_t dest,
.andReturnValue(result);
}
-ffa_result ffa_msg_send_direct_resp(uint16_t source, uint16_t dest, uint32_t a0,
+ffa_result ffa_msg_send_direct_resp_32(uint16_t source, uint16_t dest, uint32_t a0,
uint32_t a1, uint32_t a2, uint32_t a3,
uint32_t a4, struct ffa_direct_msg *msg)
{
return mock()
- .actualCall("ffa_msg_send_direct_resp")
+ .actualCall("ffa_msg_send_direct_resp_32")
.withUnsignedIntParameter("source", source)
.withUnsignedIntParameter("dest", dest)
.withUnsignedIntParameter("a0", a0)
@@ -210,6 +247,41 @@ ffa_result ffa_msg_send_direct_resp(uint16_t source, uint16_t dest, uint32_t a0,
.returnIntValue();
}
+void expect_ffa_msg_send_direct_resp_64(uint16_t source, uint16_t dest,
+ uint64_t a0, uint64_t a1, uint64_t a2,
+ uint64_t a3, uint64_t a4,
+ const struct ffa_direct_msg *msg,
+ ffa_result result)
+{
+ mock().expectOneCall("ffa_msg_send_direct_resp_64")
+ .withUnsignedIntParameter("source", source)
+ .withUnsignedIntParameter("dest", dest)
+ .withUnsignedLongIntParameter("a0", a0)
+ .withUnsignedLongIntParameter("a1", a1)
+ .withUnsignedLongIntParameter("a2", a2)
+ .withUnsignedLongIntParameter("a3", a3)
+ .withUnsignedLongIntParameter("a4", a4)
+ .withOutputParameterReturning("msg", msg, sizeof(*msg))
+ .andReturnValue(result);
+}
+
+ffa_result ffa_msg_send_direct_resp_64(uint16_t source, uint16_t dest, uint64_t a0,
+ uint64_t a1, uint64_t a2, uint64_t a3,
+ uint64_t a4, struct ffa_direct_msg *msg)
+{
+ return mock()
+ .actualCall("ffa_msg_send_direct_resp_64")
+ .withUnsignedIntParameter("source", source)
+ .withUnsignedIntParameter("dest", dest)
+ .withUnsignedLongIntParameter("a0", a0)
+ .withUnsignedLongIntParameter("a1", a1)
+ .withUnsignedLongIntParameter("a2", a2)
+ .withUnsignedLongIntParameter("a3", a3)
+ .withUnsignedLongIntParameter("a4", a4)
+ .withOutputParameter("msg", msg)
+ .returnIntValue();
+}
+
void expect_ffa_mem_donate(uint32_t total_length, uint32_t fragment_length,
void *buffer_address, uint32_t page_count,
const uint64_t *handle, ffa_result result)
diff --git a/components/messaging/ffa/libsp/mock/mock_ffa_api.h b/components/messaging/ffa/libsp/mock/mock_ffa_api.h
index b1c794f..4213ccb 100644
--- a/components/messaging/ffa/libsp/mock/mock_ffa_api.h
+++ b/components/messaging/ffa/libsp/mock/mock_ffa_api.h
@@ -30,17 +30,29 @@ void expect_ffa_id_get(const uint16_t *id, ffa_result result);
void expect_ffa_msg_wait(const struct ffa_direct_msg *msg, ffa_result result);
-void expect_ffa_msg_send_direct_req(uint16_t source, uint16_t dest, uint32_t a0,
- uint32_t a1, uint32_t a2, uint32_t a3,
- uint32_t a4,
- const struct ffa_direct_msg *msg,
- ffa_result result);
-
-void expect_ffa_msg_send_direct_resp(uint16_t source, uint16_t dest,
- uint32_t a0, uint32_t a1, uint32_t a2,
- uint32_t a3, uint32_t a4,
- const struct ffa_direct_msg *msg,
- ffa_result result);
+void expect_ffa_msg_send_direct_req_32(uint16_t source, uint16_t dest,
+ uint32_t a0, uint32_t a1, uint32_t a2,
+ uint32_t a3, uint32_t a4,
+ const struct ffa_direct_msg *msg,
+ ffa_result result);
+
+void expect_ffa_msg_send_direct_req_64(uint16_t source, uint16_t dest,
+ uint64_t a0, uint64_t a1, uint64_t a2,
+ uint64_t a3, uint64_t a4,
+ const struct ffa_direct_msg *msg,
+ ffa_result result);
+
+void expect_ffa_msg_send_direct_resp_32(uint16_t source, uint16_t dest,
+ uint32_t a0, uint32_t a1, uint32_t a2,
+ uint32_t a3, uint32_t a4,
+ const struct ffa_direct_msg *msg,
+ ffa_result result);
+
+void expect_ffa_msg_send_direct_resp_64(uint16_t source, uint16_t dest,
+ uint64_t a0, uint64_t a1, uint64_t a2,
+ uint64_t a3, uint64_t a4,
+ const struct ffa_direct_msg *msg,
+ ffa_result result);
void expect_ffa_mem_donate(uint32_t total_length, uint32_t fragment_length,
void *buffer_address, uint32_t page_count,
diff --git a/components/messaging/ffa/libsp/mock/test/test_mock_ffa_api.cpp b/components/messaging/ffa/libsp/mock/test/test_mock_ffa_api.cpp
index ab33649..c1cbdd6 100644
--- a/components/messaging/ffa/libsp/mock/test/test_mock_ffa_api.cpp
+++ b/components/messaging/ffa/libsp/mock/test/test_mock_ffa_api.cpp
@@ -105,7 +105,7 @@ TEST(mock_ffa_api, ffa_msg_wait)
MEMCMP_EQUAL(&expected_msg, &msg, sizeof(expected_msg));
}
-TEST(mock_ffa_api, ffa_msg_send_direct_req)
+TEST(mock_ffa_api, ffa_msg_send_direct_req_32)
{
const uint16_t source = 0x1122;
const uint16_t dest = 0x2233;
@@ -116,13 +116,30 @@ TEST(mock_ffa_api, ffa_msg_send_direct_req)
const uint32_t a4 = 0x89124567;
struct ffa_direct_msg msg = { 0 };
- expect_ffa_msg_send_direct_req(source, dest, a0, a1, a2, a3, a4,
+ expect_ffa_msg_send_direct_req_32(source, dest, a0, a1, a2, a3, a4,
+ &expected_msg, result);
+ LONGS_EQUAL(result, ffa_msg_send_direct_req_32(source, dest, a0, a1, a2,
+ a3, a4, &msg));
+}
+
+TEST(mock_ffa_api, ffa_msg_send_direct_req_64)
+{
+ const uint16_t source = 0x1122;
+ const uint16_t dest = 0x2233;
+ const uint64_t a0 = 0x4567891221987654;
+ const uint64_t a1 = 0x5678912442198765;
+ const uint64_t a2 = 0x6789124554219876;
+ const uint64_t a3 = 0x7891245665421987;
+ const uint64_t a4 = 0x8912456776542198;
+ struct ffa_direct_msg msg = { 0 };
+
+ expect_ffa_msg_send_direct_req_64(source, dest, a0, a1, a2, a3, a4,
&expected_msg, result);
- LONGS_EQUAL(result, ffa_msg_send_direct_req(source, dest, a0, a1, a2,
- a3, a4, &msg));
+ LONGS_EQUAL(result, ffa_msg_send_direct_req_64(source, dest, a0, a1, a2,
+ a3, a4, &msg));
}
-TEST(mock_ffa_api, ffa_msg_send_direct_resp)
+TEST(mock_ffa_api, ffa_msg_send_direct_resp_32)
{
const uint16_t source = 0x1122;
const uint16_t dest = 0x2233;
@@ -133,10 +150,27 @@ TEST(mock_ffa_api, ffa_msg_send_direct_resp)
const uint32_t a4 = 0x89124567;
struct ffa_direct_msg msg = { 0 };
- expect_ffa_msg_send_direct_resp(source, dest, a0, a1, a2, a3, a4,
+ expect_ffa_msg_send_direct_resp_32(source, dest, a0, a1, a2, a3, a4,
&expected_msg, result);
- LONGS_EQUAL(result, ffa_msg_send_direct_resp(source, dest, a0, a1, a2,
- a3, a4, &msg));
+ LONGS_EQUAL(result, ffa_msg_send_direct_resp_32(source, dest, a0, a1,
+ a2, a3, a4, &msg));
+}
+
+TEST(mock_ffa_api, ffa_msg_send_direct_resp_64)
+{
+ const uint16_t source = 0x1122;
+ const uint16_t dest = 0x2233;
+ const uint64_t a0 = 0x4567891221987654;
+ const uint64_t a1 = 0x5678912442198765;
+ const uint64_t a2 = 0x6789124554219876;
+ const uint64_t a3 = 0x7891245665421987;
+ const uint64_t a4 = 0x8912456776542198;
+ struct ffa_direct_msg msg = { 0 };
+
+ expect_ffa_msg_send_direct_resp_64(source, dest, a0, a1, a2, a3, a4,
+ &expected_msg, result);
+ LONGS_EQUAL(result, ffa_msg_send_direct_resp_64(source, dest, a0, a1,
+ a2, a3, a4, &msg));
}
TEST(mock_ffa_api, ffa_mem_donate)
diff --git a/components/messaging/ffa/libsp/sp_messaging.c b/components/messaging/ffa/libsp/sp_messaging.c
index f7223aa..392006b 100644
--- a/components/messaging/ffa/libsp/sp_messaging.c
+++ b/components/messaging/ffa/libsp/sp_messaging.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
*/
#include "ffa_api.h"
@@ -20,22 +20,40 @@ static void pack_ffa_direct_msg(const struct sp_msg *msg,
ffa_msg->source_id = msg->source_id;
ffa_msg->destination_id = msg->destination_id;
- ffa_msg->args[0] = 0;
- memcpy(&ffa_msg->args[SP_MSG_ARG_OFFSET], msg->args, sizeof(msg->args));
+ ffa_msg->args.args64[0] = 0;
+ if (msg->is_64bit_message)
+ memcpy(&ffa_msg->args.args64[SP_MSG_ARG_OFFSET],
+ msg->args.args64, sizeof(msg->args.args64));
+ else
+ memcpy(&ffa_msg->args.args32[SP_MSG_ARG_OFFSET],
+ msg->args.args32, sizeof(msg->args.args32));
}
static void unpack_ffa_direct_msg(const struct ffa_direct_msg *ffa_msg,
struct sp_msg *msg)
{
- if (ffa_msg->function_id != FFA_SUCCESS_32) {
+ if (ffa_msg->function_id == FFA_MSG_SEND_DIRECT_REQ_32 ||
+ ffa_msg->function_id == FFA_MSG_SEND_DIRECT_RESP_32) {
/*
- * Handling request or response (error is handled before call)
+ * Handling 32 bit request or response
*/
msg->source_id = ffa_msg->source_id;
msg->destination_id = ffa_msg->destination_id;
+ msg->is_64bit_message = FFA_IS_64_BIT_FUNC(ffa_msg->function_id);
- memcpy(msg->args, &ffa_msg->args[SP_MSG_ARG_OFFSET],
- sizeof(msg->args));
+ memcpy(msg->args.args32, &ffa_msg->args.args32[SP_MSG_ARG_OFFSET],
+ sizeof(msg->args.args32));
+ } else if (ffa_msg->function_id == FFA_MSG_SEND_DIRECT_REQ_64 ||
+ ffa_msg->function_id == FFA_MSG_SEND_DIRECT_RESP_64) {
+ /*
+ * Handling 64 bit request or response
+ */
+ msg->source_id = ffa_msg->source_id;
+ msg->destination_id = ffa_msg->destination_id;
+ msg->is_64bit_message = FFA_IS_64_BIT_FUNC(ffa_msg->function_id);
+
+ memcpy(msg->args.args64, &ffa_msg->args.args64[SP_MSG_ARG_OFFSET],
+ sizeof(msg->args.args64));
} else {
/* Success has no message parameters */
*msg = (struct sp_msg){ 0 };
@@ -89,11 +107,18 @@ sp_result sp_msg_send_direct_req(const struct sp_msg *req, struct sp_msg *resp)
ffa_direct_msg_routing_ext_req_pre_hook(&ffa_req);
#endif
- ffa_res = ffa_msg_send_direct_req(ffa_req.source_id,
- ffa_req.destination_id,
- ffa_req.args[0], ffa_req.args[1],
- ffa_req.args[2], ffa_req.args[3],
- ffa_req.args[4], &ffa_resp);
+ if (req->is_64bit_message)
+ ffa_res = ffa_msg_send_direct_req_64(
+ ffa_req.source_id, ffa_req.destination_id,
+ ffa_req.args.args64[0], ffa_req.args.args64[1],
+ ffa_req.args.args64[2], ffa_req.args.args64[3],
+ ffa_req.args.args64[4], &ffa_resp);
+ else
+ ffa_res = ffa_msg_send_direct_req_32(
+ ffa_req.source_id, ffa_req.destination_id,
+ ffa_req.args.args32[0], ffa_req.args.args32[1],
+ ffa_req.args.args32[2], ffa_req.args.args32[3],
+ ffa_req.args.args32[4], &ffa_resp);
if (ffa_res != FFA_OK) {
#if FFA_DIRECT_MSG_ROUTING_EXTENSION
@@ -136,11 +161,18 @@ sp_result sp_msg_send_direct_resp(const struct sp_msg *resp, struct sp_msg *req)
ffa_direct_msg_routing_ext_resp_pre_hook(&ffa_resp);
#endif
- ffa_res = ffa_msg_send_direct_resp(ffa_resp.source_id,
- ffa_resp.destination_id,
- ffa_resp.args[0], ffa_resp.args[1],
- ffa_resp.args[2], ffa_resp.args[3],
- ffa_resp.args[4], &ffa_req);
+ if (resp->is_64bit_message)
+ ffa_res = ffa_msg_send_direct_resp_64(
+ ffa_resp.source_id, ffa_resp.destination_id,
+ ffa_resp.args.args64[0], ffa_resp.args.args64[1],
+ ffa_resp.args.args64[2], ffa_resp.args.args64[3],
+ ffa_resp.args.args64[4], &ffa_req);
+ else
+ ffa_res = ffa_msg_send_direct_resp_32(
+ ffa_resp.source_id, ffa_resp.destination_id,
+ ffa_resp.args.args32[0], ffa_resp.args.args32[1],
+ ffa_resp.args.args32[2], ffa_resp.args.args32[3],
+ ffa_resp.args.args32[4], &ffa_req);
if (ffa_res != FFA_OK) {
#if FFA_DIRECT_MSG_ROUTING_EXTENSION
@@ -182,11 +214,11 @@ sp_result sp_msg_send_rc_req(const struct sp_msg *req, struct sp_msg *resp)
ffa_direct_msg_routing_ext_rc_req_pre_hook(&ffa_req);
- ffa_res = ffa_msg_send_direct_resp(ffa_req.source_id,
+ ffa_res = ffa_msg_send_direct_resp_32(ffa_req.source_id,
ffa_req.destination_id,
- ffa_req.args[0], ffa_req.args[1],
- ffa_req.args[2], ffa_req.args[3],
- ffa_req.args[4], &ffa_resp);
+ ffa_req.args.args32[0], ffa_req.args.args32[1],
+ ffa_req.args.args32[2], ffa_req.args.args32[3],
+ ffa_req.args.args32[4], &ffa_resp);
if (ffa_res != FFA_OK) {
ffa_direct_msg_routing_ext_rc_req_error_hook();
diff --git a/components/messaging/ffa/libsp/test/test_ffa_api.cpp b/components/messaging/ffa/libsp/test/test_ffa_api.cpp
index 8fa261e..6cca085 100644
--- a/components/messaging/ffa/libsp/test/test_ffa_api.cpp
+++ b/components/messaging/ffa/libsp/test/test_ffa_api.cpp
@@ -43,20 +43,35 @@ TEST_GROUP(ffa_api)
svc_result.a2 = (uint32_t)error_code;
}
- void msg_equal(uint32_t func_id, uint16_t source_id, uint16_t dest_id,
- uint32_t arg0, uint32_t arg1, uint32_t arg2,
- uint32_t arg3, uint32_t arg4)
+ void msg_equal_32(uint32_t func_id, uint16_t source_id, uint16_t dest_id,
+ uint32_t arg0, uint32_t arg1, uint32_t arg2,
+ uint32_t arg3, uint32_t arg4)
{
UNSIGNED_LONGS_EQUAL(func_id, msg.function_id);
UNSIGNED_LONGS_EQUAL(source_id, msg.source_id);
UNSIGNED_LONGS_EQUAL(dest_id, msg.destination_id);
- UNSIGNED_LONGS_EQUAL(arg0, msg.args[0]);
- UNSIGNED_LONGS_EQUAL(arg1, msg.args[1]);
- UNSIGNED_LONGS_EQUAL(arg2, msg.args[2]);
- UNSIGNED_LONGS_EQUAL(arg3, msg.args[3]);
- UNSIGNED_LONGS_EQUAL(arg4, msg.args[4]);
+ UNSIGNED_LONGS_EQUAL(arg0, msg.args.args32[0]);
+ UNSIGNED_LONGS_EQUAL(arg1, msg.args.args32[1]);
+ UNSIGNED_LONGS_EQUAL(arg2, msg.args.args32[2]);
+ UNSIGNED_LONGS_EQUAL(arg3, msg.args.args32[3]);
+ UNSIGNED_LONGS_EQUAL(arg4, msg.args.args32[4]);
}
+ void msg_equal_64(uint32_t func_id, uint16_t source_id, uint16_t dest_id,
+ uint64_t arg0, uint64_t arg1, uint64_t arg2,
+ uint64_t arg3, uint64_t arg4)
+ {
+ UNSIGNED_LONGS_EQUAL(func_id, msg.function_id);
+ UNSIGNED_LONGS_EQUAL(source_id, msg.source_id);
+ UNSIGNED_LONGS_EQUAL(dest_id, msg.destination_id);
+ UNSIGNED_LONGLONGS_EQUAL(arg0, msg.args.args64[0]);
+ UNSIGNED_LONGLONGS_EQUAL(arg1, msg.args.args64[1]);
+ UNSIGNED_LONGLONGS_EQUAL(arg2, msg.args.args64[2]);
+ UNSIGNED_LONGLONGS_EQUAL(arg3, msg.args.args64[3]);
+ UNSIGNED_LONGLONGS_EQUAL(arg4, msg.args.args64[4]);
+ }
+
+
struct ffa_params svc_result;
struct ffa_direct_msg msg;
};
@@ -360,7 +375,7 @@ TEST(ffa_api, ffa_msg_wait_success)
expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
ffa_result result = ffa_msg_wait(&msg);
LONGS_EQUAL(0, result);
- msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
}
TEST(ffa_api, ffa_msg_wait_error)
@@ -369,10 +384,10 @@ TEST(ffa_api, ffa_msg_wait_error)
expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
ffa_result result = ffa_msg_wait(&msg);
LONGS_EQUAL(-1, result);
- msg_equal(0, 0, 0, 0, 0, 0, 0, 0);
+ msg_equal_32(0, 0, 0, 0, 0, 0, 0, 0);
}
-TEST(ffa_api, ffa_msg_wait_direct_req)
+TEST(ffa_api, ffa_msg_wait_direct_req_32)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -392,7 +407,31 @@ TEST(ffa_api, ffa_msg_wait_direct_req)
expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
ffa_result result = ffa_msg_wait(&msg);
LONGS_EQUAL(0, result);
- msg_equal(0x8400006F, source_id, dest_id, arg0, arg1, arg2, arg3,
+ msg_equal_32(0x8400006F, source_id, dest_id, arg0, arg1, arg2, arg3,
+ arg4);
+}
+
+TEST(ffa_api, ffa_msg_wait_direct_req_64)
+{
+ const uint16_t source_id = 0x1122;
+ const uint16_t dest_id = 0x3344;
+ const uint64_t arg0 = 0x0123456776543210ULL;
+ const uint64_t arg1 = 0x1234567887654321ULL;
+ const uint64_t arg2 = 0x2345678998765432ULL;
+ const uint64_t arg3 = 0x3456789aa9876543ULL;
+ const uint64_t arg4 = 0x456789abba987654ULL;
+
+ svc_result.a0 = 0xC400006F;
+ svc_result.a1 = ((uint32_t)source_id) << 16 | dest_id;
+ svc_result.a3 = arg0;
+ svc_result.a4 = arg1;
+ svc_result.a5 = arg2;
+ svc_result.a6 = arg3;
+ svc_result.a7 = arg4;
+ expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
+ ffa_result result = ffa_msg_wait(&msg);
+ LONGS_EQUAL(0, result);
+ msg_equal_64(0xC400006F, source_id, dest_id, arg0, arg1, arg2, arg3,
arg4);
}
@@ -410,7 +449,7 @@ TEST(ffa_api, ffa_msg_wait_one_interrupt_success)
expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
ffa_result result = ffa_msg_wait(&msg);
LONGS_EQUAL(0, result);
- msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
}
TEST(ffa_api, ffa_msg_wait_two_interrupt_success)
@@ -434,7 +473,7 @@ TEST(ffa_api, ffa_msg_wait_two_interrupt_success)
expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
ffa_result result = ffa_msg_wait(&msg);
LONGS_EQUAL(0, result);
- msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
}
TEST(ffa_api, ffa_msg_wait_unknown_response)
@@ -448,7 +487,7 @@ TEST(ffa_api, ffa_msg_wait_unknown_response)
}
}
-TEST(ffa_api, ffa_msg_send_direct_req_success)
+TEST(ffa_api, ffa_msg_send_direct_req_32_success)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -461,13 +500,13 @@ TEST(ffa_api, ffa_msg_send_direct_req_success)
svc_result.a0 = 0x84000061;
expect_ffa_svc(0x8400006F, ((uint32_t)source_id << 16) | dest_id, 0,
arg0, arg1, arg2, arg3, arg4, &svc_result);
- ffa_result result = ffa_msg_send_direct_req(
+ ffa_result result = ffa_msg_send_direct_req_32(
source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
LONGS_EQUAL(0, result);
- msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
}
-TEST(ffa_api, ffa_msg_send_direct_req_error)
+TEST(ffa_api, ffa_msg_send_direct_req_32_error)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -480,13 +519,48 @@ TEST(ffa_api, ffa_msg_send_direct_req_error)
setup_error_response(-1);
expect_ffa_svc(0x8400006F, ((uint32_t)source_id << 16) | dest_id, 0,
arg0, arg1, arg2, arg3, arg4, &svc_result);
- ffa_result result = ffa_msg_send_direct_req(
+ ffa_result result = ffa_msg_send_direct_req_32(
source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
LONGS_EQUAL(-1, result);
- msg_equal(0, 0, 0, 0, 0, 0, 0, 0);
+ msg_equal_32(0, 0, 0, 0, 0, 0, 0, 0);
+}
+
+TEST(ffa_api, ffa_msg_send_direct_req_32_get_resp_64)
+{
+ const uint16_t source_id = 0x1122;
+ const uint16_t dest_id = 0x3344;
+ const uint32_t arg0 = 0x01234567ULL;
+ const uint32_t arg1 = 0x12345678ULL;
+ const uint32_t arg2 = 0x23456789ULL;
+ const uint32_t arg3 = 0x3456789aULL;
+ const uint32_t arg4 = 0x456789abULL;
+ const uint16_t resp_source_id = 0x1221;
+ const uint16_t resp_dest_id = 0x3443;
+ const uint64_t resp_arg0 = 0x9012345665432109ULL;
+ const uint64_t resp_arg1 = 0xa12345677654321aULL;
+ const uint64_t resp_arg2 = 0xb23456788765432bULL;
+ const uint64_t resp_arg3 = 0xc34567899876543cULL;
+ const uint64_t resp_arg4 = 0xd456789aa987654dULL;
+ assert_environment_t assert_env;
+
+ svc_result.a0 = 0xC4000070;
+ svc_result.a1 = ((uint32_t)resp_source_id) << 16 | resp_dest_id;
+ svc_result.a3 = resp_arg0;
+ svc_result.a4 = resp_arg1;
+ svc_result.a5 = resp_arg2;
+ svc_result.a6 = resp_arg3;
+ svc_result.a7 = resp_arg4;
+
+ expect_ffa_svc(0x8400006F, ((uint32_t)source_id << 16) | dest_id, 0,
+ arg0, arg1, arg2, arg3, arg4, &svc_result);
+
+ if (SETUP_ASSERT_ENVIRONMENT(assert_env)) {
+ ffa_msg_send_direct_req_32(source_id, dest_id, arg0, arg1, arg2,
+ arg3, arg4, &msg);
+ }
}
-TEST(ffa_api, ffa_msg_send_direct_req_direct_resp)
+TEST(ffa_api, ffa_msg_send_direct_req_32_direct_resp)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -512,14 +586,82 @@ TEST(ffa_api, ffa_msg_send_direct_req_direct_resp)
svc_result.a7 = resp_arg4;
expect_ffa_svc(0x8400006F, ((uint32_t)source_id << 16) | dest_id, 0,
arg0, arg1, arg2, arg3, arg4, &svc_result);
- ffa_result result = ffa_msg_send_direct_req(
+ ffa_result result = ffa_msg_send_direct_req_32(
+ source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ LONGS_EQUAL(0, result);
+ msg_equal_32(0x84000070, resp_source_id, resp_dest_id, resp_arg0,
+ resp_arg1, resp_arg2, resp_arg3, resp_arg4);
+}
+
+TEST(ffa_api, ffa_msg_send_direct_req_64_success)
+{
+ const uint16_t source_id = 0x1122;
+ const uint16_t dest_id = 0x3344;
+ const uint64_t arg0 = 0x0123456776543210ULL;
+ const uint64_t arg1 = 0x1234567887654321ULL;
+ const uint64_t arg2 = 0x2345678998765432ULL;
+ const uint64_t arg3 = 0x3456789aa9876543ULL;
+ const uint64_t arg4 = 0x456789abba987654ULL;
+ const uint16_t resp_source_id = 0x1221;
+ const uint16_t resp_dest_id = 0x3443;
+ const uint64_t resp_arg0 = 0x9012345665432109ULL;
+ const uint64_t resp_arg1 = 0xa12345677654321aULL;
+ const uint64_t resp_arg2 = 0xb23456788765432bULL;
+ const uint64_t resp_arg3 = 0xc34567899876543cULL;
+ const uint64_t resp_arg4 = 0xd456789aa987654dULL;
+
+ svc_result.a0 = 0xC4000070;
+ svc_result.a1 = ((uint32_t)resp_source_id) << 16 | resp_dest_id;
+ svc_result.a3 = resp_arg0;
+ svc_result.a4 = resp_arg1;
+ svc_result.a5 = resp_arg2;
+ svc_result.a6 = resp_arg3;
+ svc_result.a7 = resp_arg4;
+ expect_ffa_svc(0xC400006F, ((uint32_t)source_id << 16) | dest_id, 0,
+ arg0, arg1, arg2, arg3, arg4, &svc_result);
+ ffa_result result = ffa_msg_send_direct_req_64(
source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
LONGS_EQUAL(0, result);
- msg_equal(0x84000070, resp_source_id, resp_dest_id, resp_arg0,
+ msg_equal_64(0xC4000070, resp_source_id, resp_dest_id, resp_arg0,
resp_arg1, resp_arg2, resp_arg3, resp_arg4);
}
-TEST(ffa_api, ffa_msg_send_direct_req_one_interrupt_success)
+TEST(ffa_api, ffa_msg_send_direct_req_64_get_resp_32)
+{
+ const uint16_t source_id = 0x1122;
+ const uint16_t dest_id = 0x3344;
+ const uint64_t arg0 = 0x9012345665432109ULL;
+ const uint64_t arg1 = 0xa12345677654321aULL;
+ const uint64_t arg2 = 0xb23456788765432bULL;
+ const uint64_t arg3 = 0xc34567899876543cULL;
+ const uint64_t arg4 = 0xd456789aa987654dULL;
+ const uint16_t resp_source_id = 0x1221;
+ const uint16_t resp_dest_id = 0x3443;
+ const uint32_t resp_arg0 = 0x01234567ULL;
+ const uint32_t resp_arg1 = 0x12345678ULL;
+ const uint32_t resp_arg2 = 0x23456789ULL;
+ const uint32_t resp_arg3 = 0x3456789aULL;
+ const uint32_t resp_arg4 = 0x456789abULL;
+ assert_environment_t assert_env;
+
+ svc_result.a0 = 0x84000070;
+ svc_result.a1 = ((uint32_t)resp_source_id) << 16 | resp_dest_id;
+ svc_result.a3 = resp_arg0;
+ svc_result.a4 = resp_arg1;
+ svc_result.a5 = resp_arg2;
+ svc_result.a6 = resp_arg3;
+ svc_result.a7 = resp_arg4;
+
+ expect_ffa_svc(0xC400006F, ((uint32_t)source_id << 16) | dest_id, 0,
+ arg0, arg1, arg2, arg3, arg4, &svc_result);
+
+ if (SETUP_ASSERT_ENVIRONMENT(assert_env)) {
+ ffa_msg_send_direct_req_64(source_id, dest_id, arg0, arg1, arg2,
+ arg3, arg4, &msg);
+ }
+}
+
+TEST(ffa_api, ffa_msg_send_direct_req_32_one_interrupt_success)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -539,13 +681,13 @@ TEST(ffa_api, ffa_msg_send_direct_req_one_interrupt_success)
svc_result.a0 = 0x84000061;
expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
- ffa_result result = ffa_msg_send_direct_req(
+ ffa_result result = ffa_msg_send_direct_req_32(
source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
LONGS_EQUAL(0, result);
- msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
}
-TEST(ffa_api, ffa_msg_send_direct_req_two_interrupt_success)
+TEST(ffa_api, ffa_msg_send_direct_req_32_two_interrupt_success)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -573,13 +715,13 @@ TEST(ffa_api, ffa_msg_send_direct_req_two_interrupt_success)
svc_result.a0 = 0x84000061;
expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
- ffa_result result = ffa_msg_send_direct_req(
+ ffa_result result = ffa_msg_send_direct_req_32(
source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
LONGS_EQUAL(0, result);
- msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
}
-TEST(ffa_api, ffa_msg_send_direct_req_unknown_response)
+TEST(ffa_api, ffa_msg_send_direct_req_32_unknown_response)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -594,12 +736,12 @@ TEST(ffa_api, ffa_msg_send_direct_req_unknown_response)
expect_ffa_svc(0x8400006F, ((uint32_t)source_id << 16) | dest_id, 0,
arg0, arg1, arg2, arg3, arg4, &svc_result);
if (SETUP_ASSERT_ENVIRONMENT(assert_env)) {
- ffa_msg_send_direct_req(source_id, dest_id, arg0, arg1, arg2,
+ ffa_msg_send_direct_req_32(source_id, dest_id, arg0, arg1, arg2,
arg3, arg4, &msg);
}
}
-TEST(ffa_api, ffa_msg_send_direct_resp_success)
+TEST(ffa_api, ffa_msg_send_direct_resp_32_success)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -612,13 +754,13 @@ TEST(ffa_api, ffa_msg_send_direct_resp_success)
svc_result.a0 = 0x84000061;
expect_ffa_svc(0x84000070, ((uint32_t)source_id << 16) | dest_id, 0,
arg0, arg1, arg2, arg3, arg4, &svc_result);
- ffa_result result = ffa_msg_send_direct_resp(
+ ffa_result result = ffa_msg_send_direct_resp_32(
source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
LONGS_EQUAL(0, result);
- msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
}
-TEST(ffa_api, ffa_msg_send_direct_resp_error)
+TEST(ffa_api, ffa_msg_send_direct_resp_32_error)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -631,13 +773,13 @@ TEST(ffa_api, ffa_msg_send_direct_resp_error)
setup_error_response(-1);
expect_ffa_svc(0x84000070, ((uint32_t)source_id << 16) | dest_id, 0,
arg0, arg1, arg2, arg3, arg4, &svc_result);
- ffa_result result = ffa_msg_send_direct_resp(
+ ffa_result result = ffa_msg_send_direct_resp_32(
source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
LONGS_EQUAL(-1, result);
- msg_equal(0, 0, 0, 0, 0, 0, 0, 0);
+ msg_equal_32(0, 0, 0, 0, 0, 0, 0, 0);
}
-TEST(ffa_api, ffa_msg_send_direct_resp_then_get_direct_req_as_response)
+TEST(ffa_api, ffa_msg_send_direct_resp_32_then_get_direct_req_32_as_response)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -663,14 +805,113 @@ TEST(ffa_api, ffa_msg_send_direct_resp_then_get_direct_req_as_response)
svc_result.a7 = resp_arg4;
expect_ffa_svc(0x84000070, ((uint32_t)source_id << 16) | dest_id, 0,
arg0, arg1, arg2, arg3, arg4, &svc_result);
- ffa_result result = ffa_msg_send_direct_resp(
+ ffa_result result = ffa_msg_send_direct_resp_32(
+ source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ LONGS_EQUAL(0, result);
+ msg_equal_32(0x8400006F, resp_source_id, resp_dest_id, resp_arg0,
+ resp_arg1, resp_arg2, resp_arg3, resp_arg4);
+}
+
+TEST(ffa_api, ffa_msg_send_direct_resp_32_then_get_direct_req_64_as_response)
+{
+ const uint16_t source_id = 0x1122;
+ const uint16_t dest_id = 0x3344;
+ const uint32_t arg0 = 0x01234567ULL;
+ const uint32_t arg1 = 0x12345678ULL;
+ const uint32_t arg2 = 0x23456789ULL;
+ const uint32_t arg3 = 0x3456789aULL;
+ const uint32_t arg4 = 0x456789abULL;
+ const uint16_t resp_source_id = 0x1221;
+ const uint16_t resp_dest_id = 0x3443;
+ const uint64_t resp_arg0 = 0x9012345665432109ULL;
+ const uint64_t resp_arg1 = 0xa12345677654321aULL;
+ const uint64_t resp_arg2 = 0xb23456788765432bULL;
+ const uint64_t resp_arg3 = 0xc34567899876543cULL;
+ const uint64_t resp_arg4 = 0xd456789aa987654dULL;
+
+ svc_result.a0 = 0xC400006F;
+ svc_result.a1 = ((uint32_t)resp_source_id) << 16 | resp_dest_id;
+ svc_result.a3 = resp_arg0;
+ svc_result.a4 = resp_arg1;
+ svc_result.a5 = resp_arg2;
+ svc_result.a6 = resp_arg3;
+ svc_result.a7 = resp_arg4;
+ expect_ffa_svc(0x84000070, ((uint32_t)source_id << 16) | dest_id, 0,
+ arg0, arg1, arg2, arg3, arg4, &svc_result);
+ ffa_result result = ffa_msg_send_direct_resp_32(
+ source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ LONGS_EQUAL(0, result);
+ msg_equal_64(0xC400006F, resp_source_id, resp_dest_id, resp_arg0,
+ resp_arg1, resp_arg2, resp_arg3, resp_arg4);
+}
+
+TEST(ffa_api, ffa_msg_send_direct_resp_64_then_get_direct_req_32_as_response)
+{
+ const uint16_t source_id = 0x1122;
+ const uint16_t dest_id = 0x3344;
+ const uint64_t arg0 = 0x9012345665432109ULL;
+ const uint64_t arg1 = 0xa12345677654321aULL;
+ const uint64_t arg2 = 0xb23456788765432bULL;
+ const uint64_t arg3 = 0xc34567899876543cULL;
+ const uint64_t arg4 = 0xd456789aa987654dULL;
+ const uint16_t resp_source_id = 0x1221;
+ const uint16_t resp_dest_id = 0x3443;
+ const uint32_t resp_arg0 = 0x01234567ULL;
+ const uint32_t resp_arg1 = 0x12345678ULL;
+ const uint32_t resp_arg2 = 0x23456789ULL;
+ const uint32_t resp_arg3 = 0x3456789aULL;
+ const uint32_t resp_arg4 = 0x456789abULL;
+
+ svc_result.a0 = 0x8400006F;
+ svc_result.a1 = ((uint32_t)resp_source_id) << 16 | resp_dest_id;
+ svc_result.a3 = resp_arg0;
+ svc_result.a4 = resp_arg1;
+ svc_result.a5 = resp_arg2;
+ svc_result.a6 = resp_arg3;
+ svc_result.a7 = resp_arg4;
+ expect_ffa_svc(0xC4000070, ((uint32_t)source_id << 16) | dest_id, 0,
+ arg0, arg1, arg2, arg3, arg4, &svc_result);
+ ffa_result result = ffa_msg_send_direct_resp_64(
+ source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
+ LONGS_EQUAL(0, result);
+ msg_equal_32(0x8400006F, resp_source_id, resp_dest_id, resp_arg0,
+ resp_arg1, resp_arg2, resp_arg3, resp_arg4);
+}
+
+TEST(ffa_api, ffa_msg_send_direct_resp_64_then_get_direct_req_64_as_response)
+{
+ const uint16_t source_id = 0x1122;
+ const uint16_t dest_id = 0x3344;
+ const uint64_t arg0 = 0x0123456776543210ULL;
+ const uint64_t arg1 = 0x1234567887654321ULL;
+ const uint64_t arg2 = 0x2345678998765432ULL;
+ const uint64_t arg3 = 0x3456789aa9876543ULL;
+ const uint64_t arg4 = 0x456789abba987654ULL;
+ const uint16_t resp_source_id = 0x1221;
+ const uint16_t resp_dest_id = 0x3443;
+ const uint64_t resp_arg0 = 0x9012345665432109ULL;
+ const uint64_t resp_arg1 = 0xa12345677654321aULL;
+ const uint64_t resp_arg2 = 0xb23456788765432bULL;
+ const uint64_t resp_arg3 = 0xc34567899876543cULL;
+ const uint64_t resp_arg4 = 0xd456789aa987654dULL;
+
+ svc_result.a0 = 0xC400006F;
+ svc_result.a1 = ((uint32_t)resp_source_id) << 16 | resp_dest_id;
+ svc_result.a3 = resp_arg0;
+ svc_result.a4 = resp_arg1;
+ svc_result.a5 = resp_arg2;
+ svc_result.a6 = resp_arg3;
+ svc_result.a7 = resp_arg4;
+ expect_ffa_svc(0xC4000070, ((uint32_t)source_id << 16) | dest_id, 0,
+ arg0, arg1, arg2, arg3, arg4, &svc_result);
+ ffa_result result = ffa_msg_send_direct_resp_64(
source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
LONGS_EQUAL(0, result);
- msg_equal(0x8400006F, resp_source_id, resp_dest_id, resp_arg0,
+ msg_equal_64(0xC400006F, resp_source_id, resp_dest_id, resp_arg0,
resp_arg1, resp_arg2, resp_arg3, resp_arg4);
}
-TEST(ffa_api, ffa_msg_send_direct_resp_one_interrupt_success)
+TEST(ffa_api, ffa_msg_send_direct_resp_32_one_interrupt_success)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -690,13 +931,13 @@ TEST(ffa_api, ffa_msg_send_direct_resp_one_interrupt_success)
svc_result.a0 = 0x84000061;
expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
- ffa_result result = ffa_msg_send_direct_resp(
+ ffa_result result = ffa_msg_send_direct_resp_32(
source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
LONGS_EQUAL(0, result);
- msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
}
-TEST(ffa_api, ffa_msg_send_direct_resp_two_interrupt_success)
+TEST(ffa_api, ffa_msg_send_direct_resp_32_two_interrupt_success)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -724,13 +965,13 @@ TEST(ffa_api, ffa_msg_send_direct_resp_two_interrupt_success)
svc_result.a0 = 0x84000061;
expect_ffa_svc(0x8400006B, 0, 0, 0, 0, 0, 0, 0, &svc_result);
- ffa_result result = ffa_msg_send_direct_resp(
+ ffa_result result = ffa_msg_send_direct_resp_32(
source_id, dest_id, arg0, arg1, arg2, arg3, arg4, &msg);
LONGS_EQUAL(0, result);
- msg_equal(0x84000061, 0, 0, 0, 0, 0, 0, 0);
+ msg_equal_32(0x84000061, 0, 0, 0, 0, 0, 0, 0);
}
-TEST(ffa_api, ffa_msg_send_direct_resp_unknown_response)
+TEST(ffa_api, ffa_msg_send_direct_resp_32_unknown_response)
{
const uint16_t source_id = 0x1122;
const uint16_t dest_id = 0x3344;
@@ -745,7 +986,7 @@ TEST(ffa_api, ffa_msg_send_direct_resp_unknown_response)
expect_ffa_svc(0x84000070, ((uint32_t)source_id << 16) | dest_id, 0,
arg0, arg1, arg2, arg3, arg4, &svc_result);
if (SETUP_ASSERT_ENVIRONMENT(assert_env)) {
- ffa_msg_send_direct_resp(source_id, dest_id, arg0, arg1, arg2,
+ ffa_msg_send_direct_resp_32(source_id, dest_id, arg0, arg1, arg2,
arg3, arg4, &msg);
}
}
diff --git a/components/messaging/ffa/libsp/test/test_sp_messaging.cpp b/components/messaging/ffa/libsp/test/test_sp_messaging.cpp
index 78bf8bf..786f66e 100644
--- a/components/messaging/ffa/libsp/test/test_sp_messaging.cpp
+++ b/components/messaging/ffa/libsp/test/test_sp_messaging.cpp
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
- * Copyright (c) 2021, Arm Limited. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited. All rights reserved.
*/
#include <CppUTest/TestHarness.h>
@@ -32,7 +32,7 @@ TEST_GROUP(sp_messaging)
mock().clear();
}
- void copy_sp_to_ffa_args(const uint32_t sp_args[], uint32_t ffa_args[])
+ void copy_sp_to_ffa_args_32(const uint32_t sp_args[], uint32_t ffa_args[])
{
int i = 0;
@@ -41,7 +41,16 @@ TEST_GROUP(sp_messaging)
}
}
- void fill_ffa_msg(struct ffa_direct_msg * msg)
+ void copy_sp_to_ffa_args_64(const uint64_t sp_args[], uint64_t ffa_args[])
+ {
+ int i = 0;
+
+ for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
+ ffa_args[i + SP_MSG_ARG_OFFSET] = sp_args[i];
+ }
+ }
+
+ void fill_ffa_msg_32(struct ffa_direct_msg * msg)
{
int i = 0;
@@ -49,20 +58,47 @@ TEST_GROUP(sp_messaging)
msg->source_id = source_id;
msg->destination_id = dest_id;
- msg->args[0] = 0;
+ msg->args.args32[0] = 0;
for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
- msg->args[i + SP_MSG_ARG_OFFSET] = args[i];
+ msg->args.args32[i + SP_MSG_ARG_OFFSET] = args32[i];
}
}
- void fill_sp_msg(struct sp_msg * msg)
+ void fill_ffa_msg_64(struct ffa_direct_msg * msg)
{
int i = 0;
+ msg->function_id = FFA_MSG_SEND_DIRECT_REQ_64;
msg->source_id = source_id;
msg->destination_id = dest_id;
+
+ msg->args.args64[0] = 0;
for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
- msg->args[i] = args[i + SP_MSG_ARG_OFFSET];
+ msg->args.args64[i + SP_MSG_ARG_OFFSET] = args64[i];
+ }
+ }
+
+ void fill_sp_msg_32(struct sp_msg * msg)
+ {
+ int i = 0;
+
+ msg->source_id = source_id;
+ msg->destination_id = dest_id;
+ msg->is_64bit_message = false;
+ for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
+ msg->args.args32[i] = args32[i + SP_MSG_ARG_OFFSET];
+ }
+ }
+
+ void fill_sp_msg_64(struct sp_msg * msg)
+ {
+ int i = 0;
+
+ msg->source_id = source_id;
+ msg->destination_id = dest_id;
+ msg->is_64bit_message = true;
+ for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
+ msg->args.args64[i] = args64[i + SP_MSG_ARG_OFFSET];
}
}
@@ -74,10 +110,19 @@ TEST_GROUP(sp_messaging)
UNSIGNED_LONGS_EQUAL(ffa_msg->source_id, sp_msg->source_id);
UNSIGNED_LONGS_EQUAL(ffa_msg->destination_id,
sp_msg->destination_id);
- for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
- UNSIGNED_LONGS_EQUAL(
- ffa_msg->args[i + SP_MSG_ARG_OFFSET],
- sp_msg->args[i]);
+ CHECK_EQUAL(FFA_IS_64_BIT_FUNC(ffa_msg->function_id), sp_msg->is_64bit_message);
+ if (sp_msg->is_64bit_message) {
+ for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
+ UNSIGNED_LONGS_EQUAL(
+ ffa_msg->args.args64[i + SP_MSG_ARG_OFFSET],
+ sp_msg->args.args64[i]);
+ }
+ } else {
+ for (i = 0; i < SP_MSG_ARG_COUNT; i++) {
+ UNSIGNED_LONGS_EQUAL(
+ ffa_msg->args.args32[i + SP_MSG_ARG_OFFSET],
+ sp_msg->args.args32[i]);
+ }
}
}
@@ -87,7 +132,7 @@ TEST_GROUP(sp_messaging)
struct ffa_direct_msg expected_ffa_req = { 0 };
struct sp_msg req = { 0 };
- fill_ffa_msg(&expected_ffa_req);
+ fill_ffa_msg_32(&expected_ffa_req);
expected_ffa_req.source_id = source_id;
expected_ffa_req.destination_id = dest_id;
expect_ffa_msg_wait(&expected_ffa_req, FFA_OK);
@@ -103,8 +148,10 @@ TEST_GROUP(sp_messaging)
const uint16_t source_id = 0x1234;
const uint16_t dest_id = 0x5678;
- const uint32_t args[SP_MSG_ARG_COUNT] = { 0x01234567, 0x12345678,
- 0x23456789, 0x3456789a };
+ const uint32_t args32[SP_MSG_ARG_COUNT] = { 0x01234567, 0x12345678,
+ 0x23456789, 0x3456789a };
+ const uint64_t args64[SP_MSG_ARG_COUNT] = { 0x0123456776543210, 0x1234567887654321,
+ 0x2345678998765432, 0x3456789aa9876543 };
const sp_result result = -1;
const sp_msg empty_sp_msg = (const sp_msg){ 0 };
};
@@ -126,7 +173,7 @@ TEST(sp_messaging, sp_msg_wait_ffa_error)
TEST(sp_messaging, sp_msg_wait)
{
- fill_ffa_msg(&ffa_msg);
+ fill_ffa_msg_32(&ffa_msg);
expect_ffa_msg_wait(&ffa_msg, FFA_OK);
LONGS_EQUAL(SP_RESULT_OK, sp_msg_wait(&req));
@@ -139,12 +186,12 @@ TEST(sp_messaging, sp_msg_wait_deny_rc_failure)
struct ffa_direct_msg rc_msg = { 0 };
ffa_result result = FFA_ABORTED;
- fill_ffa_msg(&rc_msg);
- rc_msg.args[0] = ROUTING_EXT_RC_BIT;
+ fill_ffa_msg_32(&rc_msg);
+ rc_msg.args.args32[0] = ROUTING_EXT_RC_BIT;
expect_ffa_msg_wait(&rc_msg, FFA_OK);
- fill_ffa_msg(&ffa_msg);
- expect_ffa_msg_send_direct_resp(
+ fill_ffa_msg_32(&ffa_msg);
+ expect_ffa_msg_send_direct_resp_32(
rc_msg.destination_id, rc_msg.source_id,
ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
SP_RESULT_FFA(FFA_DENIED), 0, 0, 0, &ffa_msg, result);
@@ -157,12 +204,12 @@ TEST(sp_messaging, sp_msg_wait_deny_rc)
{
struct ffa_direct_msg rc_msg = { 0 };
- fill_ffa_msg(&rc_msg);
- rc_msg.args[0] = ROUTING_EXT_RC_BIT;
+ fill_ffa_msg_32(&rc_msg);
+ rc_msg.args.args32[0] = ROUTING_EXT_RC_BIT;
expect_ffa_msg_wait(&rc_msg, FFA_OK);
- fill_ffa_msg(&ffa_msg);
- expect_ffa_msg_send_direct_resp(
+ fill_ffa_msg_32(&ffa_msg);
+ expect_ffa_msg_send_direct_resp_32(
rc_msg.destination_id, rc_msg.source_id,
ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
SP_RESULT_FFA(FFA_DENIED), 0, 0, 0, &ffa_msg, FFA_OK);
@@ -191,10 +238,10 @@ TEST(sp_messaging, sp_msg_send_direct_req_ffa_error)
ffa_result result = FFA_ABORTED;
uint32_t expected_ffa_args[5] = { 0 };
- fill_sp_msg(&req);
+ fill_sp_msg_32(&req);
memset(&resp, 0x5a, sizeof(resp));
- copy_sp_to_ffa_args(req.args, expected_ffa_args);
- expect_ffa_msg_send_direct_req(
+ copy_sp_to_ffa_args_32(req.args.args32, expected_ffa_args);
+ expect_ffa_msg_send_direct_req_32(
req.source_id, req.destination_id, expected_ffa_args[0],
expected_ffa_args[1], expected_ffa_args[2],
expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, result);
@@ -203,14 +250,30 @@ TEST(sp_messaging, sp_msg_send_direct_req_ffa_error)
MEMCMP_EQUAL(&empty_sp_msg, &resp, sizeof(empty_sp_msg));
}
-TEST(sp_messaging, sp_msg_send_direct_req_msg)
+TEST(sp_messaging, sp_msg_send_direct_req_msg_32)
{
uint32_t expected_ffa_args[5] = { 0 };
- fill_sp_msg(&req);
- fill_ffa_msg(&ffa_msg);
- copy_sp_to_ffa_args(req.args, expected_ffa_args);
- expect_ffa_msg_send_direct_req(
+ fill_sp_msg_32(&req);
+ fill_ffa_msg_32(&ffa_msg);
+ copy_sp_to_ffa_args_32(req.args.args32, expected_ffa_args);
+ expect_ffa_msg_send_direct_req_32(
+ req.source_id, req.destination_id, expected_ffa_args[0],
+ expected_ffa_args[1], expected_ffa_args[2],
+ expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, FFA_OK);
+
+ LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_direct_req(&req, &resp));
+ ffa_and_sp_msg_equal(&ffa_msg, &resp);
+}
+
+TEST(sp_messaging, sp_msg_send_direct_req_msg_64)
+{
+ uint64_t expected_ffa_args[5] = { 0 };
+
+ fill_sp_msg_64(&req);
+ fill_ffa_msg_64(&ffa_msg);
+ copy_sp_to_ffa_args_64(req.args.args64, expected_ffa_args);
+ expect_ffa_msg_send_direct_req_64(
req.source_id, req.destination_id, expected_ffa_args[0],
expected_ffa_args[1], expected_ffa_args[2],
expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, FFA_OK);
@@ -223,10 +286,10 @@ TEST(sp_messaging, sp_msg_send_direct_req_success)
{
uint32_t expected_ffa_args[5] = { 0 };
- fill_sp_msg(&req);
+ fill_sp_msg_32(&req);
ffa_msg.function_id = FFA_SUCCESS_32;
- copy_sp_to_ffa_args(req.args, expected_ffa_args);
- expect_ffa_msg_send_direct_req(
+ copy_sp_to_ffa_args_32(req.args.args32, expected_ffa_args);
+ expect_ffa_msg_send_direct_req_32(
req.source_id, req.destination_id, expected_ffa_args[0],
expected_ffa_args[1], expected_ffa_args[2],
expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, FFA_OK);
@@ -248,54 +311,54 @@ TEST(sp_messaging, sp_msg_send_direct_req_rc_forwarding_success)
sp_msg sp_req = { 0 };
sp_msg sp_resp = { 0 };
- fill_sp_msg(&sp_req);
+ fill_sp_msg_32(&sp_req);
sp_req.source_id = own_id;
sp_req.destination_id = rc_root_id;
req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
req.source_id = own_id;
req.destination_id = rc_root_id;
- copy_sp_to_ffa_args(sp_req.args, req.args);
+ copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
- fill_ffa_msg(&rc_req);
+ fill_ffa_msg_32(&rc_req);
rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
rc_req.source_id = rc_root_id;
rc_req.destination_id = own_id;
- rc_req.args[0] = ROUTING_EXT_RC_BIT;
+ rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_ffa_msg(&rc_resp);
+ fill_ffa_msg_32(&rc_resp);
rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
rc_resp.source_id = root_id;
rc_resp.destination_id = own_id;
- rc_resp.args[0] = ROUTING_EXT_RC_BIT;
+ rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_sp_msg(&sp_resp);
+ fill_sp_msg_32(&sp_resp);
sp_resp.source_id = rc_root_id;
sp_resp.destination_id = own_id;
resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
resp.source_id = rc_root_id;
resp.destination_id = own_id;
- copy_sp_to_ffa_args(sp_resp.args, resp.args);
+ copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
/* Initial request to current SP to set own_id */
wait_and_receive_request(root_id, own_id);
/* Sending request and receiving RC request from RC root */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
- req.args[2], req.args[3], req.args[4],
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
+ req.args.args32[2], req.args.args32[3], req.args.args32[4],
&rc_req, FFA_OK);
/* Forwarding RC request to root and receiving RC response */
- expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
- rc_req.args[1], rc_req.args[2],
- rc_req.args[3], rc_req.args[4],
+ expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
+ rc_req.args.args32[1], rc_req.args.args32[2],
+ rc_req.args.args32[3], rc_req.args.args32[4],
&rc_resp, FFA_OK);
/* Fowarding RC response to RC root and receiving response */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, rc_resp.args[0],
- rc_resp.args[1], rc_resp.args[2],
- rc_resp.args[3], rc_resp.args[4], &resp,
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, rc_resp.args.args32[0],
+ rc_resp.args.args32[1], rc_resp.args.args32[2],
+ rc_resp.args.args32[3], rc_resp.args.args32[4], &resp,
FFA_OK);
LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_direct_req(&sp_req, &sp_resp));
@@ -312,28 +375,28 @@ TEST(sp_messaging, sp_msg_send_direct_req_rc_error)
sp_msg sp_req = { 0 };
sp_msg sp_resp = { 0 };
- fill_sp_msg(&sp_req);
+ fill_sp_msg_32(&sp_req);
sp_req.source_id = own_id;
sp_req.destination_id = rc_root_id;
req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
req.source_id = own_id;
req.destination_id = rc_root_id;
- copy_sp_to_ffa_args(sp_req.args, req.args);
+ copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
- fill_ffa_msg(&rc_err);
+ fill_ffa_msg_32(&rc_err);
rc_err.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
rc_err.source_id = rc_root_id;
rc_err.destination_id = own_id;
- rc_err.args[0] = ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT;
- rc_err.args[1] = result;
+ rc_err.args.args32[0] = ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT;
+ rc_err.args.args32[1] = result;
/* Initial request to current SP to set own_id */
wait_and_receive_request(root_id, own_id);
/* Sending request and receiving RC request from RC root */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
- req.args[2], req.args[3], req.args[4],
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
+ req.args.args32[2], req.args.args32[3], req.args.args32[4],
&rc_err, FFA_OK);
LONGS_EQUAL(SP_RESULT_FFA(result),
@@ -354,64 +417,64 @@ TEST(sp_messaging, sp_msg_send_direct_req_rc_forwarding_success_deny_request)
sp_msg sp_req = { 0 };
sp_msg sp_resp = { 0 };
- fill_sp_msg(&sp_req);
+ fill_sp_msg_32(&sp_req);
sp_req.source_id = own_id;
sp_req.destination_id = rc_root_id;
req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
req.source_id = own_id;
req.destination_id = rc_root_id;
- copy_sp_to_ffa_args(sp_req.args, req.args);
+ copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
- fill_ffa_msg(&rc_req);
+ fill_ffa_msg_32(&rc_req);
rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
rc_req.source_id = rc_root_id;
rc_req.destination_id = own_id;
- rc_req.args[0] = ROUTING_EXT_RC_BIT;
+ rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
request_to_deny.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
request_to_deny.source_id = root_id;
request_to_deny.destination_id = own_id;
- request_to_deny.args[0] = 0;
+ request_to_deny.args.args32[0] = 0;
- fill_ffa_msg(&rc_resp);
+ fill_ffa_msg_32(&rc_resp);
rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
rc_resp.source_id = root_id;
rc_resp.destination_id = own_id;
- rc_resp.args[0] = ROUTING_EXT_RC_BIT;
+ rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_sp_msg(&sp_resp);
+ fill_sp_msg_32(&sp_resp);
sp_resp.source_id = rc_root_id;
sp_resp.destination_id = own_id;
resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
resp.source_id = rc_root_id;
resp.destination_id = own_id;
- copy_sp_to_ffa_args(sp_resp.args, resp.args);
+ copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
/* Initial request to current SP to set own_id */
wait_and_receive_request(root_id, own_id);
/* Sending request and receiving RC request from RC root */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
- req.args[2], req.args[3], req.args[4],
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
+ req.args.args32[2], req.args.args32[3], req.args.args32[4],
&rc_req, FFA_OK);
/* Forwarding RC request to root and receiving a request to deny */
- expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
- rc_req.args[1], rc_req.args[2],
- rc_req.args[3], rc_req.args[4],
+ expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
+ rc_req.args.args32[1], rc_req.args.args32[2],
+ rc_req.args.args32[3], rc_req.args.args32[4],
&request_to_deny, FFA_OK);
/* Sending error to root and receiving RC response */
- expect_ffa_msg_send_direct_resp(
+ expect_ffa_msg_send_direct_resp_32(
own_id, root_id, ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
SP_RESULT_FFA(FFA_BUSY), 0, 0, 0, &rc_resp, FFA_OK);
/* Fowarding RC response to RC root and receiving response */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, rc_resp.args[0],
- rc_resp.args[1], rc_resp.args[2],
- rc_resp.args[3], rc_resp.args[4], &resp,
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, rc_resp.args.args32[0],
+ rc_resp.args.args32[1], rc_resp.args.args32[2],
+ rc_resp.args.args32[3], rc_resp.args.args32[4], &resp,
FFA_OK);
LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_direct_req(&sp_req, &sp_resp));
@@ -431,65 +494,65 @@ TEST(sp_messaging, sp_msg_send_direct_req_rc_forwarding_success_invalid_req_src)
sp_msg sp_req = { 0 };
sp_msg sp_resp = { 0 };
- fill_sp_msg(&sp_req);
+ fill_sp_msg_32(&sp_req);
sp_req.source_id = own_id;
sp_req.destination_id = rc_root_id;
req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
req.source_id = own_id;
req.destination_id = rc_root_id;
- copy_sp_to_ffa_args(sp_req.args, req.args);
+ copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
- fill_ffa_msg(&rc_req);
+ fill_ffa_msg_32(&rc_req);
rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
rc_req.source_id = rc_root_id;
rc_req.destination_id = own_id;
- rc_req.args[0] = ROUTING_EXT_RC_BIT;
+ rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
request_to_deny.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
/* This source ID should be denied in the current state. */
request_to_deny.source_id = rc_root_id;
request_to_deny.destination_id = own_id;
- request_to_deny.args[0] = ROUTING_EXT_RC_BIT;
+ request_to_deny.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_ffa_msg(&rc_resp);
+ fill_ffa_msg_32(&rc_resp);
rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
rc_resp.source_id = root_id;
rc_resp.destination_id = own_id;
- rc_resp.args[0] = ROUTING_EXT_RC_BIT;
+ rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_sp_msg(&sp_resp);
+ fill_sp_msg_32(&sp_resp);
sp_resp.source_id = rc_root_id;
sp_resp.destination_id = own_id;
resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
resp.source_id = rc_root_id;
resp.destination_id = own_id;
- copy_sp_to_ffa_args(sp_resp.args, resp.args);
+ copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
/* Initial request to current SP to set own_id */
wait_and_receive_request(root_id, own_id);
/* Sending request and receiving RC request from RC root */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
- req.args[2], req.args[3], req.args[4],
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
+ req.args.args32[2], req.args.args32[3], req.args.args32[4],
&rc_req, FFA_OK);
/* Forwarding RC request to root and receiving RC response */
- expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
- rc_req.args[1], rc_req.args[2],
- rc_req.args[3], rc_req.args[4],
+ expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
+ rc_req.args.args32[1], rc_req.args.args32[2],
+ rc_req.args.args32[3], rc_req.args.args32[4],
&request_to_deny, FFA_OK);
/* Sending error to root and receiving RC response */
- expect_ffa_msg_send_direct_resp(
+ expect_ffa_msg_send_direct_resp_32(
own_id, rc_root_id, ROUTING_EXT_ERR_BIT | ROUTING_EXT_RC_BIT,
SP_RESULT_FFA(FFA_BUSY), 0, 0, 0, &rc_resp, FFA_OK);
/* Fowarding RC response to RC root and receiving response */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, rc_resp.args[0],
- rc_resp.args[1], rc_resp.args[2],
- rc_resp.args[3], rc_resp.args[4], &resp,
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, rc_resp.args.args32[0],
+ rc_resp.args.args32[1], rc_resp.args.args32[2],
+ rc_resp.args.args32[3], rc_resp.args.args32[4], &resp,
FFA_OK);
LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_direct_req(&sp_req, &sp_resp));
@@ -509,58 +572,58 @@ TEST(sp_messaging, sp_msg_send_direct_req_deny_fail_wait_success)
sp_msg sp_req = { 0 };
sp_msg sp_resp = { 0 };
- fill_sp_msg(&sp_req);
+ fill_sp_msg_32(&sp_req);
sp_req.source_id = own_id;
sp_req.destination_id = rc_root_id;
req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
req.source_id = own_id;
req.destination_id = rc_root_id;
- copy_sp_to_ffa_args(sp_req.args, req.args);
+ copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
- fill_ffa_msg(&rc_req);
+ fill_ffa_msg_32(&rc_req);
rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
rc_req.source_id = rc_root_id;
rc_req.destination_id = own_id;
- rc_req.args[0] = ROUTING_EXT_RC_BIT;
+ rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
request_to_deny.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
/* This source ID should be denied in the current state. */
request_to_deny.source_id = rc_root_id;
request_to_deny.destination_id = own_id;
- request_to_deny.args[0] = ROUTING_EXT_RC_BIT;
+ request_to_deny.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_ffa_msg(&rc_resp);
+ fill_ffa_msg_32(&rc_resp);
rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
rc_resp.source_id = root_id;
rc_resp.destination_id = own_id;
- rc_resp.args[0] = ROUTING_EXT_RC_BIT;
+ rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_sp_msg(&sp_resp);
+ fill_sp_msg_32(&sp_resp);
sp_resp.source_id = rc_root_id;
sp_resp.destination_id = own_id;
resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
resp.source_id = rc_root_id;
resp.destination_id = own_id;
- copy_sp_to_ffa_args(sp_resp.args, resp.args);
+ copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
/* Initial request to current SP to set own_id */
wait_and_receive_request(root_id, own_id);
/* Sending request and receiving RC request from RC root */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
- req.args[2], req.args[3], req.args[4],
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
+ req.args.args32[2], req.args.args32[3], req.args.args32[4],
&rc_req, FFA_OK);
/* Forwarding RC request to root and receiving RC response */
- expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
- rc_req.args[1], rc_req.args[2],
- rc_req.args[3], rc_req.args[4],
+ expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
+ rc_req.args.args32[1], rc_req.args.args32[2],
+ rc_req.args.args32[3], rc_req.args.args32[4],
&request_to_deny, FFA_OK);
/* Sending error to root which fails */
- expect_ffa_msg_send_direct_resp(
+ expect_ffa_msg_send_direct_resp_32(
own_id, rc_root_id, (ROUTING_EXT_ERR_BIT | ROUTING_EXT_RC_BIT),
SP_RESULT_FFA(FFA_BUSY), 0, 0, 0, &rc_resp, FFA_DENIED);
@@ -568,9 +631,9 @@ TEST(sp_messaging, sp_msg_send_direct_req_deny_fail_wait_success)
expect_ffa_msg_wait(&rc_resp, FFA_OK);
/* Fowarding RC response to RC root and receiving response */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, rc_resp.args[0],
- rc_resp.args[1], rc_resp.args[2],
- rc_resp.args[3], rc_resp.args[4], &resp,
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, rc_resp.args.args32[0],
+ rc_resp.args.args32[1], rc_resp.args.args32[2],
+ rc_resp.args.args32[3], rc_resp.args.args32[4], &resp,
FFA_OK);
LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_direct_req(&sp_req, &sp_resp));
@@ -590,58 +653,58 @@ TEST(sp_messaging, sp_msg_send_direct_req_deny_fail_wait_fail_forwarding)
sp_msg sp_req = { 0 };
sp_msg sp_resp = { 0 };
- fill_sp_msg(&sp_req);
+ fill_sp_msg_32(&sp_req);
sp_req.source_id = own_id;
sp_req.destination_id = rc_root_id;
req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
req.source_id = own_id;
req.destination_id = rc_root_id;
- copy_sp_to_ffa_args(sp_req.args, req.args);
+ copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
- fill_ffa_msg(&rc_req);
+ fill_ffa_msg_32(&rc_req);
rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
rc_req.source_id = rc_root_id;
rc_req.destination_id = own_id;
- rc_req.args[0] = ROUTING_EXT_RC_BIT;
+ rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
request_to_deny.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
/* This source ID should be denied in the current state. */
request_to_deny.source_id = rc_root_id;
request_to_deny.destination_id = own_id;
- request_to_deny.args[0] = ROUTING_EXT_RC_BIT;
+ request_to_deny.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_ffa_msg(&rc_resp);
+ fill_ffa_msg_32(&rc_resp);
rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
rc_resp.source_id = root_id;
rc_resp.destination_id = own_id;
- rc_resp.args[0] = ROUTING_EXT_RC_BIT;
+ rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_sp_msg(&sp_resp);
+ fill_sp_msg_32(&sp_resp);
sp_resp.source_id = rc_root_id;
sp_resp.destination_id = own_id;
resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
resp.source_id = rc_root_id;
resp.destination_id = own_id;
- copy_sp_to_ffa_args(sp_resp.args, resp.args);
+ copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
/* Initial request to current SP to set own_id */
wait_and_receive_request(root_id, own_id);
/* Sending request and receiving RC request from RC root */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
- req.args[2], req.args[3], req.args[4],
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
+ req.args.args32[2], req.args.args32[3], req.args.args32[4],
&rc_req, FFA_OK);
/* Forwarding RC request to root and receiving RC response */
- expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
- rc_req.args[1], rc_req.args[2],
- rc_req.args[3], rc_req.args[4],
+ expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
+ rc_req.args.args32[1], rc_req.args.args32[2],
+ rc_req.args.args32[3], rc_req.args.args32[4],
&request_to_deny, FFA_OK);
/* Sending error to root which fails */
- expect_ffa_msg_send_direct_resp(
+ expect_ffa_msg_send_direct_resp_32(
own_id, rc_root_id, ROUTING_EXT_ERR_BIT | ROUTING_EXT_RC_BIT,
SP_RESULT_FFA(FFA_BUSY), 0, 0, 0, &rc_resp, FFA_DENIED);
@@ -649,7 +712,7 @@ TEST(sp_messaging, sp_msg_send_direct_req_deny_fail_wait_fail_forwarding)
expect_ffa_msg_wait(&rc_resp, result);
/* Fowarding RC error as FFA_MSG_WAIT failed */
- expect_ffa_msg_send_direct_req(
+ expect_ffa_msg_send_direct_req_32(
own_id, rc_root_id, (ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT),
result, 0, 0, 0, &resp, FFA_OK);
@@ -670,52 +733,52 @@ TEST(sp_messaging, sp_msg_send_direct_req_rc_return_rc_error_msg)
sp_msg sp_resp = { 0 };
ffa_result result = FFA_ABORTED;
- fill_sp_msg(&sp_req);
+ fill_sp_msg_32(&sp_req);
sp_req.source_id = own_id;
sp_req.destination_id = rc_root_id;
req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
req.source_id = own_id;
req.destination_id = rc_root_id;
- copy_sp_to_ffa_args(sp_req.args, req.args);
+ copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
- fill_ffa_msg(&rc_req);
+ fill_ffa_msg_32(&rc_req);
rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
rc_req.source_id = rc_root_id;
rc_req.destination_id = own_id;
- rc_req.args[0] = ROUTING_EXT_RC_BIT;
+ rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_ffa_msg(&rc_resp);
+ fill_ffa_msg_32(&rc_resp);
rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
rc_resp.source_id = root_id;
rc_resp.destination_id = own_id;
- rc_resp.args[0] = ROUTING_EXT_RC_BIT;
+ rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_sp_msg(&sp_resp);
+ fill_sp_msg_32(&sp_resp);
sp_resp.source_id = rc_root_id;
sp_resp.destination_id = own_id;
resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
resp.source_id = rc_root_id;
resp.destination_id = own_id;
- copy_sp_to_ffa_args(sp_resp.args, resp.args);
+ copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
/* Initial request to current SP to set own_id */
wait_and_receive_request(root_id, own_id);
/* Sending request and receiving RC request from RC root */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
- req.args[2], req.args[3], req.args[4],
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
+ req.args.args32[2], req.args.args32[3], req.args.args32[4],
&rc_req, FFA_OK);
/* Forwarding RC request to root and receiving RC response */
- expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
- rc_req.args[1], rc_req.args[2],
- rc_req.args[3], rc_req.args[4],
+ expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
+ rc_req.args.args32[1], rc_req.args.args32[2],
+ rc_req.args.args32[3], rc_req.args.args32[4],
&rc_resp, result);
/* Fowarding RC error to RC root and receiving response */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id,
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id,
ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
SP_RESULT_FFA(result), 0, 0, 0, &resp,
FFA_OK);
@@ -737,54 +800,54 @@ TEST(sp_messaging, sp_msg_send_direct_req_rc_return_resp_fail)
sp_msg sp_resp = { 0 };
ffa_result result = FFA_ABORTED;
- fill_sp_msg(&sp_req);
+ fill_sp_msg_32(&sp_req);
sp_req.source_id = own_id;
sp_req.destination_id = rc_root_id;
req.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
req.source_id = own_id;
req.destination_id = rc_root_id;
- copy_sp_to_ffa_args(sp_req.args, req.args);
+ copy_sp_to_ffa_args_32(sp_req.args.args32, req.args.args32);
- fill_ffa_msg(&rc_req);
+ fill_ffa_msg_32(&rc_req);
rc_req.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
rc_req.source_id = rc_root_id;
rc_req.destination_id = own_id;
- rc_req.args[0] = ROUTING_EXT_RC_BIT;
+ rc_req.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_ffa_msg(&rc_resp);
+ fill_ffa_msg_32(&rc_resp);
rc_resp.function_id = FFA_MSG_SEND_DIRECT_REQ_32;
rc_resp.source_id = root_id;
rc_resp.destination_id = own_id;
- rc_resp.args[0] = ROUTING_EXT_RC_BIT;
+ rc_resp.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_sp_msg(&sp_resp);
+ fill_sp_msg_32(&sp_resp);
sp_resp.source_id = rc_root_id;
sp_resp.destination_id = own_id;
resp.function_id = FFA_MSG_SEND_DIRECT_RESP_32;
resp.source_id = rc_root_id;
resp.destination_id = own_id;
- copy_sp_to_ffa_args(sp_resp.args, resp.args);
+ copy_sp_to_ffa_args_32(sp_resp.args.args32, resp.args.args32);
/* Initial request to current SP to set own_id */
wait_and_receive_request(root_id, own_id);
/* Sending request and receiving RC request from RC root */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, 0, req.args[1],
- req.args[2], req.args[3], req.args[4],
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, 0, req.args.args32[1],
+ req.args.args32[2], req.args.args32[3], req.args.args32[4],
&rc_req, FFA_OK);
/* Forwarding RC request to root and receiving RC response */
- expect_ffa_msg_send_direct_resp(own_id, root_id, rc_req.args[0],
- rc_req.args[1], rc_req.args[2],
- rc_req.args[3], rc_req.args[4],
+ expect_ffa_msg_send_direct_resp_32(own_id, root_id, rc_req.args.args32[0],
+ rc_req.args.args32[1], rc_req.args.args32[2],
+ rc_req.args.args32[3], rc_req.args.args32[4],
&rc_resp, FFA_OK);
/* Fowarding RC response to RC root and receiving response */
- expect_ffa_msg_send_direct_req(own_id, rc_root_id, rc_resp.args[0],
- rc_resp.args[1], rc_resp.args[2],
- rc_resp.args[3], rc_resp.args[4], &resp,
+ expect_ffa_msg_send_direct_req_32(own_id, rc_root_id, rc_resp.args.args32[0],
+ rc_resp.args.args32[1], rc_resp.args.args32[2],
+ rc_resp.args.args32[3], rc_resp.args.args32[4], &resp,
result);
LONGS_EQUAL(SP_RESULT_FFA(result),
@@ -812,10 +875,11 @@ TEST(sp_messaging, sp_msg_send_direct_resp_ffa_error)
ffa_result result = FFA_ABORTED;
uint32_t expected_ffa_args[5] = { 0 };
- fill_sp_msg(&resp);
+ fill_sp_msg_32(&resp);
memset(&req, 0x5a, sizeof(req));
- copy_sp_to_ffa_args(resp.args, expected_ffa_args);
- expect_ffa_msg_send_direct_resp(
+ req.is_64bit_message = false;
+ copy_sp_to_ffa_args_32(resp.args.args32, expected_ffa_args);
+ expect_ffa_msg_send_direct_resp_32(
resp.source_id, resp.destination_id, expected_ffa_args[0],
expected_ffa_args[1], expected_ffa_args[2],
expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, result);
@@ -825,14 +889,30 @@ TEST(sp_messaging, sp_msg_send_direct_resp_ffa_error)
MEMCMP_EQUAL(&empty_sp_msg, &req, sizeof(empty_sp_msg));
}
-TEST(sp_messaging, sp_msg_send_direct_resp_msg)
+TEST(sp_messaging, sp_msg_send_direct_resp_msg_32)
{
uint32_t expected_ffa_args[5] = { 0 };
- fill_sp_msg(&resp);
- fill_ffa_msg(&ffa_msg);
- copy_sp_to_ffa_args(resp.args, expected_ffa_args);
- expect_ffa_msg_send_direct_resp(
+ fill_sp_msg_32(&resp);
+ fill_ffa_msg_32(&ffa_msg);
+ copy_sp_to_ffa_args_32(resp.args.args32, expected_ffa_args);
+ expect_ffa_msg_send_direct_resp_32(
+ resp.source_id, resp.destination_id, expected_ffa_args[0],
+ expected_ffa_args[1], expected_ffa_args[2],
+ expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, FFA_OK);
+
+ LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_direct_resp(&resp, &req));
+ ffa_and_sp_msg_equal(&ffa_msg, &req);
+}
+
+TEST(sp_messaging, sp_msg_send_direct_resp_msg_64)
+{
+ uint64_t expected_ffa_args[5] = { 0 };
+
+ fill_sp_msg_64(&resp);
+ fill_ffa_msg_64(&ffa_msg);
+ copy_sp_to_ffa_args_64(resp.args.args64, expected_ffa_args);
+ expect_ffa_msg_send_direct_resp_64(
resp.source_id, resp.destination_id, expected_ffa_args[0],
expected_ffa_args[1], expected_ffa_args[2],
expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, FFA_OK);
@@ -841,15 +921,16 @@ TEST(sp_messaging, sp_msg_send_direct_resp_msg)
ffa_and_sp_msg_equal(&ffa_msg, &req);
}
+
TEST(sp_messaging, sp_msg_send_direct_resp_success)
{
uint32_t expected_ffa_args[5] = { 0 };
- fill_sp_msg(&req);
- fill_sp_msg(&resp);
+ fill_sp_msg_32(&req);
+ fill_sp_msg_32(&resp);
ffa_msg.function_id = FFA_SUCCESS_32;
- copy_sp_to_ffa_args(resp.args, expected_ffa_args);
- expect_ffa_msg_send_direct_resp(
+ copy_sp_to_ffa_args_32(resp.args.args32, expected_ffa_args);
+ expect_ffa_msg_send_direct_resp_32(
resp.source_id, resp.destination_id, expected_ffa_args[0],
expected_ffa_args[1], expected_ffa_args[2],
expected_ffa_args[3], expected_ffa_args[4], &ffa_msg, FFA_OK);
@@ -864,20 +945,20 @@ TEST(sp_messaging, sp_msg_send_direct_resp_deny_rc_failure)
uint32_t expected_ffa_args[5] = { 0 };
struct ffa_direct_msg rc_msg = { 0 };
- fill_sp_msg(&resp);
+ fill_sp_msg_32(&resp);
- fill_ffa_msg(&rc_msg);
- rc_msg.args[0] = ROUTING_EXT_RC_BIT;
+ fill_ffa_msg_32(&rc_msg);
+ rc_msg.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_ffa_msg(&ffa_msg);
- copy_sp_to_ffa_args(resp.args, expected_ffa_args);
+ fill_ffa_msg_32(&ffa_msg);
+ copy_sp_to_ffa_args_32(resp.args.args32, expected_ffa_args);
- expect_ffa_msg_send_direct_resp(
+ expect_ffa_msg_send_direct_resp_32(
resp.source_id, resp.destination_id, expected_ffa_args[0],
expected_ffa_args[1], expected_ffa_args[2],
expected_ffa_args[3], expected_ffa_args[4], &rc_msg, FFA_OK);
- expect_ffa_msg_send_direct_resp(
+ expect_ffa_msg_send_direct_resp_32(
rc_msg.destination_id, rc_msg.source_id,
ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
SP_RESULT_FFA(FFA_DENIED), 0, 0, 0, &ffa_msg, result);
@@ -892,21 +973,21 @@ TEST(sp_messaging, sp_msg_send_direct_resp_deny_rc)
uint32_t expected_ffa_args[5] = { 0 };
struct ffa_direct_msg rc_msg = { 0 };
- fill_sp_msg(&resp);
+ fill_sp_msg_32(&resp);
- fill_ffa_msg(&rc_msg);
- rc_msg.args[0] = ROUTING_EXT_RC_BIT;
+ fill_ffa_msg_32(&rc_msg);
+ rc_msg.args.args32[0] = ROUTING_EXT_RC_BIT;
- fill_ffa_msg(&ffa_msg);
- copy_sp_to_ffa_args(resp.args, expected_ffa_args);
+ fill_ffa_msg_32(&ffa_msg);
+ copy_sp_to_ffa_args_32(resp.args.args32, expected_ffa_args);
- expect_ffa_msg_send_direct_resp(resp.source_id, resp.destination_id, 0,
+ expect_ffa_msg_send_direct_resp_32(resp.source_id, resp.destination_id, 0,
expected_ffa_args[1],
expected_ffa_args[2],
expected_ffa_args[3],
expected_ffa_args[4], &rc_msg, FFA_OK);
- expect_ffa_msg_send_direct_resp(
+ expect_ffa_msg_send_direct_resp_32(
rc_msg.destination_id, rc_msg.source_id,
ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
SP_RESULT_FFA(FFA_DENIED), 0, 0, 0, &ffa_msg, FFA_OK);
@@ -933,13 +1014,14 @@ TEST(sp_messaging, sp_msg_send_rc_req_ffa_error)
{
ffa_result result = FFA_ABORTED;
- fill_sp_msg(&resp);
+ fill_sp_msg_32(&resp);
memset(&req, 0x5a, sizeof(req));
- fill_ffa_msg(&ffa_msg);
+ req.is_64bit_message = false;
+ fill_ffa_msg_32(&ffa_msg);
- expect_ffa_msg_send_direct_resp(req.source_id, req.destination_id,
- ROUTING_EXT_RC_BIT, req.args[0],
- req.args[1], req.args[2], req.args[3],
+ expect_ffa_msg_send_direct_resp_32(req.source_id, req.destination_id,
+ ROUTING_EXT_RC_BIT, req.args.args32[0],
+ req.args.args32[1], req.args.args32[2], req.args.args32[3],
&ffa_msg, result);
LONGS_EQUAL(SP_RESULT_FFA(result), sp_msg_send_rc_req(&req, &resp));
@@ -953,22 +1035,22 @@ TEST(sp_messaging, sp_msg_send_rc_req_deny_fail_wait_fail)
wait_and_receive_request(root_id, own_id);
- fill_sp_msg(&req);
+ fill_sp_msg_32(&req);
req.source_id = own_id;
req.destination_id = root_id;
- fill_ffa_msg(&ffa_msg);
+ fill_ffa_msg_32(&ffa_msg);
ffa_msg.source_id = root_id;
ffa_msg.destination_id = own_id;
/* Should be RC message so it will be denied */
- ffa_msg.args[0] = 0;
+ ffa_msg.args.args32[0] = 0;
- expect_ffa_msg_send_direct_resp(req.source_id, req.destination_id,
- ROUTING_EXT_RC_BIT, req.args[0],
- req.args[1], req.args[2], req.args[3],
+ expect_ffa_msg_send_direct_resp_32(req.source_id, req.destination_id,
+ ROUTING_EXT_RC_BIT, req.args.args32[0],
+ req.args.args32[1], req.args.args32[2], req.args.args32[3],
&ffa_msg, FFA_OK);
- expect_ffa_msg_send_direct_resp(
+ expect_ffa_msg_send_direct_resp_32(
req.source_id, req.destination_id,
ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT,
SP_RESULT_FFA(FFA_BUSY), 0, 0, 0, &ffa_msg, result);
@@ -987,19 +1069,19 @@ TEST(sp_messaging, sp_msg_send_rc_req_rc_error)
wait_and_receive_request(root_id, own_id);
- fill_sp_msg(&req);
+ fill_sp_msg_32(&req);
req.source_id = own_id;
req.destination_id = root_id;
- fill_ffa_msg(&ffa_msg);
+ fill_ffa_msg_32(&ffa_msg);
ffa_msg.source_id = root_id;
ffa_msg.destination_id = own_id;
- ffa_msg.args[0] = ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT;
- ffa_msg.args[1] = sp_err;
+ ffa_msg.args.args32[0] = ROUTING_EXT_RC_BIT | ROUTING_EXT_ERR_BIT;
+ ffa_msg.args.args32[1] = sp_err;
- expect_ffa_msg_send_direct_resp(req.source_id, req.destination_id,
- ROUTING_EXT_RC_BIT, req.args[0],
- req.args[1], req.args[2], req.args[3],
+ expect_ffa_msg_send_direct_resp_32(req.source_id, req.destination_id,
+ ROUTING_EXT_RC_BIT, req.args.args32[0],
+ req.args.args32[1], req.args.args32[2], req.args.args32[3],
&ffa_msg, FFA_OK);
LONGS_EQUAL(sp_err, sp_msg_send_rc_req(&req, &resp));
@@ -1013,18 +1095,18 @@ TEST(sp_messaging, sp_msg_send_rc_req_success)
wait_and_receive_request(root_id, own_id);
- fill_sp_msg(&req);
+ fill_sp_msg_32(&req);
req.source_id = own_id;
req.destination_id = root_id;
- fill_ffa_msg(&ffa_msg);
+ fill_ffa_msg_32(&ffa_msg);
ffa_msg.source_id = root_id;
ffa_msg.destination_id = own_id;
- ffa_msg.args[0] = ROUTING_EXT_RC_BIT;
+ ffa_msg.args.args32[0] = ROUTING_EXT_RC_BIT;
- expect_ffa_msg_send_direct_resp(req.source_id, req.destination_id,
- ROUTING_EXT_RC_BIT, req.args[0],
- req.args[1], req.args[2], req.args[3],
+ expect_ffa_msg_send_direct_resp_32(req.source_id, req.destination_id,
+ ROUTING_EXT_RC_BIT, req.args.args32[0],
+ req.args.args32[1], req.args.args32[2], req.args.args32[3],
&ffa_msg, FFA_OK);
LONGS_EQUAL(SP_RESULT_OK, sp_msg_send_rc_req(&req, &resp));
diff --git a/components/rpc/ffarpc/caller/sp/ffarpc_caller.c b/components/rpc/ffarpc/caller/sp/ffarpc_caller.c
index 4ad98fb..ca3d318 100644
--- a/components/rpc/ffarpc/caller/sp/ffarpc_caller.c
+++ b/components/rpc/ffarpc/caller/sp/ffarpc_caller.c
@@ -81,16 +81,17 @@ static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t
req.destination_id = this_context->dest_partition_id;
req.source_id = own_id;
- req.args[SP_CALL_ARGS_IFACE_ID_OPCODE] =
+ req.is_64bit_message = false;
+ req.args.args32[SP_CALL_ARGS_IFACE_ID_OPCODE] =
FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(this_context->dest_iface_id, opcode);
- req.args[SP_CALL_ARGS_REQ_DATA_LEN] = (uint32_t)this_context->req_len;
- req.args[SP_CALL_ARGS_ENCODING] = this_context->rpc_caller.encoding;
+ req.args.args32[SP_CALL_ARGS_REQ_DATA_LEN] = (uint32_t)this_context->req_len;
+ req.args.args32[SP_CALL_ARGS_ENCODING] = this_context->rpc_caller.encoding;
/* Initialise the caller ID. Depending on the call path, this may
* be overridden by a higher privilege execution level, based on its
* perspective of the caller identity.
*/
- req.args[SP_CALL_ARGS_CALLER_ID] = 0;
+ req.args.args32[SP_CALL_ARGS_CALLER_ID] = 0;
sp_res = sp_msg_send_direct_req(&req, &resp);
if (sp_res != SP_RESULT_OK) {
@@ -98,9 +99,9 @@ static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t
goto out;
}
- this_context->resp_len = (size_t)resp.args[SP_CALL_ARGS_RESP_DATA_LEN];
- status = resp.args[SP_CALL_ARGS_RESP_RPC_STATUS];
- *opstatus = (rpc_status_t)((int32_t)resp.args[SP_CALL_ARGS_RESP_OP_STATUS]);
+ this_context->resp_len = (size_t)resp.args.args32[SP_CALL_ARGS_RESP_DATA_LEN];
+ status = resp.args.args32[SP_CALL_ARGS_RESP_RPC_STATUS];
+ *opstatus = (rpc_status_t)((int32_t)resp.args.args32[SP_CALL_ARGS_RESP_OP_STATUS]);
if (this_context->resp_len > this_context->shared_mem_required_size) {
EMSG("invalid response length");
@@ -242,11 +243,12 @@ int ffarpc_caller_open(struct ffarpc_caller *caller, uint16_t dest_partition_id,
req.source_id = own_id;
req.destination_id = dest_partition_id;
- req.args[SP_CALL_ARGS_IFACE_ID_OPCODE] =
+ req.is_64bit_message = false;
+ req.args.args32[SP_CALL_ARGS_IFACE_ID_OPCODE] =
FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(FFA_CALL_MGMT_IFACE_ID, FFA_CALL_OPCODE_SHARE_BUF);
- req.args[SP_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = (uint32_t)(handle & UINT32_MAX);
- req.args[SP_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = (uint32_t)(handle >> 32);
- req.args[SP_CALL_ARGS_SHARE_MEM_SIZE] = (uint32_t)(caller->shared_mem_required_size);
+ req.args.args32[SP_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = (uint32_t)(handle & UINT32_MAX);
+ req.args.args32[SP_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = (uint32_t)(handle >> 32);
+ req.args.args32[SP_CALL_ARGS_SHARE_MEM_SIZE] = (uint32_t)(caller->shared_mem_required_size);
sp_res = sp_msg_send_direct_req(&req, &resp);
if (sp_res != SP_RESULT_OK) {
@@ -273,10 +275,11 @@ int ffarpc_caller_close(struct ffarpc_caller *caller)
req.source_id = own_id;
req.destination_id = caller->dest_partition_id;
- req.args[SP_CALL_ARGS_IFACE_ID_OPCODE] =
+ req.is_64bit_message = false;
+ req.args.args32[SP_CALL_ARGS_IFACE_ID_OPCODE] =
FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(FFA_CALL_MGMT_IFACE_ID, FFA_CALL_OPCODE_UNSHARE_BUF);
- req.args[SP_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = handle_lo;
- req.args[SP_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = handle_hi;
+ req.args.args32[SP_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = handle_lo;
+ req.args.args32[SP_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = handle_hi;
sp_res = sp_msg_send_direct_req(&req, &resp);
if (sp_res != SP_RESULT_OK) {
diff --git a/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c b/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c
index 6a8cef0..c024196 100644
--- a/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c
+++ b/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c
@@ -260,8 +260,8 @@ void ffa_call_ep_receive(struct ffa_call_ep *call_ep,
const struct sp_msg *req_msg,
struct sp_msg *resp_msg)
{
- const uint32_t *req_args = req_msg->args;
- uint32_t *resp_args = resp_msg->args;
+ const uint32_t *req_args = req_msg->args.args32;
+ uint32_t *resp_args = resp_msg->args.args32;
uint16_t source_id = req_msg->source_id;
uint32_t ifaceid_opcode = req_args[SP_CALL_ARGS_IFACE_ID_OPCODE];
diff --git a/components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.c b/components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.c
index 09f1e2c..dc49e64 100644
--- a/components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.c
+++ b/components/rpc/mm_communicate/endpoint/sp/mm_communicate_call_ep.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: BSD-3-Clause
/*
- * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
*/
#include "components/rpc/mm_communicate/common/mm_communicate_call_args.h"
@@ -127,15 +127,15 @@ void mm_communicate_call_ep_receive(struct mm_communicate_ep *mm_communicate_cal
uintptr_t buffer_address = 0;
size_t buffer_size = 0;
- buffer_address = req_msg->args[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_ADDRESS];
- buffer_size = req_msg->args[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_SIZE];
+ buffer_address = req_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_ADDRESS];
+ buffer_size = req_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_COMM_BUFFER_SIZE];
return_value = handle_mm_communicate(mm_communicate_call_ep, req_msg->source_id,
buffer_address, buffer_size);
- resp_msg->args[MM_COMMUNICATE_CALL_ARGS_RETURN_ID] = ARM_SVC_ID_SP_EVENT_COMPLETE;
- resp_msg->args[MM_COMMUNICATE_CALL_ARGS_RETURN_CODE] = return_value;
- resp_msg->args[MM_COMMUNICATE_CALL_ARGS_MBZ0] = 0;
- resp_msg->args[MM_COMMUNICATE_CALL_ARGS_MBZ1] = 0;
- resp_msg->args[MM_COMMUNICATE_CALL_ARGS_MBZ2] = 0;
+ resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_RETURN_ID] = ARM_SVC_ID_SP_EVENT_COMPLETE;
+ resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_RETURN_CODE] = return_value;
+ resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_MBZ0] = 0;
+ resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_MBZ1] = 0;
+ resp_msg->args.args32[MM_COMMUNICATE_CALL_ARGS_MBZ2] = 0;
}
diff --git a/deployments/smm-gateway/common/smm_gateway_sp.c b/deployments/smm-gateway/common/smm_gateway_sp.c
index 2187fea..3697b7f 100644
--- a/deployments/smm-gateway/common/smm_gateway_sp.c
+++ b/deployments/smm-gateway/common/smm_gateway_sp.c
@@ -70,10 +70,10 @@ void __noreturn sp_main(struct ffa_init_info *init_info)
while (1) {
mm_communicate_call_ep_receive(&mm_communicate_call_ep, &req_msg, &resp_msg);
- ffa_msg_send_direct_resp(req_msg.destination_id,
- req_msg.source_id, resp_msg.args[0],
- resp_msg.args[1], resp_msg.args[2],
- resp_msg.args[3], resp_msg.args[4],
+ ffa_msg_send_direct_resp_32(req_msg.destination_id,
+ req_msg.source_id, resp_msg.args.args32[0],
+ resp_msg.args.args32[1], resp_msg.args.args32[2],
+ resp_msg.args.args32[3], resp_msg.args.args32[4],
&req_msg);
}
--
2.17.1