fix(memory sharing): memory attributes checks

In [1] we enforced that the sender of memory sharing call, should
specify the memory attributes supported by Hafnium. Though this remains
true for a FFA_MEM_SHARE call, this differs to what the spec mandates
for FFA_MEM_DONATE and FFA_MEM_LEND with single borrower. According
to section 10.10.4.2 of FF-A v1.1 EAC0 specification, in those cases the
memory attributes shall remain unspecified.

This patch fixes the checks in the handling of memory sharing calls,
and the tests that were affected by this change.

[1] https://review.trustedfirmware.org/c/hafnium/hafnium/+/13338

Change-Id: I125fbbe4213eb8cfadb53d8fd57ff8e7207dd4e6
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/src/ffa_memory.c b/src/ffa_memory.c
index dfe31de..1cd8c5e 100644
--- a/src/ffa_memory.c
+++ b/src/ffa_memory.c
@@ -1529,13 +1529,29 @@
 	}
 
 	/*
-	 * Check that sender's memory attributes match Hafnium expectations:
-	 * Normal Memory, Inner shareable, Write-Back Read-Allocate
-	 * Write-Allocate Cacheable.
+	 * If a memory donate or lend with single borrower, the memory type
+	 * shall not be specified by the sender.
 	 */
-	ret = ffa_memory_attributes_validate(memory_region->attributes);
-	if (ret.func != FFA_SUCCESS_32) {
-		return ret;
+	if (share_func == FFA_MEM_DONATE_32 ||
+	    (share_func == FFA_MEM_LEND_32 &&
+	     memory_region->receiver_count == 1)) {
+		if (ffa_get_memory_type_attr(memory_region->attributes) !=
+		    FFA_MEMORY_NOT_SPECIFIED_MEM) {
+			dlog_verbose(
+				"Memory type shall not be specified by "
+				"sender.\n");
+			return ffa_error(FFA_INVALID_PARAMETERS);
+		}
+	} else {
+		/*
+		 * Check that sender's memory attributes match Hafnium
+		 * expectations: Normal Memory, Inner shareable, Write-Back
+		 * Read-Allocate Write-Allocate Cacheable.
+		 */
+		ret = ffa_memory_attributes_validate(memory_region->attributes);
+		if (ret.func != FFA_SUCCESS_32) {
+			return ret;
+		}
 	}
 
 	return (struct ffa_value){.func = FFA_SUCCESS_32};
diff --git a/test/vmapi/common/ffa.c b/test/vmapi/common/ffa.c
index 31a2517..6e57ae6 100644
--- a/test/vmapi/common/ffa.c
+++ b/test/vmapi/common/ffa.c
@@ -63,7 +63,9 @@
 	remaining_constituent_count = ffa_memory_region_init(
 		tx_buffer, HF_MAILBOX_SIZE, sender, recipient, constituents,
 		constituent_count, 0, flags, send_data_access,
-		send_instruction_access, FFA_MEMORY_NORMAL_MEM,
+		send_instruction_access,
+		share_func == FFA_MEM_SHARE_32 ? FFA_MEMORY_NORMAL_MEM
+					       : FFA_MEMORY_NOT_SPECIFIED_MEM,
 		FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE,
 		&total_length, &fragment_length);
 	if (remaining_constituent_count == 0) {
@@ -161,7 +163,9 @@
 	remaining_constituent_count = ffa_memory_region_init(
 		tx_buffer, HF_MAILBOX_SIZE, sender, recipient, constituents,
 		constituent_count, 0, flags, send_data_access,
-		send_instruction_access, FFA_MEMORY_NORMAL_MEM,
+		send_instruction_access,
+		share_func == FFA_MEM_SHARE_32 ? FFA_MEMORY_NORMAL_MEM
+					       : FFA_MEMORY_NOT_SPECIFIED_MEM,
 		FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE,
 		&total_length, &fragment_length);
 	EXPECT_EQ(remaining_constituent_count, 0);
diff --git a/test/vmapi/el0_partitions/memory_sharing.c b/test/vmapi/el0_partitions/memory_sharing.c
index 3756d7d..d85d3a3 100644
--- a/test/vmapi/el0_partitions/memory_sharing.c
+++ b/test/vmapi/el0_partitions/memory_sharing.c
@@ -1586,7 +1586,7 @@
 				  ARRAY_SIZE(constituents), 0, 0,
 				  FFA_DATA_ACCESS_NOT_SPECIFIED,
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-				  FFA_MEMORY_NORMAL_MEM,
+				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
@@ -1600,7 +1600,8 @@
 			  SERVICE_VM1, constituents, ARRAY_SIZE(constituents),
 			  0, 0, FFA_DATA_ACCESS_NOT_SPECIFIED,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
+			  FFA_MEMORY_NOT_SPECIFIED_MEM,
+			  FFA_MEMORY_CACHE_WRITE_BACK,
 			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
@@ -1651,7 +1652,7 @@
 				  ARRAY_SIZE(constituents), 0, 0,
 				  FFA_DATA_ACCESS_NOT_SPECIFIED,
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-				  FFA_MEMORY_NORMAL_MEM,
+				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
@@ -1665,7 +1666,8 @@
 			  SERVICE_VM1, constituents, ARRAY_SIZE(constituents),
 			  0, 0, FFA_DATA_ACCESS_NOT_SPECIFIED,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
+			  FFA_MEMORY_NOT_SPECIFIED_MEM,
+			  FFA_MEMORY_CACHE_WRITE_BACK,
 			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
@@ -1736,7 +1738,7 @@
 				  ARRAY_SIZE(constituents), 0, 0,
 				  FFA_DATA_ACCESS_RO,
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-				  FFA_MEMORY_NORMAL_MEM,
+				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
@@ -2048,11 +2050,6 @@
 	struct mailbox_buffers mb = set_up_mailbox();
 	uint32_t msg_size;
 
-	struct ffa_value (*send_function[])(uint32_t, uint32_t) = {
-		ffa_mem_share,
-		ffa_mem_lend,
-	};
-
 	struct ffa_memory_region_constituent constituents[] = {
 		{.address = (uint64_t)pages, .page_count = 2},
 		{.address = (uint64_t)pages + PAGE_SIZE * 3, .page_count = 1},
@@ -2090,11 +2087,9 @@
 			  0);
 
 		/* Call the various mem send functions on the same region. */
-		for (uint32_t j = 0; j < ARRAY_SIZE(send_function); j++) {
-			ret = send_function[j](msg_size, msg_size);
-			EXPECT_EQ(ret.func, FFA_ERROR_32);
-			EXPECT_TRUE(ffa_error_code(ret) == FFA_DENIED);
-		}
+		ret = ffa_mem_share(msg_size, msg_size);
+		EXPECT_EQ(ret.func, FFA_ERROR_32);
+		EXPECT_EQ(ffa_error_code(ret), FFA_DENIED);
 	}
 }
 
