Fix memory handle encoding.

We were sending handles as a single register in some cases, rather than
breaking them into two 32-bit registers as the FF-A spec requires.

Bug: 132420445
Change-Id: Ieb327ded2ad72f5332a1d001452176c8edbe0f08
diff --git a/inc/vmapi/hf/ffa.h b/inc/vmapi/hf/ffa.h
index bd93f0c..a955ca8 100644
--- a/inc/vmapi/hf/ffa.h
+++ b/inc/vmapi/hf/ffa.h
@@ -246,9 +246,21 @@
 	return args.arg4;
 }
 
+static inline ffa_memory_handle_t ffa_assemble_handle(uint32_t a1, uint32_t a2)
+{
+	return (uint64_t)a1 | (uint64_t)a2 << 32;
+}
+
 static inline ffa_memory_handle_t ffa_mem_success_handle(struct ffa_value args)
 {
-	return args.arg2;
+	return ffa_assemble_handle(args.arg2, args.arg3);
+}
+
+static inline struct ffa_value ffa_mem_success(ffa_memory_handle_t handle)
+{
+	return (struct ffa_value){.func = FFA_SUCCESS_32,
+				  .arg2 = (uint32_t)handle,
+				  .arg3 = (uint32_t)(handle >> 32)};
 }
 
 static inline ffa_vm_id_t ffa_vm_id(struct ffa_value args)
diff --git a/prebuilts b/prebuilts
index ce0ff4e..2498939 160000
--- a/prebuilts
+++ b/prebuilts
@@ -1 +1 @@
-Subproject commit ce0ff4e3bb78d04d52f4717233706431055d0710
+Subproject commit 24989398059599c1d8e0c387779e910394c16637
diff --git a/src/arch/aarch64/hypervisor/handler.c b/src/arch/aarch64/hypervisor/handler.c
index 6ad8616..8eb580c 100644
--- a/src/arch/aarch64/hypervisor/handler.c
+++ b/src/arch/aarch64/hypervisor/handler.c
@@ -379,8 +379,8 @@
 		return true;
 	case FFA_MEM_RECLAIM_32:
 		*args = api_ffa_mem_reclaim(
-			(args->arg1 & 0xffffffff) | args->arg2 << 32,
-			args->arg3, current());
+			ffa_assemble_handle(args->arg1, args->arg2), args->arg3,
+			current());
 		return true;
 	}
 
diff --git a/src/ffa_memory.c b/src/ffa_memory.c
index 8def572..d31750d 100644
--- a/src/ffa_memory.c
+++ b/src/ffa_memory.c
@@ -1319,7 +1319,7 @@
 		return (struct ffa_value){.func = FFA_SUCCESS_32};
 	}
 
-	return (struct ffa_value){.func = FFA_SUCCESS_32, .arg2 = handle};
+	return ffa_mem_success(handle);
 }
 
 struct ffa_value ffa_memory_retrieve(struct vm_locked to_locked,
diff --git a/test/vmapi/common/ffa.c b/test/vmapi/common/ffa.c
index a7048b1..a313267 100644
--- a/test/vmapi/common/ffa.c
+++ b/test/vmapi/common/ffa.c
@@ -83,6 +83,8 @@
 	}
 	EXPECT_EQ(ret.func, FFA_SUCCESS_32);
 	handle = ffa_mem_success_handle(ret);
+	EXPECT_EQ(handle & FFA_MEMORY_HANDLE_ALLOCATOR_MASK,
+		  FFA_MEMORY_HANDLE_ALLOCATOR_HYPERVISOR);
 
 	/*
 	 * Send the appropriate retrieve request to the VM so that it can use it