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