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