From f74527d93c359e39d1701129308e138976310c24 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Sat, 14 Nov 2020 11:35:51 -0800 Subject: [PATCH] libexosphere: support building under debug/audit configurations --- libraries/libexosphere/Makefile | 35 +++++--- libraries/libexosphere/arm.mk | 79 +++++++++++++------ libraries/libexosphere/arm64.mk | 79 +++++++++++++------ .../exosphere/secmon/secmon_memory_layout.hpp | 2 +- 4 files changed, 136 insertions(+), 59 deletions(-) diff --git a/libraries/libexosphere/Makefile b/libraries/libexosphere/Makefile index 97b463c6b..7cc93f20b 100644 --- a/libraries/libexosphere/Makefile +++ b/libraries/libexosphere/Makefile @@ -1,19 +1,34 @@ -.PHONY: all arm64 arm clean arm64-clean arm-clean +ATMOSPHERE_BUILD_CONFIGS := +all: arm64-release arm-release -all: arm64 arm +define ATMOSPHERE_ADD_TARGET -arm64: - $(MAKE) -f arm64.mk +ATMOSPHERE_BUILD_CONFIGS += $(strip $1) -arm: - $(MAKE) -f arm.mk +arm64-$(strip $1): + $$(MAKE) -f arm64.mk $(strip $1) -#--------------------------------------------------------------------------------- +arm-$(strip $1): + $$(MAKE) -f arm.mk $(strip $1) -clean: arm64-clean arm-clean +clean-arm64-$(strip $1): + $$(MAKE) -f arm64.mk clean-$(strip $1) -arm64-clean: +clean-arm-$(strip $1): + $$(MAKE) -f arm.mk clean-$(strip $1) + +endef + +$(eval $(call ATMOSPHERE_ADD_TARGET, release)) +$(eval $(call ATMOSPHERE_ADD_TARGET, debug)) +$(eval $(call ATMOSPHERE_ADD_TARGET, audit)) + +clean-arm64: $(MAKE) -f arm64.mk clean -arm-clean: +clean-arm: $(MAKE) -f arm.mk clean + +clean: clean-arm64 clean-arm + +.PHONY: all clean clean-arm64 clean-arm $(foreach config,$(ATMOSPHERE_BUILD_CONFIGS),arm64-$(config) arm-$(config) clean-arm64-$(config) clean-arm-$(config)) diff --git a/libraries/libexosphere/arm.mk b/libraries/libexosphere/arm.mk index a9b50909c..f6acfd8de 100644 --- a/libraries/libexosphere/arm.mk +++ b/libraries/libexosphere/arm.mk @@ -7,6 +7,8 @@ export ATMOSPHERE_CPU := arm7tdmi #--------------------------------------------------------------------------------- # pull in common atmosphere configuration #--------------------------------------------------------------------------------- +THIS_MAKEFILE := $(abspath $(lastword $(MAKEFILE_LIST))) +CURRENT_DIRECTORY := $(abspath $(dir $(THIS_MAKEFILE))) include $(dir $(abspath $(lastword $(MAKEFILE_LIST))))/../config/common.mk #--------------------------------------------------------------------------------- @@ -17,7 +19,7 @@ DEFINES := $(ATMOSPHERE_DEFINES) -DATMOSPHERE_IS_EXOSPHERE SETTINGS := $(ATMOSPHERE_SETTINGS) -Os -Wextra -Werror -flto -fno-non-call-exceptions CFLAGS := $(ATMOSPHERE_CFLAGS) $(SETTINGS) $(DEFINES) $(INCLUDE) CXXFLAGS := $(CFLAGS) $(ATMOSPHERE_CXXFLAGS) -fno-use-cxa-atexit -ASFLAGS := $(ATMOSPHERE_ASFLAGS) $(SETTINGS) +ASFLAGS := $(ATMOSPHERE_ASFLAGS) $(SETTINGS) $(DEFINES) $(INCLUDE) SOURCES += $(call ALL_SOURCE_DIRS,../libvapours/source) @@ -33,7 +35,7 @@ LIBDIRS := $(ATMOSPHERE_LIBRARIES_DIR)/libvapours # no real need to edit anything past this point unless you need to add additional # rules for different file extensions #--------------------------------------------------------------------------------- -ifneq ($(BUILD),$(notdir $(CURDIR))) +ifneq ($(__RECURSIVE__),1) #--------------------------------------------------------------------------------- export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) $(CURDIR)/include \ @@ -59,7 +61,7 @@ endif export OFILES_BIN := $(addsuffix .o,$(BINFILES)) export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) -export GCH_FILES := $(foreach hdr,$(PRECOMPILED_HEADERS:.hpp=.gch),$(notdir $(hdr))) +export GCH_DIRS := $(PRECOMPILED_HEADERS:.hpp=.hpp.gch) export OFILES := $(OFILES_BIN) $(OFILES_SRC) export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) @@ -67,40 +69,70 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ -I. -.PHONY: clean all +#--------------------------------------------------------------------------------- + +ATMOSPHERE_BUILD_CONFIGS := +all: release + +define ATMOSPHERE_ADD_TARGET + +ATMOSPHERE_BUILD_CONFIGS += $(strip $1) + +$(strip $1): $$(ATMOSPHERE_LIBRARY_DIR)/$(strip $2) + +$$(ATMOSPHERE_LIBRARY_DIR)/$(strip $2) : $$(ATMOSPHERE_LIBRARY_DIR) $$(ATMOSPHERE_BUILD_DIR)/$(strip $1) $$(SOURCES) $$(INCLUDES) $$(GCH_DIRS) + @$$(MAKE) __RECURSIVE__=1 OUTPUT=$$(CURDIR)/$$@ $(3) \ + ATMOSPHERE_GCH_IDENTIFIER="$$(ATMOSPHERE_BOARD_NAME)_$$(ATMOSPHERE_ARCH_NAME)_$(strip $1)" \ + DEPSDIR=$$(CURDIR)/$$(ATMOSPHERE_BUILD_DIR)/$(strip $1) \ + --no-print-directory -C $$(ATMOSPHERE_BUILD_DIR)/$(strip $1) \ + -f $$(THIS_MAKEFILE) + +clean-$(strip $1): + @echo clean $(strip $1) ... + @rm -fr $$(ATMOSPHERE_BUILD_DIR)/$(strip $1) $$(ATMOSPHERE_LIBRARY_DIR)/$(strip $2) + @rm -fr $$(foreach hdr,$$(GCH_DIRS),$$(hdr)/$$(ATMOSPHERE_BOARD_NAME)_$$(ATMOSPHERE_ARCH_NAME)_$(strip $1)) + @for i in $$(GCH_DIRS) $$(ATMOSPHERE_BUILD_DIR) $$(ATMOSPHERE_LIBRARY_DIR); do [ -d $$$$i ] && rmdir --ignore-fail-on-non-empty $$$$i || true; done + +endef + +$(eval $(call ATMOSPHERE_ADD_TARGET, release, $(TARGET).a, \ + ATMOSPHERE_BUILD_SETTINGS="" \ +)) + +$(eval $(call ATMOSPHERE_ADD_TARGET, debug, $(TARGET)_debug.a, \ + ATMOSPHERE_BUILD_SETTINGS="-DAMS_BUILD_FOR_DEBUGGING" \ +)) + +$(eval $(call ATMOSPHERE_ADD_TARGET, audit, $(TARGET)_audit.a, \ + ATMOSPHERE_BUILD_SETTINGS="-DAMS_BUILD_FOR_AUDITING" \ +)) #--------------------------------------------------------------------------------- -all: $(ATMOSPHERE_LIBRARY_DIR)/$(TARGET).a -$(ATMOSPHERE_LIBRARY_DIR): +-include $(ATMOSPHERE_BOARD_NAME)_$(ATMOSPHERE_ARCH_NAME).mk + +ALL_GCH_IDENTIFIERS := $(foreach config,$(ATMOSPHERE_BUILD_CONFIGS),$(ATMOSPHERE_BOARD_NAME)_$(ATMOSPHERE_ARCH_NAME)_$(config)) +ALL_GCH_FILES := $(foreach hdr,$(PRECOMPILED_HEADERS:.hpp=.hpp.gch),$(foreach id,$(ALL_GCH_IDENTIFIERS),$(hdr)/$(id))) + +.PHONY: clean all $(foreach config,$(ATMOSPHERE_BUILD_CONFIGS),$(config) clean-$(config)) + +$(ATMOSPHERE_LIBRARY_DIR) $(GCH_DIRS): @[ -d $@ ] || mkdir -p $@ -$(ATMOSPHERE_BUILD_DIR): +$(ATMOSPHERE_BUILD_DIR)/%: @[ -d $@ ] || mkdir -p $@ -$(ATMOSPHERE_LIBRARY_DIR)/$(TARGET).a : $(ATMOSPHERE_LIBRARY_DIR) $(ATMOSPHERE_BUILD_DIR) $(SOURCES) $(INCLUDES) - @$(MAKE) BUILD=$(ATMOSPHERE_BUILD_DIR) OUTPUT=$(CURDIR)/$@ \ - DEPSDIR=$(CURDIR)/$(ATMOSPHERE_BUILD_DIR) \ - --no-print-directory -C $(ATMOSPHERE_BUILD_DIR) \ - -f $(CURDIR)/arm.mk - -dist-bin: all - @tar --exclude=*~ -cjf $(TARGET).tar.bz2 include $(ATMOSPHERE_LIBRARY_DIR) - -dist-src: - @tar --exclude=*~ -cjf $(TARGET)-src.tar.bz2 include source arm.mk - -dist: dist-src dist-bin - #--------------------------------------------------------------------------------- clean: @echo clean ... - @rm -fr $(ATMOSPHERE_BUILD_DIR) $(ATMOSPHERE_LIBRARY_DIR) *.bz2 + @rm -fr $(ATMOSPHERE_BUILD_DIR) $(ATMOSPHERE_LIBRARY_DIR) *.bz2 $(ALL_GCH_FILES) + @for i in $(GCH_DIRS); do [ -d $$i ] && rmdir --ignore-fail-on-non-empty $$i || true; done #--------------------------------------------------------------------------------- else -DEPENDS := $(OFILES:.o=.d) $(GCH_FILES:.gch=.d) +GCH_FILES := $(foreach hdr,$(PRECOMPILED_HEADERS:.hpp=.hpp.gch),$(CURRENT_DIRECTORY)/$(hdr)/$(ATMOSPHERE_GCH_IDENTIFIER)) +DEPENDS := $(OFILES:.o=.d) $(foreach hdr,$(GCH_FILES),$(notdir $(patsubst %.hpp.gch/,%.d,$(dir $(hdr))))) #--------------------------------------------------------------------------------- # main targets @@ -126,4 +158,3 @@ libgcc_division.arch.arm.o: CFLAGS += -fno-builtin -fno-lto #--------------------------------------------------------------------------------------- endif #--------------------------------------------------------------------------------------- - diff --git a/libraries/libexosphere/arm64.mk b/libraries/libexosphere/arm64.mk index 3ce1165b1..f59111300 100644 --- a/libraries/libexosphere/arm64.mk +++ b/libraries/libexosphere/arm64.mk @@ -7,6 +7,8 @@ export ATMOSPHERE_CPU := arm-cortex-a57 #--------------------------------------------------------------------------------- # pull in common atmosphere configuration #--------------------------------------------------------------------------------- +THIS_MAKEFILE := $(abspath $(lastword $(MAKEFILE_LIST))) +CURRENT_DIRECTORY := $(abspath $(dir $(THIS_MAKEFILE))) include $(dir $(abspath $(lastword $(MAKEFILE_LIST))))/../config/common.mk #--------------------------------------------------------------------------------- @@ -17,7 +19,7 @@ DEFINES := $(ATMOSPHERE_DEFINES) -DATMOSPHERE_IS_EXOSPHERE SETTINGS := $(ATMOSPHERE_SETTINGS) -mgeneral-regs-only -ffixed-x18 -Os -Wextra -Werror -fno-non-call-exceptions CFLAGS := $(ATMOSPHERE_CFLAGS) $(SETTINGS) $(DEFINES) $(INCLUDE) CXXFLAGS := $(CFLAGS) $(ATMOSPHERE_CXXFLAGS) -fno-use-cxa-atexit -ASFLAGS := $(ATMOSPHERE_ASFLAGS) $(SETTINGS) +ASFLAGS := $(ATMOSPHERE_ASFLAGS) $(SETTINGS) $(DEFINES) $(INCLUDE) SOURCES += $(call ALL_SOURCE_DIRS,../libvapours/source) @@ -33,7 +35,7 @@ LIBDIRS := $(ATMOSPHERE_LIBRARIES_DIR)/libvapours # no real need to edit anything past this point unless you need to add additional # rules for different file extensions #--------------------------------------------------------------------------------- -ifneq ($(BUILD),$(notdir $(CURDIR))) +ifneq ($(__RECURSIVE__),1) #--------------------------------------------------------------------------------- export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) $(CURDIR)/include \ @@ -59,7 +61,7 @@ endif export OFILES_BIN := $(addsuffix .o,$(BINFILES)) export OFILES_SRC := $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) -export GCH_FILES := $(foreach hdr,$(PRECOMPILED_HEADERS:.hpp=.gch),$(notdir $(hdr))) +export GCH_DIRS := $(PRECOMPILED_HEADERS:.hpp=.hpp.gch) export OFILES := $(OFILES_BIN) $(OFILES_SRC) export HFILES_BIN := $(addsuffix .h,$(subst .,_,$(BINFILES))) @@ -67,41 +69,70 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ -I. -.PHONY: clean all +#--------------------------------------------------------------------------------- + +ATMOSPHERE_BUILD_CONFIGS := +all: release + +define ATMOSPHERE_ADD_TARGET + +ATMOSPHERE_BUILD_CONFIGS += $(strip $1) + +$(strip $1): $$(ATMOSPHERE_LIBRARY_DIR)/$(strip $2) + +$$(ATMOSPHERE_LIBRARY_DIR)/$(strip $2) : $$(ATMOSPHERE_LIBRARY_DIR) $$(ATMOSPHERE_BUILD_DIR)/$(strip $1) $$(SOURCES) $$(INCLUDES) $$(GCH_DIRS) + @$$(MAKE) __RECURSIVE__=1 OUTPUT=$$(CURDIR)/$$@ $(3) \ + ATMOSPHERE_GCH_IDENTIFIER="$$(ATMOSPHERE_BOARD_NAME)_$$(ATMOSPHERE_ARCH_NAME)_$(strip $1)" \ + DEPSDIR=$$(CURDIR)/$$(ATMOSPHERE_BUILD_DIR)/$(strip $1) \ + --no-print-directory -C $$(ATMOSPHERE_BUILD_DIR)/$(strip $1) \ + -f $$(THIS_MAKEFILE) + +clean-$(strip $1): + @echo clean $(strip $1) ... + @rm -fr $$(ATMOSPHERE_BUILD_DIR)/$(strip $1) $$(ATMOSPHERE_LIBRARY_DIR)/$(strip $2) + @rm -fr $$(foreach hdr,$$(GCH_DIRS),$$(hdr)/$$(ATMOSPHERE_BOARD_NAME)_$$(ATMOSPHERE_ARCH_NAME)_$(strip $1)) + @for i in $$(GCH_DIRS) $$(ATMOSPHERE_BUILD_DIR) $$(ATMOSPHERE_LIBRARY_DIR); do [ -d $$$$i ] && rmdir --ignore-fail-on-non-empty $$$$i || true; done + +endef + +$(eval $(call ATMOSPHERE_ADD_TARGET, release, $(TARGET).a, \ + ATMOSPHERE_BUILD_SETTINGS="" \ +)) + +$(eval $(call ATMOSPHERE_ADD_TARGET, debug, $(TARGET)_debug.a, \ + ATMOSPHERE_BUILD_SETTINGS="-DAMS_BUILD_FOR_DEBUGGING" \ +)) + +$(eval $(call ATMOSPHERE_ADD_TARGET, audit, $(TARGET)_audit.a, \ + ATMOSPHERE_BUILD_SETTINGS="-DAMS_BUILD_FOR_AUDITING" \ +)) #--------------------------------------------------------------------------------- -all: $(ATMOSPHERE_LIBRARY_DIR)/$(TARGET).a -$(ATMOSPHERE_LIBRARY_DIR): +-include $(ATMOSPHERE_BOARD_NAME)_$(ATMOSPHERE_ARCH_NAME).mk + +ALL_GCH_IDENTIFIERS := $(foreach config,$(ATMOSPHERE_BUILD_CONFIGS),$(ATMOSPHERE_BOARD_NAME)_$(ATMOSPHERE_ARCH_NAME)_$(config)) +ALL_GCH_FILES := $(foreach hdr,$(PRECOMPILED_HEADERS:.hpp=.hpp.gch),$(foreach id,$(ALL_GCH_IDENTIFIERS),$(hdr)/$(id))) + +.PHONY: clean all $(foreach config,$(ATMOSPHERE_BUILD_CONFIGS),$(config) clean-$(config)) + +$(ATMOSPHERE_LIBRARY_DIR) $(GCH_DIRS): @[ -d $@ ] || mkdir -p $@ -$(ATMOSPHERE_BUILD_DIR): +$(ATMOSPHERE_BUILD_DIR)/%: @[ -d $@ ] || mkdir -p $@ -$(ATMOSPHERE_LIBRARY_DIR)/$(TARGET).a : $(ATMOSPHERE_LIBRARY_DIR) $(ATMOSPHERE_BUILD_DIR) $(SOURCES) $(INCLUDES) - @$(MAKE) BUILD=$(ATMOSPHERE_BUILD_DIR) OUTPUT=$(CURDIR)/$@ \ - BUILD_CFLAGS="-DNDEBUG=1 -O2" \ - DEPSDIR=$(CURDIR)/$(ATMOSPHERE_BUILD_DIR) \ - --no-print-directory -C $(ATMOSPHERE_BUILD_DIR) \ - -f $(CURDIR)/arm64.mk - -dist-bin: all - @tar --exclude=*~ -cjf $(TARGET).tar.bz2 include $(ATMOSPHERE_LIBRARY_DIR) - -dist-src: - @tar --exclude=*~ -cjf $(TARGET)-src.tar.bz2 include source arm64.mk - -dist: dist-src dist-bin - #--------------------------------------------------------------------------------- clean: @echo clean ... - @rm -fr $(ATMOSPHERE_BUILD_DIR) $(ATMOSPHERE_LIBRARY_DIR) *.bz2 + @rm -fr $(ATMOSPHERE_BUILD_DIR) $(ATMOSPHERE_LIBRARY_DIR) *.bz2 $(ALL_GCH_FILES) + @for i in $(GCH_DIRS); do [ -d $$i ] && rmdir --ignore-fail-on-non-empty $$i || true; done #--------------------------------------------------------------------------------- else -DEPENDS := $(OFILES:.o=.d) $(GCH_FILES:.gch=.d) +GCH_FILES := $(foreach hdr,$(PRECOMPILED_HEADERS:.hpp=.hpp.gch),$(CURRENT_DIRECTORY)/$(hdr)/$(ATMOSPHERE_GCH_IDENTIFIER)) +DEPENDS := $(OFILES:.o=.d) $(foreach hdr,$(GCH_FILES),$(notdir $(patsubst %.hpp.gch/,%.d,$(dir $(hdr))))) #--------------------------------------------------------------------------------- # main targets diff --git a/libraries/libexosphere/include/exosphere/secmon/secmon_memory_layout.hpp b/libraries/libexosphere/include/exosphere/secmon/secmon_memory_layout.hpp index 13462f9b7..7cc8d2c6d 100644 --- a/libraries/libexosphere/include/exosphere/secmon/secmon_memory_layout.hpp +++ b/libraries/libexosphere/include/exosphere/secmon/secmon_memory_layout.hpp @@ -197,7 +197,7 @@ namespace ams::secmon { constexpr inline const MemoryRegion MemoryRegionVirtualTzramMarikoProgram(UINT64_C(0x1F00D0000), 0x20000); constexpr inline const MemoryRegion MemoryRegionPhysicalTzramMarikoProgram(UINT64_C(0x7C020000), 0x20000); - static_assert(MemoryRegionPhysicalTzramMariko.Contains(MemoryRegionVirtualTzramMarikoProgram)); + static_assert(MemoryRegionPhysicalTzramMariko.Contains(MemoryRegionPhysicalTzramMarikoProgram)); constexpr inline const MemoryRegion MemoryRegionVirtualTzramProgramMain(UINT64_C(0x1F00C0800), 0xB800); static_assert(MemoryRegionVirtualTzramProgram.Contains(MemoryRegionVirtualTzramProgramMain));