- i440fx structure is now a private member of bx_pci_c

- PCI configuration space of the host bridge renamed from array[] to pci_conf[]
- new functions load_ROM() and mem_read() for ROM access
- macros for PCI functions defined in bochs.h
This commit is contained in:
Volker Ruppert 2002-08-17 09:23:42 +00:00
parent 16f04b12f0
commit 46093f8a88
5 changed files with 88 additions and 73 deletions

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: bochs.h,v 1.75 2002-08-09 06:16:42 vruppert Exp $
// $Id: bochs.h,v 1.76 2002-08-17 09:23:42 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -153,6 +153,11 @@ 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
#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: pci.cc,v 1.16 2002-08-05 17:43:25 vruppert Exp $
// $Id: pci.cc,v 1.17 2002-08-17 09:23:42 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -92,17 +92,17 @@ bx_pci_c::init(bx_devices_c *d)
d->register_io_write_handler(this, write_handler, i, "i440FX");
}
BX_PCI_THIS register_pci_handlers(this, pci_read_handler, pci_write_handler,
0x00, "440FX Host bridge");
BX_REGISTER_PCI_HANDLERS(this, pci_read_handler, pci_write_handler,
0x00, "440FX Host bridge");
for (unsigned i=0; i<256; i++)
BX_PCI_THIS s.i440fx.array[i] = 0x0;
BX_PCI_THIS s.i440fx.pci_conf[i] = 0x0;
// readonly registers
BX_PCI_THIS s.i440fx.array[0x00] = 0x86;
BX_PCI_THIS s.i440fx.array[0x01] = 0x80;
BX_PCI_THIS s.i440fx.array[0x02] = 0x37;
BX_PCI_THIS s.i440fx.array[0x03] = 0x12;
BX_PCI_THIS s.i440fx.array[0x0b] = 0x06;
BX_PCI_THIS s.i440fx.pci_conf[0x00] = 0x86;
BX_PCI_THIS s.i440fx.pci_conf[0x01] = 0x80;
BX_PCI_THIS s.i440fx.pci_conf[0x02] = 0x37;
BX_PCI_THIS s.i440fx.pci_conf[0x03] = 0x12;
BX_PCI_THIS s.i440fx.pci_conf[0x0b] = 0x06;
}
}
@ -112,23 +112,23 @@ bx_pci_c::reset(void)
BX_PCI_THIS s.i440fx.confAddr = 0;
BX_PCI_THIS s.i440fx.confData = 0;
BX_PCI_THIS s.i440fx.array[0x04] = 0x06;
BX_PCI_THIS s.i440fx.array[0x05] = 0x00;
BX_PCI_THIS s.i440fx.array[0x06] = 0x80;
BX_PCI_THIS s.i440fx.array[0x07] = 0x02;
BX_PCI_THIS s.i440fx.array[0x0d] = 0x00;
BX_PCI_THIS s.i440fx.array[0x0f] = 0x00;
BX_PCI_THIS s.i440fx.array[0x50] = 0x00;
BX_PCI_THIS s.i440fx.array[0x51] = 0x01;
BX_PCI_THIS s.i440fx.array[0x52] = 0x00;
BX_PCI_THIS s.i440fx.array[0x53] = 0x80;
BX_PCI_THIS s.i440fx.array[0x54] = 0x00;
BX_PCI_THIS s.i440fx.array[0x55] = 0x00;
BX_PCI_THIS s.i440fx.array[0x56] = 0x00;
BX_PCI_THIS s.i440fx.array[0x57] = 0x01;
BX_PCI_THIS s.i440fx.array[0x58] = 0x10;
BX_PCI_THIS s.i440fx.pci_conf[0x04] = 0x06;
BX_PCI_THIS s.i440fx.pci_conf[0x05] = 0x00;
BX_PCI_THIS s.i440fx.pci_conf[0x06] = 0x80;
BX_PCI_THIS s.i440fx.pci_conf[0x07] = 0x02;
BX_PCI_THIS s.i440fx.pci_conf[0x0d] = 0x00;
BX_PCI_THIS s.i440fx.pci_conf[0x0f] = 0x00;
BX_PCI_THIS s.i440fx.pci_conf[0x50] = 0x00;
BX_PCI_THIS s.i440fx.pci_conf[0x51] = 0x01;
BX_PCI_THIS s.i440fx.pci_conf[0x52] = 0x00;
BX_PCI_THIS s.i440fx.pci_conf[0x53] = 0x80;
BX_PCI_THIS s.i440fx.pci_conf[0x54] = 0x00;
BX_PCI_THIS s.i440fx.pci_conf[0x55] = 0x00;
BX_PCI_THIS s.i440fx.pci_conf[0x56] = 0x00;
BX_PCI_THIS s.i440fx.pci_conf[0x57] = 0x01;
BX_PCI_THIS s.i440fx.pci_conf[0x58] = 0x10;
for (unsigned i=0x59; i<0x60; i++)
BX_PCI_THIS s.i440fx.array[i] = 0x00;
BX_PCI_THIS s.i440fx.pci_conf[i] = 0x00;
}
@ -285,7 +285,7 @@ bx_pci_c::pci_read(Bit8u address, unsigned io_len)
Bit32u val440fx = 0;
if (io_len <= 4) {
memcpy(&val440fx, &BX_PCI_THIS s.i440fx.array[address], io_len);
memcpy(&val440fx, &BX_PCI_THIS s.i440fx.pci_conf[address], io_len);
BX_DEBUG(("440FX PMC read register 0x%02x value 0x%08x", address, val440fx));
return val440fx;
}
@ -323,7 +323,7 @@ bx_pci_c::pci_write(Bit8u address, Bit32u value, unsigned io_len)
case 0x0c:
break;
default:
BX_PCI_THIS s.i440fx.array[address+i] = value8;
BX_PCI_THIS s.i440fx.pci_conf[address+i] = value8;
BX_DEBUG(("440FX PMC write register 0x%02x value 0x%02x", address,
value8));
}
@ -367,38 +367,38 @@ bx_pci_c::rd_memType (Bit32u addr)
{
switch ((addr & 0xFC000) >> 12) {
case 0xC0:
return (mapRead ( BX_PCI_THIS s.i440fx.array[0x5A] & 0x3));
return (mapRead ( BX_PCI_THIS s.i440fx.pci_conf[0x5A] & 0x3));
case 0xC4:
return (mapRead ( (BX_PCI_THIS s.i440fx.array[0x5A] >> 4) & 0x3));
return (mapRead ( (BX_PCI_THIS s.i440fx.pci_conf[0x5A] >> 4) & 0x3));
case 0xC8:
return (mapRead ( BX_PCI_THIS s.i440fx.array[0x5B] & 0x3));
return (mapRead ( BX_PCI_THIS s.i440fx.pci_conf[0x5B] & 0x3));
case 0xCC:
return (mapRead ( (BX_PCI_THIS s.i440fx.array[0x5B] >> 4) & 0x3));
return (mapRead ( (BX_PCI_THIS s.i440fx.pci_conf[0x5B] >> 4) & 0x3));
case 0xD0:
return (mapRead ( BX_PCI_THIS s.i440fx.array[0x5C] & 0x3));
return (mapRead ( BX_PCI_THIS s.i440fx.pci_conf[0x5C] & 0x3));
case 0xD4:
return (mapRead ( (BX_PCI_THIS s.i440fx.array[0x5C] >> 4) & 0x3));
return (mapRead ( (BX_PCI_THIS s.i440fx.pci_conf[0x5C] >> 4) & 0x3));
case 0xD8:
return (mapRead ( BX_PCI_THIS s.i440fx.array[0x5D] & 0x3));
return (mapRead ( BX_PCI_THIS s.i440fx.pci_conf[0x5D] & 0x3));
case 0xDC:
return (mapRead ( (BX_PCI_THIS s.i440fx.array[0x5D] >> 4) & 0x3));
return (mapRead ( (BX_PCI_THIS s.i440fx.pci_conf[0x5D] >> 4) & 0x3));
case 0xE0:
return (mapRead ( BX_PCI_THIS s.i440fx.array[0x5E] & 0x3));
return (mapRead ( BX_PCI_THIS s.i440fx.pci_conf[0x5E] & 0x3));
case 0xE4:
return (mapRead ( (BX_PCI_THIS s.i440fx.array[0x5E] >> 4) & 0x3));
return (mapRead ( (BX_PCI_THIS s.i440fx.pci_conf[0x5E] >> 4) & 0x3));
case 0xE8:
return (mapRead ( BX_PCI_THIS s.i440fx.array[0x5F] & 0x3));
return (mapRead ( BX_PCI_THIS s.i440fx.pci_conf[0x5F] & 0x3));
case 0xEC:
return (mapRead ( (BX_PCI_THIS s.i440fx.array[0x5F] >> 4) & 0x3));
return (mapRead ( (BX_PCI_THIS s.i440fx.pci_conf[0x5F] >> 4) & 0x3));
case 0xF0:
case 0xF4:
case 0xF8:
case 0xFC:
return (mapRead ( (BX_PCI_THIS s.i440fx.array[0x59] >> 4) & 0x3));
return (mapRead ( (BX_PCI_THIS s.i440fx.pci_conf[0x59] >> 4) & 0x3));
default:
BX_PANIC(("rd_memType () Error: Memory Type not known !"));
@ -413,38 +413,38 @@ bx_pci_c::wr_memType (Bit32u addr)
{
switch ((addr & 0xFC000) >> 12) {
case 0xC0:
return (mapWrite ( BX_PCI_THIS s.i440fx.array[0x5A] & 0x3));
return (mapWrite ( BX_PCI_THIS s.i440fx.pci_conf[0x5A] & 0x3));
case 0xC4:
return (mapWrite ( (BX_PCI_THIS s.i440fx.array[0x5A] >> 4) & 0x3));
return (mapWrite ( (BX_PCI_THIS s.i440fx.pci_conf[0x5A] >> 4) & 0x3));
case 0xC8:
return (mapWrite ( BX_PCI_THIS s.i440fx.array[0x5B] & 0x3));
return (mapWrite ( BX_PCI_THIS s.i440fx.pci_conf[0x5B] & 0x3));
case 0xCC:
return (mapWrite ( (BX_PCI_THIS s.i440fx.array[0x5B] >> 4) & 0x3));
return (mapWrite ( (BX_PCI_THIS s.i440fx.pci_conf[0x5B] >> 4) & 0x3));
case 0xD0:
return (mapWrite ( BX_PCI_THIS s.i440fx.array[0x5C] & 0x3));
return (mapWrite ( BX_PCI_THIS s.i440fx.pci_conf[0x5C] & 0x3));
case 0xD4:
return (mapWrite ( (BX_PCI_THIS s.i440fx.array[0x5C] >> 4) & 0x3));
return (mapWrite ( (BX_PCI_THIS s.i440fx.pci_conf[0x5C] >> 4) & 0x3));
case 0xD8:
return (mapWrite ( BX_PCI_THIS s.i440fx.array[0x5D] & 0x3));
return (mapWrite ( BX_PCI_THIS s.i440fx.pci_conf[0x5D] & 0x3));
case 0xDC:
return (mapWrite ( (BX_PCI_THIS s.i440fx.array[0x5D] >> 4) & 0x3));
return (mapWrite ( (BX_PCI_THIS s.i440fx.pci_conf[0x5D] >> 4) & 0x3));
case 0xE0:
return (mapWrite ( BX_PCI_THIS s.i440fx.array[0x5E] & 0x3));
return (mapWrite ( BX_PCI_THIS s.i440fx.pci_conf[0x5E] & 0x3));
case 0xE4:
return (mapWrite ( (BX_PCI_THIS s.i440fx.array[0x5E] >> 4) & 0x3));
return (mapWrite ( (BX_PCI_THIS s.i440fx.pci_conf[0x5E] >> 4) & 0x3));
case 0xE8:
return (mapWrite ( BX_PCI_THIS s.i440fx.array[0x5F] & 0x3));
return (mapWrite ( BX_PCI_THIS s.i440fx.pci_conf[0x5F] & 0x3));
case 0xEC:
return (mapWrite ( (BX_PCI_THIS s.i440fx.array[0x5F] >> 4) & 0x3));
return (mapWrite ( (BX_PCI_THIS s.i440fx.pci_conf[0x5F] >> 4) & 0x3));
case 0xF0:
case 0xF4:
case 0xF8:
case 0xFC:
return (mapWrite ( (BX_PCI_THIS s.i440fx.array[0x59] >> 4) & 0x3));
return (mapWrite ( (BX_PCI_THIS s.i440fx.pci_conf[0x59] >> 4) & 0x3));
default:
BX_PANIC(("wr_memType () Error: Memory Type not known !"));
@ -463,11 +463,11 @@ bx_pci_c::print_i440fx_state()
#ifdef DUMP_FULL_I440FX
for (i=0; i<256; i++) {
BX_DEBUG(( "i440fxArray%02x:0x%02x", i, BX_PCI_THIS s.i440fx.array[i] ));
BX_DEBUG(( "i440fxArray%02x:0x%02x", i, BX_PCI_THIS s.i440fx.pci_conf[i] ));
}
#else /* DUMP_FULL_I440FX */
for (i=0x59; i<0x60; i++) {
BX_DEBUG(( "i440fxArray%02x:0x%02x", i, BX_PCI_THIS s.i440fx.array[i] ));
BX_DEBUG(( "i440fxArray%02x:0x%02x", i, BX_PCI_THIS s.i440fx.pci_conf[i] ));
}
#endif /* DUMP_FULL_I440FX */
}
@ -491,6 +491,17 @@ bx_pci_c::i440fx_fetch_ptr(Bit32u addr)
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,

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: pci.h,v 1.6 2002-05-30 07:33:48 vruppert Exp $
// $Id: pci.h,v 1.7 2002-08-17 09:23:42 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -44,7 +44,7 @@ typedef void (*bx_pci_write_handler_t)(void *, Bit8u, Bit32u, unsigned);
typedef struct {
Bit32u confAddr;
Bit32u confData;
Bit8u array[256];
Bit8u pci_conf[256];
Bit8u shadow[4*16*4096]; // 256k of memory
} bx_def440fx_t;
@ -64,10 +64,8 @@ public:
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);
struct {
bx_def440fx_t i440fx;
} s;
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;
@ -80,6 +78,10 @@ private:
} pci_handler[BX_MAX_PCI_DEVICES];
unsigned num_pci_handles;
struct {
bx_def440fx_t i440fx;
} s;
static Bit32u read_handler(void *this_ptr, Bit32u address, unsigned io_len);
static void write_handler(void *this_ptr, Bit32u address, Bit32u value, unsigned io_len);
static Bit32u pci_read_handler(void *this_ptr, Bit8u address, unsigned io_len);

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: memory.cc,v 1.15 2002-06-06 23:03:09 yakovlev Exp $
// $Id: memory.cc,v 1.16 2002-08-17 09:23:42 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 MandrakeSoft S.A.
@ -245,8 +245,7 @@ inc_one:
goto inc_one;
case 0x1: // Writes to ROM, Inhibit
// bx_pci.s.i440fx.shadow[(a20addr - 0xc0000)] = *data_ptr;
// BX_INFO(("Writing to ROM %08x, Data %02x ! ", (unsigned) a20addr, *data_ptr));
BX_DEBUG(("Write to ROM ignored: address %08x, data %02x", (unsigned) a20addr, *data_ptr));
goto inc_one;
default:
BX_PANIC(("write_physical: default case"));
@ -478,7 +477,7 @@ inc_one:
goto inc_one;
case 0x1: // Read from ROM
*data_ptr = bx_pci.s.i440fx.shadow[(a20addr - 0xc0000)];
*data_ptr = BX_PCI_MEM_READ(a20addr - 0xc0000);
//BX_INFO(("Reading from ROM %08x, Data %02x ", (unsigned) a20addr, *data_ptr));
goto inc_one;
default:
@ -558,7 +557,7 @@ inc_one:
break;
case 0x1: // Read from Shadow RAM
*data_ptr = bx_pci.s.i440fx.shadow[(a20addr - 0xc0000)];
*data_ptr = BX_PCI_MEM_READ(a20addr - 0xc0000);
BX_INFO(("Reading from ShadowRAM %08x, Data %02x ", (unsigned) a20addr, *data_ptr));
break;
default:

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: misc_mem.cc,v 1.20 2002-07-03 17:13:29 mlerwill Exp $
// $Id: misc_mem.cc,v 1.21 2002-08-17 09:23:42 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2001 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.20 2002-07-03 17:13:29 mlerwill Exp $"));
BX_DEBUG(("Init $Id: misc_mem.cc,v 1.21 2002-08-17 09:23:42 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
@ -158,12 +158,10 @@ BX_MEM_C::load_ROM(const char *path, Bit32u romaddress)
while (size > 0) {
#if BX_PCI_SUPPORT
if (bx_options.Oi440FXSupport->get ())
ret = read(fd, (bx_ptr_t) &bx_pci.s.i440fx.shadow[romaddress - 0xC0000 + offset],
size);
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);
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));