feat(app): add code to parse app bin headers

Add code in lib/el0_app that is able to iterate over the attached app
bins, and save the header addresses.

Modify the boot code so that the parsing function in lib/el0_app is
called

Also update the build system so that the bin gnerating/bundling scripts
are called on the apps

Change-Id: I97c93edc58bd0fea25770f1d2001c1b2742e1f13
Signed-off-by: Mate Toth-Pal <mate.toth-pal@arm.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0d94f41..c231396 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -107,6 +107,7 @@
 # Recurse into the various component subdirectories
 #
 add_subdirectory("lib")
+add_subdirectory("app")
 add_subdirectory("runtime")
 
 if(RMM_DOCS)
@@ -114,25 +115,33 @@
 endif()
 
 #
-# Copy 'rmm-runtime' executable to 'build/$<CONFIG>/rmm.elf'.
+# Copy 'rmm-runtime' executable to 'build/$<CONFIG>/rmm_core.elf'.
 #
 
 set(ARTEFACT_DIR "${CMAKE_BINARY_DIR}/$<CONFIG>")
 add_custom_command(
     COMMAND ${CMAKE_COMMAND} -E make_directory "${ARTEFACT_DIR}"
-    COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:rmm-runtime>" "${ARTEFACT_DIR}/rmm.elf"
-    OUTPUT rmm.elf
+    COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:rmm-runtime>" "${ARTEFACT_DIR}/rmm_core.elf"
+    OUTPUT rmm_core.elf
     DEPENDS rmm-runtime)
 
 #
+# Create rmm.elf as a copy of rmm_core.elf to keep CI working
+#
+add_custom_command(
+    COMMAND "${CMAKE_COMMAND}" -E copy ${ARTEFACT_DIR}/rmm_core.elf ${ARTEFACT_DIR}/rmm.elf
+    OUTPUT rmm.elf
+    DEPENDS rmm_core.elf)
+
+#
 # Create the flat binary using whatever tool comes with the toolchain.
 #
 
 if(CMAKE_OBJCOPY)
     add_custom_command(
-        COMMAND "${CMAKE_OBJCOPY}" -O binary "${ARTEFACT_DIR}/rmm.elf" "${ARTEFACT_DIR}/rmm.img"
-        OUTPUT rmm.img
-        DEPENDS rmm.elf)
+        COMMAND "${CMAKE_OBJCOPY}" -O binary "${ARTEFACT_DIR}/rmm_core.elf" "${ARTEFACT_DIR}/rmm_core.img"
+        OUTPUT rmm_core.img
+        DEPENDS rmm_core.elf)
 endif()
 
 #
@@ -141,21 +150,36 @@
 
 if(CMAKE_OBJDUMP)
     add_custom_command(
-        COMMAND "${CMAKE_OBJDUMP}" -dxS "${ARTEFACT_DIR}/rmm.elf" > "${ARTEFACT_DIR}/rmm.dump"
-        OUTPUT rmm.dump
-        DEPENDS rmm.elf)
+        COMMAND "${CMAKE_OBJDUMP}" -dxS "${ARTEFACT_DIR}/rmm_core.elf" > "${ARTEFACT_DIR}/rmm_core.dump"
+        OUTPUT rmm_core.dump
+        DEPENDS rmm_core.elf)
 endif()
 
 #
-# Copy 'rmm-runtime.map' to 'build/$<CONFIG>/rmm.map'
+# Copy 'rmm-runtime.map' to 'build/$<CONFIG>/rmm_core.map'
 #
 
 add_custom_command(
-    COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:rmm-runtime>.map" "${ARTEFACT_DIR}/rmm.map"
-    OUTPUT rmm.map
+    COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$<TARGET_FILE:rmm-runtime>.map" "${ARTEFACT_DIR}/rmm_core.map"
+    OUTPUT rmm_core.map
     DEPENDS rmm-runtime)
 
-add_custom_target(rmm ALL DEPENDS rmm.img rmm.dump rmm.elf rmm.map)
+if(NOT RMM_ARCH STREQUAL fake_host)
+    set(RMM_IMG "rmm.img")
+    find_program(BUNDLE_APP_RMM "bundle_app_rmm.py"
+        PATHS ${CMAKE_SOURCE_DIR}
+        PATH_SUFFIXES app
+        DOC "bundle_app_rmm.py")
+
+    set(BUNDLE_COMMAND_OUTPUT "${ARTEFACT_DIR}/bundle_app_out.txt")
+    add_custom_command(
+        # TODO: Call ${BUNDLE_APP_RMM} instead of copy if an app is added.
+        COMMAND "${CMAKE_COMMAND}" -E copy ${ARTEFACT_DIR}/rmm_core.img ${ARTEFACT_DIR}/${RMM_IMG} 2> ${BUNDLE_COMMAND_OUTPUT}
+        OUTPUT ${RMM_IMG}
+        DEPENDS rmm_core.img)
+endif()
+
+add_custom_target(rmm ALL DEPENDS rmm_core.img rmm_core.dump rmm_core.elf rmm.elf rmm_core.map ${RMM_IMG})
 
 #
 # Set up additional tooling.