SPCI: Add a buffer of len PAGE_SIZE to each CPU.

The buffers are used to store a copy of the contents of the Tx buffer
when handling an architected message. This is mostly relevant for
memory sharing.
There exists a single buffer per CPU.

Change-Id: I60c4eab865b01fb73825308439faa72c8af85fb2
diff --git a/src/api.c b/src/api.c
index 98c0827..1fed670 100644
--- a/src/api.c
+++ b/src/api.c
@@ -936,11 +936,9 @@
 		 * Buffer holding the internal copy of the shared memory
 		 * regions.
 		 */
-		/* TODO: Buffer is temporarily in the stack. */
-		uint8_t message_buffer
-			[sizeof(struct spci_architected_message_header) +
-			 sizeof(struct spci_memory_region_constituent) +
-			 sizeof(struct spci_memory_region)];
+		uint8_t *message_buffer = cpu_get_buffer(current->cpu->id);
+		uint32_t message_buffer_size =
+			cpu_get_buffer_size(current->cpu->id);
 
 		struct spci_architected_message_header *architected_header =
 			spci_get_architected_message_header(from->mailbox.send);
@@ -948,7 +946,7 @@
 		const struct spci_architected_message_header
 			*architected_message_replica;
 
-		if (from_msg_replica.length > sizeof(message_buffer)) {
+		if (from_msg_replica.length > message_buffer_size) {
 			ret = SPCI_INVALID_PARAMETERS;
 			goto out;
 		}
@@ -960,7 +958,7 @@
 		}
 
 		/* Copy the architected message into an internal buffer. */
-		memcpy_s(message_buffer, sizeof(message_buffer),
+		memcpy_s(message_buffer, message_buffer_size,
 			 architected_header, from_msg_replica.length);
 
 		architected_message_replica =