FFA: Adjust 'ffa_memory_permissions_to_mode'

This function is now receiving a default mode. When permissions are not
specified, the data and instruction permissions of the return value
match what set in the default mode.
With this, the receiver's permissions of a memory send operation will
be the same to those of the sender when either the data access or
instruction are not specified.

Change-Id: I6397b4242076ca1f1142288f9424011e429ba15f
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/src/ffa_memory.c b/src/ffa_memory.c
index b4ff37a..f119d42 100644
--- a/src/ffa_memory.c
+++ b/src/ffa_memory.c
@@ -402,7 +402,7 @@
 
 /* TODO: Add device attributes: GRE, cacheability, shareability. */
 static inline uint32_t ffa_memory_permissions_to_mode(
-	ffa_memory_access_permissions_t permissions)
+	ffa_memory_access_permissions_t permissions, uint32_t default_mode)
 {
 	uint32_t mode = 0;
 
@@ -411,9 +411,11 @@
 		mode = MM_MODE_R;
 		break;
 	case FFA_DATA_ACCESS_RW:
-	case FFA_DATA_ACCESS_NOT_SPECIFIED:
 		mode = MM_MODE_R | MM_MODE_W;
 		break;
+	case FFA_DATA_ACCESS_NOT_SPECIFIED:
+		mode = (default_mode & (MM_MODE_R | MM_MODE_W));
+		break;
 	case FFA_DATA_ACCESS_RESERVED:
 		panic("Tried to convert FFA_DATA_ACCESS_RESERVED.");
 	}
@@ -422,9 +424,11 @@
 	case FFA_INSTRUCTION_ACCESS_NX:
 		break;
 	case FFA_INSTRUCTION_ACCESS_X:
-	case FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED:
 		mode |= MM_MODE_X;
 		break;
+	case FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED:
+		mode |= (default_mode & MM_MODE_X);
+		break;
 	case FFA_INSTRUCTION_ACCESS_RESERVED:
 		panic("Tried to convert FFA_INSTRUCTION_ACCESS_RESVERVED.");
 	}
@@ -519,8 +523,7 @@
 {
 	const uint32_t state_mask =
 		MM_MODE_INVALID | MM_MODE_UNOWNED | MM_MODE_SHARED;
-	const uint32_t required_from_mode =
-		ffa_memory_permissions_to_mode(permissions);
+	uint32_t required_from_mode;
 	struct ffa_value ret;
 
 	ret = constituents_get_mode(from, orig_from_mode, fragments,
@@ -546,6 +549,9 @@
 		return ffa_error(FFA_DENIED);
 	}
 
+	required_from_mode =
+		ffa_memory_permissions_to_mode(permissions, *orig_from_mode);
+
 	if ((*orig_from_mode & required_from_mode) != required_from_mode) {
 		dlog_verbose(
 			"Sender tried to send memory with permissions which "
@@ -2307,8 +2313,8 @@
 		panic("Got unexpected FFA_INSTRUCTION_ACCESS_RESERVED. Should "
 		      "be checked before this point.");
 	}
-	memory_to_attributes = ffa_memory_permissions_to_mode(permissions);
-
+	memory_to_attributes = ffa_memory_permissions_to_mode(
+		permissions, share_state->sender_orig_mode);
 	ret = ffa_retrieve_check_update(
 		to_locked, share_state->fragments,
 		share_state->fragment_constituent_counts,