diff --git a/components/service/spm_test/sp.c b/components/service/spm_test/sp.c
index 76ac133..fa9c7ea 100644
--- a/components/service/spm_test/sp.c
+++ b/components/service/spm_test/sp.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2022-2023, Arm Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -221,14 +221,14 @@
 
 static void return_error(uint32_t error, struct ffa_direct_msg *msg)
 {
-	ffa_msg_send_direct_resp_32(msg->destination_id, msg->source_id, 0xff,
+	ffa_msg_send_direct_resp_64(msg->destination_id, msg->source_id, 0xff,
 				 error, 0, 0, 0, msg);
 }
 
 static void return_ok(struct ffa_direct_msg *msg)
 {
 
-	ffa_msg_send_direct_resp_32(msg->destination_id,
+	ffa_msg_send_direct_resp_64(msg->destination_id,
 				 msg->source_id, SP_TEST_OK, 0, 0, 0, 0, msg);
 }
 
@@ -245,28 +245,29 @@
 
 static void test_increase(struct ffa_direct_msg *msg)
 {
-	msg->args.args32[1]++;
-	msg->args.args32[2]++;
-	msg->args.args32[3]++;
-	msg->args.args32[4]++;
-	ffa_msg_send_direct_resp_32(msg->destination_id,msg->source_id,
-				 SP_TEST_OK, msg->args.args32[1],
-				 msg->args.args32[2],msg->args.args32[3],
-				 msg->args.args32[4], msg);
+	msg->args.args64[1]++;
+	msg->args.args64[2]++;
+	msg->args.args64[3]++;
+	msg->args.args64[4]++;
+	ffa_msg_send_direct_resp_64(msg->destination_id,msg->source_id,
+				 SP_TEST_OK, msg->args.args64[1],
+				 msg->args.args64[2],msg->args.args64[3],
+				 msg->args.args64[4], msg);
 
 }
 
 static void test_communication(struct ffa_direct_msg *msg)
 {
 	struct ffa_direct_msg sp_msg = {0};
-	uint16_t dst = (uint16_t)msg->args.args32[1];
+	uint16_t dst = (uint16_t)msg->args.args64[1];
 	ffa_result res = FFA_OK;
 
-	sp_msg.args.args32[1] =  0x55;
-	sp_msg.args.args32[2] =  0xAA;
-	sp_msg.args.args32[3] =  0xBB;
-	sp_msg.args.args32[4] =  0xCC;
-	res = ffa_msg_send_direct_req_32(msg->destination_id, dst,
+	sp_msg.args.args64[1] =  0x55;
+	sp_msg.args.args64[2] =  0xAA;
+	sp_msg.args.args64[3] =  0xBB;
+	sp_msg.args.args64[4] =  0xCC;
+
+	res = ffa_msg_send_direct_req_64(msg->destination_id, dst,
 				      EP_TEST_SP_INCREASE,0x55, 0xAA, 0xBB,
 				      0xCC, &sp_msg);
 
@@ -276,14 +277,14 @@
 		return;
 	}
 
-	if (sp_msg.args.args32[1] == 0x56 && sp_msg.args.args32[2] == 0xAB &&
-	    sp_msg.args.args32[3] == 0xBC &&sp_msg.args.args32[4] == 0xCD) {
+	if (sp_msg.args.args64[1] == 0x56 && sp_msg.args.args64[2] == 0xAB &&
+	    sp_msg.args.args64[3] == 0xBC &&sp_msg.args.args64[4] == 0xCD) {
 		return_ok(msg);
 	} else {
 		DMSG("Failed SP communication %x %x %x %x",
-		     sp_msg.args.args32[1],
-		     sp_msg.args.args32[2], sp_msg.args.args32[3],
-		     sp_msg.args.args32[4]);
+		     sp_msg.args.args64[1],
+		     sp_msg.args.args64[2], sp_msg.args.args64[3],
+		     sp_msg.args.args64[4]);
 
 		return_error(ERR_SP_COMMUNICATION, msg);
 	}
@@ -349,10 +350,10 @@
 
 	ffa_id_get(&own_id);
 
-	handle = (uint64_t)msg->args.args32[1] |
-		 (((uint64_t)msg->args.args32[2]) << 32);
+	handle = (uint64_t)msg->args.args64[1] |
+		 (((uint64_t)msg->args.args64[2]) << 32);
 	descriptor.tag = 0;
-	descriptor.sender_id = msg->args.args32[3] & 0xffff;
+	descriptor.sender_id = msg->args.args64[3] & 0xffff;
 	acc_desc.receiver_id = own_id;
 	acc_desc.data_access = sp_data_access_read_write;
 	res = sp_memory_retrieve(&descriptor, &acc_desc, regions, 1,
@@ -381,12 +382,12 @@
 		.operation_time_slicing = false,
 	};
 
-	if (msg->args.args32[3] == 1)
+	if (msg->args.args64[3] == 1)
 		flags.zero_memory = true;
 
 	ffa_id_get(&endpoint_id);
-	handle = (uint64_t)msg->args.args32[1] |
-		 (((uint64_t)msg->args.args32[2]) << 32);
+	handle = (uint64_t)msg->args.args64[1] |
+		 (((uint64_t)msg->args.args64[2]) << 32);
 	descriptor.tag = 0;
 
 	res = sp_memory_relinquish(handle, &endpoint_id, 1, &flags);
@@ -436,7 +437,7 @@
 		return;
 	}
 
-	res = ffa_msg_send_direct_req_32(own_id, service_ep_id,
+	res = ffa_msg_send_direct_req_64(own_id, service_ep_id,
 				      EP_RETRIEVE, handle & 0xffffffff,
 				      handle >> 32, own_id, 0, msg);
 
@@ -448,7 +449,7 @@
 		return;
 	}
 
-	res = ffa_msg_send_direct_req_32(own_id, service_ep_id,
+	res = ffa_msg_send_direct_req_64(own_id, service_ep_id,
 				EP_TRY_W_ACCESS, 0,
 				0, 0, 0, msg);
 
@@ -460,7 +461,7 @@
 		return;
 	}
 
-	res = ffa_msg_send_direct_req_32(own_id, service_ep_id,
+	res = ffa_msg_send_direct_req_64(own_id, service_ep_id,
 				EP_RELINQUISH, handle & 0xffffffff,
 				handle >> 32, 0, 0, msg);
 	if (res != FFA_OK) {
@@ -497,8 +498,8 @@
 	uint16_t src_id = msg->source_id = 0;
 	struct sp_memory_access_descriptor acc_desc[2] = { };
 	uint32_t err = 0;
-	uint16_t endpoint2 = msg->args.args32[1];
-	uint16_t endpoint3 = msg->args.args32[2];
+	uint16_t endpoint2 = msg->args.args64[1];
+	uint16_t endpoint3 = msg->args.args64[2];
 
 	my_buf[0] = 0xa;
 	set_rxtx_buf(&t_buf, NULL);
@@ -529,7 +530,7 @@
 		goto err;
 	}
 	/* test SP2*/
-	res = ffa_msg_send_direct_req_32(own_id, endpoint2,
+	res = ffa_msg_send_direct_req_64(own_id, endpoint2,
 				      EP_RETRIEVE, handle & 0xffffffff,
 				      handle >> 32, own_id, 0, msg);
 
@@ -541,7 +542,7 @@
 		return;
 	}
 
-	res = ffa_msg_send_direct_req_32(own_id, endpoint2,
+	res = ffa_msg_send_direct_req_64(own_id, endpoint2,
 				EP_TRY_W_ACCESS, 0,
 				0, 0, 0, msg);
 
@@ -559,7 +560,7 @@
 		goto err;
 	}
 
-	res = ffa_msg_send_direct_req_32(own_id, endpoint2,
+	res = ffa_msg_send_direct_req_64(own_id, endpoint2,
 				      EP_RELINQUISH, handle & 0xffffffff,
 				      handle >> 32, 0, 0, msg);
 
@@ -572,7 +573,7 @@
 	}
 	my_buf[0] = 0xa;
 	/* test SP3*/
-	res = ffa_msg_send_direct_req_32(own_id, endpoint3,
+	res = ffa_msg_send_direct_req_64(own_id, endpoint3,
 				      EP_RETRIEVE, handle & 0xffffffff,
 				      handle >> 32, own_id, 0, msg);
 
@@ -584,7 +585,7 @@
 		return;
 	}
 
-	res = ffa_msg_send_direct_req_32(own_id, endpoint3,
+	res = ffa_msg_send_direct_req_64(own_id, endpoint3,
 				EP_TRY_W_ACCESS, 0,
 				0, 0, 0, msg);
 
@@ -608,7 +609,7 @@
 		goto err;
 	}
 
-	res = ffa_msg_send_direct_req_32(own_id, endpoint3,
+	res = ffa_msg_send_direct_req_64(own_id, endpoint3,
 				EP_RELINQUISH, handle & 0xffffffff,
 				handle >> 32, 0, 0, msg);
 
@@ -760,7 +761,7 @@
 	ffa_msg_wait(&msg);
 
 	while (1) {
-		enum sp_tests test_case = (enum sp_tests)msg.args.args32[0];
+		enum sp_tests test_case = (enum sp_tests)msg.args.args64[0];
 
 		DMSG("SP:%x Starting test %s", own_id, sp_test_str[test_case]);
 		switch (test_case) {
@@ -788,18 +789,18 @@
 			test_mem_relinquish(&msg);
 			break;
 		case EP_SP_MEM_SHARING:
-			test_mem_sharing((uint16_t)msg.args.args32[1], &msg);
+			test_mem_sharing((uint16_t)msg.args.args64[1], &msg);
 			break;
 		case EP_SP_MEM_SHARING_MULTI:
 			test_mem_multi_sharing(&msg);
 			break;
 		case EP_SP_MEM_SHARING_EXC:
-			test_mem_sharing_exc((uint16_t)msg.args.args32[1],
+			test_mem_sharing_exc((uint16_t)msg.args.args64[1],
 					     &msg);
 			break;
 		case EP_SP_MEM_INCORRECT_ACCESS:
 			test_mem_sharing_inccorrect_access(
-				(uint16_t)msg.args.args32[1], &msg);
+				(uint16_t)msg.args.args64[1], &msg);
 			break;
 		case EP_SP_NOP:
 			return_ok(&msg);
