From c8f2d17d02ab2a999b23603849a3b34938f75d0b Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Fri, 14 Jun 2019 18:19:10 -0700 Subject: [PATCH] sept: fix undefined behavior with emummc --- sept/sept-primary/Makefile | 15 +++++---------- sept/sept-primary/linker.ld | 4 ++-- sept/sept-primary/src/main.c | 2 +- sept/sept-primary/src/start.s | 4 ++++ sept/sept-primary/src/utils.c | 25 +------------------------ sept/sept-primary/src/utils.h | 1 - 6 files changed, 13 insertions(+), 38 deletions(-) diff --git a/sept/sept-primary/Makefile b/sept/sept-primary/Makefile index 107b32f55..96a026436 100644 --- a/sept/sept-primary/Makefile +++ b/sept/sept-primary/Makefile @@ -39,7 +39,7 @@ DEFINES := -D__BPMP__ -DFUSEE_STAGE1_SRC -DATMOSPHERE_GIT_BRANCH=\"$(AMSBRANCH)\ CFLAGS := \ -g \ - -O2 \ + -Os \ -fomit-frame-pointer \ -ffunction-sections \ -fdata-sections \ @@ -76,15 +76,14 @@ export OUTPUT := $(CURDIR)/$(TARGET) export TOPDIR := $(CURDIR) export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ - $(foreach dir,$(DATA),$(CURDIR)/$(dir)) \ - $(AMS)/exosphere/rebootstub + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) export DEPSDIR := $(CURDIR)/$(BUILD) CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) -BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) rebootstub.bin +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) #--------------------------------------------------------------------------------- # use CXX for linking C++ projects, CC for standard C @@ -111,13 +110,10 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) -.PHONY: $(BUILD) clean all check_rebootstub +.PHONY: $(BUILD) clean all #--------------------------------------------------------------------------------- -all: check_rebootstub $(BUILD) - -check_rebootstub: - @$(MAKE) -C $(AMS)/exosphere/rebootstub all +all: $(BUILD) $(BUILD): @[ -d $@ ] || mkdir -p $@ @@ -126,7 +122,6 @@ $(BUILD): #--------------------------------------------------------------------------------- clean: @echo clean ... - @$(MAKE) -C $(AMS)/exosphere/rebootstub clean @rm -fr $(BUILD) $(TARGET).bin $(TARGET).elf diff --git a/sept/sept-primary/linker.ld b/sept/sept-primary/linker.ld index 7d135168c..56e9f66cd 100644 --- a/sept/sept-primary/linker.ld +++ b/sept/sept-primary/linker.ld @@ -12,7 +12,7 @@ PHDRS MEMORY { NULL : ORIGIN = 0x00000000, LENGTH = 0x1000 - main : ORIGIN = 0x40010040, LENGTH = 0x1000 + main : ORIGIN = 0x40010000, LENGTH = 0x1000 high_iram : ORIGIN = 0x4003F000, LENGTH = 0x1000 low_iram : ORIGIN = 0x40003000, LENGTH = 0x8000 } @@ -20,7 +20,7 @@ MEMORY SECTIONS { PROVIDE(__crt0_start__ = 0x4003F000); - PROVIDE(__main_start__ = 0x40010040); + PROVIDE(__main_start__ = 0x40010000); PROVIDE(__stack_top__ = 0x40010000); PROVIDE(__stack_bottom__ = 0x4000C000); PROVIDE(__heap_start__ = 0); diff --git a/sept/sept-primary/src/main.c b/sept/sept-primary/src/main.c index 5a55f44e2..62a5c15d6 100644 --- a/sept/sept-primary/src/main.c +++ b/sept/sept-primary/src/main.c @@ -190,7 +190,7 @@ int load_tsec_fw(void) { int main(void) { /* Setup vectors */ setup_exception_vectors(); - + volatile tegra_pmc_t *pmc = pmc_get_regs(); volatile tegra_car_t *car = car_get_regs(); diff --git a/sept/sept-primary/src/start.s b/sept/sept-primary/src/start.s index 1c335685f..cd0c9d81a 100644 --- a/sept/sept-primary/src/start.s +++ b/sept/sept-primary/src/start.s @@ -93,6 +93,10 @@ ipatch_word: .global jump_to_main .type jump_to_main, %function jump_to_main: + /* Insert 0x40 of NOPs, for version compatibility. */ +.rept 16 + nop +.endr /* Just jump to main */ ldr sp, =__stack_top__ b main diff --git a/sept/sept-primary/src/utils.c b/sept/sept-primary/src/utils.c index 04df56a7a..be59a2b5f 100644 --- a/sept/sept-primary/src/utils.c +++ b/sept/sept-primary/src/utils.c @@ -27,12 +27,6 @@ #include -#define u8 uint8_t -#define u32 uint32_t -#include "rebootstub_bin.h" -#undef u8 -#undef u32 - void wait(uint32_t microseconds) { uint32_t old_time = TIMERUS_CNTR_1US_0; while (TIMERUS_CNTR_1US_0 - old_time <= microseconds) { @@ -63,29 +57,12 @@ __attribute__((noreturn)) void pmc_reboot(uint32_t scratch0) { } } -__attribute__((noreturn)) void reboot_to_self(void) { - /* Patch SDRAM init to perform an SVC immediately after second write */ - APBDEV_PMC_SCRATCH45_0 = 0x2E38DFFF; - APBDEV_PMC_SCRATCH46_0 = 0x6001DC28; - /* Set SVC handler to jump to reboot stub in IRAM. */ - APBDEV_PMC_SCRATCH33_0 = 0x4003F000; - APBDEV_PMC_SCRATCH40_0 = 0x6000F208; - - /* Copy reboot stub into IRAM high. */ - for (size_t i = 0; i < rebootstub_bin_size; i += sizeof(uint32_t)) { - write32le((void *)0x4003F000, i, read32le(rebootstub_bin, i)); - } - - /* Trigger warm reboot. */ - pmc_reboot(1 << 0); -} - __attribute__((noreturn)) void wait_for_button_and_reboot(void) { uint32_t button; while (true) { button = btn_read(); if (button & BTN_POWER) { - reboot_to_self(); + pmc_reboot(2); } } } diff --git a/sept/sept-primary/src/utils.h b/sept/sept-primary/src/utils.h index 90133d352..445637695 100644 --- a/sept/sept-primary/src/utils.h +++ b/sept/sept-primary/src/utils.h @@ -121,7 +121,6 @@ void hexdump(const void* data, size_t size, uintptr_t addrbase); __attribute__((noreturn)) void watchdog_reboot(void); __attribute__((noreturn)) void pmc_reboot(uint32_t scratch0); -__attribute__((noreturn)) void reboot_to_self(void); __attribute__((noreturn)) void wait_for_button_and_reboot(void); __attribute__((noreturn)) void generic_panic(void);