@@ -2130,12 +2125,14 @@
 				  ARRAY_SIZE(constituents), 0, 0,
 				  FFA_DATA_ACCESS_RW,
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-				  FFA_MEMORY_NORMAL_MEM,
+				  send_function[i] == ffa_mem_share
+					  ? FFA_MEMORY_NORMAL_MEM
+					  : FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
 
-		ret = send_function[0](msg_size, msg_size);
+		ret = send_function[i](msg_size, msg_size);
 		EXPECT_EQ(ret.func, FFA_SUCCESS_32);
 
 		handle = ffa_mem_success_handle(ret);
@@ -2208,7 +2205,9 @@
 				  ARRAY_SIZE(constituents), 0, 0,
 				  FFA_DATA_ACCESS_RW,
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-				  FFA_MEMORY_NORMAL_MEM,
+				  send_function[i] == ffa_mem_share
+					  ? FFA_MEMORY_NORMAL_MEM
+					  : FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
@@ -2336,7 +2335,8 @@
 			  SERVICE_VM1, constituents, ARRAY_SIZE(constituents),
 			  0, 0, FFA_DATA_ACCESS_RO,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
+			  FFA_MEMORY_NOT_SPECIFIED_MEM,
+			  FFA_MEMORY_CACHE_WRITE_BACK,
 			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 		  0);
 
diff --git a/test/vmapi/el0_partitions/services/memory.c b/test/vmapi/el0_partitions/services/memory.c
index 38221cd..81212bd 100644
--- a/test/vmapi/el0_partitions/services/memory.c
+++ b/test/vmapi/el0_partitions/services/memory.c
@@ -280,8 +280,9 @@
 			send_buf, HF_MAILBOX_SIZE, hf_vm_get_id(), SERVICE_VM2,
 			&constituent, 1, 0, 0, FFA_DATA_ACCESS_NOT_SPECIFIED,
 			FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-			FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			FFA_MEMORY_NOT_SPECIFIED_MEM,
