Ignore:
Timestamp:
Jan 11, 2012, 7:07:48 PM (12 years ago)
Author:
ertl-ichiba
Message:

ASP 1.7.0対応のNios2依存部を追加

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asp_nios2/trunk/arch/nios2_gcc/prc_support.S

    r1 r14  
    44 *      Advanced Standard Profile Kernel
    55 *
    6  *  Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
     6 *  Copyright (C) 2008-2011 by Embedded and Real-Time Systems Laboratory
    77 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    88 *
     
    5656
    5757/*
     58 * 標準外の例外を用いる
     59 */
     60#define USE_EXTRA_EXCEPTION
     61
     62/*
    5863 * スタック操作 : プッシュ
    5964 */
     
    9398interrupt:
    9499        addi ea, ea, -4      /* 戻り番地をデクリメント */
     100
    95101        /*
    96102         *  コンテキストの保存
     
    117123        stw   ra,  68(sp)
    118124        stw   ea,  72(sp)
    119 
    120         /*
    121          *  多重割込みか判定
    122          */
    123         ldw   r3, %gprel(except_nest_count)(gp)  /* ネスト回数のチェック */
    124         bltu  zero, r3,  nest_int
    125 
    126         /*
    127          * スタックポインタの入れ替え
    128          */
    129         ldw   r2, %gprel(_kernel_istkpt)(gp)
    130         addi  r2, r2, -4
    131         stw   sp, 0(r2)     /* スタックポインタの保存 */       
    132         mov   sp, r2        /* スタックポインタの入れ替え */
    133 
    134 nest_int:
    135         /*
    136          *  割込み・例外のネスト回数のインクリメント
    137          */
    138         addi  r3, r3, 1
    139         stw   r3, %gprel(except_nest_count)(gp)
    140125
    141126        /*
     
    179164
    180165        /*
     166         *  多重割込みか判定
     167         */
     168        ldw   r3, %gprel(except_nest_count)(gp)  /* ネスト回数のチェック */
     169        bltu  zero, r3,  nest_int
     170
     171        /*
     172         * スタックポインタの入れ替え
     173         */
     174        ldw   r2, %gprel(_kernel_istkpt)(gp)
     175        addi  r2, r2, -4
     176        stw   sp, 0(r2)     /* スタックポインタの保存 */       
     177        mov   sp, r2        /* スタックポインタの入れ替え */
     178
     179nest_int:
     180        /*
     181         *  割込み・例外のネスト回数のインクリメント
     182         */
     183        addi  r3, r3, 1
     184        stw   r3, %gprel(except_nest_count)(gp)
     185
     186        /*
    181187         *  割込み要因の割込み優先度を求め(モデル上の)割込み優先度マスクをセット
    182188         *  する.またその際,ハンドラ実行前の(モデル上の)割込み優先度マスクを
     
    245251        and   r3, r3, r4
    246252        wrctl status, r3
    247 test1:
    248253
    249254/*
     
    355360
    356361        /*
    357          * 多重割込みか判定
     362         * カーネル管理外のCPU例外か判定する
     363         *
     364         * カーネル管理外のCPU例外は,カーネル実行中,全割込みロック状態,
     365         * CPUロック状態,カーネル管理外の割込みハンドラ実行中に発生した
     366         * CPU例外である.
     367         * Nios2の場合は,PIEが'0'の場合が相当する.
     368         */
     369        rdctl r3, estatus
     370        andi  r3, r3, STATUS_PIE
     371        beq   r3, zero, kernel_unc_exception
     372
     373        /*
     374         * 例外発生元のコンテキストを判定
    358375         */
    359376        ldw   r3, %gprel(except_nest_count)(gp)  /* ネスト回数のチェック */
     
    361378
    362379        /*
    363          * スタックポインタの入れ替え
     380         * 発生元がタスクの場合はスタックポインタの入れ替え
    364381         */
    365382        ldw   r2, %gprel(_kernel_istkpt)(gp)
     
    376393
    377394        /*
    378          *  CPU例外番号の取得(4倍されている)
     395         *  CPU例外ハンドラ番号の取得(4倍されている)
    379396         */
    380397#ifdef USE_EXTRA_EXCEPTION
     
    420437
    421438        /*
    422          *  例外発生時CPUロック状態でなければCPUロック解除状態とする
    423          */
    424         rdctl r3, estatus
    425         andi  r3, r3, STATUS_PIE
    426         beq   r3, zero, call_exc_handler
     439         *  CPUロック解除状態とする
     440         */
    427441        rdctl r3, status
    428442        ori   r3, r3, STATUS_PIE
     
    431445call_exc_handler:
    432446#ifdef LOG_EXC_ENTER
    433         Push  r6         /* CPU例外番号保存               */
     447        Push  r6         /* CPU例外ハンドラ番号保存       */
    434448        Push  r5         /* CPU例外ハンドラアドレス保存   */
    435449        Push  r4         /* CPU例外フレームの先頭番地保存 */
    436         mov   r4, r6     /* CPU例外番号を引数に           */
     450        mov   r4, r6     /* CPU例外ハンドラ番号を引数に   */
    437451        call  log_exc_enter
    438452        Pop   r4         /* CPU例外フレームの先頭番地復帰 */
     
    446460
    447461#ifdef LOG_EXC_LEAVE
    448         Pop   r4         /* CPU例外番号復帰               */
     462        Pop   r4         /* CPU例外ハンドラ番号復帰        */
    449463        call  log_exc_leave
    450464#endif /* LOG_EXC_LEAVE */
     
    550564        beq  r6, zero, ret_int_4      /* enatex が false ならリターン */
    551565        ldw  r7, TCB_texptn(r4)       /* r7 <- texptn, texptnが0でなければ */
    552         beq  zero, r7, ret_int_4     
     566        beq  zero, r7, ret_int_4
     567        ldw  r7, %gprel(ipmflg)(gp)   /* r7 <- ipmflg      */
     568        beq  zero, r7, ret_int_4      /* ipmflgがfalseであればリターン */
    553569        call call_texrtn              /* タスク例外ルーチンの呼び出し */
    554570
     
    577593        eret
    578594
     595/*
     596 * カーネル管理外のCPU例外の出入口処理
     597 */
     598kernel_unc_exception:
     599        /*
     600         * 例外発生元のコンテキストを判定
     601         */
     602        ldw   r3, %gprel(except_nest_count)(gp)  /* ネスト回数のチェック */
     603        bltu  zero, r3,  nest_int_exc
     604
     605        /*
     606         * 発生元がタスクの場合はスタックポインタの入れ替え
     607         */
     608        ldw   r2, %gprel(_kernel_istkpt)(gp)
     609        addi  r2, r2, -4
     610        stw   sp, 0(r2)     /* スタックポインタの保存 */       
     611        mov   sp, r2        /* スタックポインタの入れ替え */
     612
     613nest_int_kernel_unc_exc:
     614        /*
     615         *  割込み・例外のネスト回数のインクリメント
     616         */
     617        addi  r4, r3, 1
     618        stw   r4, %gprel(except_nest_count)(gp)
     619
     620        /*
     621         *  CPU例外ハンドラ番号の取得(4倍されている)
     622         */
     623#ifdef USE_EXTRA_EXCEPTION
     624        rdctl r5, exception
     625#else
     626        mov   r5, zero
     627#endif /* USE_EXTRA_EXCEPTION */
     628        srli  r6, r5, 2
     629
     630        /*
     631         *  割込み発生前の割込み優先度マスクをスタックに保存
     632         */
     633        ldbu  r2, %gprel(iipm)(gp)
     634        Push  r2
     635
     636        /*
     637         *  例外フレームの作成            オフセット
     638         *    例外番号                        0
     639         *    ESTATUS(et)                     4
     640         *    割込み・例外ネストカウント(r3)  8
     641         *    戻りアドレス                   12 
     642         *    割込み優先度マスク(iipm)       16
     643         */
     644        addi  sp,  sp, -20
     645        stw   r6,  0(sp)
     646        stw   et,  4(sp)
     647        stw   r3,  8(sp)
     648        stw   ea, 12(sp)
     649        stw   r2, 16(sp)
     650
     651        /*
     652         *  例外フレームの先頭番地をCPU例外ハンドラの引数に設定(r4)
     653         */
     654        mov   r4, sp
     655
     656        /*
     657         *  例外ハンドラアドレスの取得
     658         */
     659        movhi r2, %hiadj(exch_tbl) 
     660        addi  r2, r2, %lo(exch_tbl)
     661        add   r2, r2, r5
     662        ldw   r5, 0(r2)
     663
     664        /*
     665         *  CPU例外ハンドラ呼び出し
     666         */
     667        callr r5
     668
     669        /*
     670         *  割込み禁止
     671         */
     672        rdctl r3, status
     673        movi  r4, ~STATUS_PIE
     674        and   r3, r3, r4
     675        wrctl status, r3
     676
     677        /*
     678         *  例外フレームを捨てる
     679         */
     680        addi  sp,  sp, 20
     681
     682        /*
     683         *  (モデル上の)割込み優先度マスクを元に戻す
     684         */
     685        Pop   r3                   /* 割込み前の(モデル上の)割込み優先度マスクを取得 */
     686        stb   r3, %gprel(iipm)(gp) /* (モデル上の)割込み優先度マスクをセット */
     687        slli  r3, r3, 2            /* 割込み優先度マスクを4倍してオフセットを生成    */
     688        movhi r2, %hiadj(iipm_mask_tbl) /* 割込み優先度マスクに対応した割込み禁止パターンを取得 */
     689        addi  r2, r2, %lo(iipm_mask_tbl)
     690        add   r2, r2, r3
     691        ldw   r5, 0(r2)
     692        ldw   r8, %gprel(idf)(gp)       /* 各割込みの割込み要求禁止フラグの状態を取得     */
     693        nor   r8, r8, r5                /* 両者のORの否定を生成                           */
     694        wrctl ienable, r8               /* 指定した割り込みのみ許可                       */
     695
     696        /*
     697         *  割込み・例外のネスト回数のデクリメント
     698         */
     699        ldw   r3, %gprel(except_nest_count)(gp)
     700        addi  r3, r3, -1
     701        stw   r3, %gprel(except_nest_count)(gp)
     702
     703        bltu  zero, r3, ret_int_1_kernel_unc_exc /* ネスト回数が1以上ならスタックポインタを変更しない */
     704
     705        ldw   r2, 0(sp)              /* スタックポインタを戻す    */
     706        mov   sp, r2
     707
     708ret_int_1_kernel_unc_exc:
     709        ldw   et,   0(sp)  /* レジスタの復帰 */
     710        wrctl estatus, et
     711        ldw   at,   4(sp)
     712        ldw   r2,   8(sp)
     713        ldw   r3,  12(sp)
     714        ldw   r4,  16(sp)
     715        ldw   r5,  20(sp)
     716        ldw   r6,  24(sp)
     717        ldw   r7,  28(sp)
     718        ldw   r8,  32(sp)
     719        ldw   r9,  36(sp)
     720        ldw   r10, 40(sp)
     721        ldw   r11, 44(sp)
     722        ldw   r12, 48(sp)
     723        ldw   r13, 52(sp)
     724        ldw   r14, 56(sp)
     725        ldw   r15, 60(sp)
     726        ldw   fp,  64(sp)
     727        ldw   ra,  68(sp)
     728        ldw   ea,  72(sp)
     729        addi  sp, sp, 76       
     730        eret   
    579731
    580732/*
     
    631783        beq  r6, zero, dispatch_r_1   /* enatex が false ならリターン */
    632784        ldw  r7, TCB_texptn(r4)       /* r7 <- texptn, texptnが0でなければ */
    633         beq  r7, zero, dispatch_r_1   
     785        beq  r7, zero, dispatch_r_1
     786        ldw  r7, %gprel(ipmflg)(gp)   /* r7 <- ipmflg      */
     787        beq  zero, r7, dispatch_r_1   /* ipmflgがfalseであればリターン */
    634788        call call_texrtn              /* タスク例外ルーチンの呼び出し */
    635789
     
    767921        ldw   r4, TINIB_exinf(r3)     /* r4  <- 引数(exinf)         */
    768922        ldw   r2, TINIB_task(r3)      /* r2 <- タスクの実行番地       */
    769         addi  sp, sp, 8
    770923        movhi ra, %hiadj(ext_tsk)
    771924        addi  ra, ra, %lo(ext_tsk)
Note: See TracChangeset for help on using the changeset viewer.