<html>
<body>
  <div id="body" style="background-color:#ffffff;" >
<table cellspacing="0" cellpadding="0" border="0" rules="cols">
<tr class="head" style="border-bottom-width:1px;border-bottom-style:solid;" ><td class="headtd" style="padding:0;padding-top:.2em;" colspan="4">Commit in <b><tt>lxdream/src/xlat</tt></b></td></tr>
<tr><td><tt><a href="#file1">xltcache.c</a></tt></td><td id="added" class="headtd2" style="padding-left:.3em;padding-right:.3em; background-color:#ddffdd;" align="right">+29</td><td></td><td class="headtd2" style="padding-left:.3em;padding-right:.3em;" nowrap="nowrap">252d50f93cf6 -> 712c418cad83</td></tr>
</table>
<pre class="comment" style="white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;white-space:pre-wrap;word-wrap:break-word;padding:4px;border:1px dashed #000000;background-color:#ffffdd;" >
Add xlat_get_address to find the SH4 address corresponding to a host code
address (for debugging purposes)
</pre>
<hr /><a name="file1" /><div class="file" style="border:1px solid #eeeeee;margin-top:1em;margin-bottom:1em;" >
<span class="pathname" style="font-family:monospace; float:right;" >lxdream/src/xlat</span><br />
<div class="fileheader" style="margin-bottom:.5em;" ><big><b>xltcache.c</b></big> <small id="info" style="color: #888888;" >252d50f93cf6 -> 712c418cad83</small></div>
<pre class="diff" style="margin:0;" ><small id="info" style="color: #888888;" >--- lxdream/src/xlat/xltcache.c
+++ lxdream/src/xlat/xltcache.c
@@ -500,6 +500,35 @@
</small></pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" > }
 
 /**
</pre><pre id="added" class="diff" style="margin:0; background-color:#ddffdd;" >+ * Perform a reverse lookup to determine the SH4 address corresponding to
+ * the start of the code block containing ptr. This is _slow_ - it does a
+ * linear scan of the lookup table to find this.
+ *
+ * If the pointer cannot be found in any live block, returns -1 (as this
+ * is not a legal PC)
+ */
+sh4addr_t xlat_get_address( unsigned char *ptr )
+{
+    int i,j;
+    for( i=0; i<XLAT_LUT_PAGES; i++ ) {
+        void **page = xlat_lut[i];
+        if( page != NULL ) {
+            for( j=0; j<XLAT_LUT_PAGE_ENTRIES; j++ ) {
+                void *entry = page[j];
+                if( ((uintptr_t)entry) > XLAT_LUT_ENTRY_USED ) {
+                    xlat_cache_block_t block = XLAT_BLOCK_FOR_CODE(entry);
+                    if( ptr >= block->code && ptr < block->code + block->size) {
+                        /* Found it */
+                        return (i<<13) | (j<<1);
+                    }
+                }
+            }
+        }
+    }
+    return -1;
+}
+
+/**
</pre><pre id="context" class="diff" style="margin:0; background-color:#eeeeee;" >  * Sanity check that the given pointer is at least contained in one of cache
  * regions, and has a sane-ish size. We don't do a full region walk atm.
  */
</pre></div>
<center><small>Chaos Theory</small></center>
</div></body></html>