+			FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE,
+			NULL, &msg_size),
 		0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
 
diff --git a/test/vmapi/primary_with_secondaries/memory_sharing.c b/test/vmapi/primary_with_secondaries/memory_sharing.c
index 9d7706f..aa07e79 100644
--- a/test/vmapi/primary_with_secondaries/memory_sharing.c
+++ b/test/vmapi/primary_with_secondaries/memory_sharing.c
@@ -271,7 +271,8 @@
 			  SERVICE_VM1, constituents, ARRAY_SIZE(constituents),
 			  0, 0, FFA_DATA_ACCESS_NOT_SPECIFIED,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
+			  FFA_MEMORY_NOT_SPECIFIED_MEM,
+			  FFA_MEMORY_CACHE_WRITE_BACK,
 			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 		  0);
 
@@ -296,7 +297,8 @@
 			  SERVICE_VM1, constituents, ARRAY_SIZE(constituents),
 			  0, 0, FFA_DATA_ACCESS_RW,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
+			  FFA_MEMORY_NOT_SPECIFIED_MEM,
+			  FFA_MEMORY_CACHE_WRITE_BACK,
 			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 		  0);
 
@@ -1720,7 +1722,7 @@
 				  ARRAY_SIZE(constituents), 0, 0,
 				  FFA_DATA_ACCESS_NOT_SPECIFIED,
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-				  FFA_MEMORY_NORMAL_MEM,
+				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
@@ -1734,7 +1736,8 @@
 			  SERVICE_VM1, constituents, ARRAY_SIZE(constituents),
 			  0, 0, FFA_DATA_ACCESS_NOT_SPECIFIED,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
+			  FFA_MEMORY_NOT_SPECIFIED_MEM,
+			  FFA_MEMORY_CACHE_WRITE_BACK,
 			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
@@ -1785,7 +1788,7 @@
 				  ARRAY_SIZE(constituents), 0, 0,
 				  FFA_DATA_ACCESS_NOT_SPECIFIED,
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-				  FFA_MEMORY_NORMAL_MEM,
+				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
@@ -1799,7 +1802,8 @@
 			  SERVICE_VM1, constituents, ARRAY_SIZE(constituents),
 			  0, 0, FFA_DATA_ACCESS_NOT_SPECIFIED,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
+			  FFA_MEMORY_NOT_SPECIFIED_MEM,
+			  FFA_MEMORY_CACHE_WRITE_BACK,
 			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 		  0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
@@ -1870,7 +1874,7 @@
 				  ARRAY_SIZE(constituents), 0, 0,
 				  FFA_DATA_ACCESS_RO,
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-				  FFA_MEMORY_NORMAL_MEM,
+				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
@@ -2185,11 +2189,6 @@
 	struct mailbox_buffers mb = set_up_mailbox();
 	uint32_t msg_size;
 
-	struct ffa_value (*send_function[])(uint32_t, uint32_t) = {
-		ffa_mem_share,
-		ffa_mem_lend,
-	};
-
 	struct ffa_memory_region_constituent constituents[] = {
 		{.address = (uint64_t)pages, .page_count = 2},
 		{.address = (uint64_t)pages + PAGE_SIZE * 3, .page_count = 1},
@@ -2227,11 +2226,9 @@
 			  0);
 
 		/* Call the various mem send functions on the same region. */
-		for (uint32_t j = 0; j < ARRAY_SIZE(send_function); j++) {
-			ret = send_function[j](msg_size, msg_size);
-			EXPECT_EQ(ret.func, FFA_ERROR_32);
-			EXPECT_EQ(ffa_error_code(ret), FFA_DENIED);
-		}
+		ret = ffa_mem_share(msg_size, msg_size);
+		EXPECT_EQ(ret.func, FFA_ERROR_32);
+		EXPECT_EQ(ffa_error_code(ret), FFA_DENIED);
 	}
 }
 
@@ -2274,7 +2271,9 @@
 				  ARRAY_SIZE(constituents), 0, 0,
 				  FFA_DATA_ACCESS_RW,
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-				  FFA_MEMORY_NORMAL_MEM,
+				  send_function[i] == ffa_mem_share
+					  ? FFA_MEMORY_NORMAL_MEM
+					  : FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
@@ -2355,7 +2354,9 @@
 				  ARRAY_SIZE(constituents), 0, 0,
 				  FFA_DATA_ACCESS_RW,
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-				  FFA_MEMORY_NORMAL_MEM,
+				  send_function[i] == ffa_mem_share
+					  ? FFA_MEMORY_NORMAL_MEM
+					  : FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
@@ -2483,7 +2484,8 @@
 			  SERVICE_VM1, constituents, ARRAY_SIZE(constituents),
 			  0, 0, FFA_DATA_ACCESS_RO,
 			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
