mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-26 07:45:33 +01:00
MMU: Make use of UReg_SDR1 in SDRUpdated()
Lets us simplify SDRUpdated() a little bit. This also fixes the layout of UReg_SDR1. Turns out this struct has been incorrect (from a little-endian perspective) the entire time and went unnoticed, since the union was never used.
This commit is contained in:
parent
1c776d8c1a
commit
75840f62ff
@ -611,11 +611,14 @@ union UReg_HID4
|
|||||||
// SDR1 - Page Table format
|
// SDR1 - Page Table format
|
||||||
union UReg_SDR1
|
union UReg_SDR1
|
||||||
{
|
{
|
||||||
BitField<0, 16, u32> htaborg;
|
BitField<0, 9, u32> htabmask;
|
||||||
BitField<16, 7, u32> reserved;
|
BitField<9, 7, u32> reserved;
|
||||||
BitField<23, 9, u32> htabmask;
|
BitField<16, 16, u32> htaborg;
|
||||||
|
|
||||||
u32 Hex = 0;
|
u32 Hex = 0;
|
||||||
|
|
||||||
|
UReg_SDR1() = default;
|
||||||
|
explicit UReg_SDR1(u32 hex_) : Hex{hex_} {}
|
||||||
};
|
};
|
||||||
|
|
||||||
// MMCR0 - Monitor Mode Control Register 0 format
|
// MMCR0 - Monitor Mode Control Register 0 format
|
||||||
|
@ -1199,7 +1199,9 @@ static void GenerateISIException(u32 effective_address)
|
|||||||
|
|
||||||
void SDRUpdated()
|
void SDRUpdated()
|
||||||
{
|
{
|
||||||
u32 htabmask = SDR1_HTABMASK(PowerPC::ppcState.spr[SPR_SDR]);
|
const auto sdr = UReg_SDR1{ppcState.spr[SPR_SDR]};
|
||||||
|
const u32 htabmask = sdr.htabmask;
|
||||||
|
|
||||||
if (!Common::IsValidLowMask(htabmask))
|
if (!Common::IsValidLowMask(htabmask))
|
||||||
WARN_LOG_FMT(POWERPC, "Invalid HTABMASK: 0b{:032b}", htabmask);
|
WARN_LOG_FMT(POWERPC, "Invalid HTABMASK: 0b{:032b}", htabmask);
|
||||||
|
|
||||||
@ -1207,12 +1209,12 @@ void SDRUpdated()
|
|||||||
// must be equal to the number of trailing ones in the mask (i.e. HTABORG must be
|
// must be equal to the number of trailing ones in the mask (i.e. HTABORG must be
|
||||||
// properly aligned), this is actually not a hard requirement. Real hardware will just OR
|
// properly aligned), this is actually not a hard requirement. Real hardware will just OR
|
||||||
// the base address anyway. Ignoring SDR changes would lead to incorrect emulation.
|
// the base address anyway. Ignoring SDR changes would lead to incorrect emulation.
|
||||||
u32 htaborg = SDR1_HTABORG(PowerPC::ppcState.spr[SPR_SDR]);
|
const u32 htaborg = sdr.htaborg;
|
||||||
if (htaborg & htabmask)
|
if ((htaborg & htabmask) != 0)
|
||||||
WARN_LOG_FMT(POWERPC, "Invalid HTABORG: htaborg=0x{:08x} htabmask=0x{:08x}", htaborg, htabmask);
|
WARN_LOG_FMT(POWERPC, "Invalid HTABORG: htaborg=0x{:08x} htabmask=0x{:08x}", htaborg, htabmask);
|
||||||
|
|
||||||
PowerPC::ppcState.pagetable_base = htaborg << 16;
|
ppcState.pagetable_base = htaborg << 16;
|
||||||
PowerPC::ppcState.pagetable_hashmask = ((htabmask << 10) | 0x3ff);
|
ppcState.pagetable_hashmask = ((htabmask << 10) | 0x3ff);
|
||||||
}
|
}
|
||||||
|
|
||||||
enum class TLBLookupResult
|
enum class TLBLookupResult
|
||||||
|
Loading…
x
Reference in New Issue
Block a user