diff --git a/src/core/kernel/fcram.cpp b/src/core/kernel/fcram.cpp index 4269c615..ad5b518c 100644 --- a/src/core/kernel/fcram.cpp +++ b/src/core/kernel/fcram.cpp @@ -7,6 +7,7 @@ void KFcram::Region::reset(u32 start, size_t size) { freePages = pages; Block initialBlock(pages, 0); + blocks.clear(); blocks.push_back(initialBlock); } diff --git a/src/core/kernel/kernel.cpp b/src/core/kernel/kernel.cpp index ad4c9245..9f69c67c 100644 --- a/src/core/kernel/kernel.cpp +++ b/src/core/kernel/kernel.cpp @@ -140,9 +140,6 @@ void Kernel::reset() { threadCount = 0; aliveThreadCount = 0; - // TODO: These values should be derived from the memory type in an app's exheader - fcramManager.reset(Memory::FCRAM_SIZE, Memory::FCRAM_APPLICATION_SIZE, Memory::FCRAM_SYSTEM_SIZE, Memory::FCRAM_BASE_SIZE); - for (auto& t : threads) { t.status = ThreadStatus::Dead; t.waitList.clear(); diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 9f435fa9..624780f2 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -306,6 +306,7 @@ void Memory::changeMemoryState(u32 vaddr, s32 pages, const Operation& op) { // Now that the block has been found, fill it with the necessary info auto oldState = it->state; + u32 oldPerms = it->perms; it->baseAddr = reqStart; it->pages = pages; if (op.changePerms) it->perms = (op.r ? PERMISSION_R : 0) | (op.w ? PERMISSION_W : 0) | (op.x ? PERMISSION_X : 0); @@ -313,13 +314,13 @@ void Memory::changeMemoryState(u32 vaddr, s32 pages, const Operation& op) { // If the requested memory region is smaller than the block found, the block must be split if (blockStart < reqStart) { - MemoryInfo startBlock(blockStart, (reqStart - blockStart) >> 12, 0, oldState); + MemoryInfo startBlock(blockStart, (reqStart - blockStart) >> 12, oldPerms, oldState); memoryInfo.insert(it, startBlock); } if (reqEnd < blockEnd) { auto itAfter = std::next(it); - MemoryInfo endBlock(reqEnd, (blockEnd - reqEnd) >> 12, 0, oldState); + MemoryInfo endBlock(reqEnd, (blockEnd - reqEnd) >> 12, oldPerms, oldState); memoryInfo.insert(itAfter, endBlock); }