Browse Source

[libcpu/aarch64] fix cache invalidate operation (#7363)

Shell 2 years ago
parent
commit
6e7c5d9bc9
2 changed files with 7 additions and 3 deletions
  1. 1 1
      components/mm/mm_page.c
  2. 6 2
      libcpu/aarch64/common/cache.h

+ 1 - 1
components/mm/mm_page.c

@@ -679,7 +679,7 @@ static void _install_page(rt_page_t mpr_head, rt_region_t region, void *insert_h
     shadow.start = region.start & ~shadow_mask;
     shadow.end = FLOOR(region.end, shadow_mask + 1);
 
-    if (shadow.end > UINT32_MAX)
+    if (shadow.end + PV_OFFSET > UINT32_MAX)
         _high_page_configured = 1;
 
     rt_page_t shad_head = addr_to_page(mpr_head, (void *)shadow.start);

+ 6 - 2
libcpu/aarch64/common/cache.h

@@ -23,9 +23,13 @@ void rt_hw_cpu_dcache_invalidate(void *start_addr, unsigned long size);
 
 static inline void rt_hw_icache_invalidate_all(void)
 {
-    /* wait for any modification complete */
+    /* wait for previous modification to complete */
     __asm__ volatile ("dsb ishst");
-    __asm__ volatile ("ic iallu");
+
+    __asm__ volatile ("ic ialluis");
+    /* wait for ic to retire */
+    __asm__ volatile ("dsb nsh");
+    /* flush instruction pipeline */
     __asm__ volatile ("isb");
 }