mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-01 14:58:14 +00:00
Add the scratchpad's missing kernel-mode mirrors, fix a mask bug hiding them
The scratchpad (PSP's repurposed-cache scratch RAM, 0x00010000+) was only mirrored for user-mode access (cached 0x00010000, uncached 0x40010000) - kernel-mode code sees it at 0x80010000/0xC0010000 (the kernel bit, 0x80000000, is independent of and combinable with the uncached bit, 0x40000000 - not "the uncached bit" as an earlier doc note in this branch mistakenly called it). Missing entirely from MemMap.cpp's views[] table, causing a real SIGSEGV the first time kernel-mode code (flash0:/reboot.bin) touched it. Adding the two missing views wasn't sufficient: the scratchpad range check is duplicated eight times (IsValidAddress/IsValid2AlignedAddress/ IsValid4AlignedAddress/MaxSizeAtAddress in MemMap.h, and four more in MemMapFunctions.cpp), and all eight used a mask (0xBFFFC000) that cleared the uncached bit but kept the kernel bit, rejecting 0x80010000 as invalid before ever reaching the now-mapped memory. Fixed all eight to 0x3FFFC000, matching Memory::MEMVIEW32_MASK (which the JIT backends already used correctly for the equivalent runtime check). Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01GZq8ZtJmFY7bkX5FVkr3P9
This commit is contained in:
1 parent
75174af77b
commit
28cbb3a967
3 files changed
+19
-9
No files matched your search
@@ -53,6 +53,8 @@ MemArena g_arena;
|
||||
u8 *m_pNullPage;
|
||||
u8 *m_pPhysicalScratchPad;
|
||||
u8 *m_pUncachedScratchPad;
|
||||
u8 *m_pKernelScratchPad;
|
||||
u8 *m_pUncachedKernelScratchPad;
|
||||
// 64-bit: Pointers to high-mem mirrors
|
||||
// 32-bit: Same as above
|
||||
u8 *m_pPhysicalRAM[3];
|
||||
@@ -92,6 +94,12 @@ static MemoryView views[] = {
|
||||
{&m_pNullPage, 0x00000000, 0x00010000, MV_NULL_PAGE}, // Null page, usually not enabled. Only used for working around some race condition bugs.
|
||||
{&m_pPhysicalScratchPad, 0x00010000, SCRATCHPAD_SIZE, 0},
|
||||
{&m_pUncachedScratchPad, 0x40010000, SCRATCHPAD_SIZE, MV_MIRROR_PREVIOUS},
|
||||
// Kernel-mode code (e.g. flash0:/reboot.bin) sees the scratchpad through these mirrors -
|
||||
// same two address bits as RAM below (0x80000000 = kernel, 0x40000000 = uncached,
|
||||
// independently combinable), just missing here until this was noticed via a real SIGSEGV
|
||||
// writing 0x80010000 (see docs/VSHBootInvestigation.md).
|
||||
{&m_pKernelScratchPad, 0x80010000, SCRATCHPAD_SIZE, MV_MIRROR_PREVIOUS | MV_KERNEL},
|
||||
{&m_pUncachedKernelScratchPad,0xC0010000, SCRATCHPAD_SIZE, MV_MIRROR_PREVIOUS | MV_KERNEL},
|
||||
{&m_pPhysicalVRAM[0], 0x04000000, 0x00200000, 0},
|
||||
{&m_pPhysicalVRAM[1], 0x04200000, 0x00200000, MV_MIRROR_PREVIOUS},
|
||||
{&m_pPhysicalVRAM[2], 0x04400000, 0x00200000, MV_MIRROR_PREVIOUS},
|
||||
|
||||
Reference in new issue
Block a user