- added new plugin type PLUGTYPE_STANDARD for optional plugins which are used in

nearly all cases and plugins that depend on others. These plugins cannot be
  managed with 'plugin_ctrl' (e.g. keyboard, harddrv, pci_ide). Store the plugin
  type in the divice structure for compatiblity with the "no-plugin" compilation.
  Call the device methods init(), reset() and after_restore_state() for each type
  separately in the order: stanard, optional, user. This also affects the status
  bar LED feature: now the keyboard and harddrv LEDs are always visible, but
  those of optional plugins may be invisible if there is no space left.
- TODO #1: add the devices 'ne2k' and 'sb16' to 'plugin_ctrl'
- TODO #2: manage core plugins with the device plugin system
This commit is contained in:
Volker Ruppert 2012-01-10 17:45:18 +00:00
parent ba7887f31c
commit 5c49e2458f
4 changed files with 50 additions and 58 deletions

View File

@ -28,6 +28,7 @@
enum plugintype_t { enum plugintype_t {
PLUGTYPE_NULL=100, PLUGTYPE_NULL=100,
PLUGTYPE_CORE, PLUGTYPE_CORE,
PLUGTYPE_STANDARD,
PLUGTYPE_OPTIONAL, PLUGTYPE_OPTIONAL,
PLUGTYPE_USER PLUGTYPE_USER
}; };

View File

@ -183,26 +183,26 @@ void bx_devices_c::init(BX_MEM_C *newmem)
#if BX_SUPPORT_PCIUSB #if BX_SUPPORT_PCIUSB
PLUG_load_plugin(usb_common, PLUGTYPE_CORE); PLUG_load_plugin(usb_common, PLUGTYPE_CORE);
#endif #endif
PLUG_load_plugin(acpi, PLUGTYPE_OPTIONAL); PLUG_load_plugin(acpi, PLUGTYPE_STANDARD);
#else #else
BX_ERROR(("Bochs is not compiled with PCI support")); BX_ERROR(("Bochs is not compiled with PCI support"));
#endif #endif
} }
#if BX_SUPPORT_APIC #if BX_SUPPORT_APIC
PLUG_load_plugin(ioapic, PLUGTYPE_OPTIONAL); PLUG_load_plugin(ioapic, PLUGTYPE_STANDARD);
#endif #endif
PLUG_load_plugin(keyboard, PLUGTYPE_OPTIONAL); PLUG_load_plugin(keyboard, PLUGTYPE_STANDARD);
#if BX_SUPPORT_BUSMOUSE #if BX_SUPPORT_BUSMOUSE
if (mouse_type == BX_MOUSE_TYPE_BUS) { if (mouse_type == BX_MOUSE_TYPE_BUS) {
PLUG_load_plugin(busmouse, PLUGTYPE_OPTIONAL); PLUG_load_plugin(busmouse, PLUGTYPE_OPTIONAL);
} }
#endif #endif
if (is_harddrv_enabled()) { if (is_harddrv_enabled()) {
PLUG_load_plugin(harddrv, PLUGTYPE_OPTIONAL); PLUG_load_plugin(harddrv, PLUGTYPE_STANDARD);
#if BX_SUPPORT_PCI #if BX_SUPPORT_PCI
if (SIM->get_param_bool(BXPN_I440FX_SUPPORT)->get()) { if (SIM->get_param_bool(BXPN_I440FX_SUPPORT)->get()) {
PLUG_load_plugin(pci_ide, PLUGTYPE_OPTIONAL); PLUG_load_plugin(pci_ide, PLUGTYPE_STANDARD);
} }
#endif #endif
} }
@ -216,7 +216,7 @@ void bx_devices_c::init(BX_MEM_C *newmem)
vga_ext = SIM->get_param_string(BXPN_VGA_EXTENSION)->getptr(); vga_ext = SIM->get_param_string(BXPN_VGA_EXTENSION)->getptr();
if ((DEV_is_pci_device("pcivga")) && if ((DEV_is_pci_device("pcivga")) &&
((!strlen(vga_ext)) || (!strcmp(vga_ext, "none")) || (!strcmp(vga_ext, "vbe")))) { ((!strlen(vga_ext)) || (!strcmp(vga_ext, "none")) || (!strcmp(vga_ext, "vbe")))) {
PLUG_load_plugin(pcivga, PLUGTYPE_OPTIONAL); PLUG_load_plugin(pcivga, PLUGTYPE_STANDARD);
} }
} }
#endif #endif

View File