+			  FFA_MEMORY_NOT_SPECIFIED_MEM,
+			  FFA_MEMORY_CACHE_WRITE_BACK,
 			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 		  0);
 
@@ -2549,7 +2551,7 @@
 					  ? FFA_DATA_ACCESS_RW
 					  : FFA_DATA_ACCESS_NOT_SPECIFIED,
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-				  FFA_MEMORY_NORMAL_MEM,
+				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
@@ -2622,7 +2624,9 @@
 					  ? FFA_DATA_ACCESS_RW
 					  : FFA_DATA_ACCESS_NOT_SPECIFIED,
 				  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-				  FFA_MEMORY_NORMAL_MEM,
+				  send_function[i] == ffa_mem_share
+					  ? FFA_MEMORY_NORMAL_MEM
+					  : FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
diff --git a/test/vmapi/primary_with_secondaries/services/memory.c b/test/vmapi/primary_with_secondaries/services/memory.c
index 315fe26..2e421ca 100644
--- a/test/vmapi/primary_with_secondaries/services/memory.c
+++ b/test/vmapi/primary_with_secondaries/services/memory.c
@@ -289,8 +289,9 @@
 			send_buf, HF_MAILBOX_SIZE, hf_vm_get_id(), SERVICE_VM2,
 			&constituent, 1, 0, 0, FFA_DATA_ACCESS_NOT_SPECIFIED,
 			FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-			FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+			FFA_MEMORY_NOT_SPECIFIED_MEM,
+			FFA_MEMORY_CACHE_WRITE_BACK, FFA_MEMORY_INNER_SHAREABLE,
+			NULL, &msg_size),
 		0);
 	EXPECT_FFA_ERROR(ffa_mem_donate(msg_size, msg_size), FFA_DENIED);
 
@@ -769,7 +770,7 @@
 				  send_buf, HF_MAILBOX_SIZE, HF_PRIMARY_VM_ID,
 				  SERVICE_VM2, &constituent_copy, 1, 0, 0,
 				  FFA_DATA_ACCESS_RW, FFA_INSTRUCTION_ACCESS_X,
-				  FFA_MEMORY_NORMAL_MEM,
+				  FFA_MEMORY_NOT_SPECIFIED_MEM,
 				  FFA_MEMORY_CACHE_WRITE_BACK,
 				  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
 			  0);
diff --git a/test/vmapi/primary_with_secondaries/services/unmapped.c b/test/vmapi/primary_with_secondaries/services/unmapped.c
index a214cc0..0385b2d 100644
--- a/test/vmapi/primary_with_secondaries/services/unmapped.c
+++ b/test/vmapi/primary_with_secondaries/services/unmapped.c
@@ -36,14 +36,15 @@
 		{.address = (uint64_t)(&pages[PAGE_SIZE]), .page_count = 1},
 	};
 	uint32_t msg_size;
-	EXPECT_EQ(ffa_memory_region_init(
-			  send_buf, HF_MAILBOX_SIZE, hf_vm_get_id(),
-			  HF_PRIMARY_VM_ID, constituents,
-			  ARRAY_SIZE(constituents), 0, 0,
-			  FFA_DATA_ACCESS_NOT_SPECIFIED,
-			  FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
-			  FFA_MEMORY_NORMAL_MEM, FFA_MEMORY_CACHE_WRITE_BACK,
-			  FFA_MEMORY_INNER_SHAREABLE, NULL, &msg_size),
+	EXPECT_EQ(ffa_memory_region_init(send_buf, HF_MAILBOX_SIZE,
+					 hf_vm_get_id(), HF_PRIMARY_VM_ID,
+					 constituents, ARRAY_SIZE(constituents),
+					 0, 0, FFA_DATA_ACCESS_NOT_SPECIFIED,
+					 FFA_INSTRUCTION_ACCESS_NOT_SPECIFIED,
+					 FFA_MEMORY_NOT_SPECIFIED_MEM,
+					 FFA_MEMORY_CACHE_WRITE_BACK,
+					 FFA_MEMORY_INNER_SHAREABLE, NULL,
+					 &msg_size),
 		  0);
 	exception_setup(NULL, exception_handler_yield_data_abort);