- allocate memory for the IRQ handler name in register_irq() and free it in

unregister_irq(). This is required since there are some devices that don't
  use a string constant for the handler name.
- replaced true / false by portable 0 / 1 values.
This commit is contained in:
Volker Ruppert 2006-09-13 18:51:25 +00:00
parent 24e82e2580
commit 38caf3bf19
3 changed files with 54 additions and 48 deletions

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: devices.cc,v 1.104 2006-09-10 17:18:44 vruppert Exp $
// $Id: devices.cc,v 1.105 2006-09-13 18:51:25 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -51,6 +51,10 @@ bx_devices_c::bx_devices_c()
read_port_to_handler = NULL;
write_port_to_handler = NULL;
init_stubs();
for (unsigned i=0; i < BX_MAX_IRQS; i++) {
irq_handler_name[i] = NULL;
}
}
bx_devices_c::~bx_devices_c()
@ -110,7 +114,7 @@ void bx_devices_c::init(BX_MEM_C *newmem)
{
unsigned i;
BX_DEBUG(("Init $Id: devices.cc,v 1.104 2006-09-10 17:18:44 vruppert Exp $"));
BX_DEBUG(("Init $Id: devices.cc,v 1.105 2006-09-13 18:51:25 vruppert Exp $"));
mem = newmem;
/* set no-default handlers, will be overwritten by the real default handler */
@ -144,6 +148,7 @@ void bx_devices_c::init(BX_MEM_C *newmem)
}
for (i=0; i < BX_MAX_IRQS; i++) {
delete [] irq_handler_name[i];
irq_handler_name[i] = NULL;
}
@ -501,15 +506,16 @@ bx_bool bx_devices_c::register_irq(unsigned irq, const char *name)
if (irq >= BX_MAX_IRQS) {
BX_PANIC(("IO device %s registered with IRQ=%d above %u",
name, irq, (unsigned) BX_MAX_IRQS-1));
return false;
return 0;
}
if (irq_handler_name[irq]) {
BX_PANIC(("IRQ %u conflict, %s with %s", irq,
irq_handler_name[irq], name));
return false;
return 0;
}
irq_handler_name[irq] = name;
return true;
irq_handler_name[irq] = new char[strlen(name)+1];
strcpy(irq_handler_name[irq], name);
return 1;
}
bx_bool bx_devices_c::unregister_irq(unsigned irq, const char *name)
@ -517,22 +523,22 @@ bx_bool bx_devices_c::unregister_irq(unsigned irq, const char *name)
if (irq >= BX_MAX_IRQS) {
BX_PANIC(("IO device %s tried to unregister IRQ %d above %u",
name, irq, (unsigned) BX_MAX_IRQS-1));
return false;
return 0;
}
if (!irq_handler_name[irq]) {
BX_INFO(("IO device %s tried to unregister IRQ %d, not registered",
name, irq));
return false;
return 0;
}
if (strcmp(irq_handler_name[irq], name)) {
BX_INFO(("IRQ %u not registered to %s but to %s", irq,
name, irq_handler_name[irq]));
return false;
return 0;
}
delete [] irq_handler_name[irq];
irq_handler_name[irq] = NULL;
return true;
return 1;
}
bx_bool bx_devices_c::register_io_read_handler(void *this_ptr, bx_read_handler_t f,
@ -541,7 +547,7 @@ bx_bool bx_devices_c::register_io_read_handler(void *this_ptr, bx_read_handler_t
addr &= 0x0000ffff;
if (!f)
return false;
return 0;
/* first check if the port already has a handlers != the default handler */
if (read_port_to_handler[addr] &&
@ -550,7 +556,7 @@ bx_bool bx_devices_c::register_io_read_handler(void *this_ptr, bx_read_handler_t
(unsigned) addr));
BX_ERROR((" conflicting devices: %s & %s",
read_port_to_handler[addr]->handler_name, name));
return false;
return 0;
}
/* first find existing handle for function or create new one */
@ -583,7 +589,7 @@ bx_bool bx_devices_c::register_io_read_handler(void *this_ptr, bx_read_handler_t
io_read_handler->usage_count++;
read_port_to_handler[addr] = io_read_handler;
return true; // address mapped successfully
return 1; // address mapped successfully
}
bx_bool bx_devices_c::register_io_write_handler(void *this_ptr, bx_write_handler_t f,
@ -592,7 +598,7 @@ bx_bool bx_devices_c::register_io_write_handler(void *this_ptr, bx_write_handler
addr &= 0x0000ffff;
if (!f)
return false;
return 0;
/* first check if the port already has a handlers != the default handler */
if (write_port_to_handler[addr] &&
@ -601,7 +607,7 @@ bx_bool bx_devices_c::register_io_write_handler(void *this_ptr, bx_write_handler
(unsigned) addr));
BX_ERROR((" conflicting devices: %s & %s",
write_port_to_handler[addr]->handler_name, name));
return false;
return 0;
}
/* first find existing handle for function or create new one */
@ -634,7 +640,7 @@ bx_bool bx_devices_c::register_io_write_handler(void *this_ptr, bx_write_handler
io_write_handler->usage_count++;
write_port_to_handler[addr] = io_write_handler;
return true; // address mapped successfully
return 1; // address mapped successfully
}
bx_bool bx_devices_c::register_io_read_handler_range(void *this_ptr, bx_read_handler_t f,
@ -647,12 +653,12 @@ bx_bool bx_devices_c::register_io_read_handler_range(void *this_ptr, bx_read_han
if (end_addr < begin_addr) {
BX_ERROR(("!!! end_addr < begin_addr !!!"));
return false;
return 0;
}
if (!f) {
BX_ERROR(("!!! f == NULL !!!"));
return false;
return 0;
}
/* first check if the port already has a handlers != the default handler */
@ -663,7 +669,7 @@ bx_bool bx_devices_c::register_io_read_handler_range(void *this_ptr, bx_read_han
(unsigned) addr));
BX_ERROR((" conflicting devices: %s & %s",
read_port_to_handler[addr]->handler_name, name));
return false;
return 0;
}
/* first find existing handle for function or create new one */
@ -697,7 +703,7 @@ bx_bool bx_devices_c::register_io_read_handler_range(void *this_ptr, bx_read_han
io_read_handler->usage_count += end_addr - begin_addr + 1;
for (addr = begin_addr; addr <= end_addr; addr++)
read_port_to_handler[addr] = io_read_handler;
return true; // address mapped successfully
return 1; // address mapped successfully
}
bx_bool bx_devices_c::register_io_write_handler_range(void *this_ptr, bx_write_handler_t f,
@ -710,12 +716,12 @@ bx_bool bx_devices_c::register_io_write_handler_range(void *this_ptr, bx_write_h
if (end_addr < begin_addr) {
BX_ERROR(("!!! end_addr < begin_addr !!!"));
return false;
return 0;
}
if (!f) {
BX_ERROR(("!!! f == NULL !!!"));
return false;
return 0;
}
/* first check if the port already has a handlers != the default handler */
@ -726,7 +732,7 @@ bx_bool bx_devices_c::register_io_write_handler_range(void *this_ptr, bx_write_h
(unsigned) addr));
BX_ERROR((" conflicting devices: %s & %s",
write_port_to_handler[addr]->handler_name, name));
return false;
return 0;
}
/* first find existing handle for function or create new one */
@ -760,7 +766,7 @@ bx_bool bx_devices_c::register_io_write_handler_range(void *this_ptr, bx_write_h
io_write_handler->usage_count += end_addr - begin_addr + 1;
for (addr = begin_addr; addr <= end_addr; addr++)
write_port_to_handler[addr] = io_write_handler;
return true; // address mapped successfully
return 1; // address mapped successfully
}
@ -772,7 +778,7 @@ bx_bool bx_devices_c::register_default_io_read_handler(void *this_ptr, bx_read_h
io_read_handlers.this_ptr = this_ptr;
io_read_handlers.handler_name = name;
io_read_handlers.mask = mask;
return true;
return 1;
}
bx_bool bx_devices_c::register_default_io_write_handler(void *this_ptr, bx_write_handler_t f,
@ -782,7 +788,7 @@ bx_bool bx_devices_c::register_default_io_write_handler(void *this_ptr, bx_write
io_write_handlers.this_ptr = this_ptr;
io_write_handlers.handler_name = name;
io_write_handlers.mask = mask;
return true;
return 1;
}
bx_bool bx_devices_c::unregister_io_read_handler(void *this_ptr, bx_read_handler_t f,
@ -796,27 +802,27 @@ bx_bool bx_devices_c::unregister_io_read_handler(void *this_ptr, bx_read_handler
if (!io_read_handler) {
BX_ERROR((">>> NO IO_READ_HANDLER <<<"));
return false;
return 0;
}
if (io_read_handler == &io_read_handlers) {
BX_ERROR((">>> CANNOT UNREGISTER THE DEFAULT IO_READ_HANDLER <<<"));
return false; // cannot unregister the default handler
return 0; // cannot unregister the default handler
}
if (io_read_handler->funct != f) {
BX_ERROR((">>> NOT THE SAME IO_READ_HANDLER FUNC <<<"));
return false;
return 0;
}
if (io_read_handler->this_ptr != this_ptr) {
BX_ERROR((">>> NOT THE SAME IO_READ_HANDLER THIS_PTR <<<"));
return false;
return 0;
}
if (io_read_handler->mask != mask) {
BX_ERROR((">>> NOT THE SAME IO_READ_HANDLER MASK <<<"));
return false;
return 0;
}
read_port_to_handler[addr] = &io_read_handlers; // reset to default
@ -827,7 +833,7 @@ bx_bool bx_devices_c::unregister_io_read_handler(void *this_ptr, bx_read_handler
io_read_handler->next->prev = io_read_handler->prev;
delete io_read_handler;
}
return true;
return 1;
}
bx_bool bx_devices_c::unregister_io_write_handler(void *this_ptr, bx_write_handler_t f,
@ -838,19 +844,19 @@ bx_bool bx_devices_c::unregister_io_write_handler(void *this_ptr, bx_write_handl
struct io_handler_struct *io_write_handler = write_port_to_handler[addr];
if (!io_write_handler)
return false;
return 0;
if (io_write_handler == &io_write_handlers)
return false; // cannot unregister the default handler
return 0; // cannot unregister the default handler
if (io_write_handler->funct != f)
return false;
return 0;
if (io_write_handler->this_ptr != this_ptr)
return false;
return 0;
if (io_write_handler->mask != mask)
return false;
return 0;
write_port_to_handler[addr] = &io_write_handlers; // reset to default
io_write_handler->usage_count--;
@ -860,7 +866,7 @@ bx_bool bx_devices_c::unregister_io_write_handler(void *this_ptr, bx_write_handl
io_write_handler->next->prev = io_write_handler->prev;
delete io_write_handler;
}
return true;
return 1;
}
bx_bool bx_devices_c::unregister_io_read_handler_range(void *this_ptr, bx_read_handler_t f,
@ -869,14 +875,14 @@ bx_bool bx_devices_c::unregister_io_read_handler_range(void *this_ptr, bx_read_h
begin &= 0x0000ffff;
end &= 0x0000ffff;
Bit32u addr;
bx_bool ret = true;
bx_bool ret = 1;
/*
* the easy way this time
*/
for (addr = begin; addr <= end; addr++)
if (!unregister_io_read_handler(this_ptr, f, addr, mask))
ret = false;
ret = 0;
return ret;
}
@ -887,14 +893,14 @@ bx_bool bx_devices_c::unregister_io_write_handler_range(void *this_ptr, bx_write
begin &= 0x0000ffff;
end &= 0x0000ffff;
Bit32u addr;
bx_bool ret = true;
bx_bool ret = 1;
/*
* the easy way this time
*/
for (addr = begin; addr <= end; addr++)
if (!unregister_io_write_handler(this_ptr, f, addr, mask))
ret = false;
ret = 0;
return ret;
}

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: harddrv.cc,v 1.183 2006-09-10 17:18:44 vruppert Exp $
// $Id: harddrv.cc,v 1.184 2006-09-13 18:51:25 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -145,7 +145,7 @@ void bx_hard_drive_c::init(void)
char ata_name[20];
bx_list_c *base;
BX_DEBUG(("Init $Id: harddrv.cc,v 1.183 2006-09-10 17:18:44 vruppert Exp $"));
BX_DEBUG(("Init $Id: harddrv.cc,v 1.184 2006-09-13 18:51:25 vruppert Exp $"));
for (channel=0; channel<BX_MAX_ATA_CHANNEL; channel++) {
sprintf(ata_name, "ata.%d.resources", channel);
@ -177,7 +177,7 @@ void bx_hard_drive_c::init(void)
sprintf(string ,"ATA%d", channel);
if (BX_HD_THIS channels[channel].irq != 0)
DEV_register_irq(BX_HD_THIS channels[channel].irq, strdup(string));
DEV_register_irq(BX_HD_THIS channels[channel].irq, string);
if (BX_HD_THIS channels[channel].ioaddr1 != 0) {
DEV_register_ioread_handler(this, read_handler,

View File

@ -1,5 +1,5 @@
/////////////////////////////////////////////////////////////////////////
// $Id: iodev.h,v 1.78 2006-09-10 17:18:44 vruppert Exp $
// $Id: iodev.h,v 1.79 2006-09-13 18:51:25 vruppert Exp $
/////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2002 MandrakeSoft S.A.
@ -517,7 +517,7 @@ private:
// more for informative purposes, the names of the devices which
// are use each of the IRQ 0..15 lines are stored here
const char *irq_handler_name[BX_MAX_IRQS];
char *irq_handler_name[BX_MAX_IRQS];
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);