Pass an FDT to the unit test VMs
Instead of passing the assigned memory size, optionally pass the
FDT to the secondary VMs. The VMs can extract the memory size, as
well as other potentially useful information from the FDT.
This is done to facilitate using the same unit test framework
with kvm-unit-tests, which expects an FDT, as does the Linux
kernel.
Change-Id: I436d86b3f4d1540c1995e01e48289f39e2c23490
Signed-off-by: Fuad Tabba <tabba@google.com>
diff --git a/inc/hf/addr.h b/inc/hf/addr.h
index 00e77c1..efb1844 100644
--- a/inc/hf/addr.h
+++ b/inc/hf/addr.h
@@ -13,6 +13,8 @@
#include "hf/arch/types.h"
+#include "hf/check.h"
+
/** An opaque type for a physical address. */
typedef struct {
uintpaddr_t pa;
@@ -69,6 +71,15 @@
}
/**
+ * Subtract from a physical address.
+ */
+static inline paddr_t pa_sub(paddr_t pa, size_t n)
+{
+ CHECK((uintptr_t)pa_addr(pa) >= n);
+ return pa_init(pa_addr(pa) - n);
+}
+
+/**
* Extracts the absolute intermediate physical address.
*/
static inline uintpaddr_t ipa_addr(ipaddr_t ipa)
diff --git a/inc/hf/fdt_handler.h b/inc/hf/fdt_handler.h
index 8fe0831..0a5e341 100644
--- a/inc/hf/fdt_handler.h
+++ b/inc/hf/fdt_handler.h
@@ -17,12 +17,15 @@
#define FDT_PROP_INITRD_START "linux,initrd-start"
#define FDT_PROP_INITRD_END "linux,initrd-end"
+bool fdt_struct_from_ptr(const void *fdt_ptr, struct fdt *fdt);
bool fdt_map(struct fdt *fdt, struct mm_stage1_locked stage1_locked,
paddr_t fdt_addr, struct mpool *ppool);
bool fdt_unmap(struct fdt *fdt, struct mm_stage1_locked stage1_locked,
struct mpool *ppool);
bool fdt_find_cpus(const struct fdt *fdt, cpu_id_t *cpu_ids, size_t *cpu_count);
-bool fdt_find_memory_ranges(const struct fdt *fdt, struct string *device_type,
+bool fdt_find_memory_ranges(const struct fdt *fdt,
+ const struct string *device_type,
struct mem_range *mem_ranges,
size_t *mem_ranges_count, size_t mem_range_limit);
bool fdt_find_initrd(const struct fdt *fdt, paddr_t *begin, paddr_t *end);
+bool fdt_get_memory_size(const struct fdt *fdt, size_t *size);
diff --git a/inc/hf/fdt_patch.h b/inc/hf/fdt_patch.h
index 4ba571c..8a5d3a0 100644
--- a/inc/hf/fdt_patch.h
+++ b/inc/hf/fdt_patch.h
@@ -15,3 +15,8 @@
/** Apply an update to the FDT. */
bool fdt_patch(struct mm_stage1_locked stage1_locked, paddr_t fdt_addr,
struct boot_params_update *p, struct mpool *ppool);
+
+/** Patches a secondary VM's FDT with the location of its memory range. */
+bool fdt_patch_mem(struct mm_stage1_locked stage1_locked, paddr_t fdt_addr,
+ size_t fdt_max_size, paddr_t mem_begin, paddr_t mem_end,
+ struct mpool *ppool);
diff --git a/inc/hf/manifest.h b/inc/hf/manifest.h
index a5ce7cb..9e571b1 100644
--- a/inc/hf/manifest.h
+++ b/inc/hf/manifest.h
@@ -134,6 +134,7 @@
struct {
uint64_t mem_size;
ffa_vcpu_count_t vcpu_count;
+ struct string fdt_filename;
} secondary;
};
};