- moved BX_USE_MEM_SMF to all the other SMF definitions in config.h.in (should
be set to 1, since there is only one address space present) - fixed memory object member to support the static case (SMF)
This commit is contained in:
parent
77217aa7b8
commit
a3908d6e86
@ -223,6 +223,8 @@
|
||||
// SMP mode is enabled, it will be turned off by configure.
|
||||
#define BX_USE_CPU_SMF 1
|
||||
|
||||
#define BX_USE_MEM_SMF 0
|
||||
|
||||
// Use static member functions in IO DEVice emulation modules.
|
||||
// For efficiency, use C like functions for IO handling,
|
||||
// and declare a device instance at compile time,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: memory.cc,v 1.57 2006-06-01 20:05:15 sshwarts Exp $
|
||||
// $Id: memory.cc,v 1.58 2006-09-02 12:08:28 vruppert Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -87,7 +87,7 @@ BX_MEM_C::writePhysicalPage(BX_CPU_C *cpu, bx_phy_address addr, unsigned len, vo
|
||||
}
|
||||
}
|
||||
|
||||
memory_handler = memory_handlers[a20addr >> 20];
|
||||
memory_handler = BX_MEM_THIS memory_handlers[a20addr >> 20];
|
||||
while (memory_handler) {
|
||||
if (memory_handler->begin <= a20addr &&
|
||||
memory_handler->end >= a20addr &&
|
||||
@ -109,22 +109,22 @@ mem_write:
|
||||
if ((a20addr & 0xfff80000) != 0x00080000 || (a20addr <= 0x0009ffff))
|
||||
{
|
||||
if (len == 8) {
|
||||
WriteHostQWordToLittleEndian(&vector[a20addr], *(Bit64u*)data);
|
||||
WriteHostQWordToLittleEndian(&BX_MEM_THIS vector[a20addr], *(Bit64u*)data);
|
||||
BX_DBG_DIRTY_PAGE(a20addr >> 12);
|
||||
return;
|
||||
}
|
||||
if (len == 4) {
|
||||
WriteHostDWordToLittleEndian(&vector[a20addr], *(Bit32u*)data);
|
||||
WriteHostDWordToLittleEndian(&BX_MEM_THIS vector[a20addr], *(Bit32u*)data);
|
||||
BX_DBG_DIRTY_PAGE(a20addr >> 12);
|
||||
return;
|
||||
}
|
||||
if (len == 2) {
|
||||
WriteHostWordToLittleEndian(&vector[a20addr], *(Bit16u*)data);
|
||||
WriteHostWordToLittleEndian(&BX_MEM_THIS vector[a20addr], *(Bit16u*)data);
|
||||
BX_DBG_DIRTY_PAGE(a20addr >> 12);
|
||||
return;
|
||||
}
|
||||
if (len == 1) {
|
||||
* ((Bit8u *) (&vector[a20addr])) = * (Bit8u *) data;
|
||||
* ((Bit8u *) (&BX_MEM_THIS vector[a20addr])) = * (Bit8u *) data;
|
||||
BX_DBG_DIRTY_PAGE(a20addr >> 12);
|
||||
return;
|
||||
}
|
||||
@ -141,7 +141,7 @@ write_one:
|
||||
if ((a20addr & 0xfff80000) != 0x00080000 || (a20addr <= 0x0009ffff))
|
||||
{
|
||||
// addr *not* in range 000A0000 .. 000FFFFF
|
||||
vector[a20addr] = *data_ptr;
|
||||
BX_MEM_THIS vector[a20addr] = *data_ptr;
|
||||
BX_DBG_DIRTY_PAGE(a20addr >> 12);
|
||||
inc_one:
|
||||
if (len == 1) return;
|
||||
@ -161,7 +161,7 @@ inc_one:
|
||||
if (a20addr <= 0x000bffff) {
|
||||
// devices are not allowed to access SMMRAM under VGA memory
|
||||
if (cpu) {
|
||||
vector[a20addr] = *data_ptr;
|
||||
BX_MEM_THIS vector[a20addr] = *data_ptr;
|
||||
BX_DBG_DIRTY_PAGE(a20addr >> 12);
|
||||
}
|
||||
goto inc_one;
|
||||
@ -173,12 +173,12 @@ inc_one:
|
||||
// ignore write to ROM
|
||||
#else
|
||||
// Write Based on 440fx Programming
|
||||
if (pci_enabled && ((a20addr & 0xfffc0000) == 0x000c0000))
|
||||
if (BX_MEM_THIS pci_enabled && ((a20addr & 0xfffc0000) == 0x000c0000))
|
||||
{
|
||||
switch (DEV_pci_wr_memtype(a20addr)) {
|
||||
case 0x1: // Writes to ShadowRAM
|
||||
BX_DEBUG(("Writing to ShadowRAM: address %08x, data %02x", (unsigned) a20addr, *data_ptr));
|
||||
vector[a20addr] = *data_ptr;
|
||||
BX_MEM_THIS vector[a20addr] = *data_ptr;
|
||||
BX_DBG_DIRTY_PAGE(a20addr >> 12);
|
||||
goto inc_one;
|
||||
|
||||
@ -244,7 +244,7 @@ BX_MEM_C::readPhysicalPage(BX_CPU_C *cpu, bx_phy_address addr, unsigned len, voi
|
||||
}
|
||||
}
|
||||
|
||||
memory_handler = memory_handlers[a20addr >> 20];
|
||||
memory_handler = BX_MEM_THIS memory_handlers[a20addr >> 20];
|
||||
while (memory_handler) {
|
||||
if (memory_handler->begin <= a20addr &&
|
||||
memory_handler->end >= a20addr &&
|
||||
@ -262,19 +262,19 @@ mem_read:
|
||||
if ((a20addr & 0xfff80000) != 0x00080000 || (a20addr <= 0x0009ffff))
|
||||
{
|
||||
if (len == 8) {
|
||||
ReadHostQWordFromLittleEndian(&vector[a20addr], * (Bit64u*) data);
|
||||
ReadHostQWordFromLittleEndian(&BX_MEM_THIS vector[a20addr], * (Bit64u*) data);
|
||||
return;
|
||||
}
|
||||
if (len == 4) {
|
||||
ReadHostDWordFromLittleEndian(&vector[a20addr], * (Bit32u*) data);
|
||||
ReadHostDWordFromLittleEndian(&BX_MEM_THIS vector[a20addr], * (Bit32u*) data);
|
||||
return;
|
||||
}
|
||||
if (len == 2) {
|
||||
ReadHostWordFromLittleEndian(&vector[a20addr], * (Bit16u*) data);
|
||||
ReadHostWordFromLittleEndian(&BX_MEM_THIS vector[a20addr], * (Bit16u*) data);
|
||||
return;
|
||||
}
|
||||
if (len == 1) {
|
||||
* (Bit8u *) data = * ((Bit8u *) (&vector[a20addr]));
|
||||
* (Bit8u *) data = * ((Bit8u *) (&BX_MEM_THIS vector[a20addr]));
|
||||
return;
|
||||
}
|
||||
// len == other case can just fall thru to special cases handling
|
||||
@ -290,7 +290,7 @@ read_one:
|
||||
if ((a20addr & 0xfff80000) != 0x00080000 || (a20addr <= 0x0009ffff))
|
||||
{
|
||||
// addr *not* in range 00080000 .. 000FFFFF
|
||||
*data_ptr = vector[a20addr];
|
||||
*data_ptr = BX_MEM_THIS vector[a20addr];
|
||||
inc_one:
|
||||
if (len == 1) return;
|
||||
len--;
|
||||
@ -308,26 +308,26 @@ inc_one:
|
||||
// SMMRAM
|
||||
if (a20addr <= 0x000bffff) {
|
||||
// devices are not allowed to access SMMRAM under VGA memory
|
||||
if (cpu) *data_ptr = vector[a20addr];
|
||||
if (cpu) *data_ptr = BX_MEM_THIS vector[a20addr];
|
||||
goto inc_one;
|
||||
}
|
||||
|
||||
#if BX_SUPPORT_PCI
|
||||
if (pci_enabled && ((a20addr & 0xfffc0000) == 0x000c0000))
|
||||
if (BX_MEM_THIS pci_enabled && ((a20addr & 0xfffc0000) == 0x000c0000))
|
||||
{
|
||||
switch (DEV_pci_rd_memtype(a20addr)) {
|
||||
case 0x0: // Read from ROM
|
||||
if ((a20addr & 0xfffe0000) == 0x000e0000)
|
||||
{
|
||||
*data_ptr = rom[a20addr & BIOS_MASK];
|
||||
*data_ptr = BX_MEM_THIS rom[a20addr & BIOS_MASK];
|
||||
}
|
||||
else
|
||||
{
|
||||
*data_ptr = rom[(a20addr & EXROM_MASK) + BIOSROMSZ];
|
||||
*data_ptr = BX_MEM_THIS rom[(a20addr & EXROM_MASK) + BIOSROMSZ];
|
||||
}
|
||||
goto inc_one;
|
||||
case 0x1: // Read from ShadowRAM
|
||||
*data_ptr = vector[a20addr];
|
||||
*data_ptr = BX_MEM_THIS vector[a20addr];
|
||||
goto inc_one;
|
||||
default:
|
||||
BX_PANIC(("readPhysicalPage: default case"));
|
||||
@ -338,15 +338,15 @@ inc_one:
|
||||
#endif // #if BX_SUPPORT_PCI
|
||||
{
|
||||
if ((a20addr & 0xfffc0000) != 0x000c0000) {
|
||||
*data_ptr = vector[a20addr];
|
||||
*data_ptr = BX_MEM_THIS vector[a20addr];
|
||||
}
|
||||
else if ((a20addr & 0xfffe0000) == 0x000e0000)
|
||||
{
|
||||
*data_ptr = rom[a20addr & BIOS_MASK];
|
||||
*data_ptr = BX_MEM_THIS rom[a20addr & BIOS_MASK];
|
||||
}
|
||||
else
|
||||
{
|
||||
*data_ptr = rom[(a20addr & EXROM_MASK) + BIOSROMSZ];
|
||||
*data_ptr = BX_MEM_THIS rom[(a20addr & EXROM_MASK) + BIOSROMSZ];
|
||||
}
|
||||
goto inc_one;
|
||||
}
|
||||
@ -362,7 +362,7 @@ inc_one:
|
||||
|
||||
for (unsigned i = 0; i < len; i++) {
|
||||
if (a20addr >= (bx_phy_address)~BIOS_MASK)
|
||||
*data_ptr = rom[a20addr & BIOS_MASK];
|
||||
*data_ptr = BX_MEM_THIS rom[a20addr & BIOS_MASK];
|
||||
else
|
||||
*data_ptr = 0xff;
|
||||
addr++;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: memory.h,v 1.38 2006-05-31 17:20:52 sshwarts Exp $
|
||||
// $Id: memory.h,v 1.39 2006-09-02 12:08:28 vruppert Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2001 MandrakeSoft S.A.
|
||||
@ -29,8 +29,6 @@
|
||||
#ifndef BX_MEM_H
|
||||
# define BX_MEM_H 1
|
||||
|
||||
#define BX_USE_MEM_SMF 0
|
||||
|
||||
#if BX_USE_MEM_SMF
|
||||
// if static member functions on, then there is only one memory
|
||||
# define BX_MEM_SMF static
|
||||
|
@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
// $Id: misc_mem.cc,v 1.95 2006-09-01 18:14:13 vruppert Exp $
|
||||
// $Id: misc_mem.cc,v 1.96 2006-09-02 12:08:28 vruppert Exp $
|
||||
/////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2002 MandrakeSoft S.A.
|
||||
@ -61,34 +61,34 @@ BX_MEM_C::BX_MEM_C()
|
||||
void BX_CPP_AttrRegparmN(2)
|
||||
BX_MEM_C::alloc_vector_aligned (size_t bytes, size_t alignment)
|
||||
{
|
||||
if (actual_vector != NULL) {
|
||||
if (BX_MEM_THIS actual_vector != NULL) {
|
||||
BX_INFO (("freeing existing memory vector"));
|
||||
delete [] actual_vector;
|
||||
actual_vector = NULL;
|
||||
vector = NULL;
|
||||
delete [] BX_MEM_THIS actual_vector;
|
||||
BX_MEM_THIS actual_vector = NULL;
|
||||
BX_MEM_THIS vector = NULL;
|
||||
}
|
||||
Bit64u test_mask = alignment - 1;
|
||||
actual_vector = new Bit8u [(unsigned int)(bytes+test_mask)];
|
||||
BX_MEM_THIS actual_vector = new Bit8u [(unsigned int)(bytes+test_mask)];
|
||||
// round address forward to nearest multiple of alignment. Alignment
|
||||
// MUST BE a power of two for this to work.
|
||||
Bit64u masked = ((Bit64u)(actual_vector + test_mask)) & ~test_mask;
|
||||
vector = (Bit8u *)masked;
|
||||
Bit64u masked = ((Bit64u)(BX_MEM_THIS actual_vector + test_mask)) & ~test_mask;
|
||||
BX_MEM_THIS vector = (Bit8u *)masked;
|
||||
// sanity check: no lost bits during pointer conversion
|
||||
BX_ASSERT (sizeof(masked) >= sizeof(vector));
|
||||
BX_ASSERT (sizeof(masked) >= sizeof(BX_MEM_THIS vector));
|
||||
// sanity check: after realignment, everything fits in allocated space
|
||||
BX_ASSERT (vector+bytes <= actual_vector+bytes+test_mask);
|
||||
BX_ASSERT (BX_MEM_THIS vector+bytes <= BX_MEM_THIS actual_vector+bytes+test_mask);
|
||||
BX_INFO (("allocated memory at %p. after alignment, vector=%p",
|
||||
actual_vector, vector));
|
||||
BX_MEM_THIS actual_vector, BX_MEM_THIS vector));
|
||||
}
|
||||
|
||||
BX_MEM_C::~BX_MEM_C()
|
||||
{
|
||||
if (BX_MEM_THIS vector != NULL) {
|
||||
delete [] actual_vector;
|
||||
actual_vector = NULL;
|
||||
vector = NULL;
|
||||
delete [] memory_handlers;
|
||||
memory_handlers = NULL;
|
||||
delete [] BX_MEM_THIS actual_vector;
|
||||
BX_MEM_THIS actual_vector = NULL;
|
||||
BX_MEM_THIS vector = NULL;
|
||||
delete [] BX_MEM_THIS memory_handlers;
|
||||
BX_MEM_THIS memory_handlers = NULL;
|
||||
#if BX_DEBUGGER
|
||||
delete [] BX_MEM_THIS dbg_dirty_pages;
|
||||
#endif
|
||||
@ -101,7 +101,7 @@ void BX_MEM_C::init_memory(int memsize)
|
||||
{
|
||||
unsigned idx;
|
||||
|
||||
BX_DEBUG(("Init $Id: misc_mem.cc,v 1.95 2006-09-01 18:14:13 vruppert Exp $"));
|
||||
BX_DEBUG(("Init $Id: misc_mem.cc,v 1.96 2006-09-02 12:08:28 vruppert Exp $"));
|
||||
|
||||
if (BX_MEM_THIS vector != NULL) {
|
||||
delete [] BX_MEM_THIS actual_vector;
|
||||
@ -313,7 +313,8 @@ void BX_MEM_C::load_ROM(const char *path, bx_phy_address romaddress, Bit8u type)
|
||||
}
|
||||
close(fd);
|
||||
offset -= (unsigned long)stat_buf.st_size;
|
||||
if ((romaddress != 0xe0000) || ((rom[offset] == 0x55) && (rom[offset] == 0xaa))) {
|
||||
if ((romaddress != 0xe0000) ||
|
||||
((BX_MEM_THIS rom[offset] == 0x55) && (BX_MEM_THIS rom[offset] == 0xaa))) {
|
||||
Bit8u checksum = 0;
|
||||
for (i = 0; i < stat_buf.st_size; i++) {
|
||||
checksum += BX_MEM_THIS rom[offset + i];
|
||||
@ -458,26 +459,26 @@ bx_bool BX_MEM_C::dbg_fetch_mem(bx_phy_address addr, unsigned len, Bit8u *buf)
|
||||
// Reading standard PCI/ISA Video Mem / SMMRAM
|
||||
if ((addr & 0xfffe0000) == 0x000a0000) {
|
||||
if (BX_MEM_THIS smram_enable)
|
||||
*buf = vector[addr];
|
||||
*buf = BX_MEM_THIS vector[addr];
|
||||
else
|
||||
*buf = DEV_vga_mem_read(addr);
|
||||
}
|
||||
#if BX_SUPPORT_PCI
|
||||
else if (pci_enabled && ((addr & 0xfffc0000) == 0x000c0000))
|
||||
else if (BX_MEM_THIS pci_enabled && ((addr & 0xfffc0000) == 0x000c0000))
|
||||
{
|
||||
switch (DEV_pci_rd_memtype (addr)) {
|
||||
case 0x0: // Read from ROM
|
||||
if ((addr & 0xfffe0000) == 0x000e0000)
|
||||
{
|
||||
*buf = rom[addr & BIOS_MASK];
|
||||
*buf = BX_MEM_THIS rom[addr & BIOS_MASK];
|
||||
}
|
||||
else
|
||||
{
|
||||
*buf = rom[(addr & EXROM_MASK) + BIOSROMSZ];
|
||||
*buf = BX_MEM_THIS rom[(addr & EXROM_MASK) + BIOSROMSZ];
|
||||
}
|
||||
break;
|
||||
case 0x1: // Read from ShadowRAM
|
||||
*buf = vector[addr];
|
||||
*buf = BX_MEM_THIS vector[addr];
|
||||
break;
|
||||
default:
|
||||
BX_PANIC(("dbg_fetch_mem: default case"));
|
||||
@ -487,20 +488,20 @@ bx_bool BX_MEM_C::dbg_fetch_mem(bx_phy_address addr, unsigned len, Bit8u *buf)
|
||||
else if (addr < BX_MEM_THIS len)
|
||||
{
|
||||
if ((addr & 0xfffc0000) != 0x000c0000) {
|
||||
*buf = vector[addr];
|
||||
*buf = BX_MEM_THIS vector[addr];
|
||||
}
|
||||
else if ((addr & 0xfffe0000) == 0x000e0000)
|
||||
{
|
||||
*buf = rom[addr & BIOS_MASK];
|
||||
*buf = BX_MEM_THIS rom[addr & BIOS_MASK];
|
||||
}
|
||||
else
|
||||
{
|
||||
*buf = rom[(addr & EXROM_MASK) + BIOSROMSZ];
|
||||
*buf = BX_MEM_THIS rom[(addr & EXROM_MASK) + BIOSROMSZ];
|
||||
}
|
||||
}
|
||||
else if (addr >= (bx_phy_address)~BIOS_MASK)
|
||||
{
|
||||
*buf = rom[addr & BIOS_MASK];
|
||||
*buf = BX_MEM_THIS rom[addr & BIOS_MASK];
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -529,13 +530,13 @@ bx_bool BX_MEM_C::dbg_set_mem(bx_phy_address addr, unsigned len, Bit8u *buf)
|
||||
DEV_vga_mem_write(addr, *buf);
|
||||
}
|
||||
#if BX_SUPPORT_PCI
|
||||
else if (pci_enabled && ((addr & 0xfffc0000) == 0x000c0000))
|
||||
else if (BX_MEM_THIS pci_enabled && ((addr & 0xfffc0000) == 0x000c0000))
|
||||
{
|
||||
switch (DEV_pci_wr_memtype (addr)) {
|
||||
case 0x0: // Ignore write to ROM
|
||||
break;
|
||||
case 0x1: // Write to ShadowRAM
|
||||
vector[addr] = *buf;
|
||||
BX_MEM_THIS vector[addr] = *buf;
|
||||
break;
|
||||
default:
|
||||
BX_PANIC(("dbg_fetch_mem: default case"));
|
||||
@ -544,7 +545,7 @@ bx_bool BX_MEM_C::dbg_set_mem(bx_phy_address addr, unsigned len, Bit8u *buf)
|
||||
#endif // #if BX_SUPPORT_PCI
|
||||
else if ((addr & 0xfffc0000) != 0x000c0000 && (addr < ~BIOS_MASK))
|
||||
{
|
||||
vector[addr] = *buf;
|
||||
BX_MEM_THIS vector[addr] = *buf;
|
||||
}
|
||||
buf++;
|
||||
addr++;
|
||||
@ -563,7 +564,7 @@ bx_bool BX_MEM_C::dbg_crc32(bx_phy_address addr1, bx_phy_address addr2, Bit32u *
|
||||
return(0); // error, specified address past last phy mem addr
|
||||
|
||||
unsigned len = 1 + addr2 - addr1;
|
||||
*crc = crc32(vector + addr1, len);
|
||||
*crc = crc32(BX_MEM_THIS vector + addr1, len);
|
||||
|
||||
return(1);
|
||||
}
|
||||
@ -607,11 +608,11 @@ Bit8u *BX_MEM_C::getHostMemAddr(BX_CPU_C *cpu, bx_phy_address a20Addr, unsigned
|
||||
if ((a20Addr & 0xfffe0000) == 0x000a0000 && (BX_MEM_THIS smram_available))
|
||||
{
|
||||
if (BX_MEM_THIS smram_enable || cpu->smm_mode())
|
||||
return (Bit8u *) & vector[a20Addr];
|
||||
return (Bit8u *) &BX_MEM_THIS vector[a20Addr];
|
||||
}
|
||||
}
|
||||
|
||||
struct memory_handler_struct *memory_handler = memory_handlers[a20Addr >> 20];
|
||||
struct memory_handler_struct *memory_handler = BX_MEM_THIS memory_handlers[a20Addr >> 20];
|
||||
while (memory_handler) {
|
||||
if (memory_handler->begin <= a20Addr &&
|
||||
memory_handler->end >= a20Addr) {
|
||||
@ -624,21 +625,21 @@ Bit8u *BX_MEM_C::getHostMemAddr(BX_CPU_C *cpu, bx_phy_address a20Addr, unsigned
|
||||
if ((a20Addr & 0xfffe0000) == 0x000a0000)
|
||||
return(NULL); // Vetoed! Mem mapped IO (VGA)
|
||||
#if BX_SUPPORT_PCI
|
||||
else if (pci_enabled && ((a20Addr & 0xfffc0000) == 0x000c0000))
|
||||
else if (BX_MEM_THIS pci_enabled && ((a20Addr & 0xfffc0000) == 0x000c0000))
|
||||
{
|
||||
switch (DEV_pci_rd_memtype (a20Addr)) {
|
||||
case 0x0: // Read from ROM
|
||||
if ((a20Addr & 0xfffe0000) == 0x000e0000)
|
||||
{
|
||||
return (Bit8u *) & rom[a20Addr & BIOS_MASK];
|
||||
return (Bit8u *) &BX_MEM_THIS rom[a20Addr & BIOS_MASK];
|
||||
}
|
||||
else
|
||||
{
|
||||
return (Bit8u *) & rom[(a20Addr & EXROM_MASK) + BIOSROMSZ];
|
||||
return (Bit8u *) &BX_MEM_THIS rom[(a20Addr & EXROM_MASK) + BIOSROMSZ];
|
||||
}
|
||||
break;
|
||||
case 0x1: // Read from ShadowRAM
|
||||
return (Bit8u *) & vector[a20Addr];
|
||||
return (Bit8u *) &BX_MEM_THIS vector[a20Addr];
|
||||
default:
|
||||
BX_PANIC(("getHostMemAddr(): default case"));
|
||||
return(NULL);
|
||||
@ -648,25 +649,25 @@ Bit8u *BX_MEM_C::getHostMemAddr(BX_CPU_C *cpu, bx_phy_address a20Addr, unsigned
|
||||
else if(a20Addr < BX_MEM_THIS len)
|
||||
{
|
||||
if ((a20Addr & 0xfffc0000) != 0x000c0000) {
|
||||
return (Bit8u *) & vector[a20Addr];
|
||||
return (Bit8u *) &BX_MEM_THIS vector[a20Addr];
|
||||
}
|
||||
else if ((a20Addr & 0xfffe0000) == 0x000e0000)
|
||||
{
|
||||
return (Bit8u *) & rom[a20Addr & BIOS_MASK];
|
||||
return (Bit8u *) &BX_MEM_THIS rom[a20Addr & BIOS_MASK];
|
||||
}
|
||||
else
|
||||
{
|
||||
return( (Bit8u *) & rom[(a20Addr & EXROM_MASK) + BIOSROMSZ]);
|
||||
return( (Bit8u *) &BX_MEM_THIS rom[(a20Addr & EXROM_MASK) + BIOSROMSZ]);
|
||||
}
|
||||
}
|
||||
else if (a20Addr >= (bx_phy_address)~BIOS_MASK)
|
||||
{
|
||||
return (Bit8u *) & rom[a20Addr & BIOS_MASK];
|
||||
return (Bit8u *) &BX_MEM_THIS rom[a20Addr & BIOS_MASK];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Error, requested addr is out of bounds.
|
||||
return (Bit8u *) & bogus[a20Addr & 0x0fff];
|
||||
return (Bit8u *) &BX_MEM_THIS bogus[a20Addr & 0x0fff];
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -679,7 +680,7 @@ Bit8u *BX_MEM_C::getHostMemAddr(BX_CPU_C *cpu, bx_phy_address a20Addr, unsigned
|
||||
else if (a20Addr >= (bx_phy_address)~BIOS_MASK)
|
||||
return(NULL); // Vetoed! ROMs
|
||||
#if BX_SUPPORT_PCI
|
||||
else if (pci_enabled && ((a20Addr & 0xfffc0000) == 0x000c0000))
|
||||
else if (BX_MEM_THIS pci_enabled && ((a20Addr & 0xfffc0000) == 0x000c0000))
|
||||
{
|
||||
// Veto direct writes to this area. Otherwise, there is a chance
|
||||
// for Guest2HostTLB and memory consistency problems, for example
|
||||
@ -690,7 +691,7 @@ Bit8u *BX_MEM_C::getHostMemAddr(BX_CPU_C *cpu, bx_phy_address a20Addr, unsigned
|
||||
else
|
||||
{
|
||||
if ((a20Addr & 0xfffc0000) != 0x000c0000) {
|
||||
retAddr = (Bit8u *) & vector[a20Addr];
|
||||
retAddr = (Bit8u *) &BX_MEM_THIS vector[a20Addr];
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -721,8 +722,8 @@ BX_MEM_C::registerMemoryHandlers(void *param, memory_handler_t read_handler,
|
||||
BX_INFO(("Register memory access handlers: %08x-%08x", begin_addr, end_addr));
|
||||
for (unsigned page_idx = begin_addr >> 20; page_idx <= end_addr >> 20; page_idx++) {
|
||||
struct memory_handler_struct *memory_handler = new struct memory_handler_struct;
|
||||
memory_handler->next = memory_handlers[page_idx];
|
||||
memory_handlers[page_idx] = memory_handler;
|
||||
memory_handler->next = BX_MEM_THIS memory_handlers[page_idx];
|
||||
BX_MEM_THIS memory_handlers[page_idx] = memory_handler;
|
||||
memory_handler->read_handler = read_handler;
|
||||
memory_handler->write_handler = write_handler;
|
||||
memory_handler->param = param;
|
||||
@ -739,7 +740,7 @@ BX_MEM_C::unregisterMemoryHandlers(memory_handler_t read_handler, memory_handler
|
||||
bx_bool ret = true;
|
||||
BX_INFO(("Memory access handlers unregistered: %08x-%08x", begin_addr, end_addr));
|
||||
for (unsigned page_idx = begin_addr >> 20; page_idx <= end_addr >> 20; page_idx++) {
|
||||
struct memory_handler_struct *memory_handler = memory_handlers[page_idx];
|
||||
struct memory_handler_struct *memory_handler = BX_MEM_THIS memory_handlers[page_idx];
|
||||
struct memory_handler_struct *prev = NULL;
|
||||
while (memory_handler &&
|
||||
memory_handler->read_handler != read_handler &&
|
||||
@ -757,7 +758,7 @@ BX_MEM_C::unregisterMemoryHandlers(memory_handler_t read_handler, memory_handler
|
||||
if (prev)
|
||||
prev->next = memory_handler->next;
|
||||
else
|
||||
memory_handlers[page_idx] = memory_handler->next;
|
||||
BX_MEM_THIS memory_handlers[page_idx] = memory_handler->next;
|
||||
delete memory_handler;
|
||||
}
|
||||
return ret;
|
||||
|
Loading…
x
Reference in New Issue
Block a user