mesosphere: refactor Elf vs Elf64 distinction

This commit is contained in:
Michael Scire 2019-12-17 15:02:59 -08:00
parent 92671af569
commit 6ce4be859f
3 changed files with 24 additions and 24 deletions

View File

@ -17,17 +17,25 @@
#include <vapours.hpp> #include <vapours.hpp>
#ifdef ATMOSPHERE_ARCH_ARM64 #ifdef ATMOSPHERE_ARCH_ARM64
#include "kern_init_elf64.hpp"
#include "../arch/arm64/init/kern_init_elf64.hpp"
#else #else
#error "Unknown Architecture" #error "Unknown Architecture"
#endif #endif
namespace ams::kern::init::Elf { namespace ams::kern::init::Elf {
/* TODO: Anything we want inside this namespace? */ #ifdef ATMOSPHERE_ARCH_ARM64
using namespace ams::kern::init::Elf::Elf64;
enum RelocationType {
R_ARCHITECTURE_RELATIVE = 0x403, /* Real name R_AARCH64_RELATIVE */
};
#else
#error "Unknown Architecture"
#endif
/* API to apply relocations or call init array. */
void ApplyRelocations(uintptr_t base_address, const Dyn *dynamic);
void CallInitArrayFuncs(uintptr_t init_array_start, uintptr_t init_array_end);
} }

View File

@ -125,12 +125,4 @@ namespace ams::kern::init::Elf::Elf64 {
DT_RELCOUNT = 0x6ffffffa DT_RELCOUNT = 0x6ffffffa
}; };
enum RelocationType { }
R_AARCH64_RELATIVE = 0x403,
};
/* API to apply relocations or call init array. */
void ApplyRelocations(uintptr_t base_address, const Dyn *dynamic);
void CallInitArrayFuncs(uintptr_t init_array_start, uintptr_t init_array_end);
}

View File

@ -15,7 +15,7 @@
*/ */
#include <mesosphere.hpp> #include <mesosphere.hpp>
namespace ams::kern::init::Elf::Elf64 { namespace ams::kern::init::Elf {
/* API to apply relocations or call init array. */ /* API to apply relocations or call init array. */
void ApplyRelocations(uintptr_t base_address, const Dyn *dynamic) { void ApplyRelocations(uintptr_t base_address, const Dyn *dynamic) {
@ -52,25 +52,25 @@ namespace ams::kern::init::Elf::Elf64 {
/* Apply all Rel relocations */ /* Apply all Rel relocations */
for (size_t i = 0; i < rel_count; i++) { for (size_t i = 0; i < rel_count; i++) {
const auto &rel = *reinterpret_cast<const Elf64::Rel *>(dyn_rel + rel_ent * i); const auto &rel = *reinterpret_cast<const Elf::Rel *>(dyn_rel + rel_ent * i);
/* Only allow R_AARCH64_RELATIVE relocations. */ /* Only allow architecture-specific relocations. */
while (rel.GetType() != R_AARCH64_RELATIVE) { /* ... */ } while (rel.GetType() != R_ARCHITECTURE_RELATIVE) { /* ... */ }
/* Apply the relocation. */ /* Apply the relocation. */
Elf64::Addr *target_address = reinterpret_cast<Elf64::Addr *>(base_address + rel.GetOffset()); Elf::Addr *target_address = reinterpret_cast<Elf::Addr *>(base_address + rel.GetOffset());
*target_address += base_address; *target_address += base_address;
} }
/* Apply all Rela relocations. */ /* Apply all Rela relocations. */
for (size_t i = 0; i < rela_count; i++) { for (size_t i = 0; i < rela_count; i++) {
const auto &rela = *reinterpret_cast<const Elf64::Rela *>(dyn_rela + rela_ent * i); const auto &rela = *reinterpret_cast<const Elf::Rela *>(dyn_rela + rela_ent * i);
/* Only allow R_AARCH64_RELATIVE relocations. */ /* Only allow architecture-specific relocations. */
while (rela.GetType() != R_AARCH64_RELATIVE) { /* ... */ } while (rela.GetType() != R_ARCHITECTURE_RELATIVE) { /* ... */ }
/* Apply the relocation. */ /* Apply the relocation. */
Elf64::Addr *target_address = reinterpret_cast<Elf64::Addr *>(base_address + rela.GetOffset()); Elf::Addr *target_address = reinterpret_cast<Elf::Addr *>(base_address + rela.GetOffset());
*target_address = base_address + rela.GetAddend(); *target_address = base_address + rela.GetAddend();
} }
} }