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

kaneko-nao kaneko-nao @ numata.co.jp
2018年 1月 5日 (金) 10:59:41 JST


名古屋大学
高田広章 様

毎々お世話になります。株式会社ヌマタです。
現在、別件(フリーズの件)でお世話になっていますが、こちらは別案件です。唯、関係しているのかも知れませんので、投稿させていただきます。
弊社では、設計当初、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


以上です。よろしくお願いいたします。

株式会社ヌマタ