diff --git a/Makefile b/Makefile index 6d3613b..60b225a 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,7 @@ revision := $(shell git describe --tags --match v[0-9]* --abbrev=8 | sed 's/-[0- dir_source := source dir_loader := loader +dir_arm11 := arm11 dir_cakehax := CakeHax dir_cakebrah := CakeBrah dir_build := build @@ -30,7 +31,7 @@ objects= $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \ $(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \ $(call rwildcard, $(dir_source), *.s *.c))) -bundled = $(dir_build)/loader.bin.o +bundled = $(dir_build)/loader.bin.o $(dir_build)/arm11.bin.o define bin2o bin2s $< | $(AS) -o $(@) @@ -56,6 +57,7 @@ release: $(dir_out)/$(name)$(revision).7z .PHONY: clean clean: @$(MAKE) -C $(dir_loader) clean + @$(MAKE) -C $(dir_arm11) clean @$(MAKE) $(FLAGS) -C $(dir_cakehax) clean @$(MAKE) $(FLAGS) -C $(dir_cakebrah) clean @rm -rf $(dir_out) $(dir_build) @@ -90,6 +92,9 @@ $(dir_build)/%.bin.o: $(dir_build)/%.bin $(dir_build)/loader.bin: $(dir_loader) $(dir_build) @$(MAKE) -C $< +$(dir_build)/arm11.bin: $(dir_arm11) $(dir_build) + @$(MAKE) -C $< + $(dir_build)/memory.o $(dir_build)/strings.o: CFLAGS += -O3 $(dir_build)/installer.o: CFLAGS += -DTITLE="\"$(name) $(revision)\"" diff --git a/loader/arm11/Makefile b/arm11/Makefile similarity index 100% rename from loader/arm11/Makefile rename to arm11/Makefile diff --git a/loader/arm11/linker.ld b/arm11/linker.ld similarity index 100% rename from loader/arm11/linker.ld rename to arm11/linker.ld diff --git a/loader/arm11/source/main.c b/arm11/source/main.c similarity index 100% rename from loader/arm11/source/main.c rename to arm11/source/main.c diff --git a/loader/arm11/source/start.s b/arm11/source/start.s similarity index 100% rename from loader/arm11/source/start.s rename to arm11/source/start.s diff --git a/loader/arm11/source/types.h b/arm11/source/types.h similarity index 100% rename from loader/arm11/source/types.h rename to arm11/source/types.h diff --git a/loader/Makefile b/loader/Makefile index ef099c7..5d49685 100644 --- a/loader/Makefile +++ b/loader/Makefile @@ -14,7 +14,6 @@ OC := arm-none-eabi-objcopy name := $(shell basename $(CURDIR)) dir_source := source -dir_arm11 := arm11 dir_build := build dir_out := ../$(dir_build) @@ -26,37 +25,19 @@ objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \ $(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \ $(call rwildcard, $(dir_source), *.s *.c))) -bundled = $(dir_build)/arm11.bin.o - -define bin2o - bin2s $< | $(AS) -o $(@) - echo "extern const u8" `(echo $(> $(dir_build)/bundled.h - echo "extern const u32" `(echo $(> $(dir_build)/bundled.h -endef - .PHONY: all all: $(dir_out)/$(name).bin .PHONY: clean clean: - @$(MAKE) -C $(dir_arm11) clean @rm -rf $(dir_build) $(dir_out)/$(name).bin: $(dir_build)/$(name).elf $(OC) -S -O binary $< $@ -$(dir_build)/$(name).elf: $(bundled) $(objects) +$(dir_build)/$(name).elf: $(objects) $(LINK.o) -T linker.ld $(OUTPUT_OPTION) $^ -$(dir_build)/%.bin.o: $(dir_build)/%.bin - @$(bin2o) - -$(dir_build)/arm11.bin: $(dir_arm11) - @mkdir -p "$(@D)" - @$(MAKE) -C $< - -$(dir_build)/memory.o: CFLAGS += -O3 - $(dir_build)/%.o: $(dir_source)/%.c @mkdir -p "$(@D)" $(COMPILE.c) $(OUTPUT_OPTION) $< diff --git a/loader/source/main.c b/loader/source/main.c index 675b4aa..5023f56 100644 --- a/loader/source/main.c +++ b/loader/source/main.c @@ -20,27 +20,10 @@ * Notices displayed by works containing it. */ -#include "memory.h" -#include "../build/bundled.h" - -#define A11_PAYLOAD_LOC 0x1FFF4C80 //Keep in mind this needs to be changed in the ld script for arm11 too -#define A11_ENTRYPOINT 0x1FFFFFF8 - -static inline void ownArm11(void) -{ - memcpy((void *)A11_PAYLOAD_LOC, arm11_bin, arm11_bin_size); - - *(vu32 *)A11_ENTRYPOINT = 1; - *(vu32 *)0x1FFAED80 = 0xE51FF004; - *(vu32 *)0x1FFAED84 = A11_PAYLOAD_LOC; - *(vu8 *)0x1FFFFFF0 = 2; - while(*(vu32 *)A11_ENTRYPOINT != 0); -} +#include "types.h" void main(void) { - ownArm11(); - vu32 *payloadAddress = (vu32 *)0x23F00000; payloadAddress[1] = 0xDEADCAFE; diff --git a/loader/source/memory.c b/loader/source/memory.c deleted file mode 100644 index 3833531..0000000 --- a/loader/source/memory.c +++ /dev/null @@ -1,14 +0,0 @@ -/* -* memory.c -*/ - -#include "memory.h" - -void memcpy(void *dest, const void *src, u32 size) -{ - u8 *destc = (u8 *)dest; - const u8 *srcc = (const u8 *)src; - - for(u32 i = 0; i < size; i++) - destc[i] = srcc[i]; -} \ No newline at end of file diff --git a/loader/source/memory.h b/loader/source/memory.h deleted file mode 100644 index 13a360e..0000000 --- a/loader/source/memory.h +++ /dev/null @@ -1,9 +0,0 @@ -/* -* memory.h -*/ - -#pragma once - -#include "types.h" - -void memcpy(void *dest, const void *src, u32 size); \ No newline at end of file diff --git a/source/installer.c b/source/installer.c index cb300b4..e5f3f96 100755 --- a/source/installer.c +++ b/source/installer.c @@ -64,9 +64,9 @@ static const u8 sectorHashRetail[SHA_256_HASH_SIZE] = { u32 posY; -static void drawTitle(void) +static void drawTitle(bool isOtpless) { - initScreens(); + initScreens(isOtpless); posY = drawString(TITLE, 10, 10, COLOR_TITLE); posY = drawString("Thanks to delebile, #cakey and StandardBus", 10, posY + SPACING_Y, COLOR_WHITE); @@ -76,7 +76,7 @@ void main(void) { bool isOtpless = ISA9LH && magic == 0xDEADCAFE; - if(!isOtpless) drawTitle(); + if(!isOtpless) drawTitle(false); if(!sdmmc_sdcard_init(isOtpless)) shutdown(1, "Error: failed to initialize SD and NAND"); @@ -289,7 +289,7 @@ static inline void installer(bool isOtpless) writeFirm((u8 *)FIRM0_OFFSET, false, FIRM0_SIZE); - if(isOtpless) drawTitle(); + if(isOtpless) drawTitle(true); shutdown(2, ISA9LH && !isOtpless ? "Update: success!" : "Full install: success!"); } diff --git a/source/screen.c b/source/screen.c index e1374ab..70b46bb 100644 --- a/source/screen.c +++ b/source/screen.c @@ -37,10 +37,23 @@ #include "screen.h" #include "cache.h" #include "utils.h" +#include "memory.h" #include "i2c.h" +#include "../build/bundled.h" vu32 *arm11Entry = (vu32 *)BRAHMA_ARM11_ENTRY; +static inline void ownArm11(void) +{ + memcpy((void *)A11_PAYLOAD_LOC, arm11_bin, arm11_bin_size); + + *arm11Entry = 1; + *(vu32 *)0x1FFAED80 = 0xE51FF004; + *(vu32 *)0x1FFAED84 = A11_PAYLOAD_LOC; + *(vu8 *)0x1FFFFFF0 = 2; + while(*arm11Entry != 0); +} + static void invokeArm11Function(void (*func)()) { *arm11Entry = (u32)func; @@ -74,7 +87,7 @@ void clearScreens(void) invokeArm11Function(ARM11); } -void initScreens(void) +void initScreens(bool isOtpless) { void __attribute__((naked)) initSequence(void) { @@ -182,10 +195,12 @@ void initScreens(void) if(!ARESCREENSINITED) { - invokeArm11Function(initSequence); - wait(3ULL); + if(isOtpless) ownArm11(); + + invokeArm11Function(initSequence); + //Turn on backlight i2cWriteRegister(I2C_DEV_MCU, 0x22, 0x2A); } diff --git a/source/screen.h b/source/screen.h index 5f273b6..aee4f2e 100644 --- a/source/screen.h +++ b/source/screen.h @@ -33,6 +33,7 @@ #define ARESCREENSINITED (PDN_GPU_CNT != 1) #define BRAHMA_ARM11_ENTRY 0x1FFFFFF8 +#define A11_PAYLOAD_LOC 0x1FFF4C80 #define WAIT_FOR_ARM9() *arm11Entry = 0; while(!*arm11Entry); ((void (*)())*arm11Entry)(); #define SCREEN_TOP_WIDTH 400 @@ -48,4 +49,4 @@ static struct fb { } *const fb = (struct fb *)0x23FFFE00; void clearScreens(void); -void initScreens(void); \ No newline at end of file +void initScreens(bool isOtpless); \ No newline at end of file diff --git a/source/utils.c b/source/utils.c index 1813cd7..33cb4d0 100755 --- a/source/utils.c +++ b/source/utils.c @@ -65,8 +65,6 @@ void mcuReboot(void) //Ensure that all memory transfers have completed and that the data cache has been flushed flushEntireDCache(); - wait(3ULL); - i2cWriteRegister(I2C_DEV_MCU, 0x20, 1 << 2); while(true); }