Some work on the Bochs plugins support.

- Improved macro definitions for plugin entry points.
- Forward declarations of plugin entry points are only required when plugin
  support is off.
- Improved panic message for the case when plugin entry point is not found.
This commit is contained in:
Volker Ruppert 2021-01-24 19:47:04 +00:00
parent 74deb16b44
commit 3f760e2900
4 changed files with 28 additions and 8 deletions

View File

@ -573,8 +573,8 @@ enum {
// static bx_sdl_gui_c *theGui; // static bx_sdl_gui_c *theGui;
#define IMPLEMENT_GUI_PLUGIN_CODE(gui_name) \ #define IMPLEMENT_GUI_PLUGIN_CODE(gui_name) \
int CDECL lib##gui_name##_gui_plugin_entry(plugin_t *plugin, \ PLUGIN_ENTRY_FOR_GUI_MODULE(gui_name) \
plugintype_t type, bool init) { \ { \
if (init) { \ if (init) { \
genlog->info("installing %s module as the Bochs GUI", #gui_name); \ genlog->info("installing %s module as the Bochs GUI", #gui_name); \
theGui = new bx_##gui_name##_gui_c (); \ theGui = new bx_##gui_name##_gui_c (); \

View File

@ -24,7 +24,7 @@ Detailed description:
Patch was created with: Patch was created with:
diff -u diff -u
Apply patch to what version: Apply patch to what version:
svn revision 14082 (Jan 24, 2021) svn revision 14083 (Jan 24, 2021)
Instructions: Instructions:
To patch, go to main bochs directory. To patch, go to main bochs directory.
Type "patch -p0 < THIS_PATCH_FILE". Type "patch -p0 < THIS_PATCH_FILE".
@ -215,7 +215,7 @@ diff -urN ../bochs/user_plugins/testdev.cc ./user_plugins/testdev.cc
+ +
+// device plugin entry point +// device plugin entry point
+ +
+extern "C" PLUGIN_ENTRY_FOR_MODULE(testdev) +PLUGIN_ENTRY_FOR_MODULE(testdev)
+{ +{
+ if (init) { + if (init) {
+ theTestDevice = new bx_testdev_c(); + theTestDevice = new bx_testdev_c();

View File

@ -556,14 +556,16 @@ bool plugin_load(const char *name, plugintype_t type)
#if defined(WIN32) #if defined(WIN32)
plugin->plugin_entry = (plugin_entry_t) GetProcAddress(plugin->handle, tmpname); plugin->plugin_entry = (plugin_entry_t) GetProcAddress(plugin->handle, tmpname);
if (plugin->plugin_entry == NULL) { if (plugin->plugin_entry == NULL) {
pluginlog->panic("could not find plugin_entry: error=%d", GetLastError()); pluginlog->panic("could not find plugin_entry for module '%s' (%s): error=%d",
name, plugin_filename, GetLastError());
plugin_abort(plugin); plugin_abort(plugin);
return 0; return 0;
} }
#else #else
plugin->plugin_entry = (plugin_entry_t) lt_dlsym(plugin->handle, tmpname); plugin->plugin_entry = (plugin_entry_t) lt_dlsym(plugin->handle, tmpname);
if (plugin->plugin_entry == NULL) { if (plugin->plugin_entry == NULL) {
pluginlog->panic("could not find plugin_entry: %s", lt_dlerror()); pluginlog->panic("could not find plugin_entry for module '%s' (%s): %s",
name, plugin_filename, lt_dlerror());
plugin_abort(plugin); plugin_abort(plugin);
return 0; return 0;
} }

View File

@ -358,7 +358,8 @@ int bx_unload_opt_plugin(const char *name, bx_bool devflag);
int plugin_entry(plugin_t *plugin, plugintype_t type, bool init); int plugin_entry(plugin_t *plugin, plugintype_t type, bool init);
// still in extern "C" // still in extern "C"
#if BX_PLUGINS && defined(_MSC_VER) #if BX_PLUGINS && defined(WIN32)
#define PLUGIN_ENTRY_FOR_MODULE(mod) \ #define PLUGIN_ENTRY_FOR_MODULE(mod) \
extern "C" __declspec(dllexport) int __cdecl lib##mod##_LTX_plugin_entry(plugin_t *plugin, plugintype_t type, bool init) extern "C" __declspec(dllexport) int __cdecl lib##mod##_LTX_plugin_entry(plugin_t *plugin, plugintype_t type, bool init)
#define PLUGIN_ENTRY_FOR_GUI_MODULE(mod) \ #define PLUGIN_ENTRY_FOR_GUI_MODULE(mod) \
@ -371,7 +372,24 @@ int plugin_entry(plugin_t *plugin, plugintype_t type, bool init);
extern "C" __declspec(dllexport) int __cdecl lib##mod##_dev_plugin_entry(plugin_t *plugin, plugintype_t type, bool init) extern "C" __declspec(dllexport) int __cdecl lib##mod##_dev_plugin_entry(plugin_t *plugin, plugintype_t type, bool init)
#define PLUGIN_ENTRY_FOR_IMG_MODULE(mod) \ #define PLUGIN_ENTRY_FOR_IMG_MODULE(mod) \
extern "C" __declspec(dllexport) int __cdecl lib##mod##_img_plugin_entry(plugin_t *plugin, plugintype_t type, bool init) extern "C" __declspec(dllexport) int __cdecl lib##mod##_img_plugin_entry(plugin_t *plugin, plugintype_t type, bool init)
#elif BX_PLUGINS
#define PLUGIN_ENTRY_FOR_MODULE(mod) \
extern "C" int CDECL lib##mod##_LTX_plugin_entry(plugin_t *plugin, plugintype_t type, bool init)
#define PLUGIN_ENTRY_FOR_GUI_MODULE(mod) \
extern "C" int CDECL lib##mod##_gui_plugin_entry(plugin_t *plugin, plugintype_t type, bool init)
#define PLUGIN_ENTRY_FOR_SOUND_MODULE(mod) \
extern "C" int CDECL lib##mod##_sound_plugin_entry(plugin_t *plugin, plugintype_t type, bool init)
#define PLUGIN_ENTRY_FOR_NET_MODULE(mod) \
extern "C" int CDECL lib##mod##_net_plugin_entry(plugin_t *plugin, plugintype_t type, bool init)
#define PLUGIN_ENTRY_FOR_USB_MODULE(mod) \
extern "C" int CDECL lib##mod##_dev_plugin_entry(plugin_t *plugin, plugintype_t type, bool init)
#define PLUGIN_ENTRY_FOR_IMG_MODULE(mod) \
extern "C" int CDECL lib##mod##_img_plugin_entry(plugin_t *plugin, plugintype_t type, bool init)
#else #else
#define PLUGIN_ENTRY_FOR_MODULE(mod) \ #define PLUGIN_ENTRY_FOR_MODULE(mod) \
int CDECL lib##mod##_LTX_plugin_entry(plugin_t *plugin, plugintype_t type, bool init) int CDECL lib##mod##_LTX_plugin_entry(plugin_t *plugin, plugintype_t type, bool init)
#define PLUGIN_ENTRY_FOR_GUI_MODULE(mod) \ #define PLUGIN_ENTRY_FOR_GUI_MODULE(mod) \
@ -384,7 +402,6 @@ int plugin_entry(plugin_t *plugin, plugintype_t type, bool init);
int CDECL lib##mod##_dev_plugin_entry(plugin_t *plugin, plugintype_t type, bool init) int CDECL lib##mod##_dev_plugin_entry(plugin_t *plugin, plugintype_t type, bool init)
#define PLUGIN_ENTRY_FOR_IMG_MODULE(mod) \ #define PLUGIN_ENTRY_FOR_IMG_MODULE(mod) \
int CDECL lib##mod##_img_plugin_entry(plugin_t *plugin, plugintype_t type, bool init) int CDECL lib##mod##_img_plugin_entry(plugin_t *plugin, plugintype_t type, bool init)
#endif
// device plugins // device plugins
PLUGIN_ENTRY_FOR_MODULE(harddrv); PLUGIN_ENTRY_FOR_MODULE(harddrv);
@ -468,6 +485,7 @@ PLUGIN_ENTRY_FOR_IMG_MODULE(vbox);
PLUGIN_ENTRY_FOR_IMG_MODULE(vpc); PLUGIN_ENTRY_FOR_IMG_MODULE(vpc);
PLUGIN_ENTRY_FOR_IMG_MODULE(vvfat); PLUGIN_ENTRY_FOR_IMG_MODULE(vvfat);
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }