From: <m97...@us...> - 2008-02-16 20:28:40
|
Revision: 7602 http://openmsx.svn.sourceforge.net/openmsx/?rev=7602&view=rev Author: m9710797 Date: 2008-02-16 12:28:10 -0800 (Sat, 16 Feb 2008) Log Message: ----------- added GP2X 'mmuhack', is about 5% faster Modified Paths: -------------- openmsx/trunk/src/video/RawFrame.cc openmsx/trunk/src/video/node.mk Added Paths: ----------- openmsx/trunk/src/video/GP2XMMUHack.cc openmsx/trunk/src/video/GP2XMMUHack.hh Added: openmsx/trunk/src/video/GP2XMMUHack.cc =================================================================== --- openmsx/trunk/src/video/GP2XMMUHack.cc (rev 0) +++ openmsx/trunk/src/video/GP2XMMUHack.cc 2008-02-16 20:28:10 UTC (rev 7602) @@ -0,0 +1,88 @@ +// $Id$ + +#include "GP2XMMUHack.hh" +#include <cstdlib> +#include <fcntl.h> +#include <unistd.h> + +#include <iostream> + +namespace openmsx { + +GP2XMMUHack::GP2XMMUHack() +{ + // some other program may have forgotton to unload (a different + // version of) this module + unloadModule(); + + loadModule(); +} + +GP2XMMUHack::~GP2XMMUHack() +{ + unloadModule(); +} + +GP2XMMUHack& GP2XMMUHack::instance() +{ + static GP2XMMUHack oneInstance; + return oneInstance; +} + +void GP2XMMUHack::loadModule() +{ + // TODO path + system("/sbin/insmod mmuhack.o"); +} + +void GP2XMMUHack::unloadModule() +{ + system("/sbin/rmmod mmuhack"); +} + +void GP2XMMUHack::patchPageTables() +{ + int mmufd = open("/dev/mmuhack", O_RDWR); + if (mmufd < 0) { + std::cerr << "mmuhack: Failed to patch pagetables" << std::endl; + return; + } + close(mmufd); + std::cerr << "mmuhack: Succesfully patched pagetables" << std::endl; +} + +void GP2XMMUHack::flushCache(void* start_address, void* end_address, int flags) +{ + // arguments are passed via registers + register void* beg asm("r0") = start_address; + register void* end asm("r1") = end_address; + register int flg asm("r2") = flags; + +#ifdef __ARM_EABI__ + // EABI is only support starting from kernel 2.6.16. + // This page has some more info: + // http://wiki.debian.org/ArmEabiPort + + // system-call number passed via r7 + register int scno asm("r7") = 0xf0002; // sys_cacheflush + asm volatile ( + "swi 0x0" + : "=r" (beg) + : "0" (beg) + , "r" (end) + , "r" (flg) + , "r" (scno) + ); +#else + // system-call number passed via swi instruction + asm volatile ( + "swi 0x9f0002 @ sys_cacheflush" + : "=r" (beg) + : "0" (beg) + , "r" (end) + , "r" (flg) + ); +#endif +} + +} // namespace openmsx Added: openmsx/trunk/src/video/GP2XMMUHack.hh =================================================================== --- openmsx/trunk/src/video/GP2XMMUHack.hh (rev 0) +++ openmsx/trunk/src/video/GP2XMMUHack.hh 2008-02-16 20:28:10 UTC (rev 7602) @@ -0,0 +1,30 @@ +// $Id$ + +#ifndef GP2XMMUHACK_HH +#define GP2XMMUHACK_HH + +namespace openmsx { + +/** This is a helper class to apply the 'mmuhack' on GP2X. (It's really + * known under this name.) See here for more info: + * http://wiki.gp2x.org/wiki/Using_the_upper_32MB_of_memory + */ +class GP2XMMUHack +{ +public: + static GP2XMMUHack& instance(); + + void patchPageTables(); + void flushCache(void* start_address, void* end_address, int flags); + +private: + GP2XMMUHack(); + ~GP2XMMUHack(); + + void loadModule(); + void unloadModule(); +}; + +} //namespace openmsx + +#endif Modified: openmsx/trunk/src/video/RawFrame.cc =================================================================== --- openmsx/trunk/src/video/RawFrame.cc 2008-02-14 18:51:30 UTC (rev 7601) +++ openmsx/trunk/src/video/RawFrame.cc 2008-02-16 20:28:10 UTC (rev 7602) @@ -6,6 +6,10 @@ #include "openmsx.hh" #include <SDL.h> +#if PLATFORM_GP2X +#include "GP2XMMUHack.hh" +#endif + namespace openmsx { RawFrame::RawFrame( @@ -54,6 +58,10 @@ setBlank(line, static_cast<unsigned>(0)); } } + +#if PLATFORM_GP2X + GP2XMMUHack::instance().patchPageTables(); +#endif } RawFrame::~RawFrame() Modified: openmsx/trunk/src/video/node.mk =================================================================== --- openmsx/trunk/src/video/node.mk 2008-02-14 18:51:30 UTC (rev 7601) +++ openmsx/trunk/src/video/node.mk 2008-02-16 20:28:10 UTC (rev 7602) @@ -37,6 +37,11 @@ Multiply32 endif +ifeq ($(PLATFORM_GP2X), 1) +SRC_HDR += \ + GP2XMMUHack +endif + HDR_ONLY:= \ DirtyChecker \ DisplayMode \ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |