(toppers-users 4724) Re: TOPPERS/ASP3 L1キャッシュについて

Hiroaki TAKADA hiro @ ertl.jp
2018年 1月 18日 (木) 08:48:32 JST


株式会社ヌマタ様

L1キャッシュの件,ご報告ありがとうございます。ご指摘の通り,L1キャッ
シュが効いていませんでした。

いただいた修正コードを参考に検討した結果,次の2つの問題があることが
わかりました(2つめの問題の洗い出しに時間がかかっていました)。

(1) キャッシュの無効化(invalidate)を行うコードに不具合があり,正し
く無効化できていませんでした。そのため,キャッシュを有効にした場合に,
プロセッサの状態によっては,正しく動作しなくなります。現状のコードで
は,次の理由でキャッシュが有効になっていなかったため,この不具合が顕
在化していませんでした。

(2) MMUのセクション/ページエントリのSビット(Shareable属性)をセット
した場合,CP15の補助制御レジスタ(ACTLR)のSMPビットが立っていないと,
キャッシュが有効にならないことがわかりました。そこで,シングルコアで
あっても,ACTLRのSMPビットを立てるように修正したいと思います。MMUの
セクション/ページエントリのSビットをセットしない手もありますが,マル
チコア向けとなるべくコードを共通化したいので,このような対策としたい
と思います。

御社の方で対策を実施されて,現時点で解決しているという認識から,次の
リリースに対策を入れたいと思います。

高田広章
名古屋大学

On 2018/01/05 10:59, kaneko-nao wrote:
> 名古屋大学
> 高田広章 様
> 
> 毎々お世話になります。株式会社ヌマタです。
> 現在、別件(フリーズの件)でお世話になっていますが、こちらは別案件です。唯、関係しているのかも知れませんので、投稿させていただきます。
> 弊社では、設計当初、OSにRTXを使用していたのですが、途中からTOPPERS/ASP3に移行しました。
> その際、同じプログラムがTOPPERS上では異常に遅かったため調べたところ、L1キャッシュが効いていないのではないかと考え、下記の変更をしています。
> 
> 1)arm.c - arm_disable_dcache(void) を以下に置き換え
> 
>     .text
> 
>     .global __v7_all_cache
> //#pragma push
> //#pragma arm
> //__STATIC_ASM void __v7_all_cache(uint32_t op) {
> __v7_all_cache:
>         .arm
> 
>         PUSH    {R4-R11}
> 
>         MRC     p15, 1, R6, c0, c0, 1      // Read CLIDR
>         ANDS    R3, R6, #0x07000000        // Extract coherency level
>         MOV     R3, R3, LSR #23            // Total cache levels << 1
>         BEQ     Finished                   // If 0, no need to clean
> 
>         MOV     R10, #0                    // R10 holds current cache level << 1
> Loop1:  ADD     R2, R10, R10, LSR #1       // R2 holds cache "Set" position
>         MOV     R1, R6, LSR R2             // Bottom 3 bits are the Cache-type for this level
>         AND     R1, R1, #7                 // Isolate those lower 3 bits
>         CMP     R1, #2
>         BLT     Skip                       // No cache or only instruction cache at this level
> 
>         MCR     p15, 2, R10, c0, c0, 0     // Write the Cache Size selection register
>         ISB                                // ISB to sync the change to the CacheSizeID reg
>         MRC     p15, 1, R1, c0, c0, 0      // Reads current Cache Size ID register
>         AND     R2, R1, #7                 // Extract the line length field
>         ADD     R2, R2, #4                 // Add 4 for the line length offset (log2 16 bytes)
>         LDR     R4, =0x3FF
>         ANDS    R4, R4, R1, LSR #3         // R4 is the max number on the way size (right aligned)
>         CLZ     R5, R4                     // R5 is the bit position of the way size increment
>         LDR     R7, =0x7FFF
>         ANDS    R7, R7, R1, LSR #13        // R7 is the max number of the index size (right aligned)
> 
> Loop2:  MOV     R9, R4                     // R9 working copy of the max way size (right aligned)
> 
> Loop3:  ORR     R11, R10, R9, LSL R5       // Factor in the Way number and cache number into R11
>         ORR     R11, R11, R7, LSL R2       // Factor in the Set number
>         CMP     R0, #0
>         BNE     Dccsw
>         MCR     p15, 0, R11, c7, c6, 2     // DCISW. Invalidate by Set/Way
>         B       cont
> Dccsw:  CMP     R0, #1
>         BNE     Dccisw
>         MCR     p15, 0, R11, c7, c10, 2    // DCCSW. Clean by Set/Way
>         B       cont
> Dccisw: MCR     p15, 0, R11, c7, c14, 2    // DCCISW, Clean and Invalidate by Set/Way
> cont:   SUBS    R9, R9, #1                 // Decrement the Way number
>         BGE     Loop3
>         SUBS    R7, R7, #1                 // Decrement the Set number
>         BGE     Loop2
> Skip:   ADD     R10, R10, #2               // increment the cache number
>         CMP     R3, R10
>         BGT     Loop1
> 
> Finished:
>         DSB
>         POP    {R4-R11}
>         BX     lr
> 
> //}
> //#pragma pop
> 
>     .END
> 
> 
> 2)target_kernel_impl.cのMMUへの設定属性(第1レベルディスクリプタ)を変更
> 
> #define MMU_ATTR_IODEV       0x00000c12    //  ストロングリオーダーメモリ
> #define MMU_ATTR_RAM          0x00085c06    //  内蔵RAM
> 
> 
> 以上です。よろしくお願いいたします。
> 
> 株式会社ヌマタ
> 
> 
> 
>