feat(dir_msg) extend FFA_MSG_SEND_DIRECT_REQ2 registers

Allow FF-A v1.2 ABI FFA_MSG_SEND_DIRECT_REQ2 to use extended set of
implementation-defined register values (x4-x17 instead of x4-x7).

Signed-off-by: Kathleen Capella <kathleen.capella@arm.com>
Change-Id: I2aaa4269b32632b8e4ac4ad2e5319520be2a69e6
diff --git a/src/api.c b/src/api.c
index bf29458..de3a763 100644
--- a/src/api.c
+++ b/src/api.c
@@ -1082,6 +1082,22 @@
 	return true;
 }
 
+/*
+ * Helper to check if extended arguments (corresponding to regs x8-x17)
+ * are zeroed out.
+ */
+static bool api_extended_args_are_zero(struct ffa_value *args)
+{
+	if (args->extended_val.arg8 != 0U || args->extended_val.arg9 != 0U ||
+	    args->extended_val.arg10 != 0U || args->extended_val.arg11 != 0U ||
+	    args->extended_val.arg12 != 0U || args->extended_val.arg13 != 0U ||
+	    args->extended_val.arg14 != 0U || args->extended_val.arg15 != 0U ||
+	    args->extended_val.arg16 != 0U || args->extended_val.arg17 != 0U) {
+		return false;
+	}
+	return true;
+}
+
 struct ffa_value api_ffa_msg_wait(struct vcpu *current, struct vcpu **next,
 				  struct ffa_value *args)
 {
@@ -1098,6 +1114,11 @@
 		return ffa_error(FFA_INVALID_PARAMETERS);
 	}
 
+	if (current->vm->ffa_version >= MAKE_FFA_VERSION(1, 2) &&
+	    !api_extended_args_are_zero(args)) {
+		return ffa_error(FFA_INVALID_PARAMETERS);
+	}
+
 	current_locked = vcpu_lock(current);
 	if (!plat_ffa_check_runtime_state_transition(
 		    current_locked, current->vm->id, HF_INVALID_VM_ID,
@@ -2546,6 +2567,10 @@
 		args.arg2 = 0;
 	}
 
+	if (args.func == FFA_MSG_SEND_DIRECT_REQ2_64) {
+		args.extended_val.valid = true;
+	}
+
 	return args;
 }
 
@@ -2719,10 +2744,6 @@
 	receiver_vcpu->regs_available = false;
 	receiver_vcpu->direct_request_origin_vm_id = sender_vm_id;
 
-	/*
-	 * TODO: when extending registers, have to set extended_val.valid before
-	 * this call.
-	 */
 	arch_regs_set_retval(&receiver_vcpu->regs, api_ffa_dir_msg_value(args));
 
 	assert(!vm_id_is_current_world(current->vm->id) ||