feat(ff-a): receive boot information
Prepare secure partitions to receive boot information:
- In the partition's manifest, the GP register to receive the address in,
and the list of boot information.
- Implemented function to dump boot information.
- Update generation of SP Layout file to include offsets for image and
partition manifest.
- Change partition manifest offsets to match the information in the
SP layout.
Signed-off-by: J-Alves <joao.alves@arm.com>
Signed-off-by: Olivier Deprez <olivier.deprez@arm.com>
Change-Id: I87d2b135379d535ccaa1a3a0a822e964cca47185
diff --git a/spm/cactus/aarch64/cactus_entrypoint.S b/spm/cactus/aarch64/cactus_entrypoint.S
index 5d9f9f0..6ca342a 100644
--- a/spm/cactus/aarch64/cactus_entrypoint.S
+++ b/spm/cactus/aarch64/cactus_entrypoint.S
@@ -22,11 +22,15 @@
/* Entry reason is primary EC cold boot */
mov x19, #1
secondary_cold_entry:
- /* Saving parameter registers to temporary registers. */
- mov x10, x1
- mov x11, x2
- mov x12, x3
- mov x13, x4
+ /*
+ * x0 holds a pointer to the Boot Information Blob.
+ * Save it for later usage.
+ */
+ mov x20, x0
+
+ /* Get the vMPIDR. The SPMC passes the vCPU linear id in lower bits. */
+ mrs x0, mpidr_el1
+ bic x0, x0, #0x80000000
/* Entry reason is secondary EC cold boot */
mrs x0, mpidr_el1
@@ -81,14 +85,12 @@
add x1, x1, x0
bl fixup_gdt_reloc
- /* Jump to the C entrypoint (it does not return) */
+ /*
+ * Jump to the C entrypoint (it does not return).
+ * Pass the cold boot reason and BIB address.
+ */
0: mov x0, x19
-
- /* Restoring parameter registers before jumping to cactus_main. */
- mov x1, x10
- mov x2, x11
- mov x3, x12
- mov x4, x13
+ mov x1, x20
/* And jump to the C entrypoint. */
b cactus_main
diff --git a/spm/cactus/cactus_main.c b/spm/cactus/cactus_main.c
index dd15d97..8138565 100644
--- a/spm/cactus/cactus_main.c
+++ b/spm/cactus/cactus_main.c
@@ -138,6 +138,45 @@
(void *)get_sp_tx_end(vm_id));
}
+static void cactus_print_boot_info(struct ffa_boot_info_header *boot_info_header)
+{
+ struct ffa_boot_info_desc *boot_info_desc;
+
+ if (boot_info_header == NULL) {
+ NOTICE("SP doesn't have boot information!\n");
+ return;
+ }
+
+ VERBOSE("SP boot info:\n");
+ VERBOSE(" Signature: %x\n", boot_info_header->signature);
+ VERBOSE(" Version: %x\n", boot_info_header->version);
+ VERBOSE(" Blob Size: %u\n", boot_info_header->info_blob_size);
+ VERBOSE(" Descriptor Size: %u\n", boot_info_header->desc_size);
+ VERBOSE(" Descriptor Count: %u\n", boot_info_header->desc_count);
+
+ boot_info_desc = boot_info_header->boot_info;
+
+ if (boot_info_desc == NULL) {
+ ERROR("Boot data arguments error...\n");
+ return;
+ }
+
+ for (uint32_t i = 0; i < boot_info_header->desc_count; i++) {
+ VERBOSE(" Boot Data:\n");
+ VERBOSE(" Type: %u\n",
+ ffa_boot_info_type(&boot_info_desc[i]));
+ VERBOSE(" Type ID: %u\n",
+ ffa_boot_info_type_id(&boot_info_desc[i]));
+ VERBOSE(" Flags:\n");
+ VERBOSE(" Name Format: %x\n",
+ ffa_boot_info_name_format(&boot_info_desc[i]));
+ VERBOSE(" Content Format: %x\n",
+ ffa_boot_info_content_format(&boot_info_desc[i]));
+ VERBOSE(" Size: %u\n", boot_info_desc[i].size);
+ VERBOSE(" Value: %llx\n", boot_info_desc[i].content);
+ }
+}
+
static void cactus_plat_configure_mmu(unsigned int vm_id)
{
mmap_add_region(CACTUS_TEXT_START,
@@ -181,7 +220,8 @@
tftf_smc(&args);
}
-void __dead2 cactus_main(bool primary_cold_boot)
+void __dead2 cactus_main(bool primary_cold_boot,
+ struct ffa_boot_info_header *boot_info_header)
{
assert(IS_IN_EL1() != 0);
@@ -209,6 +249,20 @@
/* Initialize locks for tail end interrupt handler */
sp_handler_spin_lock_init();
+
+ if (boot_info_header != NULL) {
+ /*
+ * TODO: Currently just validating that cactus can
+ * access the boot info descriptors. In case we want to
+ * use the boot info contents, we should check the
+ * blob and remap if the size is bigger than one page.
+ * Only then access the contents.
+ */
+ mmap_add_dynamic_region(
+ (unsigned long long)boot_info_header,
+ (uintptr_t)boot_info_header,
+ PAGE_SIZE, MT_RO_DATA);
+ }
}
/*
@@ -234,6 +288,7 @@
set_putc_impl(PL011_AS_STDOUT);
+ cactus_print_boot_info(boot_info_header);
} else {
set_putc_impl(HVC_CALL_AS_STDOUT);
}
diff --git a/spm/cactus/plat/arm/fvp/fdts/cactus-secondary.dts b/spm/cactus/plat/arm/fvp/fdts/cactus-secondary.dts
index f377c83..12d2175 100644
--- a/spm/cactus/plat/arm/fvp/fdts/cactus-secondary.dts
+++ b/spm/cactus/plat/arm/fvp/fdts/cactus-secondary.dts
@@ -24,16 +24,13 @@
exception-level = <2>; /* S-EL1 */
execution-state = <0>; /* AARCH64 */
load-address = <0x7100000>;
- entrypoint-offset = <0x00001000>;
+ entrypoint-offset = <0x00004000>;
xlat-granule = <0>; /* 4KiB */
boot-order = <0>;
messaging-method = <3>; /* Direct messaging only */
notification-support; /* Support receipt of notifications. */
run-time-model = <0>; /* Run to completion */
- /* Boot protocol */
- gp-register-num = <0x0>;
-
rx_tx-info {
compatible = "arm,ffa-manifest-rx_tx-buffer";
rx-buffer = <&rxbuffer>;
diff --git a/spm/cactus/plat/arm/fvp/fdts/cactus-tertiary.dts b/spm/cactus/plat/arm/fvp/fdts/cactus-tertiary.dts
index 772c3d4..9251763 100644
--- a/spm/cactus/plat/arm/fvp/fdts/cactus-tertiary.dts
+++ b/spm/cactus/plat/arm/fvp/fdts/cactus-tertiary.dts
@@ -24,16 +24,13 @@
exception-level = <2>; /* S-EL1 */
execution-state = <0>; /* AARCH64 */
load-address = <0x7200000>;
- entrypoint-offset = <0x00001000>;
+ entrypoint-offset = <0x00004000>;
xlat-granule = <0>; /* 4KiB */
boot-order = <0>;
notification-support;
messaging-method = <3>; /* Direct messaging only */
run-time-model = <0>; /* Run to completion */
- /* Boot protocol */
- gp-register-num = <0x0>;
-
memory-regions {
compatible = "arm,ffa-manifest-memory-regions";
diff --git a/spm/cactus/plat/arm/fvp/fdts/cactus.dts b/spm/cactus/plat/arm/fvp/fdts/cactus.dts
index 34e59fa..3c011c9 100644
--- a/spm/cactus/plat/arm/fvp/fdts/cactus.dts
+++ b/spm/cactus/plat/arm/fvp/fdts/cactus.dts
@@ -24,7 +24,7 @@
exception-level = <2>; /* S-EL1 */
execution-state = <0>; /* AARCH64 */
load-address = <0x7000000>;
- entrypoint-offset = <0x00001000>;
+ entrypoint-offset = <0x00002000>;
xlat-granule = <0>; /* 4KiB */
boot-order = <0>;
messaging-method = <3>; /* Direct messaging only */
@@ -33,7 +33,13 @@
run-time-model = <0>; /* Run to completion */
/* Boot protocol */
- gp-register-num = <0x0>;
+ gp-register-num = <0>;
+
+ /* Boot Info */
+ boot-info {
+ compatible = "arm,ffa-manifest-boot-info";
+ ffa_manifest;
+ };
rx_tx-info {
compatible = "arm,ffa-manifest-rx_tx-buffer";
diff --git a/spm/cactus/plat/arm/tc0/fdts/cactus-secondary.dts b/spm/cactus/plat/arm/tc0/fdts/cactus-secondary.dts
index 2baa8b9..13d489c 100644
--- a/spm/cactus/plat/arm/tc0/fdts/cactus-secondary.dts
+++ b/spm/cactus/plat/arm/tc0/fdts/cactus-secondary.dts
@@ -22,16 +22,13 @@
exception-level = <2>; /* S-EL1 */
execution-state = <0>; /* AARCH64 */
load-address = <0xfe100000>;
- entrypoint-offset = <0x00001000>;
+ entrypoint-offset = <0x00004000>;
xlat-granule = <0>; /* 4KiB */
boot-order = <0>;
messaging-method = <3>; /* Direct messaging only */
notification-support; /* Support receipt of notifications. */
run-time-model = <1>; /* Run to completion */
- /* Boot protocol */
- gp-register-num = <0x0>;
-
rx_tx-info {
compatible = "arm,ffa-manifest-rx_tx-buffer";
rx-buffer = <&rxbuffer>;
diff --git a/spm/cactus/plat/arm/tc0/fdts/cactus-tertiary.dts b/spm/cactus/plat/arm/tc0/fdts/cactus-tertiary.dts
index da62d3b..807d1dd 100644
--- a/spm/cactus/plat/arm/tc0/fdts/cactus-tertiary.dts
+++ b/spm/cactus/plat/arm/tc0/fdts/cactus-tertiary.dts
@@ -22,16 +22,13 @@
exception-level = <2>; /* S-EL1 */
execution-state = <0>; /* AARCH64 */
load-address = <0xfe200000>;
- entrypoint-offset = <0x00001000>;
+ entrypoint-offset = <0x00004000>;
xlat-granule = <0>; /* 4KiB */
boot-order = <0>;
messaging-method = <3>; /* Direct messaging only */
notification-support; /* Support receipt of notifications. */
run-time-model = <1>; /* Run to completion */
- /* Boot protocol */
- gp-register-num = <0x0>;
-
memory-regions {
compatible = "arm,ffa-manifest-memory-regions";
diff --git a/spm/cactus/plat/arm/tc0/fdts/cactus.dts b/spm/cactus/plat/arm/tc0/fdts/cactus.dts
index 64daa3d..99d3ae8 100644
--- a/spm/cactus/plat/arm/tc0/fdts/cactus.dts
+++ b/spm/cactus/plat/arm/tc0/fdts/cactus.dts
@@ -22,7 +22,7 @@
exception-level = <2>; /* S-EL1 */
execution-state = <0>; /* AARCH64 */
load-address = <0xfe000000>;
- entrypoint-offset = <0x00001000>;
+ entrypoint-offset = <0x00002000>;
xlat-granule = <0>; /* 4KiB */
boot-order = <0>;
messaging-method = <3>; /* Direct messaging only */
@@ -31,7 +31,13 @@
run-time-model = <1>; /* Run to completion */
/* Boot protocol */
- gp-register-num = <0x0>;
+ gp-register-num = <0>;
+
+ /* Boot Info */
+ boot-info {
+ compatible = "arm,ffa-manifest-boot-info";
+ ffa_manifest;
+ };
rx_tx-info {
compatible = "arm,ffa-manifest-rx_tx-buffer";
diff --git a/spm/ivy/app/plat/arm/fvp/fdts/ivy.dts b/spm/ivy/app/plat/arm/fvp/fdts/ivy.dts
index 461abe4..d368076 100644
--- a/spm/ivy/app/plat/arm/fvp/fdts/ivy.dts
+++ b/spm/ivy/app/plat/arm/fvp/fdts/ivy.dts
@@ -21,7 +21,7 @@
exception-level = <2>; /* S-EL1 */
execution-state = <0>; /* AARCH64 */
load-address = <0x7600000>;
- entrypoint-offset = <0x00001000>;
+ entrypoint-offset = <0x00004000>;
xlat-granule = <0>; /* 4KiB */
boot-order = <0>;
messaging-method = <3>; /* Direct messaging only */
diff --git a/spm/ivy/app/plat/arm/tc0/fdts/ivy.dts b/spm/ivy/app/plat/arm/tc0/fdts/ivy.dts
index 0f74358..405dca7 100644
--- a/spm/ivy/app/plat/arm/tc0/fdts/ivy.dts
+++ b/spm/ivy/app/plat/arm/tc0/fdts/ivy.dts
@@ -24,7 +24,7 @@
exception-level = <2>; /* S-EL1 */
execution-state = <0>; /* AARCH64 */
load-address = <0xfe600000>;
- entrypoint-offset = <0x00001000>;
+ entrypoint-offset = <0x00004000>;
xlat-granule = <0>; /* 4KiB */
boot-order = <0>;
messaging-method = <3>; /* Direct messaging only */
diff --git a/tools/generate_json/generate_json.sh b/tools/generate_json/generate_json.sh
index 3a3c04f..d1b861f 100755
--- a/tools/generate_json/generate_json.sh
+++ b/tools/generate_json/generate_json.sh
@@ -21,14 +21,20 @@
# different partition manifests.
if [ "$1" == "cactus" ]; then
echo -e "{\n\t\"$1-primary\" : {\n \
- \t\"image\": \"$1.bin\",\n \
- \t\"pm\": \"$1.dts\",\n \
+ \t\"image\": {\n \
+ \t\t\"file\": \"$1.bin\",\n \
+ \t\t\"offset\":\"0x2000\"\n\
+ \t},\n \
+ \t\"pm\": {\n \
+ \t\t\"file\": \"$1.dts\",\n \
+ \t\t\"offset\":\"0x1000\"\n\
+ \t},\n
\t\"owner\": \"SiP\"\n\t},\n\n\t\"$1-secondary\" : {\n \
\t\"image\": \"$1.bin\",\n \
\t\"pm\": \"$1-secondary.dts\",\n \
\t\"owner\": \"Plat\"\n\t},\n\n\t\"$1-tertiary\" : {\n \
\t\"image\": \"$1.bin\",\n \
- \t\"pm\": \"$1-tertiary.dts\", \n \
+ \t\"pm\": \"$1-tertiary.dts\",\n \
\t\"owner\": \"Plat\"\n\t},\n\n\t\"ivy\" : {\n \
\t\"image\": \"ivy.bin\",\n \
\t\"pm\": \"ivy.dts\", \n \