Author: David Schneider <[email protected]>
Branch: arm-backend-2
Changeset: r50166:8fbef9af526f
Date: 2011-12-02 23:04 +0100
http://bitbucket.org/pypy/pypy/changeset/8fbef9af526f/

Log:    (arigo, bivab): clear CPU cache everty time instructions are written
        to memory and put breakpoints at the locations that are going to be
        patched

diff --git a/pypy/jit/backend/arm/codebuilder.py 
b/pypy/jit/backend/arm/codebuilder.py
--- a/pypy/jit/backend/arm/codebuilder.py
+++ b/pypy/jit/backend/arm/codebuilder.py
@@ -6,12 +6,19 @@
 
 from pypy.rlib.rmmap import alloc, PTR
 from pypy.rpython.annlowlevel import llhelper
-from pypy.rpython.lltypesystem import lltype, rffi
+from pypy.rpython.lltypesystem import lltype, rffi, llmemory
 from pypy.jit.metainterp.history import ConstInt, BoxInt, AbstractFailDescr
 from pypy.rlib.objectmodel import we_are_translated
 from pypy.jit.backend.llsupport.asmmemmgr import BlockBuilderMixin
 from pypy.tool.udir import udir
 
+__clear_cache = rffi.llexternal(
+    "__clear_cache",
+    [llmemory.Address, llmemory.Address],
+    lltype.Void,
+    _nowrapper=True,
+    sandboxsafe=True)
+
 def binary_helper_call(name):
     signature = getattr(arch, 'arm_%s_sign' % name)
     function = getattr(arch, 'arm_%s' % name)
@@ -284,8 +291,14 @@
                 gcrootmap.put(rawstart + pos, mark)
         return rawstart
 
+    def clear_cache(self, addr):
+        startaddr = rffi.cast(llmemory.Address, addr)
+        endaddr = rffi.cast(llmemory.Address, addr + self.get_relative_pos())
+        __clear_cache(startaddr, endaddr)
+
     def copy_to_raw_memory(self, addr):
         self._copy_to_raw_memory(addr)
+        self.clear_cache(addr)
         self._dump(addr, "jit-backend-dump", 'arm')
 
     def currpos(self):
diff --git a/pypy/jit/backend/arm/opassembler.py 
b/pypy/jit/backend/arm/opassembler.py
--- a/pypy/jit/backend/arm/opassembler.py
+++ b/pypy/jit/backend/arm/opassembler.py
@@ -199,7 +199,7 @@
            print 'Failargs: ', op.getfailargs()
 
         pos = self.mc.currpos()
-        self.mc.NOP()
+        self.mc.BKPT()
         self.pending_guards.append(GuardToken(descr,
                                     failargs=op.getfailargs(),
                                     faillocs=arglocs,
@@ -495,7 +495,7 @@
         self.mc.TST_ri(r.ip.value, imm=ofs)
 
         jz_location = self.mc.currpos()
-        self.mc.NOP()
+        self.mc.BKPT()
 
         # the following is supposed to be the slow path, so whenever possible
         # we choose the most compact encoding over the most efficient one.
@@ -958,7 +958,7 @@
         regalloc.possibly_free_var(resbox)
 
         fast_jmp_pos = self.mc.currpos()
-        self.mc.NOP()
+        self.mc.BKPT()
 
         # Path A: use assembler helper
         #if values are equal we take the fast path
@@ -981,7 +981,7 @@
         # jump to merge point
         jmp_pos = self.mc.currpos()
         #jmp_location = self.mc.curraddr()
-        self.mc.NOP()
+        self.mc.BKPT()
 
         # Path B: load return value and reset token
         # Fast Path using result boxes
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to