Preliminary implemntation of SMM save statei
Fixed fetchModeMask for load32bitOsStack
This commit is contained in:
parent
c7d142200f
commit
da3d26d7f4
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: arith32.cc,v 1.48 2006-03-26 18:58:00 sshwarts Exp $
|
||||
// $Id: arith32.cc,v 1.49 2006-03-27 18:02:07 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -440,13 +440,13 @@ void BX_CPU_C::CDQ(bxInstruction_c *i)
|
||||
|
||||
void BX_CPU_C::CMPXCHG_XBTS(bxInstruction_c *i)
|
||||
{
|
||||
BX_INFO(("CMPXCHG_XBTS:"));
|
||||
BX_INFO(("CMPXCHG_XBTS: Generate #UD exception"));
|
||||
UndefinedOpcode(i);
|
||||
}
|
||||
|
||||
void BX_CPU_C::CMPXCHG_IBTS(bxInstruction_c *i)
|
||||
{
|
||||
BX_INFO(("CMPXCHG_IBTS:"));
|
||||
BX_INFO(("CMPXCHG_IBTS: Generate #UD exception"));
|
||||
UndefinedOpcode(i);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: cpu.h,v 1.272 2006-03-26 18:58:00 sshwarts Exp $
|
||||
// $Id: cpu.h,v 1.273 2006-03-27 18:02:07 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -1233,9 +1233,9 @@ public: // for now...
|
||||
#if BX_SUPPORT_ICACHE
|
||||
bxICache_c iCache BX_CPP_AlignN(32);
|
||||
Bit32u fetchModeMask;
|
||||
Bit32u updateFetchModeMask(void);
|
||||
#endif
|
||||
|
||||
|
||||
struct {
|
||||
bx_address rm_addr; // The address offset after resolution.
|
||||
Bit32u paddress1; // physical address after translation of 1st len1 bytes of data
|
||||
@ -2742,6 +2742,8 @@ public: // for now...
|
||||
BX_CPP_AttrNoReturn();
|
||||
#endif
|
||||
BX_SMF bx_bool smram_write(bx_phy_address a20addr);
|
||||
BX_SMF void smram_save_state(void);
|
||||
BX_SMF bx_bool smram_restore_state(void);
|
||||
BX_SMF int int_number(bx_segment_reg_t *seg);
|
||||
BX_SMF void CR3_change(bx_address value) BX_CPP_AttrRegparmN(1);
|
||||
BX_SMF void pagingCR0Changed(Bit32u oldCR0, Bit32u newCR0) BX_CPP_AttrRegparmN(2);
|
||||
@ -2927,18 +2929,18 @@ public: // for now...
|
||||
|
||||
BX_SMF void SetCR0(Bit32u val_32);
|
||||
#if BX_CPU_LEVEL >= 4
|
||||
BX_SMF void SetCR4(Bit32u val_32);
|
||||
BX_SMF bx_bool SetCR4(Bit32u val_32);
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
#if BX_SUPPORT_ICACHE
|
||||
|
||||
BX_CPP_INLINE Bit32u createFetchModeMask(BX_CPU_C *cpu)
|
||||
BX_CPP_INLINE Bit32u BX_CPU_C::updateFetchModeMask(void)
|
||||
{
|
||||
return (cpu->sregs[BX_SEG_REG_CS].cache.u.segment.d_b << 31)
|
||||
return (BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].cache.u.segment.d_b << 31)
|
||||
#if BX_SUPPORT_X86_64
|
||||
| ((cpu->cpu_mode == BX_MODE_LONG_64)<<30)
|
||||
| ((BX_CPU_THIS_PTR cpu_mode == BX_MODE_LONG_64)<<30)
|
||||
#endif
|
||||
| (1<<29); // iCache code.
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// $Id: ctrl_xfer_pro.cc,v 1.52 2006-03-06 22:02:52 sshwarts Exp $
|
||||
// $Id: ctrl_xfer_pro.cc,v 1.53 2006-03-27 18:02:07 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -118,7 +118,7 @@ BX_CPU_C::load_cs(bx_selector_t *selector, bx_descriptor_t *descriptor, Bit8u cp
|
||||
#endif
|
||||
|
||||
#if BX_SUPPORT_ICACHE
|
||||
BX_CPU_THIS_PTR fetchModeMask = createFetchModeMask(BX_CPU_THIS);
|
||||
BX_CPU_THIS_PTR updateFetchModeMask();
|
||||
#endif
|
||||
|
||||
// Loading CS will invalidate the EIP fetch window.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: debugstuff.cc,v 1.60 2006-03-06 22:02:53 sshwarts Exp $
|
||||
// $Id: debugstuff.cc,v 1.61 2006-03-27 18:02:07 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -719,7 +719,7 @@ bx_bool BX_CPU_C::dbg_set_cpu(bx_dbg_cpu_t *cpu)
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].cache.u.segment.limit;
|
||||
|
||||
#if BX_SUPPORT_ICACHE
|
||||
BX_CPU_THIS_PTR fetchModeMask = createFetchModeMask(BX_CPU_THIS);
|
||||
BX_CPU_THIS_PTR updateFetchModeMask();
|
||||
#endif
|
||||
|
||||
// SS:
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: init.cc,v 1.94 2006-03-16 20:24:09 sshwarts Exp $
|
||||
// $Id: init.cc,v 1.95 2006-03-27 18:02:07 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -511,7 +511,7 @@ void BX_CPU_C::reset(unsigned source)
|
||||
#endif
|
||||
|
||||
#if BX_SUPPORT_ICACHE
|
||||
BX_CPU_THIS_PTR fetchModeMask = createFetchModeMask(BX_CPU_THIS);
|
||||
BX_CPU_THIS_PTR updateFetchModeMask();
|
||||
#endif
|
||||
|
||||
/* DS (Data Segment) and descriptor cache */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: proc_ctrl.cc,v 1.142 2006-03-22 20:47:11 sshwarts Exp $
|
||||
// $Id: proc_ctrl.cc,v 1.143 2006-03-27 18:02:07 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -591,10 +591,6 @@ void BX_CPU_C::MOV_CdRd(bxInstruction_c *i)
|
||||
|
||||
switch (i->nnn()) {
|
||||
case 0: // CR0 (MSW)
|
||||
// BX_INFO(("MOV_CdRd:CR0: R32 = %08x @CS:EIP %04x:%04x ",
|
||||
// (unsigned) val_32,
|
||||
// (unsigned) BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value,
|
||||
// (unsigned) EIP));
|
||||
SetCR0(val_32);
|
||||
break;
|
||||
|
||||
@ -616,9 +612,10 @@ void BX_CPU_C::MOV_CdRd(bxInstruction_c *i)
|
||||
BX_PANIC(("MOV_CdRd: write to CR4 of 0x%08x on 386", val_32));
|
||||
UndefinedOpcode(i);
|
||||
#else
|
||||
// Protected mode: #GP(0) if attempt to write a 1 to
|
||||
// any reserved bit of CR4
|
||||
SetCR4(val_32);
|
||||
// Protected mode: #GP(0) if attempt to write a 1 to
|
||||
// any reserved bit of CR4
|
||||
if (! SetCR4(val_32))
|
||||
exception(BX_GP_EXCEPTION, 0, 0);
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
@ -724,10 +721,6 @@ void BX_CPU_C::MOV_CqRq(bxInstruction_c *i)
|
||||
|
||||
switch (i->nnn()) {
|
||||
case 0: // CR0 (MSW)
|
||||
// BX_INFO(("MOV_CqRq:CR0: R64 = %08x @CS:EIP %04x:%04x ",
|
||||
// (unsigned) val_64,
|
||||
// (unsigned) BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value,
|
||||
// (unsigned) EIP));
|
||||
SetCR0(val_64);
|
||||
break;
|
||||
case 1: /* CR1 */
|
||||
@ -748,7 +741,8 @@ void BX_CPU_C::MOV_CqRq(bxInstruction_c *i)
|
||||
// any reserved bit of CR4
|
||||
BX_DEBUG(("MOV_CqRq: write to CR4 of %08x:%08x",
|
||||
(Bit32u)(val_64 >> 32), (Bit32u)(val_64 & 0xFFFFFFFF)));
|
||||
SetCR4(val_64);
|
||||
if (! SetCR4(val_64))
|
||||
exception(BX_GP_EXCEPTION, 0, 0);
|
||||
break;
|
||||
#if BX_SUPPORT_APIC
|
||||
case 8: // CR8
|
||||
@ -1142,7 +1136,7 @@ void BX_CPU_C::LOADALL(bxInstruction_c *i)
|
||||
}
|
||||
|
||||
#if BX_SUPPORT_ICACHE
|
||||
BX_CPU_THIS_PTR fetchModeMask = createFetchModeMask(BX_CPU_THIS);
|
||||
BX_CPU_THIS_PTR updateFetchModeMask();
|
||||
#endif
|
||||
|
||||
/* ES */
|
||||
@ -1327,9 +1321,6 @@ void BX_CPU_C::SetCR0(Bit32u val_32)
|
||||
BX_CPU_THIS_PTR msr.lma = 1;
|
||||
BX_DEBUG(("Enter Compatibility Mode"));
|
||||
BX_CPU_THIS_PTR cpu_mode = BX_MODE_LONG_COMPAT;
|
||||
//#if BX_EXTERNAL_DEBUGGER
|
||||
//trap_debugger(0);
|
||||
//#endif
|
||||
}
|
||||
}
|
||||
else if (prev_pg==1 && BX_CPU_THIS_PTR cr0.pg==0) {
|
||||
@ -1346,9 +1337,6 @@ void BX_CPU_C::SetCR0(Bit32u val_32)
|
||||
BX_DEBUG(("Enter Real Mode"));
|
||||
BX_CPU_THIS_PTR cpu_mode = BX_MODE_IA32_REAL;
|
||||
}
|
||||
//#if BX_EXTERNAL_DEBUGGER
|
||||
//trap_debugger(0);
|
||||
//#endif
|
||||
}
|
||||
}
|
||||
#endif // #if BX_SUPPORT_X86_64
|
||||
@ -1359,7 +1347,7 @@ void BX_CPU_C::SetCR0(Bit32u val_32)
|
||||
}
|
||||
|
||||
#if BX_CPU_LEVEL >= 4
|
||||
void BX_CPU_C::SetCR4(Bit32u val_32)
|
||||
bx_bool BX_CPU_C::SetCR4(Bit32u val_32)
|
||||
{
|
||||
Bit32u oldCR4 = BX_CPU_THIS_PTR cr4.getRegister();
|
||||
Bit32u allowMask = 0;
|
||||
@ -1415,24 +1403,25 @@ void BX_CPU_C::SetCR4(Bit32u val_32)
|
||||
#endif
|
||||
|
||||
#if BX_SUPPORT_X86_64
|
||||
// need to GPF #0 if LME=1 and PAE=0
|
||||
// need to GPF #0 if LME=1 and PAE=0
|
||||
if ((BX_CPU_THIS_PTR msr.lme)
|
||||
&& (!(val_32 >> 5) & 1)
|
||||
&& (BX_CPU_THIS_PTR cr4.get_PAE()))
|
||||
{
|
||||
exception(BX_GP_EXCEPTION, 0, 0);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Need to GPF if trying to set undefined bits.
|
||||
if (val_32 & ~allowMask) {
|
||||
BX_INFO(("#GP(0): SetCR4: Write of 0x%08x not supported (allowMask=0x%x)",
|
||||
val_32, allowMask));
|
||||
exception(BX_GP_EXCEPTION, 0, 0);
|
||||
BX_INFO(("#GP(0): SetCR4: Write of 0x%08x not supported (allowMask=0x%x)", val_32, allowMask));
|
||||
return 0;
|
||||
}
|
||||
|
||||
val_32 &= allowMask; // Screen out unsupported bits. (not needed, for good measure)
|
||||
BX_CPU_THIS_PTR cr4.setRegister(val_32);
|
||||
pagingCR4Changed(oldCR4, BX_CPU_THIS_PTR cr4.getRegister());
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1856,7 +1845,7 @@ void BX_CPU_C::SYSENTER (bxInstruction_c *i)
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].cache.u.segment.avl = 0; // available for use by system
|
||||
|
||||
#if BX_SUPPORT_ICACHE
|
||||
BX_CPU_THIS_PTR fetchModeMask = createFetchModeMask(BX_CPU_THIS);
|
||||
BX_CPU_THIS_PTR updateFetchModeMask();
|
||||
#endif
|
||||
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].selector.value = (BX_CPU_THIS_PTR msr.sysenter_cs_msr + 8) & BX_SELECTOR_RPL_MASK;
|
||||
@ -1916,7 +1905,7 @@ void BX_CPU_C::SYSEXIT (bxInstruction_c *i)
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].cache.u.segment.avl = 0; // available for use by system
|
||||
|
||||
#if BX_SUPPORT_ICACHE
|
||||
BX_CPU_THIS_PTR fetchModeMask = createFetchModeMask(BX_CPU_THIS);
|
||||
BX_CPU_THIS_PTR updateFetchModeMask();
|
||||
#endif
|
||||
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].selector.value = (BX_CPU_THIS_PTR msr.sysenter_cs_msr + 24) | 3;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: segment_ctrl_pro.cc,v 1.55 2006-03-22 20:47:11 sshwarts Exp $
|
||||
// $Id: segment_ctrl_pro.cc,v 1.56 2006-03-27 18:02:07 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -223,7 +223,7 @@ BX_CPU_C::load_seg_reg(bx_segment_reg_t *seg, Bit16u new_value)
|
||||
if (seg == &BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS]) {
|
||||
seg->cache.u.segment.executable = 1; /* code segment */
|
||||
#if BX_SUPPORT_ICACHE
|
||||
BX_CPU_THIS_PTR fetchModeMask = createFetchModeMask(BX_CPU_THIS);
|
||||
BX_CPU_THIS_PTR updateFetchModeMask();
|
||||
#endif
|
||||
invalidate_prefetch_q();
|
||||
}
|
||||
|
248
bochs/cpu/smm.cc
248
bochs/cpu/smm.cc
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: smm.cc,v 1.7 2006-03-26 18:58:01 sshwarts Exp $
|
||||
// $Id: smm.cc,v 1.8 2006-03-27 18:02:07 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2006 Stanislav Shwartsman
|
||||
@ -53,6 +53,9 @@ void BX_CPU_C::enter_system_management_mode(void)
|
||||
{
|
||||
invalidate_prefetch_q();
|
||||
|
||||
// save processor state to the SMRAM
|
||||
BX_CPU_THIS_PTR smram_save_state();
|
||||
|
||||
// all status flags at known values, use BX_CPU_THIS_PTR eflags structure
|
||||
BX_CPU_THIS_PTR lf_flags_status = 0x000000;
|
||||
|
||||
@ -86,7 +89,7 @@ void BX_CPU_C::enter_system_management_mode(void)
|
||||
#endif
|
||||
|
||||
#if BX_SUPPORT_ICACHE
|
||||
BX_CPU_THIS_PTR fetchModeMask = createFetchModeMask(BX_CPU_THIS);
|
||||
BX_CPU_THIS_PTR updateFetchModeMask();
|
||||
#endif
|
||||
|
||||
/* DS (Data Segment) and descriptor cache */
|
||||
@ -150,4 +153,245 @@ bx_bool BX_CPU_C::smram_write(bx_phy_address a20addr)
|
||||
return 1; // for now
|
||||
}
|
||||
|
||||
#define SMRAM_TRANSLATE(addr) (((0x8000 - (addr)) >> 2) - 1)
|
||||
|
||||
#if BX_SUPPORT_X86_64
|
||||
|
||||
void BX_CPU_C::smram_save_state(void)
|
||||
{
|
||||
Bit32u saved_state[256], i;
|
||||
|
||||
// reset reserved bits
|
||||
for(i=0;i<256;i++) saved_state[i] = 0;
|
||||
|
||||
saved_state[SMRAM_TRANSLATE(0x7ff8)] = BX_CPU_THIS_PTR cr0.val32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7ff4)] = BX_CPU_THIS_PTR cr3 >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7ff0)] = BX_CPU_THIS_PTR cr3 & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fe8)] = read_eflags();
|
||||
saved_state[SMRAM_TRANSLATE(0x7fe0)] = BX_CPU_THIS_PTR get_EFER();
|
||||
saved_state[SMRAM_TRANSLATE(0x7fdc)] = RIP >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fd8)] = RIP & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fd0)] = BX_CPU_THIS_PTR dr6;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fc8)] = BX_CPU_THIS_PTR dr7;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fc4)] = BX_CPU_THIS_PTR tr.selector.value;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fc0)] = BX_CPU_THIS_PTR ldtr.selector.value;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fbc)] =
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_GS].selector.value;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fb8)] =
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_FS].selector.value;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fb4)] =
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_DS].selector.value;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fb0)] =
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].selector.value;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fac)] =
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fa8)] =
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_ES].selector.value;
|
||||
/* base+7fa4 is I/O MISC (4 byte) */
|
||||
/* base+7f9c is I/O MEM ADDRESS (8 byte) */
|
||||
saved_state[SMRAM_TRANSLATE(0x7f98)] = RDI >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f94)] = RDI & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f90)] = RSI >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f8c)] = RSI & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f88)] = RBP >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f84)] = RBP & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f80)] = RSP >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f7c)] = RSP & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f78)] = RBX >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f74)] = RBX & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f70)] = RDX >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f6c)] = RDX & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f68)] = RCX >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f64)] = RCX & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f60)] = RAX >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f5c)] = RAX & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f58)] = R8 >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f54)] = R8 & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f50)] = R9 >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f4c)] = R9 & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f48)] = R10 >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f44)] = R10 & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f40)] = R11 >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f3c)] = R11 & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f38)] = R12 >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f34)] = R12 & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f30)] = R13 >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f2c)] = R13 & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f28)] = R14 >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f24)] = R14 & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f20)] = R15 >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f1c)] = R15 & 0xffffffff;
|
||||
/* base+0x7f1c to base+0x7f04 is reserved */
|
||||
/* base+0x7f02 is Auto HALT restart field (2 byte) */
|
||||
/* base+0x7f00 is I/O restart field (2 byte) */
|
||||
/* base+0x7efc is SMM Revision Identifier field */
|
||||
saved_state[SMRAM_TRANSLATE(0x7ef8)] = BX_CPU_THIS_PTR smbase;
|
||||
/* base+0x7ff4 to base+0x7fa8 is reserved */
|
||||
/* base+0x7fa4 is LDT Info (4 byte) */
|
||||
saved_state[SMRAM_TRANSLATE(0x7fa0)] =
|
||||
BX_CPU_THIS_PTR ldtr.cache.u.segment.limit;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f9c)] =
|
||||
BX_CPU_THIS_PTR ldtr.cache.u.segment.base & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f98)] = BX_CPU_THIS_PTR idtr.limit;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f94)] = BX_CPU_THIS_PTR idtr.base & 0xffffffff;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f90)] = BX_CPU_THIS_PTR gdtr.limit;
|
||||
saved_state[SMRAM_TRANSLATE(0x7f8c)] = BX_CPU_THIS_PTR gdtr.base & 0xffffffff;
|
||||
/* base+0x7e80 to base+0x7e44 is reserved */
|
||||
saved_state[SMRAM_TRANSLATE(0x7e40)] = BX_CPU_THIS_PTR cr4.getRegister();
|
||||
/* base+0x7e3c to base+0x7df0 is reserved */
|
||||
/* base+0x7de8 is I/O RIP (8 bytes) */
|
||||
/* base+0x7de4 to base+0x7ddc is reserved */
|
||||
saved_state[SMRAM_TRANSLATE(0x7dd8)] = BX_CPU_THIS_PTR idtr.base >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fd4)] =
|
||||
BX_CPU_THIS_PTR ldtr.cache.u.segment.base >> 32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7dd0)] = BX_CPU_THIS_PTR gdtr.base >> 32;
|
||||
/* base+0x7dcc to base+0x7c00 is reserved */
|
||||
|
||||
bx_phy_address base = (BX_CPU_THIS_PTR smbase + 0x8000);
|
||||
base += 0x8000;
|
||||
|
||||
// could be optimized with writing of only non-reserved bytes
|
||||
for(i=0;i<256;i++) {
|
||||
base -= 4;
|
||||
BX_CPU_THIS_PTR mem->writePhysicalPage(BX_CPU_THIS, base, 4, &saved_state[i]);
|
||||
}
|
||||
}
|
||||
|
||||
bx_bool BX_CPU_C::smram_restore_state(void)
|
||||
{
|
||||
Bit32u saved_state[256], i;
|
||||
|
||||
// reset reserved bits
|
||||
for(i=0;i<256;i++) saved_state[i] = 0;
|
||||
|
||||
bx_phy_address base = (BX_CPU_THIS_PTR smbase + 0x8000);
|
||||
base += 0x8000;
|
||||
|
||||
// could be optimized with reading of only non-reserved bytes
|
||||
for(i=0;i<256;i++) {
|
||||
base -= 4;
|
||||
BX_CPU_THIS_PTR mem->readPhysicalPage(BX_CPU_THIS, base, 4, &saved_state[i]);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#else /* BX_SUPPORT_X86_64 == 0 */
|
||||
|
||||
void BX_CPU_C::smram_save_state(void)
|
||||
{
|
||||
Bit32u saved_state[128], i;
|
||||
|
||||
// reset reserved bits
|
||||
for(i=0;i<128;i++) saved_state[i] = 0;
|
||||
|
||||
saved_state[SMRAM_TRANSLATE(0x7ffc)] = BX_CPU_THIS_PTR cr0.val32;
|
||||
saved_state[SMRAM_TRANSLATE(0x7ff8)] = BX_CPU_THIS_PTR cr3;
|
||||
saved_state[SMRAM_TRANSLATE(0x7ff4)] = read_eflags();
|
||||
saved_state[SMRAM_TRANSLATE(0x7ff0)] = EIP;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fec)] = EDI;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fe8)] = ESI;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fe4)] = EBP;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fe0)] = ESP;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fdc)] = EBX;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fd8)] = EDX;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fd4)] = ECX;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fd0)] = EAX;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fcc)] = BX_CPU_THIS_PTR dr6;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fc8)] = BX_CPU_THIS_PTR dr7;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fc4)] = BX_CPU_THIS_PTR tr.selector.value;
|
||||
/* base+0x7fc0 is reserved field */
|
||||
saved_state[SMRAM_TRANSLATE(0x7fbc)] =
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_GS].selector.value;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fb8)] =
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_FS].selector.value;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fb4)] =
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_DS].selector.value;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fb0)] =
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].selector.value;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fac)] =
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value;
|
||||
saved_state[SMRAM_TRANSLATE(0x7fa8)] =
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_ES].selector.value;
|
||||
/* base+0x7fa4 is I/O state field */
|
||||
/* base+0x7fa0 is I/O Memory Address field */
|
||||
/* base+0x7f9c to base+0x7f04 is reserved */
|
||||
/* base+0x7f02 is Auto HALT restart field (2 byte) */
|
||||
/* base+0x7f00 is I/O restart field (2 byte) */
|
||||
/* base+0x7efc is SMM Revision Identifier field */
|
||||
saved_state[SMRAM_TRANSLATE(0x7ef8)] = BX_CPU_THIS_PTR smbase;
|
||||
/* base+0x7ef4 to base+0x7e00 is reserved */
|
||||
|
||||
bx_phy_address base = (BX_CPU_THIS_PTR smbase + 0x8000);
|
||||
base += 0x8000;
|
||||
|
||||
// could be optimized with writing of only non-reserved bytes
|
||||
for(i=0;i<128;i++) {
|
||||
base -= 4;
|
||||
BX_CPU_THIS_PTR mem->writePhysicalPage(BX_CPU_THIS, base, 4, &saved_state[i]);
|
||||
}
|
||||
}
|
||||
|
||||
bx_bool BX_CPU_C::smram_restore_state(void)
|
||||
{
|
||||
Bit32u saved_state[128], i;
|
||||
|
||||
// reset reserved bits
|
||||
for(i=0;i<128;i++) saved_state[i] = 0;
|
||||
|
||||
bx_phy_address base = (BX_CPU_THIS_PTR smbase + 0x8000);
|
||||
base += 0x8000;
|
||||
|
||||
// could be optimized with reading of only non-reserved bytes
|
||||
for(i=0;i<128;i++) {
|
||||
base -= 4;
|
||||
BX_CPU_THIS_PTR mem->readPhysicalPage(BX_CPU_THIS, base, 4, &saved_state[i]);
|
||||
}
|
||||
|
||||
setCR0(saved_state[SMRAM_TRANSLATE(0x7ffc)]);
|
||||
CR3_change(saved_state[SMRAM_TRANSLATE(0x7ff8)]);
|
||||
setEFlags(saved_state[SMRAM_TRANSLATE(0x7ff4)]);
|
||||
|
||||
EIP = saved_state[SMRAM_TRANSLATE(0x7ff0)];
|
||||
EDI = saved_state[SMRAM_TRANSLATE(0x7fec)];
|
||||
ESI = saved_state[SMRAM_TRANSLATE(0x7fe8)];
|
||||
EBP = saved_state[SMRAM_TRANSLATE(0x7fe4)];
|
||||
ESP = saved_state[SMRAM_TRANSLATE(0x7fe0)];
|
||||
EBX = saved_state[SMRAM_TRANSLATE(0x7fdc)];
|
||||
EDX = saved_state[SMRAM_TRANSLATE(0x7fd8)];
|
||||
ECX = saved_state[SMRAM_TRANSLATE(0x7fd4)];
|
||||
EAX = saved_state[SMRAM_TRANSLATE(0x7fd0)];
|
||||
|
||||
BX_CPU_THIS_PTR dr6 = saved_state[SMRAM_TRANSLATE(0x7fcc)];
|
||||
BX_CPU_THIS_PTR dr7 = saved_state[SMRAM_TRANSLATE(0x7fc8)];
|
||||
|
||||
// saved_state[SMRAM_TRANSLATE(0x7fc4)] = BX_CPU_THIS_PTR tr.selector.value;
|
||||
// /* base+0x7fc0 is reserved field */
|
||||
// saved_state[SMRAM_TRANSLATE(0x7fbc)] =
|
||||
// BX_CPU_THIS_PTR sregs[BX_SEG_REG_GS].selector.value;
|
||||
// saved_state[SMRAM_TRANSLATE(0x7fb8)] =
|
||||
// BX_CPU_THIS_PTR sregs[BX_SEG_REG_FS].selector.value;
|
||||
// saved_state[SMRAM_TRANSLATE(0x7fb4)] =
|
||||
// BX_CPU_THIS_PTR sregs[BX_SEG_REG_DS].selector.value;
|
||||
// saved_state[SMRAM_TRANSLATE(0x7fb0)] =
|
||||
// BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].selector.value;
|
||||
// saved_state[SMRAM_TRANSLATE(0x7fac)] =
|
||||
// BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.value;
|
||||
// saved_state[SMRAM_TRANSLATE(0x7fa8)] =
|
||||
// BX_CPU_THIS_PTR sregs[BX_SEG_REG_ES].selector.value;
|
||||
|
||||
/* base+0x7fa4 is I/O state field */
|
||||
/* base+0x7fa0 is I/O Memory Address field */
|
||||
/* base+0x7f9c to base+0x7f04 is reserved */
|
||||
/* base+0x7f02 is Auto HALT restart field (2 byte) */
|
||||
/* base+0x7f00 is I/O restart field (2 byte) */
|
||||
/* base+0x7efc is SMM Revision Identifier field */
|
||||
BX_CPU_THIS_PTR smbase = saved_state[SMRAM_TRANSLATE(0x7ef8)];
|
||||
/* base+0x7ef4 to base+0x7e00 is reserved */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
#endif /* BX_SUPPORT_X86_64 */
|
||||
|
||||
#endif /* BX_CPU_LEVEL >= 3 */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: tasking.cc,v 1.31 2006-03-06 22:03:04 sshwarts Exp $
|
||||
// $Id: tasking.cc,v 1.32 2006-03-27 18:02:07 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -608,8 +608,8 @@ void BX_CPU_C::task_switch(bx_selector_t *tss_selector,
|
||||
goto post_exception;
|
||||
}
|
||||
|
||||
#if BX_SUPPORT_ICACHE // update instruction cache
|
||||
BX_CPU_THIS_PTR fetchModeMask = createFetchModeMask(BX_CPU_THIS);
|
||||
#if BX_SUPPORT_ICACHE
|
||||
BX_CPU_THIS_PTR updateFetchModeMask();
|
||||
#endif
|
||||
|
||||
// SS
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: vm8086.cc,v 1.25 2006-03-06 22:03:04 sshwarts Exp $
|
||||
// $Id: vm8086.cc,v 1.26 2006-03-27 18:02:07 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -254,7 +254,7 @@ void BX_CPU_C::init_v8086_mode(void)
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_CS].selector.rpl = 3;
|
||||
|
||||
#if BX_SUPPORT_ICACHE // update instruction cache
|
||||
BX_CPU_THIS_PTR fetchModeMask = createFetchModeMask(BX_CPU_THIS);
|
||||
BX_CPU_THIS_PTR updateFetchModeMask();
|
||||
#endif
|
||||
|
||||
BX_CPU_THIS_PTR sregs[BX_SEG_REG_SS].cache.valid = 1;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: load32bitOShack.cc,v 1.20 2006-03-06 22:02:48 sshwarts Exp $
|
||||
// $Id: load32bitOShack.cc,v 1.21 2006-03-27 18:02:06 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -245,6 +245,10 @@ void bx_load_null_kernel_hack(void)
|
||||
BX_CPU(0)->sregs[BX_SEG_REG_CS].cache.u.segment.g = 1; // page gran
|
||||
BX_CPU(0)->sregs[BX_SEG_REG_CS].cache.u.segment.d_b = 1; // 32bit
|
||||
|
||||
#if BX_SUPPORT_ICACHE
|
||||
BX_CPU(0)->updateFetchModeMask();
|
||||
#endif
|
||||
|
||||
// DS deltas
|
||||
BX_CPU(0)->sregs[BX_SEG_REG_DS].cache.u.segment.base = 0x00000000;
|
||||
BX_CPU(0)->sregs[BX_SEG_REG_DS].cache.u.segment.limit = 0xFFFFF;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: memory.h,v 1.35 2006-03-26 22:15:07 sshwarts Exp $
|
||||
// $Id: memory.h,v 1.36 2006-03-27 18:02:07 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -92,6 +92,7 @@ public:
|
||||
BX_MEM_SMF void init_memory(int memsize);
|
||||
BX_MEM_SMF void enable_smram(bx_bool enable, bx_bool restricted);
|
||||
BX_MEM_SMF void disable_smram(void);
|
||||
BX_MEM_SMF bx_bool is_smram_accessible(void);
|
||||
BX_MEM_SMF void readPhysicalPage(BX_CPU_C *cpu, Bit32u addr,
|
||||
unsigned len, void *data) BX_CPP_AttrRegparmN(3);
|
||||
BX_MEM_SMF void writePhysicalPage(BX_CPU_C *cpu, Bit32u addr,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: misc_mem.cc,v 1.85 2006-03-26 22:15:07 sshwarts Exp $
|
||||
// $Id: misc_mem.cc,v 1.86 2006-03-27 18:02:07 sshwarts Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2002 MandrakeSoft S.A.
|
||||
@ -94,7 +94,7 @@ void BX_MEM_C::init_memory(int memsize)
|
||||
{
|
||||
int idx;
|
||||
|
||||
BX_DEBUG(("Init $Id: misc_mem.cc,v 1.85 2006-03-26 22:15:07 sshwarts Exp $"));
|
||||
BX_DEBUG(("Init $Id: misc_mem.cc,v 1.86 2006-03-27 18:02:07 sshwarts Exp $"));
|
||||
// you can pass 0 if memory has been allocated already through
|
||||
// the constructor, or the desired size of memory if it hasn't
|
||||
|
||||
@ -751,16 +751,23 @@ BX_MEM_C::unregisterMemoryHandlers(memory_handler_t read_handler, memory_handler
|
||||
return ret;
|
||||
}
|
||||
|
||||
BX_MEM_SMF void BX_MEM_C::enable_smram(bx_bool enable, bx_bool restricted)
|
||||
void BX_MEM_C::enable_smram(bx_bool enable, bx_bool restricted)
|
||||
{
|
||||
BX_MEM_THIS smram_available = 1;
|
||||
BX_MEM_THIS smram_enable = (enable > 0);
|
||||
BX_MEM_THIS smram_restricted = (restricted > 0);
|
||||
}
|
||||
|
||||
BX_MEM_SMF void BX_MEM_C::disable_smram(void)
|
||||
void BX_MEM_C::disable_smram(void)
|
||||
{
|
||||
BX_MEM_THIS smram_available = 0;
|
||||
BX_MEM_THIS smram_enable = 0;
|
||||
BX_MEM_THIS smram_restricted = 0;
|
||||
}
|
||||
|
||||
// check if SMRAM is aavailable for CPU data accesses
|
||||
bx_bool BX_MEM_C::is_smram_accessible(void)
|
||||
{
|
||||
return(BX_MEM_THIS smram_available) &&
|
||||
(BX_MEM_THIS smram_enable || !BX_MEM_THIS smram_restricted);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user