Re-add 3DSX support

This commit is contained in:
wheremyfoodat 2025-08-03 11:47:36 +03:00
commit 8b551fba40

View file

@ -6,6 +6,8 @@
#include "memory.hpp" #include "memory.hpp"
using namespace KernelMemoryTypes;
namespace { namespace {
struct LoadInfo { struct LoadInfo {
u32 codeSegSizeAligned; u32 codeSegSizeAligned;
@ -26,7 +28,7 @@ namespace {
} // namespace } // namespace
bool Memory::map3DSX(HB3DSX& hb3dsx, const HB3DSX::Header& header) { bool Memory::map3DSX(HB3DSX& hb3dsx, const HB3DSX::Header& header) {
/* const LoadInfo hbInfo = { const LoadInfo hbInfo = {
.codeSegSizeAligned = (header.codeSegSize + 0xFFF) & ~0xFFF, .codeSegSizeAligned = (header.codeSegSize + 0xFFF) & ~0xFFF,
.rodataSegSizeAligned = (header.rodataSegSize + 0xFFF) & ~0xFFF, .rodataSegSizeAligned = (header.rodataSegSize + 0xFFF) & ~0xFFF,
.dataSegSizeAligned = (header.dataSegSize + 0xFFF) & ~0xFFF, .dataSegSizeAligned = (header.dataSegSize + 0xFFF) & ~0xFFF,
@ -53,12 +55,6 @@ bool Memory::map3DSX(HB3DSX& hb3dsx, const HB3DSX::Header& header) {
// suum of aligned values is always aligned, have an extra RW page for libctru // suum of aligned values is always aligned, have an extra RW page for libctru
const u32 totalSize = hbInfo.codeSegSizeAligned + hbInfo.rodataSegSizeAligned + hbInfo.dataSegSizeAligned + 4_KB; const u32 totalSize = hbInfo.codeSegSizeAligned + hbInfo.rodataSegSizeAligned + hbInfo.dataSegSizeAligned + 4_KB;
const auto opt = findPaddr(totalSize);
if (!opt.has_value()) {
Helpers::panic("Failed to find paddr to map 3DSX file's code to");
return false;
}
// Map the ROM on the kernel side // Map the ROM on the kernel side
const u32 textOffset = 0; const u32 textOffset = 0;
const u32 rodataOffset = textOffset + hbInfo.codeSegSizeAligned; const u32 rodataOffset = textOffset + hbInfo.codeSegSizeAligned;
@ -186,10 +182,10 @@ bool Memory::map3DSX(HB3DSX& hb3dsx, const HB3DSX::Header& header) {
return false; return false;
} }
} }
}*/ }
// Detect and fill _prm structure // Detect and fill _prm structure
/*HB3DSX::PrmStruct pst; HB3DSX::PrmStruct pst;
std::memcpy(&pst, &code[4], sizeof(pst)); std::memcpy(&pst, &code[4], sizeof(pst));
if (pst.magic[0] == '_' && pst.magic[1] == 'p' && pst.magic[2] == 'r' && pst.magic[3] == 'm') { if (pst.magic[0] == '_' && pst.magic[1] == 'p' && pst.magic[2] == 'r' && pst.magic[3] == 'm') {
// if there was any argv to put, it would go there // if there was any argv to put, it would go there
@ -205,7 +201,7 @@ bool Memory::map3DSX(HB3DSX& hb3dsx, const HB3DSX::Header& header) {
// RUNFLAG_APTREINIT: Reinitialize APT. // RUNFLAG_APTREINIT: Reinitialize APT.
// From libctru. Because there's no previously running software here // From libctru. Because there's no previously running software here
pst.runFlags |= 1 << 1;*/ pst.runFlags |= 1 << 1;
/* s64 dummy; /* s64 dummy;
bool isN3DS = svcGetSystemInfo(&dummy, 0x10001, 0) == 0; bool isN3DS = svcGetSystemInfo(&dummy, 0x10001, 0) == 0;
@ -213,7 +209,8 @@ bool Memory::map3DSX(HB3DSX& hb3dsx, const HB3DSX::Header& header) {
{ {
pst->heapSize = u32(48_MB); pst->heapSize = u32(48_MB);
pst->linearHeapSize = u32(64_MB); pst->linearHeapSize = u32(64_MB);
} else *//* { } else */
{
pst.heapSize = u32(24_MB); pst.heapSize = u32(24_MB);
pst.linearHeapSize = u32(32_MB); pst.linearHeapSize = u32(32_MB);
} }
@ -221,15 +218,19 @@ bool Memory::map3DSX(HB3DSX& hb3dsx, const HB3DSX::Header& header) {
std::memcpy(&code[4], &pst, sizeof(pst)); std::memcpy(&code[4], &pst, sizeof(pst));
} }
const auto paddr = opt.value(); // Text is R-X
std::memcpy(&fcram[paddr], &code[0], totalSize); // Copy the 3 segments + BSS to FCRAM allocMemory(textSegAddr, hbInfo.codeSegSizeAligned / Memory::pageSize, FcramRegion::App, true, false, true, MemoryState::Code);
copyToVaddr(textSegAddr, &code[textOffset], hbInfo.codeSegSizeAligned);
allocateMemory(textSegAddr, paddr + textOffset, hbInfo.codeSegSizeAligned, true, true, false, true); // Text is R-X // Rodata is R--
allocateMemory(rodataSegAddr, paddr + rodataOffset, hbInfo.rodataSegSizeAligned, true, true, false, false); // Rodata is R-- allocMemory(rodataSegAddr, hbInfo.rodataSegSizeAligned / Memory::pageSize, FcramRegion::App, true, false, false, MemoryState::Code);
allocateMemory(dataSegAddr, paddr + dataOffset, hbInfo.dataSegSizeAligned + 0x1000, true, true, true, false); // Data+BSS+Extra is RW- copyToVaddr(rodataSegAddr, &code[rodataOffset], hbInfo.rodataSegSizeAligned);
return true;*/ // Data + BSS + Extra is RW-. We allocate 1 extra page (4KB) which is not initialized to anything.
return false; allocMemory(dataSegAddr, (hbInfo.dataSegSizeAligned + 4_KB) / Memory::pageSize, FcramRegion::App, true, true, false, MemoryState::Private);
copyToVaddr(dataSegAddr, &code[dataOffset], hbInfo.dataSegSizeAligned);
return true;
} }
std::optional<u32> Memory::load3DSX(const std::filesystem::path& path) { std::optional<u32> Memory::load3DSX(const std::filesystem::path& path) {