Ignore:
Timestamp:
Jul 3, 2020, 7:19:17 PM (4 years ago)
Author:
coas-nagasima
Message:

ASP3, TINET, mbed を更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_support.S

    r331 r429  
    66 *  Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2006-2017 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2006-2019 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    5555
    5656/*
     57 *  使用する命令セットの定義
     58 */
     59#ifdef USE_ARM_FPU
     60        .fpu    vfpv3
     61#endif /* USE_ARM_FPU */
     62
     63/*
    5764 *  例外ベクタ
    5865 */
     
    101108         *  マスク全解除状態・ディスパッチ許可状態で呼び出される.
    102109         */
    103         push    {r12,lr}                                /* 戻り番地を保存,r12はダミー */
     110        push    {r12,lr}                                /* 戻り番地(lr)を保存 */
     111                                                                        /* r12はアラインメントのため */
    104112#ifdef TOPPERS_SUPPORT_OVRHDR
    105113        bl              ovrtimer_stop
    106114#endif /* TOPPERS_SUPPORT_OVRHDR */
    107         stmfd   sp!, {r4-r11}                   /* 非スクラッチレジスタの保存 */
     115        push    {r4-r11}                                /* 非スクラッチレジスタの保存 */
    108116        ldr             r0, =p_runtsk                   /* p_runtsk → r0 */
    109117        ldr             r0, [r0]
     118#ifdef USE_ARM_FPU
     119        ldr             r2, [r0,#TCB_p_tinib]   /* p_runtsk->p_tinib → r2 */
     120        ldr             r1, [r2,#TINIB_tskatr]  /* p_runtsk->p_tinib->tskatr → r1 */
     121        tst             r1, #TA_FPU
     122        beq             1f
     123        vpush   {d8-d15}                                /* 非スクラッチFPUレジスタの保存 */
     1241:
     125#endif /* USE_ARM_FPU */
    110126        str             sp, [r0,#TCB_sp]                /* スタックポインタを保存 */
    111127        adr             r1, dispatch_r
     
    114130
    115131ALABEL(dispatch_r)
    116         ldmfd   sp!, {r4-r11}                   /* 非スクラッチレジスタの復帰 */
     132        /*
     133         * 【この時点のレジスタ状態】
     134         *  r4:p_runtsk(タスク切換え後)
     135         */
     136#ifdef USE_ARM_FPU
     137        ldr             r2, [r4,#TCB_p_tinib]   /* p_runtsk->p_tinib → r2 */
     138        ldr             r1, [r2,#TINIB_tskatr]  /* p_runtsk->p_tinib->tskatr → r1 */
     139        tst             r1, #TA_FPU
     140        vmrs    r0, fpexc
     141        biceq   r0, r0, #FPEXC_ENABLE
     142        orrne   r0, r0, #FPEXC_ENABLE
     143        vmsr    fpexc, r0                               /* FPEXCを設定 */
     144        beq             1f
     145        vpop    {d8-d15}                                /* 非スクラッチFPUレジスタの復帰 */
     1461:
     147#endif /* USE_ARM_FPU */
     148        pop             {r4-r11}                                /* 非スクラッチレジスタの復帰 */
    117149#ifdef TOPPERS_SUPPORT_OVRHDR
    118150        bl              ovrtimer_start
     
    137169
    138170        /*
     171         *  各種のデバイス(特に割込みコントローラ)の設定が完了するのを待つ.
     172         */
     173        asm_data_sync_barrier r0
     174       
     175        /*
    139176         *      タスクコンテキストに切り換える.
    140177         */
     
    184221        bl              log_dsp_enter
    185222#endif /* LOG_DSP_ENTER */
    186        
     223
    187224ALABEL(dispatcher_0)
    188225        /*
     
    232269ALABEL(call_exit_kernel)
    233270        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_INTLOCK)
    234         ldr             r0, =istkpt                             /* 非タスクコンテキストのスタックへ */
     271        ldr             r0, =istkpt                             /* 非タスクコンテキスト用のスタックに */
    235272        ldr             sp, [r0]
     273        ldr             r0, =excpt_nest_count   /* 例外ネストカウントを1に */
     274        mov             r1, #1
     275        str             r1, [r0]
    236276        b               exit_kernel
    237277
     
    243283        AGLOBAL(start_r)
    244284        /*
    245          *  ディスパッチャ本体から呼び出されるため,p_runtskはr4に入っている.
     285         * 【この時点のレジスタ状態】
     286         *  r4:p_runtsk(タスク切換え後)
    246287         */
    247288ALABEL(start_r)
     
    253294        ldr             lr, =ext_tsk                    /* タスク本体からの戻り番地を設定 */
    254295        ldr             r2, [r4,#TCB_p_tinib]   /* p_runtsk->p_tinib → r2 */
     296#ifdef USE_ARM_FPU
     297        ldr             r1, [r2,#TINIB_tskatr]  /* p_runtsk->p_tinib->tskatr → r1 */
     298        tst             r1, #TA_FPU
     299        vmrs    r0, fpexc
     300        biceq   r0, r0, #FPEXC_ENABLE
     301        orrne   r0, r0, #FPEXC_ENABLE
     302        vmsr    fpexc, r0                               /* FPEXCを設定 */
     303#endif /* USE_ARM_FPU */
    255304        ldr             r0, [r2,#TINIB_exinf]   /* exinfをパラメータに */
    256305        ldr             r1, [r2,#TINIB_task]    /* タスク起動番地にジャンプ */
     
    270319#if __TARGET_ARCH_ARM < 6
    271320        /*
    272          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     321         *  スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する.
    273322         */
    274323        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_IRQ_BIT)
    275         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    276 
    277         /*
    278          *  IRQモードに戻して,戻り番地とspsr(戻り先のcpsr)を取得する.
     324        push    {r0-r5,r12,lr,pc}               /* pcはスペース確保のため */
     325
     326        /*
     327         *  IRQモードに戻して,戻り番地(lr-4)と戻り先のcpsr(spsr)を取
     328         *  得する.
    279329         */
    280330        msr             cpsr_c, #(CPSR_IRQ_MODE AOR CPSR_IRQ_BIT)
     
    283333
    284334        /*
    285          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     335         *  スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する.
    286336         */
    287337        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_IRQ_BIT)
    288         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    289         push    {r1}                                    /* spsrをスタックに保存 */
     338        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存(pcの場所)*/
     339        push    {r1}                                    /* 戻り先のcpsrをスタックに保存 */
    290340#else /* __TARGET_ARCH_ARM < 6 */
    291341        /*
    292          *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    293          *  保存する.
     342         *  戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ
     343         *  クに保存する.
    294344         */
    295345        sub             lr, lr, #4                              /* 戻り番地の算出 */
     
    297347
    298348        /*
    299          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     349         *  スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する.
    300350         */
    301351        cps             #CPSR_SVC_MODE
    302         stmfd   sp!, {r0-r5,r12,lr}
     352        push    {r0-r5,r12,lr}
    303353#endif /* __TARGET_ARCH_ARM < 6 */
    304354
     
    308358        and             r1, sp, #4
    309359        sub             sp, sp, r1
    310         push    {r0,r1}                                 /* r0はスペース確保のため */
    311 
     360        push    {r0,r1}                                 /* スタックポインタの調整値を保存 */
     361                                                                        /* r0はスペース確保のため */
    312362        /*
    313363         *  例外ネストカウントをインクリメントする.割込みが非タスクコンテキ
     
    328378#endif /* TOPPERS_SUPPORT_OVRHDR */
    329379
     380#ifdef USE_ARM_FPU
     381        /*
     382         *  FPUをディスエーブルする.
     383         */
     384        vmrs    r0, fpexc
     385        str             r0, [sp]                                /* FPEXCを保存(r0の場所)*/
     386        bic             r0, r0, #FPEXC_ENABLE
     387        vmsr    fpexc, r0                               /* FPEXCを設定 */
     388#endif /* USE_ARM_FPU */
     389       
    330390        /*
    331391         *  非タスクコンテキスト用のスタックに切り換える.
     
    339399        /*
    340400         *  割込みコントローラを操作し,割込み番号を取得する.
     401         *
     402         *  irc_begin_intは,スタックトップ(r0の場所)に,irc_end_intで用
     403         *  いる情報を保存する.
    341404         */
    342405        bl              irc_begin_int
     
    345408#else /* TNUM_INHNO <= 256 || __TARGET_ARCH_ARM <= 6 */
    346409        movw    r3, #TNUM_INHNO
    347         cmp             r4, r3                 
     410        cmp             r4, r3
    348411#endif /* TNUM_INHNO <= 256 || __TARGET_ARCH_ARM <= 6 */
    349412        bhs             irq_handler_2                   /* スプリアス割込みなら */
     
    420483        mov     sp, r3
    421484
     485#ifdef USE_ARM_FPU
     486        /*
     487         *  FPUを元に戻す.
     488         */
     489        ldr             r0, [sp]                                /* FPEXCを復帰 */
     490        vmsr    fpexc, r0
     491#endif /* USE_ARM_FPU */
     492       
    422493        /*
    423494         *  p_runtskがNULLか判定する.
     
    433504        pop             {r0,r1}                                 /* スタックポインタの調整を元に戻す */
    434505        add             sp, sp, r1
    435         add             sp, sp, #40                             /* スクラッチレジスタを捨てる */
     506        add             sp, sp, #40                             /* スクラッチレジスタを捨てる */
    436507        b               dispatcher_0
    437508
     
    440511         */
    441512ALABEL(irq_handler_3)
     513        /*
     514         * 【この時点のレジスタ状態】
     515         *  r0:p_runtsk
     516         */
    442517        ldr             r1, =p_schedtsk                 /* p_schedtsk → r1 */
    443518        ldr             r1, [r1]
     
    448523         *  コンテキストを保存する.
    449524         */
    450         stmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの保存 */
     525        push    {r6-r11}                                /* 残りのレジスタの保存 */
     526#ifdef USE_ARM_FPU
     527        ldr             r2, [r0,#TCB_p_tinib]   /* p_runtsk->p_tinib → r2 */
     528        ldr             r1, [r2,#TINIB_tskatr]  /* p_runtsk->p_tinib->tskatr → r1 */
     529        tst             r1, #TA_FPU
     530        beq             1f                                              /* TA_FPU属性でない場合は分岐 */
     531#ifdef USE_ARM_FPU_D32
     532        vpush   {d16-d31}
     533#endif /* USE_ARM_FPU_D32 */
     534        vpush   {d0-d15}                                /* 全FPUレジスタの保存 */
     535        vmrs    r1, fpscr
     536        push    {r1,r2}                                 /* FPSCRの保存 */
     5371:                                                                      /* r2はアラインメントのため */
     538#endif /* USE_ARM_FPU */
    451539        str             sp, [r0,#TCB_sp]                /* スタックポインタを保存 */
    452540        adr             r1, ret_int_r                   /* 実行再開番地を保存 */
     
    457545        /*
    458546         *  コンテキストを復帰する.
    459          */
    460         ldmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの復帰 */
     547         *
     548         * 【この時点のレジスタ状態】
     549         *  r4:p_runtsk(タスク切換え後)
     550         */
     551#ifdef USE_ARM_FPU
     552        ldr             r2, [r4,#TCB_p_tinib]   /* p_runtsk->p_tinib → r2 */
     553        ldr             r1, [r2,#TINIB_tskatr]  /* p_runtsk->p_tinib->tskatr → r1 */
     554        tst             r1, #TA_FPU
     555        vmrs    r0, fpexc
     556        biceq   r0, r0, #FPEXC_ENABLE
     557        orrne   r0, r0, #FPEXC_ENABLE
     558        vmsr    fpexc, r0                               /* FPEXCを設定 */
     559        beq             1f                                              /* TA_FPU属性でない場合は分岐 */
     560        pop             {r1,r2}                                 /* FPSCRの復帰 */
     561        vmsr    fpscr, r1
     562        vpop    {d0-d15}                                /* 全FPUレジスタの復帰 */
     563#ifdef USE_ARM_FPU_D32
     564        vpop    {d16-d31}
     565#endif /* USE_ARM_FPU_D32 */
     5661:
     567#endif /* USE_ARM_FPU */
     568        pop             {r6-r11}                                /* 残りのレジスタの復帰 */
    461569
    462570ALABEL(irq_handler_4)
     
    469577
    470578        /*
    471          *  割込み/CPU例外処理からのリターン
     579         *  割込み処理からのリターン
    472580         *
    473          *  割込み/CPU例外処理からのリターンにより,CPUロック解除状態に遷
    474          *  移するようにする必要があるが,ARMはCPSRのビットによってCPUロッ
    475          *  ク状態を表しているため,CPSRを元に戻してリターンすればよい.
     581         *  割込み処理からのリターンにより,CPUロック解除状態に遷移するよ
     582         *  うにする必要があるが,ARMはCPSRのビットによってCPUロック状態を
     583         *  表しているため,CPSRを元に戻してリターンすればよい.
    476584         */
    477585ALABEL(irq_handler_5)
     
    480588
    481589#if __TARGET_ARCH_ARM < 6
    482         ldmfd   sp!, {r0}                               /* 戻り先のcpsrをspsrに設定 */
     590        pop             {r0}                                    /* 戻り先のcpsrをspsrに設定 */
    483591        msr             spsr_cxsf, r0
    484592        ldmfd   sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */
    485593                                                                        /* ^付きなので,spsr → cpsr */
    486594#else /* __TARGET_ARCH_ARM < 6 */
    487         ldmfd   sp!, {r0-r5,r12,lr}
     595        pop             {r0-r5,r12,lr}                  /* スクラッチレジスタ+αの復帰 */
    488596        rfefd   sp!
    489597#endif /* __TARGET_ARCH_ARM < 6 */
     
    509617        /*
    510618         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
    511          *  ラッチレジスタを保存する.
     619         *  ラッチレジスタ+αを保存する.
    512620         */
    513621        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    514         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    515 
    516         /*
    517          *  未定義モードに戻して,戻り番地とspsrを取得する.
     622        push    {r0-r5,r12,lr,pc}               /* pcはスペース確保のため */
     623
     624        /*
     625         *  未定義モードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を取
     626         *  得する.
    518627         */
    519628        msr             cpsr_c, #(CPSR_UND_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    522631
    523632        /*
    524          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     633         *  スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する.
    525634         */
    526635        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    527         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    528         push    {r1}                                    /* spsrをスタックに保存 */
     636        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存(pcの場所)*/
     637        push    {r1}                                    /* 戻り先のcpsrをスタックに保存 */
    529638#else /* __TARGET_ARCH_ARM < 6 */
    530639        /*
    531          *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    532          *  保存する.
     640         *  戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ
     641         *  クに保存する.
    533642         */
    534643        srsfd   #CPSR_SVC_MODE!
    535644
    536645        /*
    537          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     646         *  スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する.
    538647         */
    539648        cps             #CPSR_SVC_MODE
    540         stmfd   sp!, {r0-r5,r12,lr}
     649        push    {r0-r5,r12,lr}
    541650#endif /* __TARGET_ARCH_ARM < 6 */
    542651        mov             r4, #EXCNO_UNDEF
     
    558667#if __TARGET_ARCH_ARM < 6
    559668        /*
    560          *  IビットとFビットをセットし,スクラッチレジスタを保存する.
     669         *  IビットとFビットをセットし,戻り番地(lr),スクラッチレジスタ
     670         *  +α,戻り先のcpsr(spsr)を保存する(lrは二重に保存される).
    561671         */
    562672        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    563         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    564 
    565         /*
    566          *  戻り番地とspsrを取得する.
    567          */
    568         mov             r2, lr
     673        push    {lr}
     674        push    {r0-r5,r12,lr}
    569675        mrs             r1, spsr
    570 
    571         /*
    572          *  戻り番地とspsrを保存する.
    573          */
    574         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    575         push    {r1}                                    /* spsrをスタックに保存 */
     676        push    {r1}
    576677#else /* __TARGET_ARCH_ARM < 6 */
    577678        /*
    578          *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    579          *  保存する.
     679         *  戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ
     680         *  クに保存する.
    580681         */
    581682        srsfd   #CPSR_SVC_MODE!
    582683
    583684        /*
    584          *  スーパバイザモードで,スクラッチレジスタを保存する.
    585          */
    586         cps             #CPSR_SVC_MODE                  /* 不要と思われる */
    587         stmfd   sp!, {r0-r5,r12,lr}
     685         *  スーパバイザモードで,スクラッチレジスタ+αを保存する.
     686         */
     687        push    {r0-r5,r12,lr}
    588688#endif /* __TARGET_ARCH_ARM < 6 */
    589689        mov             r4, #EXCNO_SVC
     
    605705        /*
    606706         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
    607          *  ラッチレジスタを保存する.
     707         *  ラッチレジスタ+αを保存する.
    608708         */
    609709        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    610         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    611 
    612         /*
    613          *  アボートモードに戻して,戻り番地とspsrを取得する.
     710        push    {r0-r5,r12,lr,pc}               /* pcはスペース確保のため */
     711
     712        /*
     713         *  アボートモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を
     714         *  取得する.
    614715         */
    615716        msr             cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    618719
    619720        /*
    620          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     721         *  スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する.
    621722         */
    622723        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    623         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    624         push    {r1}                                    /* spsrをスタックに保存 */
     724        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存(pcの場所)*/
     725        push    {r1}                                    /* 戻り先のcpsrをスタックに保存 */
    625726#else /* __TARGET_ARCH_ARM < 6 */
    626727        /*
    627          *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    628          *  保存する.
     728         *  戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ
     729         *  クに保存する.
    629730         */
    630731        srsfd   #CPSR_SVC_MODE!
    631732
    632733        /*
    633          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     734         *  スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する.
    634735         */
    635736        cps             #CPSR_SVC_MODE
    636         stmfd   sp!, {r0-r5,r12,lr}
     737        push    {r0-r5,r12,lr}
    637738#endif /* __TARGET_ARCH_ARM < 6 */
    638739        mov             r4, #EXCNO_PABORT
     
    653754         *  データアボートが,CPU例外の入口(start_exc_entryとend_exc_entry
    654755         *  の間)で発生した場合には,fatal_dabort_handlerに分岐する.アボー
    655          *  トモードのspを汎用レジスタの代わりに使用する
    656          */
    657         ldr             sp, =start_exc_entry+8
    658         cmp             lr, sp
     756         *  トモードのspを汎用レジスタの代わりに使用する(r13と記述している)
     757         */
     758        adr             r13, start_exc_entry+8
     759        cmp             lr, r13
    659760        bcc             dabort_handler_1
    660         ldr             sp, =end_exc_entry+8
    661         cmp             lr, sp
     761        adr             r13, end_exc_entry+8
     762        cmp             lr, r13
    662763        bcc             fatal_dabort_handler
    663764
     
    666767        /*
    667768         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
    668          *  ラッチレジスタを保存する.
     769         *  ラッチレジスタ+αを保存する.
    669770         */
    670771        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    671         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    672 
    673         /*
    674          *  アボートモードに戻して,戻り番地とspsrを取得する.
     772        push    {r0-r5,r12,lr,pc}               /* pcはスペース確保のため */
     773
     774        /*
     775         *  アボートモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を
     776         *  取得する.
    675777         */
    676778        msr             cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    679781
    680782        /*
    681          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     783         *  スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する.
    682784         */
    683785        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    684         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    685         push    {r1}                                    /* spsrをスタックに保存 */
     786        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存(pcの場所)*/
     787        push    {r1}                                    /* 戻り先のcpsrをスタックに保存 */
    686788#else /* __TARGET_ARCH_ARM < 6 */
    687789        /*
    688          *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    689          *  保存する.
     790         *  戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ
     791         *  クに保存する.
    690792         */
    691793        srsfd   #CPSR_SVC_MODE!
    692794
    693795        /*
    694          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     796         *  スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する.
    695797         */
    696798        cps             #CPSR_SVC_MODE
    697         stmfd   sp!, {r0-r5,r12,lr}
     799        push    {r0-r5,r12,lr}
    698800#endif /* __TARGET_ARCH_ARM < 6 */
    699801        mov             r4, #EXCNO_DABORT
    700802        b               exc_handler_1
    701 #endif /* OMIT_DABORT_HANDLER */
    702803
    703804/*
     
    708809        /*
    709810         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スタッ
    710          *  クポインタを初期化し,スクラッチレジスタを保存する.
     811         *  クポインタを初期化し,スクラッチレジスタ+αを保存する.
    711812         */
    712813        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    713814        ldr             sp, =istkpt
    714815        ldr             sp, [sp]
    715         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    716 
    717         /*
    718          *  アボートモードに戻して,戻り番地とspsrを取得する.
     816        push    {r0-r5,r12,lr,pc}               /* pcはスペース確保のため */
     817
     818        /*
     819         *  アボートモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を
     820         *  取得する.
    719821         */
    720822        msr             cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    723825
    724826        /*
    725          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     827         *  スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する.
    726828         */
    727829        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    728         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    729         push    {r1}                                    /* spsrをスタックに保存 */
     830        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存(pcの場所)*/
     831        push    {r1}                                    /* 戻り先のcpsrをスタックに保存 */
    730832#else /* __TARGET_ARCH_ARM < 6 */
    731833        /*
     
    738840
    739841        /*
    740          *  アボートモードに戻して,戻り先(lr)とspsr(cpsr_svc)をスーパ
    741          *  バイザモードのスタックに保存する.
     842         *  アボートモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を
     843         *  スーパバイザモードのスタックに保存する.
    742844         */
    743845        cps             #CPSR_ABT_MODE
     
    745847
    746848        /*
    747          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     849         *  スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する.
    748850         */
    749851        cps             #CPSR_SVC_MODE
    750         stmfd   sp!, {r0-r5,r12,lr}
     852        push    {r0-r5,r12,lr}
    751853#endif /* __TARGET_ARCH_ARM < 6 */
    752854
    753855        /*
    754          *  例外ネストカウントの最上位ビットを1にする.
     856         *  例外ネストカウントをインクリメントする.
    755857         */
    756858        ldr             r2, =excpt_nest_count
    757859        ldr             r3, [r2]
    758         orr             r3, r3, #0x80000000
     860        add             r3, r3, #1
    759861        str             r3, [r2]
    760862
    761         mov             r4, #EXCNO_DABORT
     863        mov             r4, #EXCNO_FATAL
    762864        b               exc_handler_1
     865#endif /* OMIT_DABORT_HANDLER */
    763866
    764867/*
     
    776879        /*
    777880         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
    778          *  ラッチレジスタを保存する.
     881         *  ラッチレジスタ+αを保存する.
    779882         */
    780883        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    781         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    782 
    783         /*
    784          *  FIQモードに戻して,戻り番地とspsrを取得する.
     884        push    {r0-r5,r12,lr,pc}               /* pcはスペース確保のため */
     885
     886        /*
     887         *  FIQモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を取得
     888         *  する.
    785889         */
    786890        msr             cpsr_c, #(CPSR_FIQ_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    789893
    790894        /*
    791          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     895         *  スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する.
    792896         */
    793897        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    794         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    795         push    {r1}                                    /* spsrをスタックに保存 */
     898        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存(pcの場所)*/
     899        push    {r1}                                    /* 戻り先のcpsrをスタックに保存 */
    796900#else /* __TARGET_ARCH_ARM < 6 */
    797901        /*
    798          *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    799          *  保存する.
     902         *  戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ
     903         *  クに保存する.
    800904         */
    801905        srsfd   #CPSR_SVC_MODE!
    802906
    803907        /*
    804          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     908         *  スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する.
    805909         */
    806910        cps             #CPSR_SVC_MODE
    807         stmfd   sp!, {r0-r5,r12,lr}
     911        push    {r0-r5,r12,lr}
    808912#endif /* __TARGET_ARCH_ARM < 6 */
    809913        mov             r4, #EXCNO_FIQ
    810914        b               exc_handler_1
    811915#endif /* OMIT_FIQ_HANDLER */
    812        
     916
    813917ALABEL(end_exc_entry)
    814918
    815919/*
    816920 *  CPU例外ハンドラ出入口処理の共通部分
    817  *
    818  * 【この時点のレジスタ状態】
    819  *  r4:CPU例外ハンドラ番号
    820921 */
    821922ALABEL(exc_handler_1)
    822923        /*
     924         * 【この時点のレジスタ状態】
     925         *  r4:CPU例外ハンドラ番号
     926         *
    823927         *  CPU例外が発生した状況の判断に用いるために,CPU例外発生前の割
    824928         *  込み優先度マスクと例外ネストカウントをスタックに保存する.
     
    836940        and             r1, sp, #4
    837941        sub             sp, sp, r1
    838         push    {r0,r1}                                 /* r0はスペース確保のため */
    839 
     942        push    {r0,r1}                                 /* スタックポインタの調整値を保存 */
     943                                                                        /* r0はスペース確保のため */
    840944        /*
    841945         *  カーネル管理外のCPU例外か判定する
     
    873977#endif /* TOPPERS_SUPPORT_OVRHDR */
    874978
     979#ifdef USE_ARM_FPU
     980        /*
     981         *  FPUをディスエーブルする.
     982         */
     983        vmrs    r0, fpexc
     984        str             r0, [sp]                                /* FPEXCを保存(r0の場所)*/
     985        bic             r0, r0, #FPEXC_ENABLE
     986        vmsr    fpexc, r0                               /* FPEXCを設定 */
     987#endif /* USE_ARM_FPU */
     988       
    875989        /*
    876990         *  非タスクコンテキスト用のスタックに切り換える.
     
    8901004        /*
    8911005         *  (必要なら)割込みコントローラを操作する.
     1006         *
     1007         *  irc_begin_excは,スタックトップ(r0の場所)に,irc_end_excで用
     1008         *  いる情報を保存する.
    8921009         */
    8931010        bl              irc_begin_exc
     
    9701087        mov             sp, r3
    9711088
     1089#ifdef USE_ARM_FPU
     1090        /*
     1091         *  FPUを元に戻す.
     1092         */
     1093        ldr             r0, [sp]                                /* FPEXCを復帰 */
     1094        vmsr    fpexc, r0
     1095#endif /* USE_ARM_FPU */
     1096       
    9721097        /*
    9731098         *  p_runtskがNULLか判定する.
     
    9901115         */
    9911116ALABEL(exc_handler_3)
     1117        /*
     1118         * 【この時点のレジスタ状態】
     1119         *  r0:p_runtsk
     1120         */
    9921121        ldr             r1, =p_schedtsk                 /* p_schedtsk → r1 */
    9931122        ldr             r1, [r1]
     
    9981127         *  コンテキストを保存する.
    9991128         */
    1000         stmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの保存 */
     1129        push    {r6-r11}                                /* 残りのレジスタの保存 */
     1130#ifdef USE_ARM_FPU
     1131        ldr             r2, [r0,#TCB_p_tinib]   /* p_runtsk->p_tinib → r2 */
     1132        ldr             r1, [r2,#TINIB_tskatr]  /* p_runtsk->p_tinib->tskatr → r1 */
     1133        tst             r1, #TA_FPU
     1134        beq             1f                                              /* TA_FPU属性でない場合は分岐 */
     1135#ifdef USE_ARM_FPU_D32
     1136        vpush   {d16-d31}
     1137#endif /* USE_ARM_FPU_D32 */
     1138        vpush   {d0-d15}                                /* 全FPUレジスタの保存 */
     1139        vmrs    r1, fpscr
     1140        push    {r1,r2}                                 /* FPSCRの保存 */
     11411:                                                                      /* r2はアラインメントのため */
     1142#endif /* USE_ARM_FPU */
    10011143        str             sp, [r0,#TCB_sp]                /* スタックポインタを保存 */
    10021144        adr             r1, ret_exc_r                   /* 実行再開番地を保存 */
     
    10071149        /*
    10081150         *  コンテキストを復帰する.
    1009          */
    1010         ldmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの復帰 */
     1151         *
     1152         * 【この時点のレジスタ状態】
     1153         *  r4:p_runtsk(タスク切換え後)
     1154         */
     1155#ifdef USE_ARM_FPU
     1156        ldr             r2, [r4,#TCB_p_tinib]   /* p_runtsk->p_tinib → r2 */
     1157        ldr             r1, [r2,#TINIB_tskatr]  /* p_runtsk->p_tinib->tskatr → r1 */
     1158        tst             r1, #TA_FPU
     1159        vmrs    r0, fpexc
     1160        biceq   r0, r0, #FPEXC_ENABLE
     1161        orrne   r0, r0, #FPEXC_ENABLE
     1162        vmsr    fpexc, r0                               /* FPEXCを設定 */
     1163        beq             1f                                              /* TA_FPU属性でない場合は分岐 */
     1164        pop             {r1,r2}                                 /* FPSCRの復帰 */
     1165        vmsr    fpscr, r1
     1166        vpop    {d0-d15}                                /* 全FPUレジスタの復帰 */
     1167#ifdef USE_ARM_FPU_D32
     1168        vpop    {d16-d31}
     1169#endif /* USE_ARM_FPU_D32 */
     11701:
     1171#endif /* USE_ARM_FPU */
     1172        pop             {r6-r11}                                /* 残りのレジスタの復帰 */
    10111173
    10121174ALABEL(exc_handler_4)
     
    10311193
    10321194#if __TARGET_ARCH_ARM < 6
    1033         ldmfd   sp!, {r0}                               /* 戻り先のcpsrをspsrに設定 */
     1195        pop             {r0}                                    /* 戻り先のcpsrをspsrに設定 */
    10341196        msr             spsr_cxsf, r0
    10351197        ldmfd   sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */
    10361198                                                                        /* ^付きなので,spsr → cpsr */
    10371199#else /* __TARGET_ARCH_ARM < 6 */
    1038         ldmfd   sp!, {r0-r5,r12,lr}
     1200        pop             {r0-r5,r12,lr}                  /* スクラッチレジスタ+αの復帰 */
    10391201        rfefd   sp!
    10401202#endif /* __TARGET_ARCH_ARM < 6 */
     
    10611223        bne             nk_exc_handler_2                /*                      ならnk_exc_handler_2に分岐 */
    10621224
     1225#ifdef USE_ARM_FPU
     1226        /*
     1227         *  FPUをディスエーブルする.
     1228         */
     1229        vmrs    r0, fpexc
     1230        str             r0, [sp]                                /* FPEXCを保存(r0の場所)*/
     1231        bic             r0, r0, #FPEXC_ENABLE
     1232        vmsr    fpexc, r0                               /* FPEXCを設定 */
     1233#endif /* USE_ARM_FPU */
     1234       
    10631235        /*
    10641236         *  非タスクコンテキスト用のスタックに切り換える.
     
    10681240        ldr             sp, [r2]
    10691241        push    {r0,r3}                                 /* 切換え前のスタックポインタを保存 */
    1070                                                                         /* r0はスペース確保のため */
     1242                                                                        /* r0はアラインメントのため */
    10711243ALABEL(nk_exc_handler_2)
    10721244        /*
     
    11011273        pop             {r0,r3}
    11021274        mov             sp, r3
     1275
     1276#ifdef USE_ARM_FPU
     1277        /*
     1278         *  FPUを元に戻す.
     1279         */
     1280        ldr             r0, [sp]                                /* FPEXCを復帰 */
     1281        vmsr    fpexc, r0
     1282#endif /* USE_ARM_FPU */
    11031283        b               exc_handler_5
    1104 
     1284       
    11051285/*
    11061286 *  ステータスレジスタの操作関数
     
    11131293        ATEXT
    11141294        AALIGN(2)
    1115         AWEAK(current_cpsr)
    1116 ALABEL(current_cpsr)
     1295        AWEAK(_kernel_current_cpsr)
     1296ALABEL(_kernel_current_cpsr)
    11171297        mrs             r0, cpsr_cxsf
    11181298        bx              lr
    11191299
    11201300        AALIGN(2)
    1121         AWEAK(set_cpsr)
    1122 ALABEL(set_cpsr)
     1301        AWEAK(_kernel_set_cpsr)
     1302ALABEL(_kernel_set_cpsr)
    11231303        msr             cpsr_cxsf, r0
    11241304        bx              lr
Note: See TracChangeset for help on using the changeset viewer.