@ -567,10 +567,12 @@ void pluginRegisterDeviceDevmodel(plugin_t *plugin, plugintype_t type, bx_devmod
// plugins are on or off. // plugins are on or off.
free(device); free(device);
return; // Do not add core devices to the devices list. return; // Do not add core devices to the devices list.
case PLUGTYPE_STANDARD:
case PLUGTYPE_OPTIONAL: case PLUGTYPE_OPTIONAL:
case PLUGTYPE_USER: case PLUGTYPE_USER:
default: default:
// The plugin system will manage optional and user devices only. // The plugin system will manage standard, optional and user devices only.
device->plugtype = type;
break; break;
} }
@ -673,24 +675,25 @@ void bx_init_plugins()
{ {
device_t *device; device_t *device;
for (device = devices; device; device = device->next) {
if (device->plugtype == PLUGTYPE_STANDARD) {
pluginlog->info("init_dev of '%s' plugin device by virtual method",device->name);
device->devmodel->init();
}
}
for (device = devices; device; device = device->next) {
if (device->plugtype == PLUGTYPE_OPTIONAL) {
pluginlog->info("init_dev of '%s' plugin device by virtual method",device->name);
device->devmodel->init();
}
}
#if BX_PLUGINS #if BX_PLUGINS
for (device = devices; device; device = device->next) { for (device = devices; device; device = device->next) {
if (device->plugin->type == PLUGTYPE_OPTIONAL) { if (device->plugtype == PLUGTYPE_USER) {
pluginlog->info("init_dev of '%s' plugin device by virtual method",device->name); pluginlog->info("init_dev of '%s' plugin device by virtual method",device->name);
device->devmodel->init(); device->devmodel->init();
} }
} }
for (device = devices; device; device = device->next) {
if (device->plugin->type == PLUGTYPE_USER) {
pluginlog->info("init_dev of '%s' plugin device by virtual method",device->name);
device->devmodel->init();
}
}
#else
for (device = devices; device; device = device->next) {
pluginlog->info("init_dev of '%s' plugin device by virtual method",device->name);
device->devmodel->init();
}
#endif #endif
} }
@ -702,24 +705,25 @@ void bx_reset_plugins(unsigned signal)
{ {
device_t *device; device_t *device;
for (device = devices; device; device = device->next) {
if (device->plugtype == PLUGTYPE_STANDARD) {
pluginlog->info("reset of '%s' plugin device by virtual method",device->name);
device->devmodel->reset(signal);
}
}
for (device = devices; device; device = device->next) {
if (device->plugtype == PLUGTYPE_OPTIONAL) {
pluginlog->info("reset of '%s' plugin device by virtual method",device->name);
device->devmodel->reset(signal);
}
}
#if BX_PLUGINS #if BX_PLUGINS
for (device = devices; device; device = device->next) { for (device = devices; device; device = device->next) {
if (device->plugin->type == PLUGTYPE_OPTIONAL) { if (device->plugtype == PLUGTYPE_USER) {
pluginlog->info("reset of '%s' plugin device by virtual method",device->name); pluginlog->info("reset of '%s' plugin device by virtual method",device->name);
device->devmodel->reset(signal); device->devmodel->reset(signal);
} }
} }
for (device = devices; device; device = device->next) {
if (device->plugin->type == PLUGTYPE_USER) {
pluginlog->info("reset of '%s' plugin device by virtual method",device->name);
device->devmodel->reset(signal);
}
}
#else
for (device = devices; device; device = device->next) {
pluginlog->info("reset of '%s' plugin device by virtual method",device->name);
device->devmodel->reset(signal);
}
#endif #endif
} }
@ -759,25 +763,10 @@ void bx_plugins_register_state()
{ {
device_t *device; device_t *device;
#if BX_PLUGINS
for (device = devices; device; device = device->next) {
if (device->plugin->type == PLUGTYPE_OPTIONAL) {
pluginlog->info("register state of '%s' plugin device by virtual method",device->name);
device->devmodel->register_state();
}
}
for (device = devices; device; device = device->next) {
if (device->plugin->type == PLUGTYPE_USER) {
pluginlog->info("register state of '%s' plugin device by virtual method",device->name);
device->devmodel->register_state();
}
}
#else
for (device = devices; device; device = device->next) { for (device = devices; device; device = device->next) {
pluginlog->info("register state of '%s' plugin device by virtual method",device->name); pluginlog->info("register state of '%s' plugin device by virtual method",device->name);
device->devmodel->register_state(); device->devmodel->register_state();
} }
#endif
} }
/***************************************************************************/ /***************************************************************************/
@ -788,21 +777,22 @@ void bx_plugins_after_restore_state()
{ {
device_t *device; device_t *device;
for (device = devices; device; device = device->next) {
if (device->plugtype == PLUGTYPE_STANDARD) {
device->devmodel->after_restore_state();
}
}
for (device = devices; device; device = device->next) {
if (device->plugtype == PLUGTYPE_OPTIONAL) {
device->devmodel->after_restore_state();
}
}
#if BX_PLUGINS #if BX_PLUGINS
for (device = devices; device; device = device->next) { for (device = devices; device; device = device->next) {
if (device->plugin->type == PLUGTYPE_OPTIONAL) { if (device->plugtype == PLUGTYPE_USER) {
device->devmodel->after_restore_state(); device->devmodel->after_restore_state();
} }
} }
for (device = devices; device; device = device->next) {
if (device->plugin->type == PLUGTYPE_USER) {
device->devmodel->after_restore_state();
}
}
#else
for (device = devices; device; device = device->next) {
device->devmodel->after_restore_state();
}
#endif #endif
} }

View File

@ -283,8 +283,9 @@ extern plugin_t *plugins;
typedef struct _device_t typedef struct _device_t
{ {
const char *name; const char *name;
plugin_t *plugin; plugin_t *plugin;
plugintype_t plugtype;
class bx_devmodel_c *devmodel; // BBD hack class bx_devmodel_c *devmodel; // BBD hack