From d6d440a47e0af64acc467155bbd083b302379962 Mon Sep 17 00:00:00 2001 From: TuxSH Date: Wed, 23 May 2018 15:02:57 +0200 Subject: [PATCH] Sanitize arm9 build system... however link script overflows itcm --- arm9/Makefile | 258 ++++++++++++++++++++---------------- arm9/linker.ld | 10 +- arm9/linker.specs | 7 + arm9/source/firm.c | 2 +- arm9/source/large_patches.s | 16 +-- 5 files changed, 164 insertions(+), 129 deletions(-) create mode 100644 arm9/linker.specs diff --git a/arm9/Makefile b/arm9/Makefile index c0eadad..73b4e8d 100644 --- a/arm9/Makefile +++ b/arm9/Makefile @@ -1,149 +1,177 @@ -rwildcard = $(foreach d, $(wildcard $1*), $(filter $(subst *, %, $2), $d) $(call rwildcard, $d/, $2)) +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- ifeq ($(strip $(DEVKITARM)),) $(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") endif -ifneq ($(strip $(shell firmtool -v 2>&1 | grep usage)),) -$(error "Please install firmtool v1.1 or greater") +TOPDIR ?= $(CURDIR) +include $(DEVKITARM)/base_rules + +export REVISION := $(shell git describe --tags --match v[0-9]* --abbrev=8 | sed 's/-[0-9]*-g/-/') +export VERSION_MAJOR := $(shell git describe --tags --match v[0-9]* | cut -c2- | cut -f1 -d- | cut -f1 -d.) +export VERSION_MINOR := $(shell git describe --tags --match v[0-9]* | cut -c2- | cut -f1 -d- | cut -f2 -d.) +export VERSION_BUILD := $(shell git describe --tags --match v[0-9]* | cut -c2- | cut -f1 -d- | cut -f3 -d.) +export COMMIT := $(shell git rev-parse --short=8 HEAD) +export IS_RELEASE := 0 + +ifeq ($(strip $(REVISION)),) + export REVISION := v0.0.0-0 + export VERSION_MAJOR := 0 + export VERSION_MINOR := 0 + export VERSION_BUILD := 0 endif -include $(DEVKITARM)/base_tools - -name := Luma3DS -revision := $(shell git describe --tags --match v[0-9]* --abbrev=8 | sed 's/-[0-9]*-g/-/') -version_major := $(shell git describe --tags --match v[0-9]* | cut -c2- | cut -f1 -d- | cut -f1 -d.) -version_minor := $(shell git describe --tags --match v[0-9]* | cut -c2- | cut -f1 -d- | cut -f2 -d.) -version_build := $(shell git describe --tags --match v[0-9]* | cut -c2- | cut -f1 -d- | cut -f3 -d.) -commit := $(shell git rev-parse --short=8 HEAD) -is_release := 0 - -ifeq ($(strip $(revision)),) - revision := v0.0.0-0 - version_major := 0 - version_minor := 0 - version_build := 0 +ifeq ($(strip $(COMMIT)),) + export COMMIT := 0 endif -ifeq ($(strip $(commit)),) - commit := 0 -endif - -ifeq ($(strip $(version_build)),) - version_build := 0 +ifeq ($(strip $(VERSION_BUILD)),) + export VERSION_BUILD := 0 endif ifeq ($(strip $(shell git describe --tags --match v[0-9]* | grep -)),) - is_release := 1 + export IS_RELEASE := 1 endif -dir_source := source -dir_arm11 := arm11 -dir_k11_extension := k11_extension -dir_sysmodules := sysmodules -dir_loader := $(dir_sysmodules)/loader -dir_rosalina := $(dir_sysmodules)/rosalina -dir_sm := $(dir_sysmodules)/sm -dir_pxi := $(dir_sysmodules)/pxi -dir_build := build -dir_out := out +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := source source/fatfs source/fatfs/sdmmc +DATA := data +INCLUDES := include -ASFLAGS := -mcpu=arm946e-s -CFLAGS := -Wall -Wextra $(ASFLAGS) -fno-builtin -std=c11 -Wno-main -O2 -ffast-math -LDFLAGS := -nostartfiles -Wl,--nmagic +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -marm -march=armv5te -mtune=arm946e-s +DEFINES := -DARM9 -D_3DS -objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \ - $(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \ - $(call rwildcard, $(dir_source), *.s *.c))) +CFLAGS := -g -std=gnu11 -Wall -Wextra -O2 -mword-relocations \ + -fomit-frame-pointer -ffunction-sections -fdata-sections \ + -Wno-main -fno-builtin $(ARCH) $(DEFINES) -modules = $(dir_build)/loader.cxi $(dir_build)/rosalina.cxi $(dir_build)/sm.cxi $(dir_build)/pxi.cxi +CFLAGS += $(INCLUDE) -define bin2o - bin2s $< | $(AS) -o $(@) -endef +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 -.PHONY: all -all: firm +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=$(TOPDIR)/linker.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) -.PHONY: release -release: $(dir_out)/$(name)$(revision).7z +LIBS := -.PHONY: firm -firm: $(dir_out)/boot.firm +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := -.PHONY: clean + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +ifeq ($(strip $(APP_TITLE)),) + APP_TITLE := $(notdir $(OUTPUT)) +endif + +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)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES_BIN := $(addsuffix .o,$(BINFILES)) +export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) +export OFILES := $(OFILES_BIN) $(OFILES_SRC) +export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- clean: - @$(MAKE) -C $(dir_arm11) clean - @$(MAKE) -C $(dir_k11_extension) clean - @$(MAKE) -C $(dir_loader) clean - @$(MAKE) -C $(dir_rosalina) clean - @$(MAKE) -C $(dir_sm) clean - @$(MAKE) -C $(dir_pxi) clean - @rm -rf $(dir_out) $(dir_build) - -.PRECIOUS: $(dir_build)/%.bin - -.PHONY: $(dir_arm11) -.PHONY: $(dir_k11_extension) -.PHONY: $(dir_loader) -.PHONY: $(dir_rosalina) -.PHONY: $(dir_sm) -.PHONY: $(dir_pxi) + @echo clean ... + @rm -fr $(BUILD) $(TARGET).bin $(TARGET).elf -$(dir_out)/$(name)$(revision).7z: all - @mkdir -p "$(@D)" - @[ -f "$@" ] || 7z a -mx $@ ./$(@D)/* ./exception_dump_parser -xr!.DS_Store +#--------------------------------------------------------------------------------- +else +.PHONY: all -$(dir_out)/boot.firm: $(dir_build)/modules.bin $(dir_build)/arm11.elf $(dir_build)/main.elf $(dir_build)/k11_extension.bin - @mkdir -p "$(@D)" - @firmtool build $@ -D $^ -A 0x18180000 0x18000000 -C XDMA XDMA NDMA XDMA +DEPENDS := $(OFILES:.o=.d) -$(dir_build)/modules.bin: $(modules) - @mkdir -p "$(@D)" - cat $^ > $@ +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +all : $(OUTPUT).elf -$(dir_build)/arm11.elf: $(dir_arm11) - @mkdir -p "$(@D)" - @$(MAKE) -C $< +$(OUTPUT).elf : $(OFILES) -$(dir_build)/main.elf: $(objects) - $(LINK.o) -T linker.ld $(OUTPUT_OPTION) $^ +%.elf: $(OFILES) + @echo linking $(notdir $@) + @$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@ + @$(NM) -CSn $@ > $(notdir $*.lst) -$(dir_build)/k11_extension.bin: $(dir_k11_extension) - @mkdir -p "$(@D)" - @$(MAKE) -C $< +$(OFILES_SRC) : $(HFILES_BIN) -$(dir_build)/loader.cxi: $(dir_loader) - @mkdir -p "$(@D)" - @$(MAKE) -C $< - -$(dir_build)/rosalina.cxi: $(dir_rosalina) - @mkdir -p "$(@D)" - @$(MAKE) -C $< - -$(dir_build)/sm.cxi: $(dir_sm) - @mkdir -p "$(@D)" - @$(MAKE) -C $< - -$(dir_build)/pxi.cxi: $(dir_pxi) - @mkdir -p "$(@D)" - @$(MAKE) -C $< - -$(dir_build)/%.bin.o: $(dir_build)/%.bin +memory.o strings.o: CFLAGS += -O3 +config.o: CFLAGS += -DCONFIG_TITLE="\"$(APP_TITLE) $(REVISION) configuration\"" +patches.o: CFLAGS += -DVERSION_MAJOR="$(VERSION_MAJOR)" -DVERSION_MINOR="$(VERSION_MINOR)"\ + -DVERSION_BUILD="$(VERSION_BUILD)" -DISRELEASE="$(IS_RELEASE)" -DCOMMIT_HASH="0x$(COMMIT)" +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) @$(bin2o) -$(dir_build)/memory.o $(dir_build)/strings.o: CFLAGS += -O3 -$(dir_build)/config.o: CFLAGS += -DCONFIG_TITLE="\"$(name) $(revision) configuration\"" -$(dir_build)/patches.o: CFLAGS += -DVERSION_MAJOR="$(version_major)" -DVERSION_MINOR="$(version_minor)"\ - -DVERSION_BUILD="$(version_build)" -DISRELEASE="$(is_release)" -DCOMMIT_HASH="0x$(commit)" -$(dir_build)/firm.o: $(dir_build)/modules.bin -$(dir_build)/firm.o: CFLAGS += -DLUMA_SECTION0_SIZE="$(shell wc -c $(dir_build)/modules.bin | tr -d [:space:][:alpha:][:punct:])" +-include $(DEPENDS) -$(dir_build)/%.o: $(dir_source)/%.c - @mkdir -p "$(@D)" - $(COMPILE.c) $(OUTPUT_OPTION) $< - -$(dir_build)/%.o: $(dir_source)/%.s - @mkdir -p "$(@D)" - $(COMPILE.s) $(OUTPUT_OPTION) $< +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/arm9/linker.ld b/arm9/linker.ld index c8efa84..6546bf2 100644 --- a/arm9/linker.ld +++ b/arm9/linker.ld @@ -7,7 +7,7 @@ MEMORY { NULL : ORIGIN = 0x00000000, LENGTH = 0x1000 main : ORIGIN = 0x08006000, LENGTH = 0x080F0000 - 0x08006000 - itcm : ORIGIN = 0x01FF8000, LENGTH = 0x01FFB800 - 0x01FF8000 /* Unused ITCM slice. */ + itcm : ORIGIN = 0x01FF8000, LENGTH = 1M } SECTIONS @@ -39,13 +39,13 @@ SECTIONS KEEP(*(.arm9_exception_handlers.text)) *(.arm9_exception_handlers.text*) KEEP(*(.chainloader.text.start)) - build/chainloader.o build/i2c.o build/arm9_exception_handlers.o(.text*) + chainloader.o i2c.o arm9_exception_handlers.o(.text*) *(.arm9_exception_handlers.rodata*) - build/chainloader.o build/i2c.o build/arm9_exception_handlers.o(.rodata*) + chainloader.o i2c.o arm9_exception_handlers.o(.rodata*) *(.arm9_exception_handlers.data*) - build/chainloader.o build/i2c.o build/arm9_exception_handlers.o(.data*) + chainloader.o i2c.o arm9_exception_handlers.o(.data*) . = ALIGN(8); } >itcm AT>main @@ -55,7 +55,7 @@ SECTIONS . = ALIGN(8); PROVIDE (__itcm_bss_start__ = ABSOLUTE(.)); *(.arm9_exception_handlers.bss*) - build/chainloader.o build/i2c.o build/arm9_exception_handlers.o(.bss* COMMON) + chainloader.o i2c.o arm9_exception_handlers.o(.bss* COMMON) . = ALIGN(8); PROVIDE (__itcm_end__ = ABSOLUTE(.)); } >itcm AT>main diff --git a/arm9/linker.specs b/arm9/linker.specs new file mode 100644 index 0000000..3009904 --- /dev/null +++ b/arm9/linker.specs @@ -0,0 +1,7 @@ +%rename link old_link + +*link: +%(old_link) -T %:getenv(TOPDIR /linker.ld) --nmagic --gc-sections + +*startfile: +crti%O%s crtbegin%O%s diff --git a/arm9/source/firm.c b/arm9/source/firm.c index 053dec8..3c8653b 100755 --- a/arm9/source/firm.c +++ b/arm9/source/firm.c @@ -282,7 +282,7 @@ static inline void mergeSection0(FirmwareType firmType, u32 firmVersion, bool lo if(firmType == NATIVE_FIRM && (ISN3DS || firmVersion >= 0x1D)) { //2) Merge that info with our own modules' - for(u8 *src = (u8 *)0x18180000; src < (u8 *)(0x18180000 + LUMA_SECTION0_SIZE); src += srcModuleSize) + for(u8 *src = (u8 *)0x18180000; src < (u8 *)(0x18180000 + /*LUMA_SECTION0_SIZE*/0); src += srcModuleSize) { const char *name = ((Cxi *)src)->exHeader.systemControlInfo.appTitle; diff --git a/arm9/source/large_patches.s b/arm9/source/large_patches.s index 021a893..dca1be9 100644 --- a/arm9/source/large_patches.s +++ b/arm9/source/large_patches.s @@ -70,16 +70,16 @@ emunandPatchSize: .arm .align 4 -.set copy_launch_stub_stack_top, 0x01FFB800 -.set copy_launch_stub_stack_bottom, 0x01FFA800 -.set copy_launch_stub_addr, 0x01FF9000 +#define copy_launch_stub_stack_top 0x01FFB800 +#define copy_launch_stub_stack_bottom 0x01FFA800 +#define copy_launch_stub_addr 0x01FF9000 -.set argv_addr, (copy_launch_stub_stack_bottom - 0x100) -.set fname_addr, (copy_launch_stub_stack_bottom - 0x200) -.set low_tid_addr, (copy_launch_stub_stack_bottom - 0x300) +#define argv_addr (copy_launch_stub_stack_bottom - 0x100) +#define fname_addr (copy_launch_stub_stack_bottom - 0x200) +#define low_tid_addr (copy_launch_stub_stack_bottom - 0x300) -.set firm_addr, 0x20001000 -.set firm_maxsize, 0x07FFF000 +#define firm_addr 0x20001000 +#define firm_maxsize 0x07FFF000 .global rebootPatch rebootPatch: