Re-add ELF support

This commit is contained in:
wheremyfoodat 2025-08-03 11:36:28 +03:00
commit 3b1d05ecce

View file

@ -4,9 +4,10 @@
#include "memory.hpp" #include "memory.hpp"
using namespace ELFIO; using namespace ELFIO;
using namespace KernelMemoryTypes;
std::optional<u32> Memory::loadELF(std::ifstream& file) { std::optional<u32> Memory::loadELF(std::ifstream& file) {
/* loadedCXI = std::nullopt; // ELF files don't have a CXI, so set this to null loadedCXI = std::nullopt; // ELF files don't have a CXI, so set this to null
elfio reader; elfio reader;
if (!file.good() || !reader.load(file)) { if (!file.good() || !reader.load(file)) {
@ -24,6 +25,7 @@ std::optional<u32> Memory::loadELF(std::ifstream& file) {
auto segNum = reader.segments.size(); auto segNum = reader.segments.size();
printf("Number of segments: %d\n", segNum); printf("Number of segments: %d\n", segNum);
printf(" # Perms Vaddr File Size Mem Size\n"); printf(" # Perms Vaddr File Size Mem Size\n");
for (int i = 0; i < segNum; ++i) { for (int i = 0; i < segNum; ++i) {
const auto seg = reader.segments[i]; const auto seg = reader.segments[i];
const auto flags = seg->get_flags(); const auto flags = seg->get_flags();
@ -55,12 +57,11 @@ std::optional<u32> Memory::loadELF(std::ifstream& file) {
Helpers::warn("Rounding ELF segment size to %08X\n", memorySize); Helpers::warn("Rounding ELF segment size to %08X\n", memorySize);
} }
// This should also assert that findPaddr doesn't fail allocMemory(vaddr, memorySize / Memory::pageSize, FcramRegion::App, r, w, x, MemoryState::Code);
u32 fcramAddr = findPaddr(memorySize).value(); copyToVaddr(vaddr, data, fileSize);
std::memcpy(&fcram[fcramAddr], data, fileSize); }
// ELF can't specify a region, make it default to USA // ELF can't specify a region, make it default to USA
region = Regions::USA; region = Regions::USA;
return static_cast<u32>(reader.get_entry());*/ return static_cast<u32>(reader.get_entry());
return std::nullopt;
} }