aboutsummaryrefslogtreecommitdiff
path: root/backends/plugins/psp/psp-provider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/plugins/psp/psp-provider.cpp')
-rw-r--r--backends/plugins/psp/psp-provider.cpp93
1 files changed, 29 insertions, 64 deletions
diff --git a/backends/plugins/psp/psp-provider.cpp b/backends/plugins/psp/psp-provider.cpp
index 5760424cbf..5bf9b0cc20 100644
--- a/backends/plugins/psp/psp-provider.cpp
+++ b/backends/plugins/psp/psp-provider.cpp
@@ -25,86 +25,51 @@
#if defined(DYNAMIC_MODULES) && defined(__PSP__)
-#include "backends/plugins/psp/psp-provider.h"
-#include "backends/plugins/dynamic-plugin.h"
-#include "common/fs.h"
+#include <psputils.h>
+#include <psputilsforkernel.h>
-#include "backends/platform/psp/psploader.h"
+#include "backends/plugins/psp/psp-provider.h"
+#include "backends/plugins/elf/mips-loader.h"
-#include "backends/platform/psp/trace.h"
+class PSPDLObject : public MIPSDLObject {
+public:
+ PSPDLObject() :
+ MIPSDLObject() {
+ }
+ virtual ~PSPDLObject() {
+ unload();
+ }
-class PSPPlugin : public DynamicPlugin {
protected:
- void *_dlHandle;
- Common::String _filename;
-
- virtual VoidFunc findSymbol(const char *symbol) {
- void *func = dlsym(_dlHandle, symbol);
- if (!func)
- warning("Failed loading symbol '%s' from plugin '%s' (%s)", symbol, _filename.c_str(), dlerror());
-
- // FIXME HACK: This is a HACK to circumvent a clash between the ISO C++
- // standard and POSIX: ISO C++ disallows casting between function pointers
- // and data pointers, but dlsym always returns a void pointer. For details,
- // see e.g. <http://www.trilithium.com/johan/2004/12/problem-with-dlsym/>.
- assert(sizeof(VoidFunc) == sizeof(func));
- VoidFunc tmp;
- memcpy(&tmp, &func, sizeof(VoidFunc));
- return tmp;
+ virtual void *allocSegment(size_t boundary, size_t size) const {
+ return memalign(boundary, size);
}
-public:
- PSPPlugin(const Common::String &filename)
- : _dlHandle(0), _filename(filename) {}
-
- ~PSPPlugin() {
- if (_dlHandle) unloadPlugin();
+ virtual void freeSegment(void *segment) const {
+ free(segment);
}
- bool loadPlugin() {
- assert(!_dlHandle);
- _dlHandle = dlopen(_filename.c_str(), RTLD_LAZY);
-
- if (!_dlHandle) {
- warning("Failed loading plugin '%s' (%s)", _filename.c_str(), dlerror());
- return false;
- }
-
- bool ret = DynamicPlugin::loadPlugin();
-
- if (ret)
- dlforgetsyms(_dlHandle);
+ virtual void flushDataCache(void *ptr, uint32 len) const {
+ sceKernelDcacheWritebackRange(ptr, len);
+ sceKernelIcacheInvalidateRange(ptr, len);
+ }
+};
- return ret;
+class PSPPlugin : public ELFPlugin {
+public:
+ PSPPlugin(const Common::String &filename) :
+ ELFPlugin(filename) {
}
- void unloadPlugin() {
- DynamicPlugin::unloadPlugin();
- if (_dlHandle) {
- if (dlclose(_dlHandle) != 0)
- warning("Failed unloading plugin '%s' (%s)", _filename.c_str(), dlerror());
- _dlHandle = 0;
- }
+ virtual DLObject *makeDLObject() {
+ return new PSPDLObject();
}
};
-
-Plugin* PSPPluginProvider::createPlugin(const Common::FSNode &node) const {
+Plugin *PSPPluginProvider::createPlugin(const Common::FSNode &node) const {
return new PSPPlugin(node.getPath());
}
-bool PSPPluginProvider::isPluginFilename(const Common::FSNode &node) const {
- // Check the plugin suffix
- Common::String filename = node.getName();
- PSP_DEBUG_PRINT("Testing name %s", filename.c_str());
- if (!filename.hasSuffix(".PLG") && !filename.hasSuffix(".plg")) {
- PSP_DEBUG_PRINT(" fail.\n");
- return false;
- }
-
- PSP_DEBUG_PRINT(" success!\n");
- return true;
-}
-
#endif // defined(DYNAMIC_MODULES) && defined(__PSP__)
+