Fix: Tidying and fixing VM's manifest parsing

Some of the parsing logs had redundant information;
The parsing of some fields didn't match the FFA spec in terms of being
an optional or mandatory definition.

Change-Id: I952ee4c132c8486bd5d7f25b3438ad9bcc32618e
Signed-off-by: J-Alves <joao.alves@arm.com>
diff --git a/inc/hf/manifest.h b/inc/hf/manifest.h
index efa345b..5c1b260 100644
--- a/inc/hf/manifest.h
+++ b/inc/hf/manifest.h
@@ -131,7 +131,7 @@
 	uintpaddr_t load_addr;
 	/** optional */
 	size_t ep_offset;
-	/**  4/16/64KB - mandatory */
+	/**  4/16/64KB - optional */
 	enum xlat_granule xlat_granule;
 	/** optional */
 	uint16_t boot_order;
@@ -145,8 +145,6 @@
 	bool has_primary_scheduler;
 	/** optional - preemptible / run to completion */
 	uint8_t runtime_model;
-	/** optional */
-	bool time_slice_mem;
 	/** optional - tuples SEPID/SMMUID/streamId */
 	uint32_t stream_ep_ids[1];
 
diff --git a/src/manifest.c b/src/manifest.c
index 0425f68..4730b4e 100644
--- a/src/manifest.c
+++ b/src/manifest.c
@@ -225,19 +225,34 @@
 	return MANIFEST_SUCCESS;
 }
 
+static enum manifest_return_code read_optional_uint8(
+	const struct fdt_node *node, const char *property,
+	uint8_t default_value, uint8_t *out)
+{
+	enum manifest_return_code ret;
+
+	ret = read_uint8(node, property, out);
+	if (ret == MANIFEST_ERROR_PROPERTY_NOT_FOUND) {
+		*out = default_value;
+		return MANIFEST_SUCCESS;
+	}
+
+	return MANIFEST_SUCCESS;
+}
+
 struct uint32list_iter {
 	struct memiter mem_it;
 };
 
