2016-05-28 18 views
0

ラズベリーパイ2のベアメタルプログラムを実行しようとしています。キャッシュとmmuを設定したいと思います。arm documentationを参照してください。armasmからgnuアームアセンブラへのARMセットアップキャッシュとmmu

まず、FASMARMアセンブラを使用してコードをコンパイルします。ラズベリーパイ2をうまく走らせることができます。

@;enable cache 
    @;Enables coherent requests to the processor 
    MRC p15, 0, r1, c1, c0, 1 
    ORR r1, r1, 0x40 
    MCR p15, 0, r1, c1, c0, 1 
    DSB 
    ISB 

    ;@ Disable MMU 
    MRC p15, 0, r1, c1, c0, 0 
    BIC r1, r1, #0x1 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Disable L1 Caches 
    MRC p15, 0, r1, c1, c0, 0 
    BIC r1, r1, 0x1000 
    BIC r1, r1, 0x4 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Invalidate Instruction cache 
    MOV r1, #0 
    MCR p15, 0, r1, c7, c5, 0 
    DSB 
    ISB 

    ;@ Invalidate Data cache 
    MRC p15, 1, r0, c0, c0, 0 
    MOV r3, 0x1ff 
    AND r0, r3, r0, LSR #13 
    MOV r1, #0 
way_loop: 
    MOV r3, #0 
set_loop: 
    MOV r2, r1, LSL #30 
    ORR r2, r2, r3, LSL #5 
    MCR p15, 0, r2, c7, c6, 2 
    ADD r3, r3, #1 
    CMP r0, r3 
    BGE set_loop 
    ADD r1, r1, #1 
    CMP r1, #4 
    BNE way_loop 
    DSB 
    ISB 

    ;@ Invalidate TLB 
    MCR p15, 0, r1, c8, c7, 0 
    DSB 
    ISB 

    ;@ Branch Prediction Enable 
    MOV r1, #0 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, 0x800 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 

    ;@ Enable L1 Data prefetch control 
    MRC p15, 0, r1, c1, c0, 1 
    ORR r1, r1, 0x6000 
    MCR p15, 0, r1, c1, c0, 1 
    DSB 
    ISB 

    ;@ Initialize PageTable 
    MOV r0, 0xde2 
    MOV r1, 0x00004000 
    MOV r3, 0 
    ORR r2, r0, r3, LSL #20 
    STR r2, [r1] 
    BIC r0, r0, 0xc 
    ORR r0, r0, 0x4 
    BIC r0, r0, 0x7000 
    ORR r0, r0, 0x5000 
    ORR r0, r0, 0x10000 
    STR r0, [r1] 
    DSB 
    ISB 

    ;@ Initialize MMU 
    MOV r1, 0x0 
    MCR p15, 0, r1, c2, c0, 2 
    MOV r1, 0x00004000 
    MCR p15, 0, r1, c2, c0, 0 
    DSB 
    ISB 

    ;@ Set all Domains to Client 
    mov r1, 0x5555 
    movt r1, 0x5555 
    MCR p15, 0, r1, c3, c0, 0 
    DSB 
    ISB 

    ;@ Enable MMU 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, 0x1 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Enable cache 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, 0x4 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Enable I cache 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, 0x1000 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    @; end enable cache 

私はコードをGNUアセンブラでコンパイルできる形式に変換する必要があります。私はMMUを有効にするセクションをコメントアウト場合は、以下のコードは、コードが動作することができますので、私は、問題はMMU有効にして発生するかどうかわからないんだけど、ラズベリーパイ2

