[Scummvm-git-logs] scummvm riscos37 -> cff9b2d486859b808e55810cf6ae8d78cc77f269
lephilousophe
noreply at scummvm.org
Fri Jul 15 21:39:07 UTC 2022
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
27207e9670 RISCOS: Add more space to Wimp slot when not using makerun
cff9b2d486 RISCOS: Use dynamic areas for data and application space for plugins
Commit: 27207e96708fb5356590016888baa01e274c2657
https://github.com/scummvm/scummvm/commit/27207e96708fb5356590016888baa01e274c2657
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2022-07-15T23:38:49+02:00
Commit Message:
RISCOS: Add more space to Wimp slot when not using makerun
We do the same as makerun: size of ELF + 32K
Changed paths:
backends/platform/sdl/riscos/riscos.mk
diff --git a/backends/platform/sdl/riscos/riscos.mk b/backends/platform/sdl/riscos/riscos.mk
index aa97bd9e652..b9c8d340fe2 100644
--- a/backends/platform/sdl/riscos/riscos.mk
+++ b/backends/platform/sdl/riscos/riscos.mk
@@ -18,7 +18,7 @@ ifdef MAKERUN
$(MAKERUN) $(APP_NAME)/scummvm,ff8 ${srcdir}/dists/riscos/!Run,feb $(APP_NAME)/!Run,feb
else
cp ${srcdir}/dists/riscos/!Run,feb $(APP_NAME)/!Run,feb
- sed -i -e "s/WIMPSLOT/WimpSlot -min `du -k $(APP_NAME)/scummvm,ff8 | cut -f1`K/g" $(APP_NAME)/!Run,feb
+ sed -i -e "s/WIMPSLOT/WimpSlot -min $$(($$(du -k $(EXECUTABLE) | cut -f1) + 32))K/g" $(APP_NAME)/!Run,feb
endif
ifeq ($(APP_NAME),$(BASE_APP_NAME))
cp ${srcdir}/dists/riscos/!Boot,feb $(APP_NAME)/!Boot,feb
Commit: cff9b2d486859b808e55810cf6ae8d78cc77f269
https://github.com/scummvm/scummvm/commit/cff9b2d486859b808e55810cf6ae8d78cc77f269
Author: Le Philousophe (lephilousophe at users.noreply.github.com)
Date: 2022-07-15T23:38:50+02:00
Commit Message:
RISCOS: Use dynamic areas for data and application space for plugins
We only use application space in 26-bits (legacy) mode.
Changed paths:
backends/plugins/riscos/riscos-provider.cpp
backends/plugins/riscos/riscos-provider.h
diff --git a/backends/plugins/riscos/riscos-provider.cpp b/backends/plugins/riscos/riscos-provider.cpp
index 52446199805..42ecf1cbf2a 100644
--- a/backends/plugins/riscos/riscos-provider.cpp
+++ b/backends/plugins/riscos/riscos-provider.cpp
@@ -32,6 +32,18 @@
#include <kernel.h>
#include <swis.h>
+// By declaring this variable we force libunixlib to always use dynamic areas for data allocations
+// This frees up space for plugins and allows to have plenty of space for data
+const char *const __dynamic_da_name = "ScummVM Heap";
+
+// HACK: These two function are part of private API in libunixlib
+// They let allocate and free data in the application space where the stack is placed below 64MB
+// When using malloc with big chunks we end up in memory mapped areas above 64MB
+extern "C" {
+extern void *__stackalloc (size_t __size);
+extern void __stackfree (void *__ptr);
+}
+
// HACK: This is needed so that standard library functions that are only
// used in plugins can be found in the main executable.
void pluginHack() {
@@ -75,8 +87,48 @@ protected:
};
+/**
+ * On 26-bit RISC OS, plugins need to be allocated in the first 64 MB
+ * of RAM so that it can be executed. This may not be the case when using
+ * the default allocators, which use dynamic areas for large allocations.
+ */
+class RiscOSDLObject_AS : public RiscOSDLObject {
+protected:
+ void *allocateMemory(uint32 align, uint32 size) override {
+ // Allocate with worst case alignment in application space
+ void *p = __stackalloc(size + sizeof(uintptr) + align - 1);
+ void *np = (void *)(((uintptr)p + align - 1) & (-align));
+
+ *(uintptr *)((byte *)np + size) = (uintptr)p;
+
+ debug(8, "Allocated %p while alignment was %d: using %p", p, align, np);
+
+ return np;
+ }
+
+ void deallocateMemory(void *ptr, uint32 size) override {
+ void *p = (void *)*(uintptr *)((byte *)ptr + size);
+ debug(8, "Freeing %p which was allocated at %p", ptr, p);
+ __stackfree(p);
+ }
+};
+
+RiscOSPluginProvider::RiscOSPluginProvider() : _is32bit(false) {
+ __asm__ volatile (
+ "SUBS %[is32bit], r0, r0\n\t" /* Set at least one status flag and set is32bits to 0 */
+ "TEQ pc, pc\n\t" /* First operand never contains flags while second one contains them in 26-bits only */
+ "MOVEQ %[is32bit], #1\n\t" /* Set to 1 only if EQ flag is set */
+ : [is32bit] "=r" (_is32bit)
+ : /* no inputs */
+ : "cc");
+}
+
Plugin *RiscOSPluginProvider::createPlugin(const Common::FSNode &node) const {
- return new TemplatedELFPlugin<RiscOSDLObject>(node.getPath());
+ if (_is32bit) {
+ return new TemplatedELFPlugin<RiscOSDLObject>(node.getPath());
+ } else {
+ return new TemplatedELFPlugin<RiscOSDLObject_AS>(node.getPath());
+ }
}
#endif // defined(DYNAMIC_MODULES) && defined(RISCOS)
diff --git a/backends/plugins/riscos/riscos-provider.h b/backends/plugins/riscos/riscos-provider.h
index 171e7e9293f..bcaa6938080 100644
--- a/backends/plugins/riscos/riscos-provider.h
+++ b/backends/plugins/riscos/riscos-provider.h
@@ -28,7 +28,11 @@
class RiscOSPluginProvider : public ELFPluginProvider {
public:
+ RiscOSPluginProvider();
Plugin *createPlugin(const Common::FSNode &node) const;
+
+private:
+ bool _is32bit;
};
#endif // BACKENDS_PLUGINS_RISCOS_PROVIDER_H
More information about the Scummvm-git-logs
mailing list