Add support for 64-bit operation status values
For compatibility with 64-bit EFI status codes, opstatus values
are now treated as 64-bit rather than 32-bit. A new rpc_opstatus_t
type has been introduced in this change. Note that the FFARPC
still maps the opstatus value to a 32-bit regsiter value but
this is sign extended up to 64-bits in RPC callers. The MM
Communicate RPC caller and endpoint handle 64-bit status values.
Signed-off-by: Julian Hall <julian.hall@arm.com>
Change-Id: I06a0883394f370ccb543ebab797973bb604ff489
diff --git a/components/rpc/common/caller/rpc_caller.c b/components/rpc/common/caller/rpc_caller.c
index 00b559c..2dceabe 100644
--- a/components/rpc/common/caller/rpc_caller.c
+++ b/components/rpc/common/caller/rpc_caller.c
@@ -28,7 +28,7 @@
}
rpc_status_t rpc_caller_invoke(struct rpc_caller *s, rpc_call_handle handle,
- uint32_t opcode, int *opstatus, uint8_t **resp_buf, size_t *resp_len)
+ uint32_t opcode, rpc_opstatus_t *opstatus, uint8_t **resp_buf, size_t *resp_len)
{
return s->call_invoke(s->context, handle, opcode, opstatus, resp_buf, resp_len);
}
diff --git a/components/rpc/common/endpoint/rpc_interface.h b/components/rpc/common/endpoint/rpc_interface.h
index ba949de..eb98587 100644
--- a/components/rpc/common/endpoint/rpc_interface.h
+++ b/components/rpc/common/endpoint/rpc_interface.h
@@ -62,7 +62,7 @@
uint32_t interface_id;
uint32_t opcode;
uint32_t encoding;
- int opstatus;
+ rpc_opstatus_t opstatus;
struct call_param_buf req_buf;
struct call_param_buf resp_buf;
};
@@ -87,12 +87,12 @@
return req->encoding;
}
-static inline int call_req_get_opstatus(const struct call_req *req)
+static inline rpc_opstatus_t call_req_get_opstatus(const struct call_req *req)
{
return req->opstatus;
}
-static inline void call_req_set_opstatus(struct call_req *req, int opstatus)
+static inline void call_req_set_opstatus(struct call_req *req, rpc_opstatus_t opstatus)
{
req->opstatus = opstatus;
}
diff --git a/components/rpc/common/interface/rpc_caller.h b/components/rpc/common/interface/rpc_caller.h
index 879d2cb..387489c 100644
--- a/components/rpc/common/interface/rpc_caller.h
+++ b/components/rpc/common/interface/rpc_caller.h
@@ -42,7 +42,7 @@
rpc_call_handle (*call_begin)(void *context, uint8_t **req_buf, size_t req_len);
rpc_status_t (*call_invoke)(void *context, rpc_call_handle handle, uint32_t opcode,
- int *opstatus, uint8_t **resp_buf, size_t *resp_len);
+ rpc_opstatus_t *opstatus, uint8_t **resp_buf, size_t *resp_len);
void (*call_end)(void *context, rpc_call_handle handle);
};
@@ -79,7 +79,7 @@
* call_end() is called for the transaction.
*/
RPC_CALLER_EXPORTED rpc_status_t rpc_caller_invoke(struct rpc_caller *s, rpc_call_handle handle,
- uint32_t opcode, int *opstatus, uint8_t **resp_buf, size_t *resp_len);
+ uint32_t opcode, rpc_opstatus_t *opstatus, uint8_t **resp_buf, size_t *resp_len);
/*
* Ends the call transaction, allowing any resource associated with the
diff --git a/components/rpc/common/interface/rpc_status.h b/components/rpc/common/interface/rpc_status.h
index 0405a64..cba9dac 100644
--- a/components/rpc/common/interface/rpc_status.h
+++ b/components/rpc/common/interface/rpc_status.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -21,6 +21,15 @@
*/
typedef int32_t rpc_status_t;
+/** \brief RPC operation status code type
+ *
+ * Used for returning the endpoint specific operation status.
+ * Different service layer protocols will use different status
+ * value schemes. Status values returned by an operation are
+ * carried by the RPC layer using this type.
+ */
+typedef int64_t rpc_opstatus_t;
+
#ifdef __cplusplus
}
#endif
diff --git a/components/rpc/common/logging/logging_caller.c b/components/rpc/common/logging/logging_caller.c
index efc1184..07c33de 100644
--- a/components/rpc/common/logging/logging_caller.c
+++ b/components/rpc/common/logging/logging_caller.c
@@ -10,7 +10,7 @@
static rpc_call_handle call_begin(void *context, uint8_t **req_buf, size_t req_len);
static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t opcode,
- int *opstatus, uint8_t **resp_buf, size_t *resp_len);
+ rpc_opstatus_t *opstatus, uint8_t **resp_buf, size_t *resp_len);
static void call_end(void *context, rpc_call_handle handle);
@@ -69,7 +69,7 @@
}
static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t opcode,
- int *opstatus, uint8_t **resp_buf, size_t *resp_len)
+ rpc_opstatus_t *opstatus, uint8_t **resp_buf, size_t *resp_len)
{
struct logging_caller *this_instance = (struct logging_caller*)context;
rpc_status_t status = TS_RPC_ERROR_INVALID_TRANSACTION;