grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Fixes and cleanup of ARM cache maintenance code


From: Leif Lindholm
Subject: Fixes and cleanup of ARM cache maintenance code
Date: Tue, 10 Sep 2013 18:43:40 +0200
User-agent: Mutt/1.5.21 (2010-09-15)

The current version of ARM cache maintenance code contains a few bugs,
preventing GRUB from running properly on my hardware platforms.

Main issues are that clean_dcache_range/invalidate_icache_range use the
addresses of grub_arch_cache_dlinesz/grub_arch_cache_ilinesz rather
than the values read in probe_caches().

ChangeLog:
2013-09-10  Leif Lindholm  <address@hidden>
        * kern/arm/cache.S: correct access to ilinesz/dlinesz variables
                            clean up stack manipulation (sync_caches_armv*)

=== modified file 'grub-core/kern/arm/cache.S'
--- grub-core/kern/arm/cache.S  2013-05-16 23:33:22 +0000
+++ grub-core/kern/arm/cache.S  2013-09-10 16:30:20 +0000
@@ -37,6 +37,7 @@
 clean_dcache_range:
        @ Clean data cache for range to point-of-unification
        ldr     r2, =EXT_C(grub_arch_cache_dlinesz)
+       ldr     r2, [r2]
        sub     r3, r2, #1              @ align "beg" to start of line
        mvn     r3, r3
        and     r0, r0, r3
@@ -57,6 +58,7 @@
 invalidate_icache_range:
        @ Invalidate instruction cache for range to point-of-unification
        ldr     r2, =EXT_C(grub_arch_cache_ilinesz)
+       ldr     r2, [r2]
        sub     r3, r2, #1              @ align "beg" to start of line
        mvn     r3, r3
        and     r0, r0, r3
@@ -77,14 +79,13 @@
 #else
 FUNCTION(grub_arch_sync_caches_armv7)
 #endif
+       DSB
        add     r1, r0, r1
-       DSB
-       push    {r0-r1, r4-r6, lr}
-       ldrdeq  r0, r1, [sp]
+       push    {r0-r2, lr}
        bl      clean_dcache_range
        pop     {r0, r1}
        bl      invalidate_icache_range
-       pop     {r4-r6, pc}
+       pop     {r2, pc}
 
 #ifdef ARMV6
 FUNCTION(grub_arm_disable_caches_mmu_armv6)
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]