mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-09-01 07:06:10 +00:00
Cleanup
This commit is contained in:
parent
59b3ddfb12
commit
54764b6deb
2 changed files with 12 additions and 14 deletions
|
@ -105,8 +105,9 @@ void Kernel::controlMemory() {
|
||||||
// The same as a Map operation, except in reverse
|
// The same as a Map operation, except in reverse
|
||||||
if (!mem.mapVirtualMemory(
|
if (!mem.mapVirtualMemory(
|
||||||
addr0, addr1, pages, false, false, false, MemoryState::Alias, MemoryState::Aliased, MemoryState::Free, MemoryState::Private
|
addr0, addr1, pages, false, false, false, MemoryState::Alias, MemoryState::Aliased, MemoryState::Free, MemoryState::Private
|
||||||
))
|
)) {
|
||||||
Helpers::panic("ControlMemory: Failed to unmap memory");
|
Helpers::panic("ControlMemory: Failed to unmap memory");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Operation::Protect:
|
case Operation::Protect:
|
||||||
|
@ -138,7 +139,7 @@ void Kernel::queryMemory() {
|
||||||
const auto result = mem.queryMemory(info, addr);
|
const auto result = mem.queryMemory(info, addr);
|
||||||
regs[0] = result;
|
regs[0] = result;
|
||||||
regs[1] = info.baseAddr;
|
regs[1] = info.baseAddr;
|
||||||
regs[2] = info.pages << 12;
|
regs[2] = info.pages * Memory::pageSize;
|
||||||
regs[3] = info.perms;
|
regs[3] = info.perms;
|
||||||
regs[4] = info.state;
|
regs[4] = info.state;
|
||||||
regs[5] = 0; // page flags
|
regs[5] = 0; // page flags
|
||||||
|
|
|
@ -150,7 +150,7 @@ static const std::string CRR_MAGIC("CRR0");
|
||||||
using namespace KernelMemoryTypes;
|
using namespace KernelMemoryTypes;
|
||||||
|
|
||||||
class CRO {
|
class CRO {
|
||||||
Memory &mem;
|
Memory& mem;
|
||||||
|
|
||||||
u32 croPointer; // Origin address of CRO in RAM
|
u32 croPointer; // Origin address of CRO in RAM
|
||||||
u32 oldDataSegmentOffset;
|
u32 oldDataSegmentOffset;
|
||||||
|
@ -158,7 +158,7 @@ class CRO {
|
||||||
bool isCRO; // False if CRS
|
bool isCRO; // False if CRS
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CRO(Memory &mem, u32 croPointer, bool isCRO) : mem(mem), croPointer(croPointer), oldDataSegmentOffset(0), isCRO(isCRO) {}
|
CRO(Memory& mem, u32 croPointer, bool isCRO) : mem(mem), croPointer(croPointer), oldDataSegmentOffset(0), isCRO(isCRO) {}
|
||||||
~CRO() = default;
|
~CRO() = default;
|
||||||
|
|
||||||
std::string getModuleName() {
|
std::string getModuleName() {
|
||||||
|
@ -174,9 +174,7 @@ class CRO {
|
||||||
u32 getFixedSize() { return mem.read32(croPointer + CROHeader::FixedSize); }
|
u32 getFixedSize() { return mem.read32(croPointer + CROHeader::FixedSize); }
|
||||||
|
|
||||||
void setNextCRO(u32 nextCRO) { mem.write32(croPointer + CROHeader::NextCRO, nextCRO); }
|
void setNextCRO(u32 nextCRO) { mem.write32(croPointer + CROHeader::NextCRO, nextCRO); }
|
||||||
|
|
||||||
void setPrevCRO(u32 prevCRO) { mem.write32(croPointer + CROHeader::PrevCRO, prevCRO); }
|
void setPrevCRO(u32 prevCRO) { mem.write32(croPointer + CROHeader::PrevCRO, prevCRO); }
|
||||||
|
|
||||||
u32 getSize() { return mem.read32(croPointer + CROHeader::FileSize); }
|
u32 getSize() { return mem.read32(croPointer + CROHeader::FileSize); }
|
||||||
|
|
||||||
void write32(u32 addr, u32 value) {
|
void write32(u32 addr, u32 value) {
|
||||||
|
@ -185,11 +183,11 @@ class CRO {
|
||||||
// can't be accessed via mem.write32()
|
// can't be accessed via mem.write32()
|
||||||
auto writePointer = mem.getWritePointer(addr);
|
auto writePointer = mem.getWritePointer(addr);
|
||||||
if (writePointer) {
|
if (writePointer) {
|
||||||
*(u32 *)writePointer = value;
|
*(u32*)writePointer = value;
|
||||||
} else {
|
} else {
|
||||||
auto readPointer = mem.getReadPointer(addr);
|
auto readPointer = mem.getReadPointer(addr);
|
||||||
if (readPointer) {
|
if (readPointer) {
|
||||||
*(u32 *)readPointer = value;
|
*(u32*)readPointer = value;
|
||||||
} else {
|
} else {
|
||||||
Helpers::panic("LDR_RO write to invalid address = %X\n", addr);
|
Helpers::panic("LDR_RO write to invalid address = %X\n", addr);
|
||||||
}
|
}
|
||||||
|
@ -225,17 +223,15 @@ class CRO {
|
||||||
|
|
||||||
u32 getOnUnresolvedAddr() { return getSegmentAddr(mem.read32(croPointer + CROHeader::OnUnresolved)); }
|
u32 getOnUnresolvedAddr() { return getSegmentAddr(mem.read32(croPointer + CROHeader::OnUnresolved)); }
|
||||||
|
|
||||||
u32 getNamedExportSymbolAddr(const std::string &symbolName) {
|
u32 getNamedExportSymbolAddr(const std::string& symbolName) {
|
||||||
// Note: The CRO contains a trie for fast symbol lookup. For simplicity,
|
// Note: The CRO contains a trie for fast symbol lookup. For simplicity,
|
||||||
// we won't use it and instead look up the symbol in the named export symbol table
|
// we won't use it and instead look up the symbol in the named export symbol table
|
||||||
|
|
||||||
const u32 exportStringSize = mem.read32(croPointer + CROHeader::ExportStringSize);
|
const u32 exportStringSize = mem.read32(croPointer + CROHeader::ExportStringSize);
|
||||||
|
|
||||||
const CROHeaderEntry namedExportTable = getHeaderEntry(CROHeader::NamedExportTableOffset);
|
const CROHeaderEntry namedExportTable = getHeaderEntry(CROHeader::NamedExportTableOffset);
|
||||||
|
|
||||||
for (u32 namedExport = 0; namedExport < namedExportTable.size; namedExport++) {
|
for (u32 namedExport = 0; namedExport < namedExportTable.size; namedExport++) {
|
||||||
const u32 nameOffset = mem.read32(namedExportTable.offset + 8 * namedExport + NamedExportTable::NameOffset);
|
const u32 nameOffset = mem.read32(namedExportTable.offset + 8 * namedExport + NamedExportTable::NameOffset);
|
||||||
|
|
||||||
const std::string exportSymbolName = mem.readString(nameOffset, exportStringSize);
|
const std::string exportSymbolName = mem.readString(nameOffset, exportStringSize);
|
||||||
|
|
||||||
if (symbolName.compare(exportSymbolName) == 0) {
|
if (symbolName.compare(exportSymbolName) == 0) {
|
||||||
|
@ -430,7 +426,7 @@ class CRO {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool rebaseSegmentTable(u32 dataVaddr, u32 bssVaddr, u32 *oldDataVaddr) {
|
bool rebaseSegmentTable(u32 dataVaddr, u32 bssVaddr, u32* oldDataVaddr) {
|
||||||
const CROHeaderEntry segmentTable = getHeaderEntry(CROHeader::SegmentTableOffset);
|
const CROHeaderEntry segmentTable = getHeaderEntry(CROHeader::SegmentTableOffset);
|
||||||
|
|
||||||
for (u32 segment = 0; segment < segmentTable.size; segment++) {
|
for (u32 segment = 0; segment < segmentTable.size; segment++) {
|
||||||
|
@ -661,7 +657,7 @@ class CRO {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool relocateInternalSymbols(u32 oldDataVaddr) {
|
bool relocateInternalSymbols(u32 oldDataVaddr) {
|
||||||
const u8 *header = (u8 *)mem.getReadPointer(croPointer);
|
const u8* header = (u8*)mem.getReadPointer(croPointer);
|
||||||
|
|
||||||
const CROHeaderEntry relocationPatchTable = getHeaderEntry(CROHeader::RelocationPatchTableOffset);
|
const CROHeaderEntry relocationPatchTable = getHeaderEntry(CROHeader::RelocationPatchTableOffset);
|
||||||
const CROHeaderEntry segmentTable = getHeaderEntry(CROHeader::SegmentTableOffset);
|
const CROHeaderEntry segmentTable = getHeaderEntry(CROHeader::SegmentTableOffset);
|
||||||
|
@ -673,7 +669,6 @@ class CRO {
|
||||||
const u32 addend = mem.read32(relocationPatchTable.offset + 12 * relocationPatch + RelocationPatch::Addend);
|
const u32 addend = mem.read32(relocationPatchTable.offset + 12 * relocationPatch + RelocationPatch::Addend);
|
||||||
|
|
||||||
const u32 segmentAddr = getSegmentAddr(segmentOffset);
|
const u32 segmentAddr = getSegmentAddr(segmentOffset);
|
||||||
|
|
||||||
const u32 entryID = mem.read32(segmentTable.offset + 12 * (segmentOffset & 0xF) + SegmentTable::ID);
|
const u32 entryID = mem.read32(segmentTable.offset + 12 * (segmentOffset & 0xF) + SegmentTable::ID);
|
||||||
|
|
||||||
u32 relocationTarget = segmentAddr;
|
u32 relocationTarget = segmentAddr;
|
||||||
|
@ -1247,6 +1242,7 @@ void LDRService::initialize(u32 messagePointer) {
|
||||||
bool succeeded = mem.mapVirtualMemory(
|
bool succeeded = mem.mapVirtualMemory(
|
||||||
mapVaddr, crsPointer, size >> 12, true, true, true, MemoryState::Free, MemoryState::Private, MemoryState::Locked, MemoryState::AliasCode
|
mapVaddr, crsPointer, size >> 12, true, true, true, MemoryState::Free, MemoryState::Private, MemoryState::Locked, MemoryState::AliasCode
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!succeeded) {
|
if (!succeeded) {
|
||||||
Helpers::panic("Failed to map CRS");
|
Helpers::panic("Failed to map CRS");
|
||||||
}
|
}
|
||||||
|
@ -1342,6 +1338,7 @@ void LDRService::loadCRO(u32 messagePointer, bool isNew) {
|
||||||
bool succeeded = mem.mapVirtualMemory(
|
bool succeeded = mem.mapVirtualMemory(
|
||||||
mapVaddr, croPointer, size >> 12, true, true, true, MemoryState::Free, MemoryState::Private, MemoryState::Locked, MemoryState::AliasCode
|
mapVaddr, croPointer, size >> 12, true, true, true, MemoryState::Free, MemoryState::Private, MemoryState::Locked, MemoryState::AliasCode
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!succeeded) {
|
if (!succeeded) {
|
||||||
Helpers::panic("Failed to map CRO");
|
Helpers::panic("Failed to map CRO");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue