mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 02:37:35 +00:00
UserspaceEmulator: Wrap the GPRs in ValueWithShadow
...instead of manually tracking their shadow data.
This commit is contained in:
parent
f6e82a8e0a
commit
70b53b44b2
3 changed files with 25 additions and 30 deletions
|
@ -74,8 +74,10 @@ SoftCPU::SoftCPU(Emulator& emulator)
|
||||||
: m_emulator(emulator)
|
: m_emulator(emulator)
|
||||||
, m_fpu(emulator, *this)
|
, m_fpu(emulator, *this)
|
||||||
{
|
{
|
||||||
memset(m_gpr, 0, sizeof(m_gpr));
|
PartAddressableRegister empty_reg;
|
||||||
memset(m_gpr_shadow, 1, sizeof(m_gpr_shadow));
|
explicit_bzero(&empty_reg, sizeof(empty_reg));
|
||||||
|
for (auto& gpr : m_gpr)
|
||||||
|
gpr = ValueWithShadow<PartAddressableRegister>::create_initialized(empty_reg);
|
||||||
|
|
||||||
m_segment[(int)X86::SegmentRegister::CS] = 0x1b;
|
m_segment[(int)X86::SegmentRegister::CS] = 0x1b;
|
||||||
m_segment[(int)X86::SegmentRegister::DS] = 0x23;
|
m_segment[(int)X86::SegmentRegister::DS] = 0x23;
|
||||||
|
|
|
@ -88,21 +88,21 @@ public:
|
||||||
{
|
{
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case X86::RegisterAL:
|
case X86::RegisterAL:
|
||||||
return { m_gpr[X86::RegisterEAX].low_u8, m_gpr_shadow[X86::RegisterEAX].low_u8 };
|
return m_gpr[X86::RegisterEAX].reference_to<&PartAddressableRegister::low_u8>();
|
||||||
case X86::RegisterAH:
|
case X86::RegisterAH:
|
||||||
return { m_gpr[X86::RegisterEAX].high_u8, m_gpr_shadow[X86::RegisterEAX].high_u8 };
|
return m_gpr[X86::RegisterEAX].reference_to<&PartAddressableRegister::high_u8>();
|
||||||
case X86::RegisterBL:
|
case X86::RegisterBL:
|
||||||
return { m_gpr[X86::RegisterEBX].low_u8, m_gpr_shadow[X86::RegisterEBX].low_u8 };
|
return m_gpr[X86::RegisterEBX].reference_to<&PartAddressableRegister::low_u8>();
|
||||||
case X86::RegisterBH:
|
case X86::RegisterBH:
|
||||||
return { m_gpr[X86::RegisterEBX].high_u8, m_gpr_shadow[X86::RegisterEBX].high_u8 };
|
return m_gpr[X86::RegisterEBX].reference_to<&PartAddressableRegister::high_u8>();
|
||||||
case X86::RegisterCL:
|
case X86::RegisterCL:
|
||||||
return { m_gpr[X86::RegisterECX].low_u8, m_gpr_shadow[X86::RegisterECX].low_u8 };
|
return m_gpr[X86::RegisterECX].reference_to<&PartAddressableRegister::low_u8>();
|
||||||
case X86::RegisterCH:
|
case X86::RegisterCH:
|
||||||
return { m_gpr[X86::RegisterECX].high_u8, m_gpr_shadow[X86::RegisterECX].high_u8 };
|
return m_gpr[X86::RegisterECX].reference_to<&PartAddressableRegister::high_u8>();
|
||||||
case X86::RegisterDL:
|
case X86::RegisterDL:
|
||||||
return { m_gpr[X86::RegisterEDX].low_u8, m_gpr_shadow[X86::RegisterEDX].low_u8 };
|
return m_gpr[X86::RegisterEDX].reference_to<&PartAddressableRegister::low_u8>();
|
||||||
case X86::RegisterDH:
|
case X86::RegisterDH:
|
||||||
return { m_gpr[X86::RegisterEDX].high_u8, m_gpr_shadow[X86::RegisterEDX].high_u8 };
|
return m_gpr[X86::RegisterEDX].reference_to<&PartAddressableRegister::high_u8>();
|
||||||
}
|
}
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
@ -111,43 +111,43 @@ public:
|
||||||
{
|
{
|
||||||
switch (reg) {
|
switch (reg) {
|
||||||
case X86::RegisterAL:
|
case X86::RegisterAL:
|
||||||
return { m_gpr[X86::RegisterEAX].low_u8, m_gpr_shadow[X86::RegisterEAX].low_u8 };
|
return m_gpr[X86::RegisterEAX].slice<&PartAddressableRegister::low_u8>();
|
||||||
case X86::RegisterAH:
|
case X86::RegisterAH:
|
||||||
return { m_gpr[X86::RegisterEAX].high_u8, m_gpr_shadow[X86::RegisterEAX].high_u8 };
|
return m_gpr[X86::RegisterEAX].slice<&PartAddressableRegister::high_u8>();
|
||||||
case X86::RegisterBL:
|
case X86::RegisterBL:
|
||||||
return { m_gpr[X86::RegisterEBX].low_u8, m_gpr_shadow[X86::RegisterEBX].low_u8 };
|
return m_gpr[X86::RegisterEBX].slice<&PartAddressableRegister::low_u8>();
|
||||||
case X86::RegisterBH:
|
case X86::RegisterBH:
|
||||||
return { m_gpr[X86::RegisterEBX].high_u8, m_gpr_shadow[X86::RegisterEBX].high_u8 };
|
return m_gpr[X86::RegisterEBX].slice<&PartAddressableRegister::high_u8>();
|
||||||
case X86::RegisterCL:
|
case X86::RegisterCL:
|
||||||
return { m_gpr[X86::RegisterECX].low_u8, m_gpr_shadow[X86::RegisterECX].low_u8 };
|
return m_gpr[X86::RegisterECX].slice<&PartAddressableRegister::low_u8>();
|
||||||
case X86::RegisterCH:
|
case X86::RegisterCH:
|
||||||
return { m_gpr[X86::RegisterECX].high_u8, m_gpr_shadow[X86::RegisterECX].high_u8 };
|
return m_gpr[X86::RegisterECX].slice<&PartAddressableRegister::high_u8>();
|
||||||
case X86::RegisterDL:
|
case X86::RegisterDL:
|
||||||
return { m_gpr[X86::RegisterEDX].low_u8, m_gpr_shadow[X86::RegisterEDX].low_u8 };
|
return m_gpr[X86::RegisterEDX].slice<&PartAddressableRegister::low_u8>();
|
||||||
case X86::RegisterDH:
|
case X86::RegisterDH:
|
||||||
return { m_gpr[X86::RegisterEDX].high_u8, m_gpr_shadow[X86::RegisterEDX].high_u8 };
|
return m_gpr[X86::RegisterEDX].slice<&PartAddressableRegister::high_u8>();
|
||||||
}
|
}
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueWithShadow<u16> const_gpr16(X86::RegisterIndex16 reg) const
|
ValueWithShadow<u16> const_gpr16(X86::RegisterIndex16 reg) const
|
||||||
{
|
{
|
||||||
return { m_gpr[reg].low_u16, m_gpr_shadow[reg].low_u16 };
|
return m_gpr[reg].slice<&PartAddressableRegister::low_u16>();
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueAndShadowReference<u16> gpr16(X86::RegisterIndex16 reg)
|
ValueAndShadowReference<u16> gpr16(X86::RegisterIndex16 reg)
|
||||||
{
|
{
|
||||||
return { m_gpr[reg].low_u16, m_gpr_shadow[reg].low_u16 };
|
return m_gpr[reg].reference_to<&PartAddressableRegister::low_u16>();
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueWithShadow<u32> const_gpr32(X86::RegisterIndex32 reg) const
|
ValueWithShadow<u32> const_gpr32(X86::RegisterIndex32 reg) const
|
||||||
{
|
{
|
||||||
return { m_gpr[reg].full_u32, m_gpr_shadow[reg].full_u32 };
|
return m_gpr[reg].slice<&PartAddressableRegister::full_u32>();
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueAndShadowReference<u32> gpr32(X86::RegisterIndex32 reg)
|
ValueAndShadowReference<u32> gpr32(X86::RegisterIndex32 reg)
|
||||||
{
|
{
|
||||||
return { m_gpr[reg].full_u32, m_gpr_shadow[reg].full_u32 };
|
return m_gpr[reg].reference_to<&PartAddressableRegister::full_u32>();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -1252,8 +1252,7 @@ private:
|
||||||
Emulator& m_emulator;
|
Emulator& m_emulator;
|
||||||
SoftFPU m_fpu;
|
SoftFPU m_fpu;
|
||||||
|
|
||||||
PartAddressableRegister m_gpr[8];
|
ValueWithShadow<PartAddressableRegister> m_gpr[8];
|
||||||
PartAddressableRegister m_gpr_shadow[8];
|
|
||||||
|
|
||||||
u16 m_segment[8] { 0 };
|
u16 m_segment[8] { 0 };
|
||||||
u32 m_eflags { 0 };
|
u32 m_eflags { 0 };
|
||||||
|
|
|
@ -107,12 +107,6 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ValueAndShadowReference(T& value, T& shadow)
|
|
||||||
: m_value(value)
|
|
||||||
, m_shadow(*bit_cast<ShadowType*>(&shadow))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_uninitialized() const
|
bool is_uninitialized() const
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < sizeof(ShadowType); ++i) {
|
for (size_t i = 0; i < sizeof(ShadowType); ++i) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue