From be772b40e1f12680597c4ad27548c9c08d7d877a Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Sun, 24 Feb 2019 20:22:38 -0800 Subject: [PATCH] fusee-secondary: add content metadata --- Makefile | 3 +- fusee/fusee-secondary/Makefile | 7 +- fusee/fusee-secondary/linker.ld | 35 ++++++++ fusee/fusee-secondary/src/start.s | 136 +++++++++++++++++++++++++++++- 4 files changed, 174 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 9bf986357..c7cb1e5b9 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,7 @@ TOPTARGETS := all clean dist AMSBRANCH := $(shell git symbolic-ref --short HEAD) -AMSREV := $(AMSBRANCH)-$(shell git rev-parse --short HEAD) +AMSHASH := $(shell git rev-parse --short HEAD) +AMSREV := $(AMSBRANCH)-$(AMSHASH) ifneq (, $(strip $(shell git status --porcelain 2>/dev/null))) AMSREV := $(AMSREV)-dirty diff --git a/fusee/fusee-secondary/Makefile b/fusee/fusee-secondary/Makefile index 7552e8e42..d4a0c2c91 100644 --- a/fusee/fusee-secondary/Makefile +++ b/fusee/fusee-secondary/Makefile @@ -13,7 +13,8 @@ AMS := $(TOPDIR)/../../ include $(DEVKITARM)/base_rules AMSBRANCH := $(shell git symbolic-ref --short HEAD) -AMSREV := $(AMSBRANCH)-$(shell git rev-parse --short HEAD) +AMSHASH := $(shell git rev-parse --short HEAD) +AMSREV := $(AMSBRANCH)-$(AMSHASH) ifneq (, $(strip $(shell git status --porcelain 2>/dev/null))) AMSREV := $(AMSREV)-dirty @@ -43,7 +44,7 @@ INCLUDES := include ../../common/include # options for code generation #--------------------------------------------------------------------------------- ARCH := -march=armv4t -mtune=arm7tdmi -marm -DEFINES := -D__BPMP__ -DFUSEE_STAGE2_SRC -DATMOSPHERE_GIT_BRANCH=\"$(AMSBRANCH)\" -DATMOSPHERE_GIT_REV=\"$(AMSREV)\" +DEFINES := -D__BPMP__ -DFUSEE_STAGE2_SRC -DATMOSPHERE_GIT_BRANCH=\"$(AMSBRANCH)\" -DATMOSPHERE_GIT_REV=\"$(AMSREV)\" -DATMOSPHERE_GIT_HASH=$(AMSHASH) CFLAGS := \ -g \ @@ -61,7 +62,7 @@ CFLAGS += $(INCLUDE) CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 -ASFLAGS := -g $(ARCH) +ASFLAGS := -g $(ARCH) $(INCLUDE) $(DEFINES) LDFLAGS = -specs=$(TOPDIR)/linker.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) LIBS := diff --git a/fusee/fusee-secondary/linker.ld b/fusee/fusee-secondary/linker.ld index 68d127842..a6328675a 100644 --- a/fusee/fusee-secondary/linker.ld +++ b/fusee/fusee-secondary/linker.ld @@ -157,6 +157,9 @@ SECTIONS CONSTRUCTORS . = ALIGN(32); } >main + + __data_end__ = ABSOLUTE(.); + PROVIDE (__total_size__ = (__data_end__ - __start__)); .bss (NOLOAD) : { @@ -211,4 +214,36 @@ SECTIONS .debug_str 0 : { *(.debug_str) } .debug_loc 0 : { *(.debug_loc) } .debug_macinfo 0 : { *(.debug_macinfo) } + + /* ======================= + ==== Embedded Data ==== + ======================= */ + PROVIDE(__ams_mitm_kip_start__ = ams_mitm_kip - __start__); + PROVIDE(__ams_mitm_kip_size__ = ams_mitm_kip_end - ams_mitm_kip); + PROVIDE(__boot_100_kip_start__ = boot_100_kip - __start__); + PROVIDE(__boot_100_kip_size__ = boot_100_kip_end - boot_100_kip); + PROVIDE(__boot_200_kip_start__ = boot_200_kip - __start__); + PROVIDE(__boot_200_kip_size__ = boot_200_kip_end - boot_200_kip); + PROVIDE(__exosphere_bin_start__ = exosphere_bin - __start__); + PROVIDE(__exosphere_bin_size__ = exosphere_bin_end - exosphere_bin); + PROVIDE(__fusee_primary_bin_start__ = fusee_primary_bin - __start__); + PROVIDE(__fusee_primary_bin_size__ = fusee_primary_bin_end - fusee_primary_bin); + PROVIDE(__loader_kip_start__ = loader_kip - __start__); + PROVIDE(__loader_kip_size__ = loader_kip_end - loader_kip); + PROVIDE(__lp0fw_bin_start__ = lp0fw_bin - __start__); + PROVIDE(__lp0fw_bin_size__ = lp0fw_bin_end - lp0fw_bin); + PROVIDE(__pm_kip_start__ = pm_kip - __start__); + PROVIDE(__pm_kip_size__ = pm_kip_end - pm_kip); + PROVIDE(__rebootstub_bin_start__ = rebootstub_bin - __start__); + PROVIDE(__rebootstub_bin_size__ = rebootstub_bin_end - rebootstub_bin); + PROVIDE(__sept_primary_bin_start__ = sept_primary_bin - __start__); + PROVIDE(__sept_primary_bin_size__ = sept_primary_bin_end - sept_primary_bin); + PROVIDE(__sept_secondary_enc_start__ = sept_secondary_enc - __start__); + PROVIDE(__sept_secondary_enc_size__ = sept_secondary_enc_end - sept_secondary_enc); + PROVIDE(__sm_kip_start__ = sm_kip - __start__); + PROVIDE(__sm_kip_size__ = sm_kip_end - sm_kip); + PROVIDE(__splash_screen_bmp_start__ = splash_screen_bmp - __start__); + PROVIDE(__splash_screen_bmp_size__ = splash_screen_bmp_end - splash_screen_bmp); + PROVIDE(__thermosphere_bin_start__ = thermosphere_bin - __start__); + PROVIDE(__thermosphere_bin_size__ = thermosphere_bin_end - thermosphere_bin); } diff --git a/fusee/fusee-secondary/src/start.s b/fusee/fusee-secondary/src/start.s index fcad0f23d..67d6c5c51 100644 --- a/fusee/fusee-secondary/src/start.s +++ b/fusee/fusee-secondary/src/start.s @@ -13,6 +13,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +#include .macro CLEAR_GPR_REG_ITER mov r\@, #0 @@ -20,21 +21,27 @@ .section .text.start, "ax", %progbits .arm + .align 5 .global _start .type _start, %function _start: + b _crt0 + +.word (_metadata - _start) + +_crt0: /* Switch to system mode, mask all interrupts, clear all flags */ msr cpsr_cxsf, #0xDF /* Relocate ourselves if necessary */ - ldr r2, =__start__ + ldr r2, =_start adr r3, _start cmp r2, r3 - bne _relocation_loop_end + beq _relocation_loop_end ldr r4, =__bss_start__ - sub r4, r4, r2 /* size >= 32, obviously, and we've declared 32-byte-alignment */ + sub r4, r4, r2 /* size >= 32, obviously, and weve declared 32-byte-alignment */ _relocation_loop: ldmia r3!, {r5-r12} stmia r2!, {r5-r12} @@ -60,6 +67,129 @@ _start: ldr r0, [r0] ldr r1, [r1] b main + +/* Fusee-secondary header. */ +.align 5 +_metadata: +.ascii "FSS0" +.word __total_size__ +.word (_crt0 - _start) +.word (_content_headers - _start) +.word (_content_headers_end - _content_headers) / 0x20 /* Number of content headers */ +.word 0x00010007 /* Maximum known supported HOS version: 7.0.1 */ +.word ((ATMOSPHERE_RELEASE_VERSION_MAJOR << 24) | (ATMOSPHERE_RELEASE_VERSION_MINOR << 16) | (ATMOSPHERE_RELEASE_VERSION_MICRO << 8) | (0x0)) +#define TO_WORD(x) TO_WORD_(x) +#define TO_WORD_(x) 0x##x +#define AMS_GIT_REV_WORD TO_WORD(ATMOSPHERE_GIT_HASH) +.word AMS_GIT_REV_WORD +#undef TO_WORD_ +#undef TO_WORD + +_content_headers: +/* ams_mitm content header */ +.word __ams_mitm_kip_start__ +.word __ams_mitm_kip_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "ams_mitm" +.align 5 + +/* boot_100 content header */ +.word __boot_100_kip_start__ +.word __boot_100_kip_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "boot_100" +.align 5 + +/* boot_200 content header */ +.word __boot_200_kip_start__ +.word __boot_200_kip_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "boot_200" +.align 5 + +/* exosphere content header */ +.word __exosphere_bin_start__ +.word __exosphere_bin_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "exosphere" +.align 5 + +/* fusee_primary content header */ +.word __fusee_primary_bin_start__ +.word __fusee_primary_bin_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "fusee_primary" +.align 5 + +/* loader content header */ +.word __loader_kip_start__ +.word __loader_kip_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "loader" +.align 5 + +/* lp0fw content header */ +.word __lp0fw_bin_start__ +.word __lp0fw_bin_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "lp0fw" +.align 5 + +/* pm content header */ +.word __pm_kip_start__ +.word __pm_kip_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "pm" +.align 5 + +/* rebootstub content header */ +.word __rebootstub_bin_start__ +.word __rebootstub_bin_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "rebootstub" +.align 5 + +/* sept_primary content header */ +.word __sept_primary_bin_start__ +.word __sept_primary_bin_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "sept_primary" +.align 5 + +/* sept_secondary content header */ +.word __sept_secondary_enc_start__ +.word __sept_secondary_enc_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "sept_secondary" +.align 5 + +/* sm content header */ +.word __sm_kip_start__ +.word __sm_kip_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "sm" +.align 5 + +/* splash_screen content header */ +.word __splash_screen_bmp_start__ +.word __splash_screen_bmp_size__ +.word 0xCCCCCCCC +.word 0xCCCCCCCC +.asciz "splash_screen" +.align 5 +_content_headers_end: /* No need to include this in normal programs: */ .section .chainloader.text.start, "ax", %progbits