mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-12-22 20:31:14 +00:00
mesosphere: refactor Elf vs Elf64 distinction
This commit is contained in:
parent
d3b697fd1d
commit
d10621e832
5 changed files with 31 additions and 31 deletions
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
|
@ -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);
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -320,14 +320,14 @@ namespace ams::kern::init::loader {
|
||||||
std::memset(GetVoidPointer(virtual_base_address + bss_offset), 0, bss_end_offset - bss_offset);
|
std::memset(GetVoidPointer(virtual_base_address + bss_offset), 0, bss_end_offset - bss_offset);
|
||||||
|
|
||||||
/* Apply relocations to the kernel. */
|
/* Apply relocations to the kernel. */
|
||||||
const Elf::Elf64::Dyn *kernel_dynamic = reinterpret_cast<const Elf::Elf64::Dyn *>(GetInteger(virtual_base_address) + dynamic_offset);
|
const Elf::Dyn *kernel_dynamic = reinterpret_cast<const Elf::Dyn *>(GetInteger(virtual_base_address) + dynamic_offset);
|
||||||
Elf::Elf64::ApplyRelocations(GetInteger(virtual_base_address), kernel_dynamic);
|
Elf::ApplyRelocations(GetInteger(virtual_base_address), kernel_dynamic);
|
||||||
|
|
||||||
/* Reprotect .rodata as R-- */
|
/* Reprotect .rodata as R-- */
|
||||||
ttbr1_table.Reprotect(virtual_base_address + ro_offset, ro_end_offset - ro_offset, KernelRwDataAttribute, KernelRoDataAttribute);
|
ttbr1_table.Reprotect(virtual_base_address + ro_offset, ro_end_offset - ro_offset, KernelRwDataAttribute, KernelRoDataAttribute);
|
||||||
|
|
||||||
/* Call the kernel's init array functions. */
|
/* Call the kernel's init array functions. */
|
||||||
Elf::Elf64::CallInitArrayFuncs(GetInteger(virtual_base_address) + init_array_offset, GetInteger(virtual_base_address) + init_array_end_offset);
|
Elf::CallInitArrayFuncs(GetInteger(virtual_base_address) + init_array_offset, GetInteger(virtual_base_address) + init_array_end_offset);
|
||||||
|
|
||||||
/* Return the difference between the random virtual base and the physical base. */
|
/* Return the difference between the random virtual base and the physical base. */
|
||||||
return GetInteger(virtual_base_address) - base_address;
|
return GetInteger(virtual_base_address) - base_address;
|
||||||
|
|
|
@ -48,17 +48,17 @@ _start:
|
||||||
ldr x1, [x1, #0x18] /* .dynamic. */
|
ldr x1, [x1, #0x18] /* .dynamic. */
|
||||||
add x1, x0, x1
|
add x1, x0, x1
|
||||||
|
|
||||||
/* branch to ams::kern::init::Elf::Elf64::ApplyRelocations(uintptr_t, const ams::kern::init::Elf::Elf64::Dyn *); */
|
/* branch to ams::kern::init::Elf::ApplyRelocations(uintptr_t, const ams::kern::init::Elf::Elf64::Dyn *); */
|
||||||
bl _ZN3ams4kern4init3Elf5Elf6416ApplyRelocationsEmPKNS3_3DynE
|
bl _ZN3ams4kern4init3Elf16ApplyRelocationsEmPKNS2_5Elf643DynE
|
||||||
|
|
||||||
/* branch to ams::kern::init::Elf::Elf64::CallInitArrayFuncs(uintptr_t, uintptr_t) */
|
/* branch to ams::kern::init::Elf::CallInitArrayFuncs(uintptr_t, uintptr_t) */
|
||||||
adr x2, _start
|
adr x2, _start
|
||||||
adr x1, __external_references
|
adr x1, __external_references
|
||||||
ldr x0, [x1, #0x20] /* init_array_start */
|
ldr x0, [x1, #0x20] /* init_array_start */
|
||||||
ldr x1, [x1, #0x28] /* init_array_end */
|
ldr x1, [x1, #0x28] /* init_array_end */
|
||||||
add x0, x0, x2
|
add x0, x0, x2
|
||||||
add x1, x1, x2
|
add x1, x1, x2
|
||||||
bl _ZN3ams4kern4init3Elf5Elf6418CallInitArrayFuncsEmm
|
bl _ZN3ams4kern4init3Elf18CallInitArrayFuncsEmm
|
||||||
|
|
||||||
/* Setup system registers, for detection of errors during init later. */
|
/* Setup system registers, for detection of errors during init later. */
|
||||||
msr tpidr_el1, xzr /* Clear TPIDR_EL1 */
|
msr tpidr_el1, xzr /* Clear TPIDR_EL1 */
|
||||||
|
|
Loading…
Reference in a new issue