Procházet zdrojové kódy

Stats for safe_{read,write}32 fast/slow path

Fabian před 6 roky
rodič
revize
0fde39d22b

+ 12 - 0
src/browser/print_stats.js

@@ -29,6 +29,18 @@ const print_stats = {
             "RUN_FROM_CACHE",
             "RUN_FROM_CACHE_STEPS",
             "TRIGGER_CPU_EXCEPTION",
+            "S_SAFE_READ32_FAST",
+            "S_SAFE_READ32_SLOW_PAGE_CROSSED",
+            "S_SAFE_READ32_SLOW_NOT_VALID",
+            "S_SAFE_READ32_SLOW_NOT_USER",
+            "S_SAFE_READ32_SLOW_IN_MAPPED_RANGE",
+            "S_SAFE_WRITE32_FAST",
+            "S_SAFE_WRITE32_SLOW_PAGE_CROSSED",
+            "S_SAFE_WRITE32_SLOW_NOT_VALID",
+            "S_SAFE_WRITE32_SLOW_NOT_USER",
+            "S_SAFE_WRITE32_SLOW_IN_MAPPED_RANGE",
+            "S_SAFE_WRITE32_SLOW_READ_ONLY",
+            "S_SAFE_WRITE32_SLOW_HAS_CODE",
             "DO_RUN",
             "DO_MANY_CYCLES",
             "CYCLE_INTERNAL",

+ 1 - 0
src/native/config.h

@@ -39,6 +39,7 @@
 
 #define ENABLE_PROFILER 0
 #define ENABLE_PROFILER_OPSTATS 0
+#define ENABLE_PROFILER_SAFE_READ_WRITE 0
 
 // Note: needs to be enabled here and in config.js
 #define DUMP_UNCOMPILED_ASSEMBLY 0

+ 64 - 0
src/native/cpu.c

@@ -2186,6 +2186,9 @@ int32_t safe_read32s(int32_t address)
 
     if(info_bits == TLB_VALID && (address & 0xFFF) <= (0x1000 - 4))
     {
+#if ENABLE_PROFILER_SAFE_READ_WRITE
+        profiler_stat_increment(S_SAFE_READ32_FAST);
+#endif
         // - not in memory mapped area
         // - can be accessed from any cpl
 
@@ -2193,6 +2196,31 @@ int32_t safe_read32s(int32_t address)
         assert(!in_mapped_range(phys_address));
         return *(int32_t*)(mem8 + phys_address);
     }
+    else
+    {
+#if ENABLE_PROFILER_SAFE_READ_WRITE
+        if((address & 0xFFF) > 0x1000 - 4)
+        {
+            profiler_stat_increment(S_SAFE_READ32_SLOW_PAGE_CROSSED);
+        }
+        else if((info_bits & TLB_VALID) == 0)
+        {
+            profiler_stat_increment(S_SAFE_READ32_SLOW_NOT_VALID);
+        }
+        else if(info_bits & TLB_NO_USER)
+        {
+            profiler_stat_increment(S_SAFE_READ32_SLOW_NOT_USER);
+        }
+        else if(info_bits & TLB_IN_MAPPED_RANGE)
+        {
+            profiler_stat_increment(S_SAFE_READ32_SLOW_IN_MAPPED_RANGE);
+        }
+        else
+        {
+            dbg_assert(false);
+        }
+#endif
+    }
 #endif
 
     return safe_read32s_slow(address);
@@ -2277,6 +2305,9 @@ void safe_write32(int32_t address, int32_t value)
 
     if(info_bits == TLB_VALID && (address & 0xFFF) <= (0x1000 - 4))
     {
+#if ENABLE_PROFILER_SAFE_READ_WRITE
+        profiler_stat_increment(S_SAFE_WRITE32_FAST);
+#endif
         // - allowed to write in user-mode
         // - not in memory mapped area
         // - can be accessed from any cpl
@@ -2289,6 +2320,39 @@ void safe_write32(int32_t address, int32_t value)
         *(int32_t*)(mem8 + phys_address) = value;
         return;
     }
+    else
+    {
+#if ENABLE_PROFILER_SAFE_READ_WRITE
+        if((address & 0xFFF) > 0x1000 - 4)
+        {
+            profiler_stat_increment(S_SAFE_WRITE32_SLOW_PAGE_CROSSED);
+        }
+        else if((info_bits & TLB_VALID) == 0)
+        {
+            profiler_stat_increment(S_SAFE_WRITE32_SLOW_NOT_VALID);
+        }
+        else if(info_bits & TLB_NO_USER)
+        {
+            profiler_stat_increment(S_SAFE_WRITE32_SLOW_NOT_USER);
+        }
+        else if(info_bits & TLB_IN_MAPPED_RANGE)
+        {
+            profiler_stat_increment(S_SAFE_WRITE32_SLOW_IN_MAPPED_RANGE);
+        }
+        else if(info_bits & TLB_READONLY)
+        {
+            profiler_stat_increment(S_SAFE_WRITE32_SLOW_READ_ONLY);
+        }
+        else if(info_bits & TLB_HAS_CODE)
+        {
+            profiler_stat_increment(S_SAFE_WRITE32_SLOW_HAS_CODE);
+        }
+        else
+        {
+            dbg_assert(false);
+        }
+#endif
+    }
 #endif
 
     safe_write32_slow(address, value);

+ 14 - 0
src/native/profiler/profiler.h

@@ -23,6 +23,20 @@ enum stat_name {
 
     S_TRIGGER_CPU_EXCEPTION,
 
+    S_SAFE_READ32_FAST,
+    S_SAFE_READ32_SLOW_PAGE_CROSSED,
+    S_SAFE_READ32_SLOW_NOT_VALID,
+    S_SAFE_READ32_SLOW_NOT_USER,
+    S_SAFE_READ32_SLOW_IN_MAPPED_RANGE,
+
+    S_SAFE_WRITE32_FAST,
+    S_SAFE_WRITE32_SLOW_PAGE_CROSSED,
+    S_SAFE_WRITE32_SLOW_NOT_VALID,
+    S_SAFE_WRITE32_SLOW_NOT_USER,
+    S_SAFE_WRITE32_SLOW_IN_MAPPED_RANGE,
+    S_SAFE_WRITE32_SLOW_READ_ONLY,
+    S_SAFE_WRITE32_SLOW_HAS_CODE,
+
     S_DO_RUN,
     S_DO_MANY_CYCLES,
     S_CYCLE_INTERNAL,