From owner-freebsd-arm@FreeBSD.ORG Wed Nov 14 19:59:28 2012 Return-Path: Delivered-To: arm@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 26278EA8; Wed, 14 Nov 2012 19:59:28 +0000 (UTC) (envelope-from giovanni.trematerra@gmail.com) Received: from mail-qc0-f182.google.com (mail-qc0-f182.google.com [209.85.216.182]) by mx1.freebsd.org (Postfix) with ESMTP id 999158FC08; Wed, 14 Nov 2012 19:59:27 +0000 (UTC) Received: by mail-qc0-f182.google.com with SMTP id k19so683377qcs.13 for ; Wed, 14 Nov 2012 11:59:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:cc:content-type; bh=R/KVysaC1jCCkQfbTuto8lTXj/Qkdzlt5uOHl7uz778=; b=IxQI54G0NPqUOpC2xF68zzJPqVSORP86PlcO7guwBgJX0eFK6Lg4Ab6/bghJzrTdpu S0bdfJGKjNdPZh6JANGDYMjJxbWzbQ6HC4FzHDZyZryiT9iBvF8Wwo6G51H5nM2jRxtm vI+z/zcoI/fsc5HWtwSh9jBbgz52NqiFByDPLL6LtQnmffJp+7t63L9SFFawt8Qu+dbw +u2KIreWmUcyx8wXELbdTCdHcQ1I0DWU7GtfX4cHWiVdLiwGwpgUSRhHjxXauvfDIt51 BwCI3gtF0EARZnOboxoyeEmhN7lh6gkiMG9rBlxLVmoyfi8KwPQWe5j39nP1D61G4FMv ZxRA== MIME-Version: 1.0 Received: by 10.224.191.137 with SMTP id dm9mr26616501qab.40.1352923161520; Wed, 14 Nov 2012 11:59:21 -0800 (PST) Received: by 10.229.117.1 with HTTP; Wed, 14 Nov 2012 11:59:21 -0800 (PST) Date: Wed, 14 Nov 2012 20:59:21 +0100 Message-ID: Subject: Cache flushing on ARMv7 SMP From: Giovanni Trematerra To: arm@freebsd.org Content-Type: text/plain; charset=UTF-8 Cc: raj@freebsd.org, cognet@freebsd.org X-BeenThere: freebsd-arm@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Porting FreeBSD to the StrongARM Processor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 14 Nov 2012 19:59:28 -0000 I think we should use the Inner Sharable variant of ICIALLU and BPIALL in SMP case for armv7 CPU. Could some one review this patch, please? -- Gianni Index: sys/arm/arm/cpufunc_asm_armv7.S =================================================================== --- sys/arm/arm/cpufunc_asm_armv7.S (revision 242212) +++ sys/arm/arm/cpufunc_asm_armv7.S (working copy) @@ -70,7 +70,11 @@ ENTRY(armv7_setttb) orr r0, r0, #PT_ATTR mcr p15, 0, r0, c2, c0, 0 /* Translation Table Base Register 0 (TTBR0) */ +#ifdef SMP + mcr p15, 0, r0, c8, c3, 0 /* invalidate I+D TLBs Inner Shareable */ +#else mcr p15, 0, r0, c8, c7, 0 /* invalidate I+D TLBs */ +#endif dsb isb RET @@ -78,11 +82,12 @@ ENTRY(armv7_setttb) ENTRY(armv7_tlb_flushID) dsb #ifdef SMP - mcr p15, 0, r0, c8, c3, 0 + mcr p15, 0, r0, c8, c3, 0 /* flush I+D tlb */ + mcr p15, 0, r0, c7, c1, 6 /* flush BTB */ #else mcr p15, 0, r0, c8, c7, 0 /* flush I+D tlb */ + mcr p15, 0, r0, c7, c5, 6 /* flush BTB */ #endif - mcr p15, 0, r0, c7, c5, 6 /* flush BTB */ dsb isb mov pc, lr @@ -91,11 +96,12 @@ ENTRY(armv7_tlb_flushID_SE) ldr r1, .Lpage_mask bic r0, r0, r1 #ifdef SMP - mcr p15, 0, r0, c8, c3, 1 /* flush D tlb single entry */ + mcr p15, 0, r0, c8, c3, 1 /* flush D tlb single entry Inner Shareable */ + mcr p15, 0, r0, c7, c1, 6 /* flush BTB Inner Shareable */ #else mcr p15, 0, r0, c8, c7, 1 /* flush D tlb single entry */ + mcr p15, 0, r0, c7, c5, 6 /* flush BTB */ #endif - mcr p15, 0, r0, c7, c5, 6 /* flush BTB */ dsb isb mov pc, lr @@ -155,7 +161,11 @@ Finished: ENTRY(armv7_idcache_wbinv_all) stmdb sp!, {lr} bl armv7_dcache_wbinv_all +#ifdef SMP + mcr p15, 0, r0, c7, c1, 0 /* Invalidate all I caches to PoU (ICIALLUIS) */ +#else mcr p15, 0, r0, c7, c5, 0 /* Invalidate all I caches to PoU (ICIALLU) */ +#endif dsb isb ldmia sp!, {lr} @@ -251,7 +261,11 @@ ENTRY(armv7_context_switch) orr r0, r0, #PT_ATTR mcr p15, 0, r0, c2, c0, 0 /* set the new TTB */ +#ifdef SMP + mcr p15, 0, r0, c8, c3, 0 /* and flush the I+D tlbs Inner Sharable */ +#else mcr p15, 0, r0, c8, c7, 0 /* and flush the I+D tlbs */ +#endif dsb isb RET