Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Dec 2012 12:52:35 +0900
From:      "Daisuke Aoyama" <aoyama@peach.ne.jp>
To:        "Oleksandr Tymoshenko" <gonzo@bluezbox.com>
Cc:        freebsd-arm@freebsd.org
Subject:   Re: FreeBSD/armv6z/clang on Raspberry Pi 512MB (with U-Boot + ubldr)
Message-ID:  <2BA73CBF02B04DD19D08CDFC556B8750@ad.peach.ne.jp>
In-Reply-To: <E42823D3-D405-40E7-B4CF-75DC947AC119@bluezbox.com>
References:  <B5F827FF91C94FF2AFEE00194A2BB2C5@ad.peach.ne.jp> <B508111FCE534B2CBA61F4D1EC1078D3@ad.peach.ne.jp> <E42823D3-D405-40E7-B4CF-75DC947AC119@bluezbox.com>

next in thread | previous in thread | raw e-mail | index | archive | help
>PTE sync - related part, Im not sure it's strictly required. We use WT 
>caches for page tables
>so we should be OK without implicit sync operations for them. I hope 
>somebody
>more clueful can confirm/disprove this.

Some digging, I notice "Invalidate Entire Instruction Cache" works without 
segfault.
So, Invalidate D-cache is no effect :)

It seems following should work for this issue:

        mov     r0, #0
        mcr     p15, 0, r0, c7, c5, 0           /* Invalidate Entire 
Instruction Cache */
        mcr     p15, 0, r0, c7, c10, 4          /* Data Synchronization 
Barrier */

Try this code instead of CF_ICACHE_SYNC.
I don't know side effect of Invalidate I-cache, but it works.
Also I don't know whether DSB is required or not.

For test, using NFS or HDD/SDD is BAD idea for system stress.
You must use SD(mmc) or USB memory. Serial console is recommended for 
interrupt test.
Here is simple test from serial console:

# rm -rf /var/db/portsnap /usr/ports
# mkdir /var/db/portsnap
# portsnap fetch
# portsnap extract
# cd /usr/ports/shells/bash
# make BATCH=y

If your kernel is really stable, it should finish without any problems with 
SD/mmc.

----------------------------------------------------------------------
--- sys/arm/arm/swtch.S (revision 244663)
+++ sys/arm/arm/swtch.S (working copy)
@@ -130,7 +130,11 @@
        /* Switch to lwp0 context */

        ldr     r9, .Lcpufuncs
-#if !defined(CPU_ARM11) && !defined(CPU_CORTEXA) && !defined(CPU_MV_PJ4B)
+#if defined(CPU_ARM1176)
+       mov     r0, #0
+       mcr     p15, 0, r0, c7, c5, 0           /* Invalidate Entire 
Instruction Cache */
+       mcr     p15, 0, r0, c7, c10, 4          /* Data Synchronization 
Barrier */
+#elif !defined(CPU_CORTEXA) && !defined(CPU_MV_PJ4B)
        mov     lr, pc
        ldr     pc, [r9, #CF_IDCACHE_WBINV_ALL]
 #endif
@@ -352,7 +356,11 @@
        cmpeq   r0, r5                          /* Same DACR? */
        beq     .Lcs_context_switched           /* yes! */

-#if !defined(CPU_ARM11) && !defined(CPU_CORTEXA) && !defined(CPU_MV_PJ4B)
+#if defined(CPU_ARM1176)
+       mov     r0, #0
+       mcr     p15, 0, r0, c7, c5, 0           /* Invalidate Entire 
Instruction Cache */
+       mcr     p15, 0, r0, c7, c10, 4          /* Data Synchronization 
Barrier */
+#elif !defined(CPU_CORTEXA) && !defined(CPU_MV_PJ4B)
        /*
         * Definately need to flush the cache.
         */
----------------------------------------------------------------------

Thanks.
-- 
Daisuke Aoyama
 




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2BA73CBF02B04DD19D08CDFC556B8750>