mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
xen/arm: ffa: advertise FF-A v1.2
Expose the RX/TX MAP capacity field only once a guest has negotiated FF-A v1.2. While there, drop the stale <asm/tee/ffa.h> include. To comply with the wider v1.2 register ABI, zero registers x8–x17 when responding to a v1.2 VM. The dispatcher also rejects SMCCC64 calls from AArch32 guests. Finally, bump Xen's FF-A version to 1.2. Signed-off-by: Bertrand Marquis <bertrand.marquis@arm.com> Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
This commit is contained in:
1 parent
3ca6aca20d
commit
f42bacb20e
2 files changed
+37
-11
No files matched your search
+17
-2
@@ -65,7 +65,6 @@
|
||||
#include <asm/event.h>
|
||||
#include <asm/regs.h>
|
||||
#include <asm/smccc.h>
|
||||
#include <asm/tee/ffa.h>
|
||||
#include <asm/tee/tee.h>
|
||||
|
||||
#include "ffa_private.h"
|
||||
@@ -296,7 +295,16 @@ static void handle_features(struct cpu_user_regs *regs)
|
||||
* differs from FFA_PAGE_SIZE (SZ_4K).
|
||||
*/
|
||||
BUILD_BUG_ON(PAGE_SIZE != FFA_PAGE_SIZE);
|
||||
ffa_set_regs_success(regs, 0, 0);
|
||||
|
||||
/*
|
||||
* From FFA v1.2, we can give the maximum number of pages we support
|
||||
* for the RX/TX buffers.
|
||||
*/
|
||||
if ( ACCESS_ONCE(ctx->guest_vers) < FFA_VERSION_1_2 )
|
||||
ffa_set_regs_success(regs, 0, 0);
|
||||
else
|
||||
ffa_set_regs_success(regs, FFA_MAX_RXTX_PAGE_COUNT << 16, 0);
|
||||
|
||||
break;
|
||||
case FFA_FEATURE_NOTIF_PEND_INTR:
|
||||
ffa_set_regs_success(regs, GUEST_FFA_NOTIF_PEND_INTR_ID, 0);
|
||||
@@ -329,6 +337,13 @@ static bool ffa_handle_call(struct cpu_user_regs *regs)
|
||||
if ( !ctx )
|
||||
return false;
|
||||
|
||||
if ( !is_64bit_domain(d) && smccc_is_conv_64(fid) )
|
||||
{
|
||||
/* 32bit guests should only use 32bit convention calls */
|
||||
ffa_set_regs_error(regs, FFA_RET_NOT_SUPPORTED);
|
||||
return true;
|
||||
}
|
||||
|
||||
/* A version must be negotiated first */
|
||||
if ( !ACCESS_ONCE(ctx->guest_vers) )
|
||||
{
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
* that particular guest or SP.
|
||||
*/
|
||||
#define FFA_MY_VERSION_MAJOR 1U
|
||||
#define FFA_MY_VERSION_MINOR 1U
|
||||
#define FFA_MY_VERSION_MINOR 2U
|
||||
#define FFA_MY_VERSION MAKE_FFA_VERSION(FFA_MY_VERSION_MAJOR, \
|
||||
FFA_MY_VERSION_MINOR)
|
||||
|
||||
@@ -519,14 +519,25 @@ static inline void ffa_set_regs(struct cpu_user_regs *regs, register_t v0,
|
||||
register_t v4, register_t v5, register_t v6,
|
||||
register_t v7)
|
||||
{
|
||||
set_user_reg(regs, 0, v0);
|
||||
set_user_reg(regs, 1, v1);
|
||||
set_user_reg(regs, 2, v2);
|
||||
set_user_reg(regs, 3, v3);
|
||||
set_user_reg(regs, 4, v4);
|
||||
set_user_reg(regs, 5, v5);
|
||||
set_user_reg(regs, 6, v6);
|
||||
set_user_reg(regs, 7, v7);
|
||||
struct domain *d = current->domain;
|
||||
struct ffa_ctx *ctx = d->arch.tee;
|
||||
int i;
|
||||
|
||||
set_user_reg(regs, 0, v0);
|
||||
set_user_reg(regs, 1, v1);
|
||||
set_user_reg(regs, 2, v2);
|
||||
set_user_reg(regs, 3, v3);
|
||||
set_user_reg(regs, 4, v4);
|
||||
set_user_reg(regs, 5, v5);
|
||||
set_user_reg(regs, 6, v6);
|
||||
set_user_reg(regs, 7, v7);
|
||||
|
||||
if ( ctx && ACCESS_ONCE(ctx->guest_vers) >= FFA_VERSION_1_2 &&
|
||||
is_64bit_domain(d) )
|
||||
{
|
||||
for (i = 8; i <= 17; i++)
|
||||
set_user_reg(regs, i, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void ffa_set_regs_error(struct cpu_user_regs *regs,
|
||||
|
||||