diff --git a/arm11/Makefile b/arm11/Makefile index 3cb816c..d21ef6b 100644 --- a/arm11/Makefile +++ b/arm11/Makefile @@ -1,39 +1,147 @@ -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 -include $(DEVKITARM)/base_tools +TOPDIR ?= $(CURDIR) +include $(DEVKITARM)/base_rules -name := $(shell basename $(CURDIR)) +#--------------------------------------------------------------------------------- +# 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/svc +DATA := data +INCLUDES := include include/svc -dir_source := source -dir_build := build -dir_out := ../$(dir_build) +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft +DEFINES := -DARM11 -D_3DS -ASFLAGS := -mcpu=mpcore -CFLAGS := -Wall -Wextra -MMD -MP -marm $(ASFLAGS) -fno-builtin -std=c11 -Wno-main -O2 -flto -ffast-math -LDFLAGS := -nostartfiles -Wl,--nmagic +CFLAGS := -g -std=gnu11 -Wall -Wextra -O2 -mword-relocations \ + -fomit-frame-pointer -ffunction-sections -fdata-sections -fno-builtin \ + -Wno-main -fno-builtin $(ARCH) $(DEFINES) -objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \ - $(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \ - $(call rwildcard, $(dir_source), *.s *.c))) +CFLAGS += $(INCLUDE) -.PHONY: all -all: $(dir_out)/$(name).elf +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 -.PHONY: clean +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=$(TOPDIR)/linker.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := + + +#--------------------------------------------------------------------------------- +# 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) + +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: - @rm -rf $(dir_build) + @echo clean ... + @rm -fr $(BUILD) $(TARGET).bin $(TARGET).elf -$(dir_out)/$(name).elf: $(objects) - $(LINK.o) -T linker.ld $(OUTPUT_OPTION) $^ -$(dir_build)/%.o: $(dir_source)/%.c - @mkdir -p "$(@D)" - $(COMPILE.c) $(OUTPUT_OPTION) $< +#--------------------------------------------------------------------------------- +else +.PHONY: all -$(dir_build)/%.o: $(dir_source)/%.s - @mkdir -p "$(@D)" - $(COMPILE.s) $(OUTPUT_OPTION) $< +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +all : $(OUTPUT).bin + +$(OUTPUT).bin : $(OUTPUT).elf + $(OBJCOPY) -S -O binary $< $@ + @echo built ... $(notdir $@) + +$(OUTPUT).elf : $(OFILES) + +%.elf: $(OFILES) + @echo linking $(notdir $@) + @$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@ + @$(NM) -CSn $@ > $(notdir $*.lst) + +$(OFILES_SRC) : $(HFILES_BIN) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/arm11/linker.ld b/arm11/linker.ld index ceb8b55..c0612db 100644 --- a/arm11/linker.ld +++ b/arm11/linker.ld @@ -1,16 +1,161 @@ OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") OUTPUT_ARCH(arm) - ENTRY(_start) + +/* Mostly copied from https://github.com/devkitPro/buildscripts/blob/master/dkarm-eabi/crtls/3dsx.ld */ + SECTIONS { - . = 0x1FF80000; + PROVIDE(__start__ = 0x1FF80000); + PROVIDE(__stack_top__ = 0x1FFFE000); + PROVIDE(__stack_bottom__ = 0x1FFFD000); - .text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); } - .rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); } - .data : ALIGN(4) { *(.data*); . = ALIGN(4); } - .bss : ALIGN(8) { __bss_start = .; *(.bss* COMMON); . = ALIGN(8); __bss_end = .; } + . = __start__; + . = ALIGN(32); - __stack_top__ = 0x1FFFE000; - . = ALIGN(4); + .crt0 : + { + . = ALIGN(32); + KEEP( *(.text.start) ) + KEEP( *(.init) ) + . = ALIGN(4); + } + + .text : + { + . = ALIGN(4); + + /* .text */ + *(.text) + *(.text.*) + *(.glue_7) + *(.glue_7t) + *(.stub) + *(.gnu.warning) + *(.gnu.linkonce.t*) + . = ALIGN(4); + + /* .fini */ + KEEP( *(.fini) ) + . = ALIGN(4); + } + + .rodata : + { + *(.rodata) + *(.roda) + *(.rodata.*) + *all.rodata*(*) + *(.gnu.linkonce.r*) + SORT(CONSTRUCTORS) + . = ALIGN(4); + } + + .preinit_array ALIGN(4) : + { + PROVIDE (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE (__preinit_array_end = .); + } + + .init_array ALIGN(4) : + { + PROVIDE (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE (__init_array_end = .); + } + + .fini_array ALIGN(4) : + { + PROVIDE (__fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE (__fini_array_end = .); + } + + .ctors ALIGN(4) : + { + KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */ + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + + .dtors ALIGN(4) : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } + __exidx_start = .; + ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } + __exidx_end = .; + + .data : + { + *(.data) + *(.data.*) + KEEP (*(.large_patch*)) + *(.gnu.linkonce.d*) + CONSTRUCTORS + . = ALIGN(4); + } + + .bss : + { + . = ALIGN(32); + PROVIDE (__bss_start__ = ABSOLUTE(.)); + *(.dynbss) + *(.bss) + *(.bss.*) + *(.gnu.linkonce.b*) + *(COMMON) + . = ALIGN(8); + PROVIDE (__bss_end__ = ABSOLUTE(.)); + } + PROVIDE (__end__ = ABSOLUTE(.)); + + /* ================== + ==== Metadata ==== + ================== */ + + /* Discard sections that difficult post-processing */ + /DISCARD/ : { *(.group .comment .note) } + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } } diff --git a/arm11/linker.specs b/arm11/linker.specs new file mode 100644 index 0000000..3009904 --- /dev/null +++ b/arm11/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/arm11/source/start.s b/arm11/source/start.s index 9e4020f..29990e9 100644 --- a/arm11/source/start.s +++ b/arm11/source/start.s @@ -21,8 +21,8 @@ @ * Prohibiting misrepresentation of the origin of that material, @ or requiring that modified versions of such material be marked in @ reasonable ways as different from the original version. - -.section .text.start + +.section .text.start, "ax", %progbits .align 4 .global _start .type _start, %function @@ -54,13 +54,17 @@ start: mcr p15, 0, r0, c7, c10, 4 @ Clear BSS - ldr r0, =__bss_start + ldr r0, =__bss_start__ mov r1, #0 - ldr r2, =__bss_end + ldr r2, =__bss_end__ sub r2, r0 bl memset32 + @ Call the init array + bl __libc_init_array + ldr sp, =__stack_top__ + mov fp, #0 b main .global prepareForFirmlaunch diff --git a/k11_extension/Makefile b/k11_extension/Makefile index b0fbae8..d21ef6b 100644 --- a/k11_extension/Makefile +++ b/k11_extension/Makefile @@ -1,47 +1,147 @@ -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 -include $(DEVKITARM)/base_tools +TOPDIR ?= $(CURDIR) +include $(DEVKITARM)/base_rules -name := k11_extension +#--------------------------------------------------------------------------------- +# 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/svc +DATA := data +INCLUDES := include include/svc -dir_source := source -dir_include := include -dir_build := build +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft +DEFINES := -DARM11 -D_3DS -ARCH := -mcpu=mpcore -mfpu=vfp -ASFLAGS := $(ARCH) -CFLAGS := -Wall -Wextra -MMD -MP -marm $(ASFLAGS) -I$(dir_include) -fno-builtin -std=c11 -Wno-main -g -flto -O2 -ffast-math \ --mword-relocations -ffunction-sections -fdata-sections -LDFLAGS := -nostdlib -Wl,--gc-sections,--nmagic $(ARCH) +CFLAGS := -g -std=gnu11 -Wall -Wextra -O2 -mword-relocations \ + -fomit-frame-pointer -ffunction-sections -fdata-sections -fno-builtin \ + -Wno-main -fno-builtin $(ARCH) $(DEFINES) -objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \ - $(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \ - $(call rwildcard, $(dir_source), *.s *.c))) +CFLAGS += $(INCLUDE) -.PHONY: all -all: ../$(dir_build)/$(name).bin +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 -.PHONY: clean +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=$(TOPDIR)/linker.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := + + +#--------------------------------------------------------------------------------- +# 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) + +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: - @rm -rf $(dir_build) + @echo clean ... + @rm -fr $(BUILD) $(TARGET).bin $(TARGET).elf -../$(dir_build)/$(name).bin: $(dir_build)/$(name).elf + +#--------------------------------------------------------------------------------- +else +.PHONY: all + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +all : $(OUTPUT).bin + +$(OUTPUT).bin : $(OUTPUT).elf $(OBJCOPY) -S -O binary $< $@ + @echo built ... $(notdir $@) -$(dir_build)/$(name).elf: $(objects) - $(CC) $(LDFLAGS) -T linker.ld $(OUTPUT_OPTION) $^ +$(OUTPUT).elf : $(OFILES) -$(dir_build)/memory.o : CFLAGS += -O3 -marm +%.elf: $(OFILES) + @echo linking $(notdir $@) + @$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@ + @$(NM) -CSn $@ > $(notdir $*.lst) -$(dir_build)/%.o: $(dir_source)/%.c - @mkdir -p "$(@D)" - $(COMPILE.c) $(OUTPUT_OPTION) $< +$(OFILES_SRC) : $(HFILES_BIN) -$(dir_build)/%.o: $(dir_source)/%.s - @mkdir -p "$(@D)" - $(COMPILE.s) $(OUTPUT_OPTION) $< -include $(call rwildcard, $(dir_build), *.d) +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/k11_extension/linker.ld b/k11_extension/linker.ld index 2ed3ef2..9145b59 100644 --- a/k11_extension/linker.ld +++ b/k11_extension/linker.ld @@ -1,19 +1,159 @@ OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") OUTPUT_ARCH(arm) - ENTRY(_start) + +/* Mostly copied from https://github.com/devkitPro/buildscripts/blob/master/dkarm-eabi/crtls/3dsx.ld */ + SECTIONS { - . = 0x40000000; + PROVIDE(__start__ = 0x40000000); - __start__ = .; + . = __start__; + . = ALIGN(32); - .text : ALIGN(4) { *(.text.start) *(.text*); . = ALIGN(4); } - .rodata : ALIGN(4) { *(.rodata*); . = ALIGN(4); } - .data : ALIGN(4) { *(.data*); . = ALIGN(4); } - .bss : ALIGN(8) { __bss_start__ = .; *(.bss* COMMON); . = ALIGN(8); __bss_end__ = .; } + .crt0 : + { + . = ALIGN(32); + KEEP( *(.text.start) ) + KEEP( *(.init) ) + . = ALIGN(4); + } - . = ALIGN(0x1000); + .text : + { + . = ALIGN(4); - __end__ = .; + /* .text */ + *(.text) + *(.text.*) + *(.glue_7) + *(.glue_7t) + *(.stub) + *(.gnu.warning) + *(.gnu.linkonce.t*) + . = ALIGN(4); + + /* .fini */ + KEEP( *(.fini) ) + . = ALIGN(4); + } + + .rodata : + { + *(.rodata) + *(.roda) + *(.rodata.*) + *all.rodata*(*) + *(.gnu.linkonce.r*) + SORT(CONSTRUCTORS) + . = ALIGN(4); + } + + .preinit_array ALIGN(4) : + { + PROVIDE (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE (__preinit_array_end = .); + } + + .init_array ALIGN(4) : + { + PROVIDE (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE (__init_array_end = .); + } + + .fini_array ALIGN(4) : + { + PROVIDE (__fini_array_start = .); + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + PROVIDE (__fini_array_end = .); + } + + .ctors ALIGN(4) : + { + KEEP (*crtbegin.o(.ctors)) /* MUST be first -- GCC requires it */ + KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + + .dtors ALIGN(4) : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + + .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } + __exidx_start = .; + ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } + __exidx_end = .; + + .data : + { + *(.data) + *(.data.*) + KEEP (*(.large_patch*)) + *(.gnu.linkonce.d*) + CONSTRUCTORS + . = ALIGN(4); + } + + .bss : + { + . = ALIGN(32); + PROVIDE (__bss_start__ = ABSOLUTE(.)); + *(.dynbss) + *(.bss) + *(.bss.*) + *(.gnu.linkonce.b*) + *(COMMON) + . = ALIGN(8); + PROVIDE (__bss_end__ = ABSOLUTE(.)); + } + PROVIDE (__end__ = ABSOLUTE(.)); + + /* ================== + ==== Metadata ==== + ================== */ + + /* Discard sections that difficult post-processing */ + /DISCARD/ : { *(.group .comment .note) } + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } } diff --git a/k11_extension/linker.specs b/k11_extension/linker.specs new file mode 100644 index 0000000..3009904 --- /dev/null +++ b/k11_extension/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/k11_extension/source/fatalExceptionHandlers.s b/k11_extension/source/fatalExceptionHandlers.s index 10c32d7..c90c01d 100644 --- a/k11_extension/source/fatalExceptionHandlers.s +++ b/k11_extension/source/fatalExceptionHandlers.s @@ -22,6 +22,8 @@ @ or requiring that modified versions of such material be marked in @ reasonable ways as different from the original version. +.fpu vfp + .macro TEST_IF_MODE_AND_ARM_INST_OR_JUMP lbl, mode cpsid aif mrs sp, spsr diff --git a/k11_extension/source/main.c b/k11_extension/source/main.c index 0a401e1..484c93d 100644 --- a/k11_extension/source/main.c +++ b/k11_extension/source/main.c @@ -51,6 +51,7 @@ void relocateAndSetupMMU(u32 coreId, u32 *L1Table) if(coreId == 0) { // Relocate ourselves, and clear BSS + // This is only OK because the jumps will be relative... memcpy((void *)p0->basePA, (const void *)0x18000000, __bss_start__ - __start__); memset32((u32 *)(p0->basePA + (__bss_start__ - __start__)), 0, __bss_end__ - __bss_start__); diff --git a/k11_extension/source/start.s b/k11_extension/source/start.s index 4da3810..3632d51 100644 --- a/k11_extension/source/start.s +++ b/k11_extension/source/start.s @@ -50,6 +50,8 @@ start: push {r0-r12, lr} + bl __libc_init_array + sub r0, r4, #8 sub r1, r8, #0x8000 bl main diff --git a/linker.ld b/linker.ld index 117361c..c8efa84 100644 --- a/linker.ld +++ b/linker.ld @@ -146,14 +146,15 @@ SECTIONS .bss : { - __bss_start__ = ALIGN(32); + . = ALIGN(32); + PROVIDE (__bss_start__ = ABSOLUTE(.)); *(.dynbss) *(.bss) *(.bss.*) *(.gnu.linkonce.b*) *(COMMON) . = ALIGN(8); - __bss_end__ = .; + PROVIDE (__bss_end__ = ABSOLUTE(.)); } >main __end__ = ABSOLUTE(.) ; diff --git a/sysmodules/loader/Makefile b/sysmodules/loader/Makefile index 4aaf9f4..7563f8e 100755 --- a/sysmodules/loader/Makefile +++ b/sysmodules/loader/Makefile @@ -1,51 +1,149 @@ -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 +TOPDIR ?= $(CURDIR) include $(DEVKITARM)/3ds_rules -name := $(shell basename $(CURDIR)) +#--------------------------------------------------------------------------------- +# 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 +DATA := data +INCLUDES := include -dir_source := source -dir_build := build -dir_out := ../../$(dir_build) +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft +DEFINES := -DARM11 -D_3DS -LIBS := -lctru -LIBDIRS := $(CTRULIB) -LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) +CFLAGS := -g -std=gnu11 -Wall -Wextra -O2 -mword-relocations \ + -fomit-frame-pointer -ffunction-sections -fdata-sections -fno-builtin \ + $(ARCH) $(DEFINES) -INCLUDE := $(foreach dir,$(LIBDIRS),-I$(dir)/include) +CFLAGS += $(INCLUDE) -ASFLAGS := -mcpu=mpcore -mfloat-abi=hard -CFLAGS := -Wall -Wextra $(ASFLAGS) -fno-builtin -std=c11 -O2 -ffast-math $(INCLUDE) -DARM11 -D_3DS -LDFLAGS := -specs=3dsx.specs $(ASFLAGS) -Wl,--section-start,.text=0x14000000 +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 -objects = $(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \ - $(call rwildcard, $(dir_source), *.s *.c)) +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map),--section-start,.text=0x14000000 -.PHONY: all -all: $(dir_out)/$(name).cxi +LIBS := -lctru -.PHONY: clean +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CTRULIB) + + +#--------------------------------------------------------------------------------- +# 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) + +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: - @rm -rf $(dir_build) + @echo clean ... + @rm -fr $(BUILD) $(TARGET).bin $(TARGET).elf -.PRECIOUS: $(dir_build)/%.bin -$(dir_out)/$(name).cxi: $(dir_build)/$(name).elf - @makerom -f ncch -rsf loader.rsf -nocodepadding -o $@ -elf $< +#--------------------------------------------------------------------------------- +else +.PHONY: all -$(dir_build)/$(name).elf: $(bundled) $(objects) - $(LINK.o) $(OUTPUT_OPTION) $^ $(LIBPATHS) $(LIBS) +DEPENDS := $(OFILES:.o=.d) -$(dir_build)/memory.o $(dir_build)/strings.o: CFLAGS += -O3 +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +all : $(OUTPUT).cxi -$(dir_build)/%.o: $(dir_source)/%.c - @mkdir -p "$(@D)" - $(COMPILE.c) $(OUTPUT_OPTION) $< +$(OUTPUT).cxi : $(OUTPUT).elf $(OUTPUT).rsf + @makerom -f ncch -rsf $(word 2,$^) -o $@ -elf $< + @echo built ... $(notdir $@) -$(dir_build)/%.o: $(dir_source)/%.s - @mkdir -p "$(@D)" - $(COMPILE.s) $(OUTPUT_OPTION) $< +$(OUTPUT).elf : $(OFILES) + +memory.o : CFLAGS += -O3 + +%.elf: $(OFILES) + @echo linking $(notdir $@) + @$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@ + @$(NM) -CSn $@ > $(notdir $*.lst) + +$(OFILES_SRC) : $(HFILES_BIN) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/sysmodules/loader/source/loader.c b/sysmodules/loader/source/loader.c index 7370c7c..4c3644d 100644 --- a/sysmodules/loader/source/loader.c +++ b/sysmodules/loader/source/loader.c @@ -585,16 +585,23 @@ void __system_initSyscalls(); void __ctru_exit() { + void __libc_fini_array(void); + + __libc_fini_array(); __appExit(); __sync_fini(); svcExitProcess(); } - + void initSystem() { + void __libc_init_array(void); + __sync_init(); __system_initSyscalls(); __appInit(); + + __libc_init_array(); } int main() diff --git a/sysmodules/pxi/Makefile b/sysmodules/pxi/Makefile index 0330ca4..748c7f1 100644 --- a/sysmodules/pxi/Makefile +++ b/sysmodules/pxi/Makefile @@ -1,47 +1,149 @@ -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 +TOPDIR ?= $(CURDIR) include $(DEVKITARM)/3ds_rules -name := pxi +#--------------------------------------------------------------------------------- +# 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 +DATA := data +INCLUDES := include -dir_source := source -dir_build := build -dir_out := ../../$(dir_build) +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft +DEFINES := -DARM11 -D_3DS -LIBS := -lctru -LIBDIRS := $(CTRULIB) -LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) +CFLAGS := -g -std=gnu11 -Wall -Wextra -O2 -mword-relocations \ + -fomit-frame-pointer -ffunction-sections -fdata-sections -fno-builtin \ + $(ARCH) $(DEFINES) -INCLUDE := $(foreach dir,$(LIBDIRS),-I$(dir)/include) +CFLAGS += $(INCLUDE) -ARCH := -mcpu=mpcore -mfloat-abi=hard -mtp=soft -CFLAGS := -Wall -Wextra -MMD -MP -marm $(ARCH) -fno-builtin -std=c11 -O2 -g -ffast-math -mword-relocations \ - -ffunction-sections -fdata-sections $(INCLUDE) -DARM11 -D_3DS -LDFLAGS := -specs=3dsx.specs -Wl,--gc-sections $(ARCH) +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 -objects = $(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \ - $(call rwildcard, $(dir_source), *.c)) +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) -.PHONY: all -all: $(dir_out)/$(name).cxi +LIBS := -lctru -.PHONY: clean +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CTRULIB) + + +#--------------------------------------------------------------------------------- +# 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) + +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: - @rm -rf $(dir_build) + @echo clean ... + @rm -fr $(BUILD) $(TARGET).bin $(TARGET).elf -$(dir_out)/$(name).cxi: $(dir_build)/$(name).elf - @makerom -f ncch -rsf $(name).rsf -nocodepadding -o $@ -elf $< -$(dir_build)/$(name).elf: $(objects) - $(LINK.o) $(OUTPUT_OPTION) $^ $(LIBPATHS) $(LIBS) +#--------------------------------------------------------------------------------- +else +.PHONY: all -$(dir_build)/memory.o : CFLAGS += -O3 +DEPENDS := $(OFILES:.o=.d) -$(dir_build)/%.o: $(dir_source)/%.c - @mkdir -p "$(@D)" - $(COMPILE.c) $(OUTPUT_OPTION) $< -include $(call rwildcard, $(dir_build), *.d) +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +all : $(OUTPUT).cxi + +$(OUTPUT).cxi : $(OUTPUT).elf $(OUTPUT).rsf + @makerom -f ncch -rsf $(word 2,$^) -o $@ -elf $< + @echo built ... $(notdir $@) + +$(OUTPUT).elf : $(OFILES) + +memory.o : CFLAGS += -O3 + +%.elf: $(OFILES) + @echo linking $(notdir $@) + @$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@ + @$(NM) -CSn $@ > $(notdir $*.lst) + +$(OFILES_SRC) : $(HFILES_BIN) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/sysmodules/pxi/source/main.c b/sysmodules/pxi/source/main.c index 883afd1..271b73e 100644 --- a/sysmodules/pxi/source/main.c +++ b/sysmodules/pxi/source/main.c @@ -140,16 +140,22 @@ Result __sync_fini(void); void __ctru_exit() { - __appExit(); - __sync_fini(); - svcExitProcess(); + void __libc_fini_array(void); + + __libc_fini_array(); + __appExit(); + __sync_fini(); + svcExitProcess(); } void initSystem() { - __sync_init(); - __system_initSyscalls(); - __appInit(); + void __libc_init_array(void); + + __sync_init(); + __system_initSyscalls(); + __appInit(); + __libc_init_array(); } int main(void) diff --git a/sysmodules/rosalina/Makefile b/sysmodules/rosalina/Makefile index eab996d..a65554c 100644 --- a/sysmodules/rosalina/Makefile +++ b/sysmodules/rosalina/Makefile @@ -1,64 +1,154 @@ -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 +TOPDIR ?= $(CURDIR) include $(DEVKITARM)/3ds_rules -name := $(shell basename $(CURDIR)) +#--------------------------------------------------------------------------------- +# 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/gdb source/menus +DATA := source/gdb/xml +INCLUDES := include include/gdb include/menus -dir_source := source -dir_include := include -dir_build := build -dir_out := ../../$(dir_build) +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft +DEFINES := -DARM11 -D_3DS -LIBS := -lctru -lm -LIBDIRS := $(CTRULIB) -LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) +CFLAGS := -g -std=gnu11 -Wall -Wextra -O2 -mword-relocations \ + -fomit-frame-pointer -ffunction-sections -fdata-sections -fno-builtin \ + $(ARCH) $(DEFINES) -INCLUDE := $(foreach dir,$(LIBDIRS),-I$(dir)/include) +CFLAGS += $(INCLUDE) -ARCH := -mcpu=mpcore -mfloat-abi=hard -ASFLAGS := -g $(ARCH) -CFLAGS := -Wall -Wextra -MMD -MP -marm $(ASFLAGS) -mtp=soft -fno-builtin -std=c11 -O2 -ffast-math -mword-relocations \ - -fomit-frame-pointer -ffunction-sections -fdata-sections $(INCLUDE) -I$(dir_include) -DARM11 -D_3DS -LDFLAGS := -specs=3dsx.specs -g $(ARCH) -mtp=soft -Wl,--section-start,.text=0x14000000 -Wl,--gc-sections +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 -objects = $(patsubst $(dir_source)/%.s, $(dir_build)/%.o, \ - $(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \ - $(call rwildcard, $(dir_source), *.s *.c))) +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map),--section-start,.text=0x14000000 -xml_files = $(call rwildcard, $(dir_source), *.xml) +LIBS := -lctru -.PHONY: all -all: $(dir_out)/$(name).cxi +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CTRULIB) -.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) + +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: - @rm -rf $(dir_build) + @echo clean ... + @rm -fr $(BUILD) $(TARGET).bin $(TARGET).elf -$(dir_out)/$(name).cxi: $(dir_build)/$(name).elf - @makerom -f ncch -rsf rosalina.rsf -nocodepadding -o $@ -elf $< -$(dir_build)/$(name).elf: $(objects) - $(LINK.o) $(OUTPUT_OPTION) $^ $(LIBPATHS) $(LIBS) +#--------------------------------------------------------------------------------- +else +.PHONY: all -$(dir_build)/xml_data.h: $(xml_files) - @ echo "" > $(@) - @$(foreach f, $(xml_files),\ - echo "static const char" `(echo $(notdir $(f)) | sed -e 's/^\([0-9]\)/_\1/g' | tr . _)`"[] = " >> $(@);\ - sed -e 's/\\/\\\\/g;s/"/\\"/g;s/^/"/g;s/[ \t\r\n]*$$/\\n"/g' $(f) >> $(@);\ - echo ';' >> $@;\ - ) -$(dir_build)/gdb/xfer.o: $(dir_build)/xml_data.h -$(dir_build)/memory.o : CFLAGS += -O3 +DEPENDS := $(OFILES:.o=.d) -$(dir_build)/%.o: $(dir_source)/%.c - @mkdir -p "$(@D)" - $(COMPILE.c) $(OUTPUT_OPTION) $< +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +all : $(OUTPUT).cxi -$(dir_build)/%.o: $(dir_source)/%.s - @mkdir -p "$(@D)" - $(COMPILE.s) $(OUTPUT_OPTION) $< -include $(call rwildcard, $(dir_build), *.d) +$(OUTPUT).cxi : $(OUTPUT).elf $(OUTPUT).rsf + @makerom -f ncch -rsf $(word 2,$^) -o $@ -elf $< + @echo built ... $(notdir $@) + +$(OUTPUT).elf : $(OFILES) + +memory.o : CFLAGS += -O3 + +%.elf: $(OFILES) + @echo linking $(notdir $@) + @$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@ + @$(NM) -CSn $@ > $(notdir $*.lst) + +$(OFILES_SRC) : $(HFILES_BIN) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o %_bin.h: %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) +#--------------------------------------------------------------------------------- +%.xml.o %_xml.h: %.xml +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/sysmodules/rosalina/source/gdb/xfer.c b/sysmodules/rosalina/source/gdb/xfer.c index cd7f865..cad12fa 100644 --- a/sysmodules/rosalina/source/gdb/xfer.c +++ b/sysmodules/rosalina/source/gdb/xfer.c @@ -24,12 +24,17 @@ * reasonable ways as different from the original version. */ +#include <3ds/os.h> + #include "gdb/xfer.h" #include "gdb/net.h" -#include "../../build/xml_data.h" -#include <3ds/os.h> #include "fmt.h" +#include "osdata_cfw_version_template_xml.h" +#include "osdata_memory_template_xml.h" +#include "osdata_xml.h" +#include "target_xml.h" + struct { const char *name; @@ -45,7 +50,7 @@ GDB_DECLARE_XFER_HANDLER(Features) if(strcmp(annex, "target.xml") != 0 || write) return GDB_ReplyEmpty(ctx); else - return GDB_SendStreamData(ctx, target_xml, offset, length, sizeof(target_xml) - 1, false); + return GDB_SendStreamData(ctx, (const char *)target_xml, offset, length, target_xml_size, false); } struct @@ -65,7 +70,7 @@ GDB_DECLARE_XFER_OSDATA_HANDLER(CfwVersion) return GDB_HandleUnsupported(ctx); else { - char buf[sizeof(osdata_cfw_version_template_xml) + 64]; + char buf[512]; // Make sure this doesn't overflow char versionString[16]; s64 out; u32 version, commitHash; @@ -86,7 +91,7 @@ GDB_DECLARE_XFER_OSDATA_HANDLER(CfwVersion) else sprintf(versionString, "v%u.%u.%u", GET_VERSION_MAJOR(version), GET_VERSION_MINOR(version), GET_VERSION_REVISION(version)); - sz = (u32)sprintf(buf, osdata_cfw_version_template_xml, versionString, commitHash, isRelease ? "Yes" : "No"); + sz = (u32)sprintf(buf, (const char *)osdata_cfw_version_template_xml, versionString, commitHash, isRelease ? "Yes" : "No"); return GDB_SendStreamData(ctx, buf, offset, length, sz, false); } @@ -113,7 +118,7 @@ GDB_DECLARE_XFER_OSDATA_HANDLER(Memory) svcGetSystemInfo(&out, 0, 3); baseUsed = (u32)out; - sprintf(ctx->memoryOsInfoXmlData, osdata_memory_template_xml, + sprintf(ctx->memoryOsInfoXmlData, (const char *)osdata_memory_template_xml, applicationUsed, applicationTotal - applicationUsed, applicationTotal, (u32)((5ULL + ((1000ULL * applicationUsed) / applicationTotal)) / 10ULL), systemUsed, systemTotal - systemUsed, systemTotal, (u32)((5ULL + ((1000ULL * systemUsed) / systemTotal)) / 10ULL), baseUsed, baseTotal - baseUsed, baseTotal, (u32)((5ULL + ((1000ULL * baseUsed) / baseTotal)) / 10ULL) @@ -196,7 +201,7 @@ GDB_DECLARE_XFER_OSDATA_HANDLER(Processes) GDB_DECLARE_XFER_HANDLER(OsData) { if(strcmp(annex, "") == 0 && !write) - return GDB_SendStreamData(ctx, osdata_xml, offset, length, sizeof(osdata_xml) - 1, false); + return GDB_SendStreamData(ctx, (const char *)osdata_xml, offset, length, osdata_xml_size, false); else { for(u32 i = 0; i < sizeof(xferOsDataCommandHandlers) / sizeof(xferOsDataCommandHandlers[0]); i++) diff --git a/sysmodules/rosalina/source/main.c b/sysmodules/rosalina/source/main.c index 1689e84..cf37952 100644 --- a/sysmodules/rosalina/source/main.c +++ b/sysmodules/rosalina/source/main.c @@ -64,9 +64,9 @@ void __libc_fini_array(void); void __ctru_exit() { + __libc_fini_array(); __appExit(); __sync_fini(); - __libc_fini_array(); for(;;) svcSleepThread(0); // kernel-loaded sysmodules except PXI are not supposed to terminate anyways svcExitProcess(); } @@ -74,8 +74,6 @@ void __ctru_exit() void initSystem() { - __libc_init_array(); - s64 out; isN3DS = svcGetSystemInfo(&out, 0x10001, 0) == 0; @@ -91,6 +89,7 @@ void initSystem() ProcessPatchesMenu_PatchUnpatchFSDirectly(); __sync_init(); __appInit(); + __libc_init_array(); // ROSALINA HACKJOB BEGIN // NORMAL APPS SHOULD NOT DO THIS, EVER diff --git a/sysmodules/sm/Makefile b/sysmodules/sm/Makefile index 0bdc9ec..748c7f1 100644 --- a/sysmodules/sm/Makefile +++ b/sysmodules/sm/Makefile @@ -1,47 +1,149 @@ -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 +TOPDIR ?= $(CURDIR) include $(DEVKITARM)/3ds_rules -name := sm +#--------------------------------------------------------------------------------- +# 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 +DATA := data +INCLUDES := include -dir_source := source -dir_build := build -dir_out := ../../$(dir_build) +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft +DEFINES := -DARM11 -D_3DS -LIBS := -lctru -LIBDIRS := $(CTRULIB) -LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) +CFLAGS := -g -std=gnu11 -Wall -Wextra -O2 -mword-relocations \ + -fomit-frame-pointer -ffunction-sections -fdata-sections -fno-builtin \ + $(ARCH) $(DEFINES) -INCLUDE := $(foreach dir,$(LIBDIRS),-I$(dir)/include) +CFLAGS += $(INCLUDE) -ARCH := -mcpu=mpcore -mfloat-abi=hard -mtp=soft -CFLAGS := -Wall -Wextra -MMD -MP -marm $(ARCH) -fno-builtin -std=c11 -O2 -g -ffast-math -mword-relocations \ - -ffunction-sections -fdata-sections -fno-strict-aliasing $(INCLUDE) -DARM11 -D_3DS -LDFLAGS := -specs=3dsx.specs -Wl,--gc-sections $(ARCH) +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 -objects = $(patsubst $(dir_source)/%.c, $(dir_build)/%.o, \ - $(call rwildcard, $(dir_source), *.c)) +ASFLAGS := -g $(ARCH) +LDFLAGS = -specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map) -.PHONY: all -all: $(dir_out)/$(name).cxi +LIBS := -lctru -.PHONY: clean +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CTRULIB) + + +#--------------------------------------------------------------------------------- +# 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) + +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: - @rm -rf $(dir_build) + @echo clean ... + @rm -fr $(BUILD) $(TARGET).bin $(TARGET).elf -$(dir_out)/$(name).cxi: $(dir_build)/$(name).elf - @makerom -f ncch -rsf $(name).rsf -nocodepadding -o $@ -elf $< -$(dir_build)/$(name).elf: $(objects) - $(LINK.o) $(OUTPUT_OPTION) $^ $(LIBPATHS) $(LIBS) +#--------------------------------------------------------------------------------- +else +.PHONY: all -$(dir_build)/memory.o : CFLAGS += -O3 +DEPENDS := $(OFILES:.o=.d) -$(dir_build)/%.o: $(dir_source)/%.c - @mkdir -p "$(@D)" - $(COMPILE.c) $(OUTPUT_OPTION) $< -include $(call rwildcard, $(dir_build), *.d) +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +all : $(OUTPUT).cxi + +$(OUTPUT).cxi : $(OUTPUT).elf $(OUTPUT).rsf + @makerom -f ncch -rsf $(word 2,$^) -o $@ -elf $< + @echo built ... $(notdir $@) + +$(OUTPUT).elf : $(OFILES) + +memory.o : CFLAGS += -O3 + +%.elf: $(OFILES) + @echo linking $(notdir $@) + @$(LD) $(LDFLAGS) $(OFILES) $(LIBPATHS) $(LIBS) -o $@ + @$(NM) -CSn $@ > $(notdir $*.lst) + +$(OFILES_SRC) : $(HFILES_BIN) + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/sysmodules/sm/source/main.c b/sysmodules/sm/source/main.c index 553bca2..1aa848f 100644 --- a/sysmodules/sm/source/main.c +++ b/sysmodules/sm/source/main.c @@ -56,9 +56,11 @@ void __ctru_exit(void){} void initSystem(void) { + void __libc_init_array(void); __sync_init(); __system_allocateHeaps(); __appInit(); + __libc_init_array(); } int main(void)