From 623b5f4eb99fd531018f10a93b5b1847e98018fc Mon Sep 17 00:00:00 2001 From: fincs Date: Fri, 13 Dec 2019 21:41:19 +0100 Subject: [PATCH] meso: miscellaneous cleanup and build fixes --- libraries/config/common.mk | 16 +-- .../init/kern_init_page_table_select.hpp | 2 +- .../arch/arm64/init/kern_init_elf64.cpp | 108 +++++++++--------- .../source/arch/arm64/kern_init_elf64.cpp | 84 -------------- mesosphere/kernel_ldr/Makefile | 13 ++- mesosphere/kernel_ldr/kernel_ldr.ld | 1 - mesosphere/kernel_ldr/source/start.s | 2 +- 7 files changed, 73 insertions(+), 153 deletions(-) delete mode 100644 libraries/libmesosphere/source/arch/arm64/kern_init_elf64.cpp diff --git a/libraries/config/common.mk b/libraries/config/common.mk index ecb4fd92c..5d6136a1e 100644 --- a/libraries/config/common.mk +++ b/libraries/config/common.mk @@ -52,7 +52,7 @@ ATMOSPHERE_DEFINES += -DATMOSPHERE_GIT_BRANCH=\"$(ATMOSPHERE_GIT_BRANCH)\" -DATM #--------------------------------------------------------------------------------- # Ensure top directory is set. #--------------------------------------------------------------------------------- -export TOPDIR ?= $(CURDIR) +TOPDIR ?= $(CURDIR) #--------------------------------------------------------------------------------- # TARGET is the name of the output @@ -60,13 +60,13 @@ export TOPDIR ?= $(CURDIR) # DATA is a list of directories containing data files # INCLUDES is a list of directories containing header files #--------------------------------------------------------------------------------- -export TARGET ?= $(notdir $(CURDIR)) -export BUILD := build -export DATA := data -export INCLUDES := include -export SOURCES ?= $(shell find source -type d \ - -not \( -path source/arch -prune \) \ - -not \( -path source/board -prune \) \) +TARGET := $(notdir $(CURDIR)) +BUILD := build +DATA := data +INCLUDES := include +SOURCES ?= $(shell find source -type d \ + -not \( -path source/arch -prune \) \ + -not \( -path source/board -prune \) \) ifneq ($(strip $(wildcard source/$(ATMOSPHERE_ARCH_DIR)/.*)),) SOURCES += $(shell find source/$(ATMOSPHERE_ARCH_DIR) -type d) diff --git a/libraries/libmesosphere/include/mesosphere/init/kern_init_page_table_select.hpp b/libraries/libmesosphere/include/mesosphere/init/kern_init_page_table_select.hpp index e0e6b423e..6539bca45 100644 --- a/libraries/libmesosphere/include/mesosphere/init/kern_init_page_table_select.hpp +++ b/libraries/libmesosphere/include/mesosphere/init/kern_init_page_table_select.hpp @@ -18,5 +18,5 @@ #ifdef ATMOSPHERE_ARCH_ARM64 #include "../arch/arm64/init/kern_k_init_page_table.hpp" #else - #error "Unknown architecutre for KInitialPageTable" + #error "Unknown architecture for KInitialPageTable" #endif diff --git a/libraries/libmesosphere/source/arch/arm64/init/kern_init_elf64.cpp b/libraries/libmesosphere/source/arch/arm64/init/kern_init_elf64.cpp index 8e60b51eb..6f846763b 100644 --- a/libraries/libmesosphere/source/arch/arm64/init/kern_init_elf64.cpp +++ b/libraries/libmesosphere/source/arch/arm64/init/kern_init_elf64.cpp @@ -17,66 +17,68 @@ namespace ams::kern::init::Elf::Elf64 { - /* API to apply relocations or call init array. */ - void ApplyRelocations(uintptr_t base_address, const Dyn *dynamic) { - uintptr_t dyn_rel = 0; - uintptr_t dyn_rela = 0; - uintptr_t rel_count = 0; - uintptr_t rela_count = 0; - uintptr_t rel_ent = 0; - uintptr_t rela_ent = 0; + /* API to apply relocations or call init array. */ + void ApplyRelocations(uintptr_t base_address, const Dyn *dynamic) { + uintptr_t dyn_rel = 0; + uintptr_t dyn_rela = 0; + uintptr_t rel_count = 0; + uintptr_t rela_count = 0; + uintptr_t rel_ent = 0; + uintptr_t rela_ent = 0; - /* Iterate over all tags, identifying important extents. */ - for (const Dyn *cur_entry = dynamic; cur_entry->GetTag() != DT_NULL; cur_entry++) { - switch (cur_entry->GetTag()) { - case DT_REL: - dyn_rel = base_address + cur_entry->GetPtr(); - break; - case DT_RELA: - dyn_rela = base_address + cur_entry->GetPtr(); - break; - case DT_RELENT: - rel_ent = cur_entry->GetValue(); - break; - case DT_RELAENT: - rela_ent = cur_entry->GetValue(); - break; - case DT_RELCOUNT: - rel_count = cur_entry->GetValue(); - break; - case DT_RELACOUNT: - rela_count = cur_entry->GetValue(); - break; - } - } + /* Iterate over all tags, identifying important extents. */ + for (const Dyn *cur_entry = dynamic; cur_entry->GetTag() != DT_NULL; cur_entry++) { + switch (cur_entry->GetTag()) { + case DT_REL: + dyn_rel = base_address + cur_entry->GetPtr(); + break; + case DT_RELA: + dyn_rela = base_address + cur_entry->GetPtr(); + break; + case DT_RELENT: + rel_ent = cur_entry->GetValue(); + break; + case DT_RELAENT: + rela_ent = cur_entry->GetValue(); + break; + case DT_RELCOUNT: + rel_count = cur_entry->GetValue(); + break; + case DT_RELACOUNT: + rela_count = cur_entry->GetValue(); + break; + } + } - /* Apply all Rel relocations */ - for (size_t i = 0; i < rel_count; i++) { - const auto &rel = *reinterpret_cast(dyn_rel + rel_ent * i); + /* Apply all Rel relocations */ + for (size_t i = 0; i < rel_count; i++) { + const auto &rel = *reinterpret_cast(dyn_rel + rel_ent * i); - /* Only allow R_AARCH64_RELATIVE relocations. */ - while (rel.GetType() != R_AARCH64_RELATIVE) { /* ... */ } + /* Only allow R_AARCH64_RELATIVE relocations. */ + while (rel.GetType() != R_AARCH64_RELATIVE) { /* ... */ } - /* Apply the relocation. */ - Elf64::Addr *target_address = reinterpret_cast(base_address + rel.GetOffset()); - *target_address += base_address; - } + /* Apply the relocation. */ + Elf64::Addr *target_address = reinterpret_cast(base_address + rel.GetOffset()); + *target_address += base_address; + } - /* Apply all Rela relocations. */ - for (size_t i = 0; i < rela_count; i++) { - const auto &rela = *reinterpret_cast(dyn_rela + rela_ent * i); + /* Apply all Rela relocations. */ + for (size_t i = 0; i < rela_count; i++) { + const auto &rela = *reinterpret_cast(dyn_rela + rela_ent * i); - /* Only allow R_AARCH64_RELATIVE relocations. */ - while (rela.GetType() != R_AARCH64_RELATIVE) { /* ... */ } + /* Only allow R_AARCH64_RELATIVE relocations. */ + while (rela.GetType() != R_AARCH64_RELATIVE) { /* ... */ } - /* Apply the relocation. */ - Elf64::Addr *target_address = reinterpret_cast(base_address + rela.GetOffset()); - *target_address = base_address + rela.GetAddend(); - } - } + /* Apply the relocation. */ + Elf64::Addr *target_address = reinterpret_cast(base_address + rela.GetOffset()); + *target_address = base_address + rela.GetAddend(); + } + } - void CallInitArrayFuncs(uintptr_t init_array_start, uintptr_t init_array_end) { - - } + void CallInitArrayFuncs(uintptr_t init_array_start, uintptr_t init_array_end) { + for (uintptr_t cur_entry = init_array_start; cur_entry < init_array_end; cur_entry += sizeof(void *)) { + (*(void (**)())(cur_entry))(); + } + } } \ No newline at end of file diff --git a/libraries/libmesosphere/source/arch/arm64/kern_init_elf64.cpp b/libraries/libmesosphere/source/arch/arm64/kern_init_elf64.cpp deleted file mode 100644 index 6f846763b..000000000 --- a/libraries/libmesosphere/source/arch/arm64/kern_init_elf64.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (c) 2018-2019 Atmosphère-NX - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#include - -namespace ams::kern::init::Elf::Elf64 { - - /* API to apply relocations or call init array. */ - void ApplyRelocations(uintptr_t base_address, const Dyn *dynamic) { - uintptr_t dyn_rel = 0; - uintptr_t dyn_rela = 0; - uintptr_t rel_count = 0; - uintptr_t rela_count = 0; - uintptr_t rel_ent = 0; - uintptr_t rela_ent = 0; - - /* Iterate over all tags, identifying important extents. */ - for (const Dyn *cur_entry = dynamic; cur_entry->GetTag() != DT_NULL; cur_entry++) { - switch (cur_entry->GetTag()) { - case DT_REL: - dyn_rel = base_address + cur_entry->GetPtr(); - break; - case DT_RELA: - dyn_rela = base_address + cur_entry->GetPtr(); - break; - case DT_RELENT: - rel_ent = cur_entry->GetValue(); - break; - case DT_RELAENT: - rela_ent = cur_entry->GetValue(); - break; - case DT_RELCOUNT: - rel_count = cur_entry->GetValue(); - break; - case DT_RELACOUNT: - rela_count = cur_entry->GetValue(); - break; - } - } - - /* Apply all Rel relocations */ - for (size_t i = 0; i < rel_count; i++) { - const auto &rel = *reinterpret_cast(dyn_rel + rel_ent * i); - - /* Only allow R_AARCH64_RELATIVE relocations. */ - while (rel.GetType() != R_AARCH64_RELATIVE) { /* ... */ } - - /* Apply the relocation. */ - Elf64::Addr *target_address = reinterpret_cast(base_address + rel.GetOffset()); - *target_address += base_address; - } - - /* Apply all Rela relocations. */ - for (size_t i = 0; i < rela_count; i++) { - const auto &rela = *reinterpret_cast(dyn_rela + rela_ent * i); - - /* Only allow R_AARCH64_RELATIVE relocations. */ - while (rela.GetType() != R_AARCH64_RELATIVE) { /* ... */ } - - /* Apply the relocation. */ - Elf64::Addr *target_address = reinterpret_cast(base_address + rela.GetOffset()); - *target_address = base_address + rela.GetAddend(); - } - } - - void CallInitArrayFuncs(uintptr_t init_array_start, uintptr_t init_array_end) { - for (uintptr_t cur_entry = init_array_start; cur_entry < init_array_end; cur_entry += sizeof(void *)) { - (*(void (**)())(cur_entry))(); - } - } - -} \ No newline at end of file diff --git a/mesosphere/kernel_ldr/Makefile b/mesosphere/kernel_ldr/Makefile index 422154c01..59b9e6722 100644 --- a/mesosphere/kernel_ldr/Makefile +++ b/mesosphere/kernel_ldr/Makefile @@ -11,6 +11,7 @@ ifneq ($(BUILD),$(notdir $(CURDIR))) #--------------------------------------------------------------------------------- export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) export DEPSDIR := $(CURDIR)/$(BUILD) export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ @@ -59,21 +60,23 @@ export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) -.PHONY: clean all +.PHONY: $(BUILD) clean all #--------------------------------------------------------------------------------- -all: $(BUILD) +all: $(BUILD) check_libmeso -$(BUILD): +$(BUILD): check_libmeso @[ -d $@ ] || mkdir -p $@ @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile +check_libmeso: + @$(MAKE) --no-print-directory -C ../../libraries/libmesosphere + #--------------------------------------------------------------------------------- clean: @echo clean ... @rm -fr $(BUILD) $(OUTPUT).bin $(OUTPUT).elf - #--------------------------------------------------------------------------------- else .PHONY: all @@ -89,7 +92,7 @@ $(OUTPUT).bin : $(OUTPUT).elf $(OBJCOPY) -S -O binary $< $@ @echo built ... $(notdir $@) -$(OUTPUT).elf : $(OFILES) +$(OUTPUT).elf : $(OFILES) ../../../libraries/libmesosphere/lib/libmesosphere.a %.elf: @echo linking $(notdir $@) diff --git a/mesosphere/kernel_ldr/kernel_ldr.ld b/mesosphere/kernel_ldr/kernel_ldr.ld index 64ab87fc0..178a5aebd 100644 --- a/mesosphere/kernel_ldr/kernel_ldr.ld +++ b/mesosphere/kernel_ldr/kernel_ldr.ld @@ -73,7 +73,6 @@ SECTIONS .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } :krnlldr .gnu_extab : ONLY_IF_RO { *(.gnu_extab*) } : rodata - __dynamic__start__ = . ; .dynamic : { *(.dynamic) } :krnlldr :dyn .dynsym : { *(.dynsym) } :krnlldr .dynstr : { *(.dynstr) } :krnlldr diff --git a/mesosphere/kernel_ldr/source/start.s b/mesosphere/kernel_ldr/source/start.s index 4ab36aa58..c15da37a1 100644 --- a/mesosphere/kernel_ldr/source/start.s +++ b/mesosphere/kernel_ldr/source/start.s @@ -89,7 +89,7 @@ __external_references: .quad __bss_start__ - _start .quad __bss_end__ - _start .quad __stack_end - _start - .quad __dynamic__start__ - _start + .quad _DYNAMIC - _start .quad __init_array_start - _start .quad __init_array_end - _start .quad __vectors_start__ - _start \ No newline at end of file