Przeglądaj źródła

[risc-v] robust backtrace;
Avoiding access to illegal memory due to memory corruption

wangxiaoyao 3 lat temu
rodzic
commit
579c7f5b77

+ 5 - 2
libcpu/risc-v/virt64/backtrace.c

@@ -18,6 +18,7 @@ static char *_get_elf_name();
 
 void rt_hw_backtrace(rt_uint32_t *ffp, rt_ubase_t sepc)
 {
+    extern rt_mmu_info mmu_info;
     rt_ubase_t *ra;
     rt_ubase_t *fp;
     rt_ubase_t vas, vae;
@@ -57,15 +58,17 @@ void rt_hw_backtrace(rt_uint32_t *ffp, rt_ubase_t sepc)
         }
 
         ra = fp - 1;
-        if (*ra < vas || *ra > vae)
+        if (!rt_hw_mmu_v2p(&mmu_info, ra) || *ra < vas || *ra > vae)
             break;
 
         rt_kprintf(" %p", *ra - 0x04);
 
         fp = fp - 2;
-        if (!fp)
+        if (!rt_hw_mmu_v2p(&mmu_info, fp))
             break;
         fp = (rt_ubase_t *)(*fp);
+        if (!fp)
+            break;
     }
 
     rt_kputs("\r\n");

+ 1 - 1
libcpu/risc-v/virt64/encoding.h

@@ -46,7 +46,7 @@
 #define SSTATUS_VS_CLEAN    0x00000400
 #define SSTATUS_VS_DIRTY    0x00000600
 #define SSTATUS_XS          0x00018000
-#define SSTATUS_PUM         0x00040000
+#define SSTATUS_SUM         0x00040000
 #define SSTATUS32_SD        0x80000000
 #define SSTATUS64_SD        0x8000000000000000