- PCI memory handling moved to bx_mem_c

* shadow RAM array and fetch function are now a part of the memory code
  * removed unnecessary PCI macros and functions load_ROM() and mem_read()
This commit is contained in:
Volker Ruppert 2002-08-31 12:24:41 +00:00
parent b65997bb13
commit 38666a2cfb
7 changed files with 49 additions and 80 deletions

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: bochs.h,v 1.83 2002-08-31 04:57:18 bdenney Exp $
// $Id: bochs.h,v 1.84 2002-08-31 12:24:39 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -153,11 +153,9 @@ extern "C" {
BX_MEM(0)->read_physical(BX_CPU(0), phy_addr, len, ptr)
#define BX_MEM_WRITE_PHYSICAL(addr, len, ptr) \
BX_MEM(0)->write_physical(BX_CPU(0), phy_addr, len, ptr)
// macros for PCI handling
// macro for PCI handling
#define BX_REGISTER_PCI_HANDLERS(this_ptr, pci_read, pci_write, devfunc, name) \
bx_pci.register_pci_handlers(this_ptr, pci_read, pci_write, devfunc, name)
#define BX_PCI_LOAD_ROM(fd, offset, size) bx_pci.load_ROM(fd, offset, size)
#define BX_PCI_MEM_READ(offset) bx_pci.mem_read(offset)
#if BX_SMP_PROCESSORS==1
#define BX_CPU(x) (&bx_cpu)

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: cpu.cc,v 1.32 2002-06-06 23:03:09 yakovlev Exp $
// $Id: cpu.cc,v 1.33 2002-08-31 12:24:39 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
@ -740,7 +740,7 @@ BX_CPU_C::prefetch(void)
#if BX_PCI_SUPPORT
if ((new_phy_addr >= 0x000C0000) && (new_phy_addr <= 0x000FFFFF)) {
BX_CPU_THIS_PTR bytesleft = 0x4000 - (new_phy_addr & 0x3FFF);
BX_CPU_THIS_PTR fetch_ptr = bx_devices.pci->i440fx_fetch_ptr(new_phy_addr);
BX_CPU_THIS_PTR fetch_ptr = BX_CPU_THIS_PTR mem->pci_fetch_ptr(new_phy_addr);
} else {
BX_CPU_THIS_PTR bytesleft = (BX_CPU_THIS_PTR max_phy_addr - new_phy_addr) + 1;
BX_CPU_THIS_PTR fetch_ptr = &BX_CPU_THIS_PTR mem->vector[new_phy_addr];
@ -773,7 +773,7 @@ BX_CPU_C::revalidate_prefetch_q(void)
#if BX_PCI_SUPPORT
if ((new_phy_addr >= 0x000C0000) && (new_phy_addr <= 0x000FFFFF)) {
BX_CPU_THIS_PTR bytesleft = 0x4000 - (new_phy_addr & 0x3FFF);
BX_CPU_THIS_PTR fetch_ptr = bx_devices.pci->i440fx_fetch_ptr(new_phy_addr);
BX_CPU_THIS_PTR fetch_ptr = BX_CPU_THIS_PTR mem->pci_fetch_ptr(new_phy_addr);
}
else {
BX_CPU_THIS_PTR bytesleft = (BX_CPU_THIS_PTR max_phy_addr - new_phy_addr) + 1;

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: pci.cc,v 1.18 2002-08-27 19:54:46 bdenney Exp $
// $Id: pci.cc,v 1.19 2002-08-31 12:24:39 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -61,10 +61,6 @@ bx_pci_c::bx_pci_c(void)
for (i=0; i < 0x100; i++) {
BX_PCI_THIS pci_handler_id[i] = BX_MAX_PCI_DEVICES; // not assigned
}
for (i=0; i<0x40000; i++) {
BX_PCI_THIS s.i440fx.shadow[i] = 0xff;
}
}
bx_pci_c::~bx_pci_c(void)
@ -472,37 +468,6 @@ bx_pci_c::print_i440fx_state()
#endif /* DUMP_FULL_I440FX */
}
Bit8u*
bx_pci_c::i440fx_fetch_ptr(Bit32u addr)
{
if (bx_options.Oi440FXSupport->get ()) {
switch (rd_memType (addr)) {
case 0x0: // Read from ShadowRAM
return (&BX_PCI_THIS devices->mem->vector[addr]);
case 0x1: // Read from ROM
return (&BX_PCI_THIS s.i440fx.shadow[(addr - 0xc0000)]);
default:
BX_PANIC(("i440fx_fetch_ptr(): default case"));
return(0);
}
}
else
return (&BX_PCI_THIS devices->mem->vector[addr]);
}
int
bx_pci_c::load_ROM(int fd, Bit32u offset, Bit32u size)
{
return read(fd, (bx_ptr_t) &bx_pci.s.i440fx.shadow[offset], size);
}
Bit8u
bx_pci_c::mem_read(Bit32u offset)
{
return (BX_PCI_THIS s.i440fx.shadow[offset]);
}
Boolean
bx_pci_c::register_pci_handlers( void *this_ptr, bx_pci_read_handler_t f1,
bx_pci_write_handler_t f2, Bit8u devfunc,

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: pci.h,v 1.8 2002-08-27 19:54:46 bdenney Exp $
// $Id: pci.h,v 1.9 2002-08-31 12:24:41 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -45,7 +45,6 @@ typedef struct {
Bit32u confAddr;
Bit32u confData;
Bit8u pci_conf[256];
Bit8u shadow[4*16*4096]; // 256k of memory
} bx_def440fx_t;
@ -63,9 +62,6 @@ public:
BX_PCI_SMF void print_i440fx_state( );
BX_PCI_SMF Bit32u rd_memType (Bit32u addr);
BX_PCI_SMF Bit32u wr_memType (Bit32u addr);
BX_PCI_SMF Bit8u* i440fx_fetch_ptr(Bit32u addr);
BX_PCI_SMF int load_ROM(int fd, Bit32u offset, Bit32u size);
BX_PCI_SMF Bit8u mem_read(Bit32u offset);
private:
bx_devices_c *devices;

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: memory.cc,v 1.16 2002-08-17 09:23:42 vruppert Exp $
// $Id: memory.cc,v 1.17 2002-08-31 12:24:41 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
@ -239,7 +239,7 @@ inc_one:
switch (bx_devices.pci->wr_memType(a20addr & 0xFC000)) {
case 0x0: // Writes to ShadowRAM
// BX_INFO(("Writing to ShadowRAM %08x, len %u ! ", (unsigned) a20addr, (unsigned) len));
vector[a20addr] = *data_ptr;
shadow[a20addr - 0xc0000] = *data_ptr;
BX_DBG_DIRTY_PAGE(a20addr >> 12);
BX_DYN_DIRTY_PAGE(a20addr >> 12);
goto inc_one;
@ -472,12 +472,12 @@ inc_one:
else {
switch (bx_devices.pci->rd_memType(a20addr & 0xFC000)) {
case 0x0: // Read from ShadowRAM
*data_ptr = vector[a20addr];
*data_ptr = shadow[a20addr - 0xc0000];
BX_INFO(("Reading from ShadowRAM %08x, Data %02x ", (unsigned) a20addr, *data_ptr));
goto inc_one;
case 0x1: // Read from ROM
*data_ptr = BX_PCI_MEM_READ(a20addr - 0xc0000);
*data_ptr = vector[a20addr];
//BX_INFO(("Reading from ROM %08x, Data %02x ", (unsigned) a20addr, *data_ptr));
goto inc_one;
default:
@ -557,7 +557,7 @@ inc_one:
break;
case 0x1: // Read from Shadow RAM
*data_ptr = BX_PCI_MEM_READ(a20addr - 0xc0000);
*data_ptr = shadow[a20addr - 0xc0000];
BX_INFO(("Reading from ShadowRAM %08x, Data %02x ", (unsigned) a20addr, *data_ptr));
break;
default:

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: memory.h,v 1.6 2001-10-03 13:10:38 bdenney Exp $
// $Id: memory.h,v 1.7 2002-08-31 12:24:41 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
@ -45,6 +45,9 @@ public:
Bit8u *vector;
size_t len;
size_t megabytes; // (len in Megabytes)
#if BX_PCI_SUPPORT
Bit8u shadow[4*16*4096]; // 256k of memory
#endif
#if BX_DEBUGGER
unsigned char dbg_dirty_pages[(BX_MAX_DIRTY_PAGE_TABLE_MEGS * 1024 * 1024) / 4096];
Bit32u dbg_count_dirty_pages () {
@ -60,6 +63,9 @@ public:
BX_MEM_SMF void write_physical(BX_CPU_C *cpu, Bit32u addr, unsigned len, void *data);
BX_MEM_SMF void load_ROM(const char *path, Bit32u romaddress);
BX_MEM_SMF Bit32u get_memory_in_k(void);
#if BX_PCI_SUPPORT
BX_MEM_SMF Bit8u* pci_fetch_ptr(Bit32u addr);
#endif
BX_MEM_SMF Boolean dbg_fetch_mem(Bit32u addr, unsigned len, Bit8u *buf);
BX_MEM_SMF Boolean dbg_set_mem(Bit32u addr, unsigned len, Bit8u *buf);
BX_MEM_SMF Boolean dbg_crc32(

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: misc_mem.cc,v 1.23 2002-08-18 08:53:26 vruppert Exp $
// $Id: misc_mem.cc,v 1.24 2002-08-31 12:24:41 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -90,7 +90,7 @@ BX_MEM_C::~BX_MEM_C(void)
void
BX_MEM_C::init_memory(int memsize)
{
BX_DEBUG(("Init $Id: misc_mem.cc,v 1.23 2002-08-18 08:53:26 vruppert Exp $"));
BX_DEBUG(("Init $Id: misc_mem.cc,v 1.24 2002-08-31 12:24:41 vruppert Exp $"));
// you can pass 0 if memory has been allocated already through
// the constructor, or the desired size of memory if it hasn't
@ -107,6 +107,11 @@ BX_MEM_C::init_memory(int memsize)
// initialize ROM area (0xc0000 .. 0xfffff) to 0xff
memset(BX_MEM_THIS vector + 0xc0000, 0xff, 0x40000);
#if BX_PCI_SUPPORT
// initialize PCI shadow RAM area (0xc0000 .. 0xfffff) to 0x00
memset(BX_MEM_THIS shadow, 0x00, 0x40000);
#endif
#if BX_DEBUGGER
// initialize dirty pages table
memset(dbg_dirty_pages, 0, sizeof(dbg_dirty_pages));
@ -156,14 +161,7 @@ BX_MEM_C::load_ROM(const char *path, Bit32u romaddress)
offset = 0;
while (size > 0) {
#if BX_PCI_SUPPORT
if (bx_options.Oi440FXSupport->get ())
ret = BX_PCI_LOAD_ROM(fd, (romaddress - 0xC0000 + offset), size);
else
ret = read(fd, (bx_ptr_t) &BX_MEM_THIS vector[romaddress + offset], size);
#else
ret = read(fd, (bx_ptr_t) &BX_MEM_THIS vector[romaddress + offset], size);
#endif
if (ret <= 0) {
BX_PANIC(( "ROM: read failed on BIOS image: '%s'",path));
}
@ -171,29 +169,35 @@ BX_MEM_C::load_ROM(const char *path, Bit32u romaddress)
offset += ret;
}
close(fd);
#if BX_PCI_SUPPORT
if (bx_options.Oi440FXSupport->get ())
BX_INFO(("rom in i440FX RAM 0x%06x/%u ('%s')",
(unsigned) romaddress,
(unsigned) stat_buf.st_size,
path
));
else
BX_INFO(("rom at 0x%05x/%u ('%s')",
(unsigned) romaddress,
(unsigned) stat_buf.st_size,
path
));
#else // #if BX_PCI_SUPPORT
BX_INFO(("rom at 0x%05x/%u ('%s')",
(unsigned) romaddress,
(unsigned) stat_buf.st_size,
path
));
#endif // #if BX_PCI_SUPPORT
}
#endif // #if BX_PROVIDE_CPU_MEMORY
#if BX_PCI_SUPPORT
Bit8u*
BX_MEM_C::pci_fetch_ptr(Bit32u addr)
{
if (bx_options.Oi440FXSupport->get ()) {
switch (bx_devices.pci->rd_memType (addr)) {
case 0x0: // Read from ShadowRAM
return (&BX_MEM_THIS shadow[addr - 0xc0000]);
case 0x1: // Read from ROM
return (&BX_MEM_THIS vector[addr]);
default:
BX_PANIC(("pci_fetch_ptr(): default case"));
return(0);
}
}
else
return (&BX_MEM_THIS vector[addr]);
}
#endif
#if ( BX_DEBUGGER || BX_DISASM )
Boolean
@ -218,12 +222,12 @@ BX_MEM_C::dbg_fetch_mem(Bit32u addr, unsigned len, Bit8u *buf)
((addr >= 0x000C0000) && (addr <= 0x000FFFFF)) ) {
switch (bx_devices.pci->rd_memType (addr)) {
case 0x0: // Fetch from ShadowRAM
*buf = vector[addr];
*buf = shadow[addr - 0xc0000];
// BX_INFO(("Fetching from ShadowRAM %06x, len %u !", (unsigned)addr, (unsigned)len));
break;
case 0x1: // Fetch from ROM
*buf = BX_PCI_MEM_READ(addr - 0xC0000);
*buf = vector[addr];
// BX_INFO(("Fetching from ROM %06x, Data %02x ", (unsigned)addr, *buf));
break;
default: