summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Bonnici <marc.bonnici@arm.com>2021-10-25 11:20:39 +0100
committerMarc Bonnici <marc.bonnici@arm.com>2021-10-26 09:12:41 +0100
commit278e7a0660b1b52817885234db5ba48fe0a29eee (patch)
treed52f0c3955a332177b9807cb8ac3ba0365d87e81
parenta30bf95b02bacca6e1946ac581b1faeb31a4ce6f (diff)
downloadarm-trusted-firmware-278e7a0660b1b52817885234db5ba48fe0a29eee.tar.gz
spmc: Fix mailbox spinlock error paths
Ensure we release the mailbox spinlock in the case of failure. Signed-off-by: Marc Bonnici <marc.bonnici@arm.com>
-rw-r--r--services/std_svc/spm/spmc/spmc_main.c2
-rw-r--r--services/std_svc/spm/spmc/spmc_shared_mem.c2
2 files changed, 4 insertions, 0 deletions
diff --git a/services/std_svc/spm/spmc/spmc_main.c b/services/std_svc/spm/spmc/spmc_main.c
index ccfe619a4..a00ddf541 100644
--- a/services/std_svc/spm/spmc/spmc_main.c
+++ b/services/std_svc/spm/spmc/spmc_main.c
@@ -210,6 +210,7 @@ static uint64_t partition_info_get_handler(uint32_t smc_fid,
spin_lock(&mbox->lock);
if (mbox->state != MAILBOX_STATE_EMPTY) {
+ spin_unlock(&mbox->lock);
return spmc_ffa_error_return(handle, FFA_ERROR_BUSY);
}
mbox->state = MAILBOX_STATE_FULL;
@@ -739,6 +740,7 @@ static uint64_t rx_release_handler(uint32_t smc_fid,
spin_lock(&mbox->lock);
if (mbox->state != MAILBOX_STATE_FULL) {
+ spin_unlock(&mbox->lock);
return spmc_ffa_error_return(handle, FFA_ERROR_DENIED);
}
mbox->state = MAILBOX_STATE_EMPTY;
diff --git a/services/std_svc/spm/spmc/spmc_shared_mem.c b/services/std_svc/spm/spmc/spmc_shared_mem.c
index 69e345dbc..2f7f45b5e 100644
--- a/services/std_svc/spm/spmc/spmc_shared_mem.c
+++ b/services/std_svc/spm/spmc/spmc_shared_mem.c
@@ -491,6 +491,7 @@ spmc_ffa_mem_retrieve_req(uint32_t smc_fid,
spin_lock(&mbox->lock);
if (mbox->state != MAILBOX_STATE_EMPTY) {
+ spin_unlock(&mbox->lock);
WARN("%s: RX Buffer is full! \n", __func__);
return spmc_ffa_error_return(handle, FFA_ERROR_DENIED);
}
@@ -643,6 +644,7 @@ long spmc_ffa_mem_frag_rx(uint32_t smc_fid,
spin_lock(&mbox->lock);
if (mbox->state != MAILBOX_STATE_EMPTY) {
+ spin_unlock(&mbox->lock);
WARN("%s: RX Buffer is full! \n", __func__);
return spmc_ffa_error_return(handle, FFA_ERROR_DENIED);
}