@; enable cache 
    @; Enables coherent requests to the processor 
    MRC p15, 0, r1, c1, c0, 1 
    orr r1, r1, #0x40 
    MCR p15, 0, r1, c1, c0, 1 
    DSB 
    ISB 

    ;@ Disable MMU 
    MRC p15, 0, r1, c1, c0, 0 
    BIC r1, r1, #0x1 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 
    ;@ Disable L1 Caches 
    MRC p15, 0, r1, c1, c0, 0 
    BIC r1, r1, #0x1000 
    BIC r1, r1, #0x4 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Invalidate Instruction cache 
    MOV r1, #0 
    MCR p15, 0, r1, c7, c5, 0 
    DSB 
    ISB 

    ;@ Invalidate Data cache 
    MRC p15, 1, r0, c0, c0, 0 
    LDR r3, =#0x1ff 
    AND r0, r3, r0, LSR #13 
    MOV r1, #0 
way_loop: 
    MOV r3, #0 
set_loop: 
    MOV r2, r1, LSL #30 
    ORR r2, r2, r3, LSL #5 
    MCR p15, 0, r2, c7, c6, 2 
    ADD r3, r3, #1 
    CMP r0, r3 
    BGE set_loop 
    ADD r1, r1, #1 
    CMP r1, #4 
    BNE way_loop 
    DSB 
    ISB 

    ;@ Invalidate TLB 
    MCR p15, 0, r1, c8, c7, 0 
    DSB 
    ISB 

    ;@ Branch Prediction Enable 
    MOV r1, #0 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, #0x800 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Enable L1 Data prefetch control 
    MRC p15, 0, r1, c1, c0, 1 
    ORR r1, r1, #0x6000 
    MCR p15, 0, r1, c1, c0, 1 
    DSB 
    ISB 

    ;@ Initialize PageTable 
    LDR r0, =#0xde2 
    MOV r1, #0x00004000 
    MOV r3, #0 
    ORR r2, r0, r3, LSL #20 
    STR r2, [r1] 
    BIC r0, r0, #0xc 
    ORR r0, r0, #0x4 
    BIC r0, r0, #0x7000 
    ORR r0, r0, #0x5000 
    ORR r0, r0, #0x10000 
    STR r0, [r1] 
    DSB 
    ISB 

    ;@ Initialize MMU 
    MOV r1, #0x0 
    MCR p15, 0, r1, c2, c0, 2 
    MOV r1, #0x00004000 
    MCR p15, 0, r1, c2, c0, 0 
    DSB 
    ISB 

    ;@ Set all Domains to Client 
    LDR r1, =#0x5555 
    movt r1, #0x5555 
    MCR p15, 0, r1, c3, c0, 0 
    DSB 
    ISB 
    ;@ Enable MMU 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, #0x1 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Enable cache 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, #0x4 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

    ;@ Enable I cache 
    MRC p15, 0, r1, c1, c0, 0 
    ORR r1, r1, #0x1000 
    MCR p15, 0, r1, c1, c0, 0 
    DSB 
    ISB 

上で動作することはできません。

誰でも助けてください。

答えて

1

リテラル負荷の使用がある可能性の違いを作ることになります唯一の事 - アセンブラは単にファイルの末尾にリテラルプールをダンプするので、実行はまっすぐデータに実行されているのリスクを実行します:

... 
154: e3811a01  orr  r1, r1, #4096 ; 0x1000 
158: ee011f10  mcr  15, 0, r1, cr1, cr0, {0} 
15c: f57ff04f  dsb  sy 
160: f57ff06f  isb  sy 
164: 000001ff  .word 0x000001ff 
168: 00000de2  .word 0x00000de2 
16c: 00005555  .word 0x00005555 

ような場合のために、完全にリテラルを避けるために、むしろldr=よりも、明示的なmovwmovを変換する方が良いだろう - ガスは統一構文は16ビットでmovを期待していることを実現するために明らかにあまりにも愚かです即時に自動的にmovwエンコードを選択します。私はFASMARMが正しくそれをやっていると思います。

+0

GNUアセンブラは、デフォルトで統一構文を使用しているとは思われません。 –

+0

@Ross確かに( 'ARM構文'の解析は非常に遅いので、ほとんどのUALも受け入れますが) '.syntax unified; mov r0、#0x5555'で '-march = armv7-a'を実行しても、" fixupの後に無効な定数(5555) "というエラーが出ます。 – Notlikethat

関連する問題