Fix subtle memory subsystem bug [O. Galibert]

This commit is contained in:
Olivier Galibert 2019-05-28 15:41:19 +02:00
parent 87d548d205
commit 3cddb3dbb2
2 changed files with 5 additions and 4 deletions

View File

@ -84,10 +84,10 @@ template<int Width, int AddrShift, int Endian> memory_units_descriptor<Width, Ad
for(u32 i=0; i<4; i++)
if(m_entries_for_key.find(m_keymap[i]) == m_entries_for_key.end())
generate(m_keymap[i], umasks[i], cswidth, bits_per_access, base_shift, shift, active_count);
generate(m_keymap[i], unitmask, umasks[i], cswidth, bits_per_access, base_shift, shift, active_count);
}
template<int Width, int AddrShift, int Endian> void memory_units_descriptor<Width, AddrShift, Endian>::generate(u8 ukey, typename emu::detail::handler_entry_size<Width>::uX umask, u32 cswidth, u32 bits_per_access, u8 base_shift, s8 shift, u32 active_count)
template<int Width, int AddrShift, int Endian> void memory_units_descriptor<Width, AddrShift, Endian>::generate(u8 ukey, typename emu::detail::handler_entry_size<Width>::uX gumask, typename emu::detail::handler_entry_size<Width>::uX umask, u32 cswidth, u32 bits_per_access, u8 base_shift, s8 shift, u32 active_count)
{
auto &entries = m_entries_for_key[ukey];
@ -105,8 +105,9 @@ template<int Width, int AddrShift, int Endian> void memory_units_descriptor<Widt
if(umask & numask) {
uX amask = csmask << (i & ~(cswidth - 1));
entries.emplace_back(entry{ amask, numask, shift, u8(i), u8(Endian == ENDIANNESS_BIG ? active_count - 1 - offset : offset) });
offset ++;
}
if(gumask & numask)
offset ++;
}
}

View File

@ -37,5 +37,5 @@ private:
u8 m_access_width;
u8 m_access_endian;
void generate(u8 ukey, uX umask, u32 cswidth, u32 bits_per_access, u8 base_shift, s8 shift, u32 active_count);
void generate(u8 ukey, uX gumask, uX umask, u32 cswidth, u32 bits_per_access, u8 base_shift, s8 shift, u32 active_count);
};