about summary refs log tree commit diff stats
path: root/src/dynarec/dynarec_native_functions.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-03-16 19:02:26 +0000
committerptitSeb <sebastien.chev@gmail.com>2023-03-16 19:02:26 +0000
commit9212e832e6c9c772d0b4bdcbbc43ab81996bc8fc (patch)
tree5eff8a4aed51ec062615ab1f4b93d1e412cec7f9 /src/dynarec/dynarec_native_functions.c
parent848763bb5cbd5c87bf108a655873622835cd60a2 (diff)
downloadbox64-9212e832e6c9c772d0b4bdcbbc43ab81996bc8fc.tar.gz
box64-9212e832e6c9c772d0b4bdcbbc43ab81996bc8fc.zip
[DYNAREC] Fixed RV64 build and moved some functions between common and arch specific
Diffstat (limited to 'src/dynarec/dynarec_native_functions.c')
-rw-r--r--src/dynarec/dynarec_native_functions.c67
1 files changed, 55 insertions, 12 deletions
diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c
index 566ba2d1..2cf87003 100644
--- a/src/dynarec/dynarec_native_functions.c
+++ b/src/dynarec/dynarec_native_functions.c
@@ -409,17 +409,60 @@ int getNominalPred(dynarec_native_t* dyn, int ninst) {
     return dyn->insts[ninst].pred[0];
 }
 
-int isCacheEmpty(dynarec_native_t* dyn, int ninst) {
-    if(dyn->insts[ninst].n.stack_next) {
-        return 0;
-    }
-    for(int i=0; i<24; ++i)
-        if(dyn->insts[ninst].n.neoncache[i].v) {       // there is something at ninst for i
-            if(!(
-            (dyn->insts[ninst].n.neoncache[i].t==NEON_CACHE_ST_F || dyn->insts[ninst].n.neoncache[i].t==NEON_CACHE_ST_D)
-            && dyn->insts[ninst].n.neoncache[i].n<dyn->insts[ninst].n.stack_pop))
-                return 0;
+#define F8      *(uint8_t*)(addr++)
+// Do the GETED, but don't emit anything...
+uintptr_t fakeed(dynarec_native_t* dyn, uintptr_t addr, int ninst, uint8_t nextop) 
+{
+    (void)dyn; (void)addr; (void)ninst;
+
+    if((nextop&0xC0)==0xC0)
+        return addr;
+    if(!(nextop&0xC0)) {
+        if((nextop&7)==4) {
+            uint8_t sib = F8;
+            if((sib&0x7)==5) {
+                addr+=4;
+            }
+        } else if((nextop&7)==5) {
+            addr+=4;
+        }
+    } else {
+        if((nextop&7)==4) {
+            ++addr;
         }
-    return 1;
+        if(nextop&0x80) {
+            addr+=4;
+        } else {
+            ++addr;
+        }
+    }
+    return addr;
+}
+#undef F8
+
+int isNativeCall(dynarec_native_t* dyn, uintptr_t addr, uintptr_t* calladdress, int* retn)
+{
+    (void)dyn;
+
+#define PK(a)       *(uint8_t*)(addr+a)
+#define PK32(a)     *(int32_t*)(addr+a)
 
-}
\ No newline at end of file
+    if(!addr || !getProtection(addr))
+        return 0;
+    if(PK(0)==0xff && PK(1)==0x25) {            // "absolute" jump, maybe the GOT (well, RIP relative in fact)
+        uintptr_t a1 = addr + 6 + (PK32(2));    // need to add a check to see if the address is from the GOT !
+        addr = (uintptr_t)getAlternate(*(void**)a1);
+    }
+    if(!addr || !getProtection(addr))
+        return 0;
+    onebridge_t *b = (onebridge_t*)(addr);
+    if(b->CC==0xCC && b->S=='S' && b->C=='C' && b->w!=(wrapper_t)0 && b->f!=(uintptr_t)PltResolver) {
+        // found !
+        if(retn) *retn = (b->C3==0xC2)?b->N:0;
+        if(calladdress) *calladdress = addr+1;
+        return 1;
+    }
+    return 0;
+#undef PK32
+#undef PK
+}