-static enum manifest_return_code read_optional_uint32list(
-	const struct fdt_node *node, const char *property,
-	struct uint32list_iter *out)
+static enum manifest_return_code read_uint32list(const struct fdt_node *node,
+						 const char *property,
+						 struct uint32list_iter *out)
 {
 	struct memiter data;
 
 	if (!fdt_read_property(node, property, &data)) {
 		memiter_init(&out->mem_it, NULL, 0);
-		return MANIFEST_SUCCESS;
+		return MANIFEST_ERROR_PROPERTY_NOT_FOUND;
 	}
 
 	if ((memiter_size(&data) % sizeof(uint32_t)) != 0) {
@@ -248,6 +263,18 @@
 	return MANIFEST_SUCCESS;
 }
 
+static enum manifest_return_code read_optional_uint32list(
+	const struct fdt_node *node, const char *property,
+	struct uint32list_iter *out)
+{
+	enum manifest_return_code ret = read_uint32list(node, property, out);
+
+	if (ret == MANIFEST_ERROR_PROPERTY_NOT_FOUND) {
+		return MANIFEST_SUCCESS;
+	}
+	return ret;
+}
+
 static bool uint32list_has_next(const struct uint32list_iter *list)
 {
 	return memiter_size(&list->mem_it) > 0;
@@ -479,7 +506,7 @@
 
 		TRY(read_bool(dev_node, "exclusive-access",
 			      &dev_regions[i].exclusive_access));
-		dlog_verbose("      Exclusive_access: %d\n",
+		dlog_verbose("      Exclusive_access: %u\n",
 			     dev_regions[i].exclusive_access);
 
 		i++;
@@ -512,45 +539,47 @@
 	}
 
 	TRY(read_uint32(&root, "ffa-version", &vm->sp.ffa_version));
-	dlog_verbose("  SP expected FF-A version %d.%d\n",
+	dlog_verbose("  Expected FF-A version %u.%u\n",
 		     vm->sp.ffa_version >> 16, vm->sp.ffa_version & 0xffff);
 
-	TRY(read_optional_uint32list(&root, "uuid", &uuid));
+	TRY(read_uint32list(&root, "uuid", &uuid));
 
 	while (uint32list_has_next(&uuid) && i < 4) {
 		TRY(uint32list_get_next(&uuid, &uuid_word));
 		vm->sp.uuid.uuid[i] = uuid_word;
 		i++;
 	}
-	dlog_verbose("  SP UUID %#x-%x-%x_%x\n", vm->sp.uuid.uuid[0],
+	dlog_verbose("  UUID %#x-%x-%x-%x\n", vm->sp.uuid.uuid[0],
 		     vm->sp.uuid.uuid[1], vm->sp.uuid.uuid[2],
 		     vm->sp.uuid.uuid[3]);
 
 	TRY(read_uint16(&root, "execution-ctx-count",
 			&vm->sp.execution_ctx_count));
-	dlog_verbose("  SP number of execution context %d\n",
+	dlog_verbose("  Number of execution context %u\n",
 		     vm->sp.execution_ctx_count);
 
 	TRY(read_uint8(&root, "exception-level",
 		       (uint8_t *)&vm->sp.run_time_el));
-	dlog_verbose("  SP run-time EL %d\n", vm->sp.run_time_el);
+	dlog_verbose("  Run-time EL %u\n", vm->sp.run_time_el);
 
 	TRY(read_uint8(&root, "execution-state",
 		       (uint8_t *)&vm->sp.execution_state));
-	dlog_verbose("  SP execution state %d\n", vm->sp.execution_state);
+	dlog_verbose("  Execution state %u\n", vm->sp.execution_state);
 
-	TRY(read_uint64(&root, "load-address", &vm->sp.load_addr));
-	dlog_verbose("  SP load address %#x\n", vm->sp.load_addr);
+	TRY(read_optional_uint64(&root, "load-address", 0, &vm->sp.load_addr));
+	dlog_verbose("  Load address %#x\n", vm->sp.load_addr);
 
-	TRY(read_uint64(&root, "entrypoint-offset", &vm->sp.ep_offset));
-	dlog_verbose("  SP entry point offset %#x\n", vm->sp.ep_offset);
+	TRY(read_optional_uint64(&root, "entrypoint-offset", 0,
+				 &vm->sp.ep_offset));
+	dlog_verbose("  Entry point offset %#x\n", vm->sp.ep_offset);
 
 	TRY(read_optional_uint16(&root, "boot-order", DEFAULT_BOOT_ORDER,
 				 &vm->sp.boot_order));
-	dlog_verbose(" SP boot order %#u\n", vm->sp.boot_order);
+	dlog_verbose("  Boot order %#u\n", vm->sp.boot_order);
 
-	TRY(read_uint8(&root, "xlat-granule", (uint8_t *)&vm->sp.xlat_granule));
-	dlog_verbose("  SP translation granule %d\n", vm->sp.xlat_granule);
+	TRY(read_optional_uint8(&root, "xlat-granule", 0,
+				(uint8_t *)&vm->sp.xlat_granule));
+	dlog_verbose("  Translation granule %u\n", vm->sp.xlat_granule);
 
 	ffa_node = root;
 	if (fdt_find_child(&ffa_node, &rxtx_node_name)) {
@@ -574,7 +603,7 @@
 
 	TRY(read_uint8(&root, "messaging-method",
 		       (uint8_t *)&vm->sp.messaging_method));
-	dlog_verbose("  SP messaging method %d\n", vm->sp.messaging_method);
+	dlog_verbose("  Messaging method %u\n", vm->sp.messaging_method);
 
 	/* Parse memory-regions */
 	ffa_node = root;
@@ -613,25 +642,25 @@
 
 	if (ffa_version_major != FFA_VERSION_MAJOR ||
 	    ffa_version_minor > FFA_VERSION_MINOR) {
-		dlog_error("FF-A partition manifest version %s: %d.%d\n",
+		dlog_error("FF-A partition manifest version %s: %u.%u\n",
 			   error_string, ffa_version_major, ffa_version_minor);
 		ret_code = MANIFEST_ERROR_NOT_COMPATIBLE;
 	}
 
 	if (vm->sp.xlat_granule != PAGE_4KB) {
-		dlog_error("Translation granule %s: %d\n", error_string,
+		dlog_error("Translation granule %s: %u\n", error_string,
 			   vm->sp.xlat_granule);
 		ret_code = MANIFEST_ERROR_NOT_COMPATIBLE;
 	}
 
 	if (vm->sp.execution_state != AARCH64) {
-		dlog_error("Execution state %s: %d\n", error_string,
+		dlog_error("Execution state %s: %u\n", error_string,
 			   vm->sp.execution_state);
 		ret_code = MANIFEST_ERROR_NOT_COMPATIBLE;
 	}
 
 	if (vm->sp.run_time_el != EL1 && vm->sp.run_time_el != S_EL1) {
-		dlog_error("Exception level %s: %d\n", error_string,
+		dlog_error("Exception level %s: %u\n", error_string,
 			   vm->sp.run_time_el);
 		ret_code = MANIFEST_ERROR_NOT_COMPATIBLE;
 	}
@@ -672,7 +701,7 @@
 		return MANIFEST_ERROR_NOT_COMPATIBLE;
 	}
 
-	/* Map top of SP package as a single page to extract the header */
+	/* Map top of package as a single page to extract the header */
 	sp_pkg_start = pa_init(sp_pkg_addr);
 	sp_pkg_end = pa_add(sp_pkg_start, PAGE_SIZE);
 	sp_pkg = mm_identity_map(stage1_locked, sp_pkg_start,
@@ -680,21 +709,21 @@
 				 ppool);
 	CHECK(sp_pkg != NULL);
 
-	dlog_verbose("SP package load address %#x\n", sp_pkg_addr);
+	dlog_verbose("Package load address %#x\n", sp_pkg_addr);
 
 	if (sp_pkg->magic != SP_PKG_HEADER_MAGIC) {
-		dlog_error("Invalid SP package magic.\n");
+		dlog_error("Invalid package magic.\n");
 		goto exit_unmap;
 	}
 
 	if (sp_pkg->version != SP_PKG_HEADER_VERSION) {
-		dlog_error("Invalid SP package version.\n");
+		dlog_error("Invalid package version.\n");
 		goto exit_unmap;
 	}
 
-	/* Expect SP DTB to immediately follow header */
+	/* Expect DTB to immediately follow header */
 	if (sp_pkg->pm_offset != sizeof(struct sp_pkg_header)) {
-		dlog_error("Invalid SP package manifest offset.\n");
+		dlog_error("Invalid package manifest offset.\n");
 		goto exit_unmap;
 	}
 
@@ -702,7 +731,7 @@
 		sp_pkg->pm_size + sizeof(struct sp_pkg_header), PAGE_SIZE);
 	if ((vm_id != HF_PRIMARY_VM_ID) &&
 	    (sp_header_dtb_size >= vm->secondary.mem_size)) {
-		dlog_error("Invalid SP package header or DT size.\n");
+		dlog_error("Invalid package header or DT size.\n");
 		goto exit_unmap;
 	}
 
@@ -716,7 +745,7 @@
 	}
 
 	sp_dtb_addr = pa_add(sp_pkg_start, sp_pkg->pm_offset);
-	if (!fdt_init_from_ptr(&sp_fdt, (void *)sp_dtb_addr.pa,
+	if (!fdt_init_from_ptr(&sp_fdt, (void *)pa_addr(sp_dtb_addr),
 			       sp_pkg->pm_size)) {
 		dlog_error("FDT failed validation.\n");
 		goto exit_unmap;