2001-10-03 17:10:38 +04:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
2003-08-05 17:19:35 +04:00
|
|
|
// $Id: memory.h,v 1.16 2003-08-05 13:19:35 cbothamy Exp $
|
2001-10-03 17:10:38 +04:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
2001-04-10 06:20:02 +04:00
|
|
|
// Copyright (C) 2001 MandrakeSoft S.A.
|
2001-04-10 05:04:59 +04:00
|
|
|
//
|
|
|
|
// MandrakeSoft S.A.
|
|
|
|
// 43, rue d'Aboukir
|
|
|
|
// 75002 Paris - France
|
|
|
|
// http://www.linux-mandrake.com/
|
|
|
|
// http://www.mandrakesoft.com/
|
|
|
|
//
|
|
|
|
// This library is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
|
|
// License as published by the Free Software Foundation; either
|
|
|
|
// version 2 of the License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This library is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
|
|
// License along with this library; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
|
|
|
|
|
|
|
|
|
2001-05-23 12:02:15 +04:00
|
|
|
#define BX_USE_MEM_SMF 0
|
2001-04-10 05:04:59 +04:00
|
|
|
|
|
|
|
#if BX_USE_MEM_SMF
|
2001-05-23 12:02:15 +04:00
|
|
|
// if static member functions on, then there is only one memory
|
2001-04-10 05:04:59 +04:00
|
|
|
# define BX_MEM_SMF static
|
2001-06-05 21:35:08 +04:00
|
|
|
# define BX_MEM_THIS BX_MEM(0)->
|
2001-04-10 05:04:59 +04:00
|
|
|
#else
|
|
|
|
# define BX_MEM_SMF
|
|
|
|
# define BX_MEM_THIS this->
|
|
|
|
#endif
|
|
|
|
|
2002-09-04 06:11:33 +04:00
|
|
|
// alignment of memory vector, must be a power of 2
|
|
|
|
#define BX_MEM_VECTOR_ALIGN 4096
|
2001-04-10 05:04:59 +04:00
|
|
|
|
2002-10-25 01:07:56 +04:00
|
|
|
class BOCHSAPI BX_MEM_C : public logfunctions {
|
2001-04-10 05:04:59 +04:00
|
|
|
|
|
|
|
public:
|
2002-09-04 06:11:33 +04:00
|
|
|
Bit8u *actual_vector;
|
|
|
|
Bit8u *vector; // aligned correctly
|
2001-04-10 05:04:59 +04:00
|
|
|
size_t len;
|
|
|
|
size_t megabytes; // (len in Megabytes)
|
2002-08-31 16:24:41 +04:00
|
|
|
#if BX_PCI_SUPPORT
|
|
|
|
Bit8u shadow[4*16*4096]; // 256k of memory
|
|
|
|
#endif
|
2001-04-10 05:04:59 +04:00
|
|
|
#if BX_DEBUGGER
|
|
|
|
unsigned char dbg_dirty_pages[(BX_MAX_DIRTY_PAGE_TABLE_MEGS * 1024 * 1024) / 4096];
|
2001-05-23 12:02:15 +04:00
|
|
|
Bit32u dbg_count_dirty_pages () {
|
|
|
|
return (BX_MAX_DIRTY_PAGE_TABLE_MEGS * 1024 * 1024) / 4096;
|
|
|
|
}
|
2001-04-10 05:04:59 +04:00
|
|
|
#endif
|
|
|
|
|
|
|
|
BX_MEM_C(void);
|
2003-08-05 17:19:35 +04:00
|
|
|
//BX_MEM_C(size_t memsize);
|
2001-04-10 05:04:59 +04:00
|
|
|
~BX_MEM_C(void);
|
2003-03-03 02:59:12 +03:00
|
|
|
BX_MEM_SMF void alloc_vector_aligned (size_t bytes, size_t alignment) BX_CPP_AttrRegparmN(2);
|
2001-04-10 05:04:59 +04:00
|
|
|
BX_MEM_SMF void init_memory(int memsize);
|
Now, when you compile with --enable-guest2host-tlb, non-paged
mode uses the notion of the guest-to-host TLB. This has the
benefit of allowing more uniform and streamlined acceleration
code in access.cc which does not have to check if CR0.PG
is set, eliminating a few instructions per guest access.
Shaved just a little off execution time, as expected.
Also, access_linear now breaks accesses which span two pages,
into two calls the the physical memory routines, when paging
is off, just like it always has for paging on. Besides
being more uniform, this allows the physical memory access
routines to known the complete data item is contained
within a single physical page, and stop reapplying the
A20ADDR() macro to pointers as it increments them.
Perhaps things can be optimized a little more now there too...
I renamed the routines to {read,write}PhysicalPage() as
a reminder that these routines now operate on data
solely within one page.
I also added a little code so that the paging module is
notified when the A20 line is tweaked, so it can dump
whatever mappings it wants to.
2002-09-05 06:31:24 +04:00
|
|
|
BX_MEM_SMF void readPhysicalPage(BX_CPU_C *cpu, Bit32u addr,
|
2003-03-03 02:59:12 +03:00
|
|
|
unsigned len, void *data) BX_CPP_AttrRegparmN(3);
|
Now, when you compile with --enable-guest2host-tlb, non-paged
mode uses the notion of the guest-to-host TLB. This has the
benefit of allowing more uniform and streamlined acceleration
code in access.cc which does not have to check if CR0.PG
is set, eliminating a few instructions per guest access.
Shaved just a little off execution time, as expected.
Also, access_linear now breaks accesses which span two pages,
into two calls the the physical memory routines, when paging
is off, just like it always has for paging on. Besides
being more uniform, this allows the physical memory access
routines to known the complete data item is contained
within a single physical page, and stop reapplying the
A20ADDR() macro to pointers as it increments them.
Perhaps things can be optimized a little more now there too...
I renamed the routines to {read,write}PhysicalPage() as
a reminder that these routines now operate on data
solely within one page.
I also added a little code so that the paging module is
notified when the A20 line is tweaked, so it can dump
whatever mappings it wants to.
2002-09-05 06:31:24 +04:00
|
|
|
BX_MEM_SMF void writePhysicalPage(BX_CPU_C *cpu, Bit32u addr,
|
2003-03-03 02:59:12 +03:00
|
|
|
unsigned len, void *data) BX_CPP_AttrRegparmN(3);
|
2003-04-02 21:03:34 +04:00
|
|
|
BX_MEM_SMF void load_ROM(const char *path, Bit32u romaddress, Bit8u type);
|
2001-04-10 05:04:59 +04:00
|
|
|
BX_MEM_SMF Bit32u get_memory_in_k(void);
|
2002-08-31 16:24:41 +04:00
|
|
|
#if BX_PCI_SUPPORT
|
2003-03-03 02:59:12 +03:00
|
|
|
BX_MEM_SMF Bit8u* pci_fetch_ptr(Bit32u addr) BX_CPP_AttrRegparmN(1);
|
2002-08-31 16:24:41 +04:00
|
|
|
#endif
|
2002-10-25 15:44:41 +04:00
|
|
|
BX_MEM_SMF bx_bool dbg_fetch_mem(Bit32u addr, unsigned len, Bit8u *buf);
|
|
|
|
BX_MEM_SMF bx_bool dbg_set_mem(Bit32u addr, unsigned len, Bit8u *buf);
|
|
|
|
BX_MEM_SMF bx_bool dbg_crc32(
|
2001-04-10 05:04:59 +04:00
|
|
|
unsigned long (*f)(unsigned char *buf, int len),
|
|
|
|
Bit32u addr1, Bit32u addr2, Bit32u *crc);
|
2003-03-03 02:59:12 +03:00
|
|
|
BX_MEM_SMF Bit8u * getHostMemAddr(BX_CPU_C *cpu, Bit32u a20Addr, unsigned op) BX_CPP_AttrRegparmN(3);
|
2001-04-10 05:04:59 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
#if BX_PROVIDE_CPU_MEMORY==1
|
2001-06-05 21:35:08 +04:00
|
|
|
|
|
|
|
#if BX_SMP_PROCESSORS==1
|
2002-10-25 01:07:56 +04:00
|
|
|
BOCHSAPI extern BX_MEM_C bx_mem;
|
2001-06-05 21:35:08 +04:00
|
|
|
#else
|
2002-10-25 01:07:56 +04:00
|
|
|
BOCHSAPI extern BX_MEM_C *bx_mem_array[BX_ADDRESS_SPACES];
|
2001-06-05 21:35:08 +04:00
|
|
|
#endif /* BX_SMP_PROCESSORS */
|
|
|
|
|
|
|
|
#endif /* BX_PROVIDE_CPU_MEMORY==1 */
|
2001-04-10 05:04:59 +04:00
|
|
|
|
|
|
|
#if BX_DEBUGGER
|
2001-05-23 12:02:15 +04:00
|
|
|
# define BX_DBG_DIRTY_PAGE(page) BX_MEM(0)->dbg_dirty_pages[page] = 1;
|
2001-04-10 05:04:59 +04:00
|
|
|
#else
|
|
|
|
# define BX_DBG_DIRTY_PAGE(page)
|
|
|
|
#endif
|