From a3908d6e86e5d0c82fbbef79e78e2ffccec22299 Mon Sep 17 00:00:00 2001 From: Volker Ruppert Date: Sat, 2 Sep 2006 12:08:28 +0000 Subject: [PATCH] - 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) --- bochs/config.h.in | 2 + bochs/memory/memory.cc | 50 ++++++++++----------- bochs/memory/memory.h | 4 +- bochs/memory/misc_mem.cc | 97 ++++++++++++++++++++-------------------- 4 files changed, 77 insertions(+), 76 deletions(-) diff --git a/bochs/config.h.in b/bochs/config.h.in index afbb3eca3..d76d6c664 100644 --- a/bochs/config.h.in +++ b/bochs/config.h.in @@ -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, diff --git a/bochs/memory/memory.cc b/bochs/memory/memory.cc index c3ff88a9b..a2a1cb8a4 100644 --- a/bochs/memory/memory.cc +++ b/bochs/memory/memory.cc @@ -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++; diff --git a/bochs/memory/memory.h b/bochs/memory/memory.h index dc6608fb4..200acbd5c 100644 --- a/bochs/memory/memory.h +++ b/bochs/memory/memory.h @@ -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 diff --git a/bochs/memory/misc_mem.cc b/bochs/memory/misc_mem.cc index fa35098d1..23854db56 100644 --- a/bochs/memory/misc_mem.cc +++ b/bochs/memory/misc_mem.cc @@ -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;