Ignore:
Timestamp:
Apr 5, 2019, 9:26:53 PM (5 years ago)
Author:
coas-nagasima
Message:

mbed関連を更新
シリアルドライバをmbedのHALを使うよう変更
ファイルディスクリプタの処理を更新

File:
1 edited

Legend:

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

    r352 r374  
    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-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
    11  *  上記著作権者は,以下の(1)(4)の条件を満たす場合に限り,本ソフトウェ
     11 *  上記著作権者は,以下の(1)(4)の条件を満たす場合に限り,本ソフトウェ
    1212 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
    1313 *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     
    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
     
    136168         */
    137169
     170        /*
     171         *  各種のデバイス(特に割込みコントローラ)の設定が完了するのを待つ.
     172         */
     173        asm_data_sync_barrier r0
     174       
    138175        /*
    139176         *      タスクコンテキストに切り換える.
     
    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
     
    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
     
    550659        ATEXT
    551660        AALIGN(2)
    552         AWEAK(svc_handler)
    553661        AGLOBAL(svc_handler)
    554662ALABEL(svc_handler)
     
    558666#if __TARGET_ARCH_ARM < 6
    559667        /*
    560          *  IビットとFビットをセットし,スクラッチレジスタを保存する.
     668         *  IビットとFビットをセットし,戻り番地(lr),スクラッチレジスタ
     669         *  +α,戻り先のcpsr(spsr)を保存する(lrは二重に保存される).
    561670         */
    562671        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
     672        push    {lr}
     673        push    {r0-r5,r12,lr}
    569674        mrs             r1, spsr
    570 
    571         /*
    572          *  戻り番地とspsrを保存する.
    573          */
    574         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    575         push    {r1}                                    /* spsrをスタックに保存 */
     675        push    {r1}
    576676#else /* __TARGET_ARCH_ARM < 6 */
    577677        /*
    578          *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    579          *  保存する.
     678         *  戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ
     679         *  クに保存する.
    580680         */
    581681        srsfd   #CPSR_SVC_MODE!
    582682
    583683        /*
    584          *  スーパバイザモードで,スクラッチレジスタを保存する.
    585          */
    586         cps             #CPSR_SVC_MODE                  /* 不要と思われる */
    587         stmfd   sp!, {r0-r5,r12,lr}
     684         *  スーパバイザモードで,スクラッチレジスタ+αを保存する.
     685         */
     686        push    {r0-r5,r12,lr}
    588687#endif /* __TARGET_ARCH_ARM < 6 */
    589688        mov             r4, #EXCNO_SVC
     
    605704        /*
    606705         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
    607          *  ラッチレジスタを保存する.
     706         *  ラッチレジスタ+αを保存する.
    608707         */
    609708        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    610         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    611 
    612         /*
    613          *  アボートモードに戻して,戻り番地とspsrを取得する.
     709        push    {r0-r5,r12,lr,pc}               /* pcはスペース確保のため */
     710
     711        /*
     712         *  アボートモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を
     713         *  取得する.
    614714         */
    615715        msr             cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    618718
    619719        /*
    620          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     720         *  スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する.
    621721         */
    622722        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    623         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    624         push    {r1}                                    /* spsrをスタックに保存 */
     723        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存(pcの場所)*/
     724        push    {r1}                                    /* 戻り先のcpsrをスタックに保存 */
    625725#else /* __TARGET_ARCH_ARM < 6 */
    626726        /*
    627          *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    628          *  保存する.
     727         *  戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ
     728         *  クに保存する.
    629729         */
    630730        srsfd   #CPSR_SVC_MODE!
    631731
    632732        /*
    633          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     733         *  スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する.
    634734         */
    635735        cps             #CPSR_SVC_MODE
    636         stmfd   sp!, {r0-r5,r12,lr}
     736        push    {r0-r5,r12,lr}
    637737#endif /* __TARGET_ARCH_ARM < 6 */
    638738        mov             r4, #EXCNO_PABORT
     
    666766        /*
    667767         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
    668          *  ラッチレジスタを保存する.
     768         *  ラッチレジスタ+αを保存する.
    669769         */
    670770        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    671         stmfd   sp!, {r0-r5,r12,lr,pc}          /* pcはスペース確保のため */
    672 
    673         /*
    674          *  アボートモードに戻して,戻り番地とspsrを取得する.
     771        push    {r0-r5,r12,lr,pc}               /* pcはスペース確保のため */
     772
     773        /*
     774         *  アボートモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を
     775         *  取得する.
    675776         */
    676777        msr             cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    679780
    680781        /*
    681          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     782         *  スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する.
    682783         */
    683784        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    684         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    685         push    {r1}                                    /* spsrをスタックに保存 */
     785        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存(pcの場所)*/
     786        push    {r1}                                    /* 戻り先のcpsrをスタックに保存 */
    686787#else /* __TARGET_ARCH_ARM < 6 */
    687788        /*
    688          *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    689          *  保存する.
     789         *  戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ
     790         *  クに保存する.
    690791         */
    691792        srsfd   #CPSR_SVC_MODE!
    692793
    693794        /*
    694          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     795         *  スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する.
    695796         */
    696797        cps             #CPSR_SVC_MODE
    697         stmfd   sp!, {r0-r5,r12,lr}
     798        push    {r0-r5,r12,lr}
    698799#endif /* __TARGET_ARCH_ARM < 6 */
    699800        mov             r4, #EXCNO_DABORT
     
    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
     
    776878        /*
    777879         *  IビットとFビットをセットし,スーパバイザモードに切り換え,スク
    778          *  ラッチレジスタを保存する.
     880         *  ラッチレジスタ+αを保存する.
    779881         */
    780882        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を取得する.
     883        push    {r0-r5,r12,lr,pc}               /* pcはスペース確保のため */
     884
     885        /*
     886         *  FIQモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を取得
     887         *  する.
    785888         */
    786889        msr             cpsr_c, #(CPSR_FIQ_MODE AOR CPSR_FIQ_IRQ_BIT)
     
    789892
    790893        /*
    791          *  スーパバイザモードに切り換え,戻り番地とspsrを保存する.
     894         *  スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する.
    792895         */
    793896        msr             cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT)
    794         str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存 */
    795         push    {r1}                                    /* spsrをスタックに保存 */
     897        str             r2, [sp,#0x20]                  /* 戻り番地をスタックに保存(pcの場所)*/
     898        push    {r1}                                    /* 戻り先のcpsrをスタックに保存 */
    796899#else /* __TARGET_ARCH_ARM < 6 */
    797900        /*
    798          *  戻り先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに
    799          *  保存する.
     901         *  戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ
     902         *  クに保存する.
    800903         */
    801904        srsfd   #CPSR_SVC_MODE!
    802905
    803906        /*
    804          *  スーパバイザモードに切り換え,スクラッチレジスタを保存する.
     907         *  スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する.
    805908         */
    806909        cps             #CPSR_SVC_MODE
    807         stmfd   sp!, {r0-r5,r12,lr}
     910        push    {r0-r5,r12,lr}
    808911#endif /* __TARGET_ARCH_ARM < 6 */
    809912        mov             r4, #EXCNO_FIQ
     
    815918/*
    816919 *  CPU例外ハンドラ出入口処理の共通部分
    817  *
    818  * 【この時点のレジスタ状態】
    819  *  r4:CPU例外ハンドラ番号
    820920 */
    821921ALABEL(exc_handler_1)
    822922        /*
     923         * 【この時点のレジスタ状態】
     924         *  r4:CPU例外ハンドラ番号
     925         *
    823926         *  CPU例外が発生した状況の判断に用いるために,CPU例外発生前の割
    824927         *  込み優先度マスクと例外ネストカウントをスタックに保存する.
     
    836939        and             r1, sp, #4
    837940        sub             sp, sp, r1
    838         push    {r0,r1}                                 /* r0はスペース確保のため */
    839 
     941        push    {r0,r1}                                 /* スタックポインタの調整値を保存 */
     942                                                                        /* r0はスペース確保のため */
    840943        /*
    841944         *  カーネル管理外のCPU例外か判定する
     
    873976#endif /* TOPPERS_SUPPORT_OVRHDR */
    874977
     978#ifdef USE_ARM_FPU
     979        /*
     980         *  FPUをディスエーブルする.
     981         */
     982        vmrs    r0, fpexc
     983        str             r0, [sp]                                /* FPEXCを保存(r0の場所)*/
     984        bic             r0, r0, #FPEXC_ENABLE
     985        vmsr    fpexc, r0                               /* FPEXCを設定 */
     986#endif /* USE_ARM_FPU */
     987       
    875988        /*
    876989         *  非タスクコンテキスト用のスタックに切り換える.
     
    8901003        /*
    8911004         *  (必要なら)割込みコントローラを操作する.
     1005         *
     1006         *  irc_begin_excは,スタックトップ(r0の場所)に,irc_end_excで用
     1007         *  いる情報を保存する.
    8921008         */
    8931009        bl              irc_begin_exc
     
    9701086        mov             sp, r3
    9711087
     1088#ifdef USE_ARM_FPU
     1089        /*
     1090         *  FPUを元に戻す.
     1091         */
     1092        ldr             r0, [sp]                                /* FPEXCを復帰 */
     1093        vmsr    fpexc, r0
     1094#endif /* USE_ARM_FPU */
     1095       
    9721096        /*
    9731097         *  p_runtskがNULLか判定する.
     
    9901114         */
    9911115ALABEL(exc_handler_3)
     1116        /*
     1117         * 【この時点のレジスタ状態】
     1118         *  r0:p_runtsk
     1119         */
    9921120        ldr             r1, =p_schedtsk                 /* p_schedtsk → r1 */
    9931121        ldr             r1, [r1]
     
    9981126         *  コンテキストを保存する.
    9991127         */
    1000         stmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの保存 */
     1128        push    {r6-r11}                                /* 残りのレジスタの保存 */
     1129#ifdef USE_ARM_FPU
     1130        ldr             r2, [r0,#TCB_p_tinib]   /* p_runtsk->p_tinib → r2 */
     1131        ldr             r1, [r2,#TINIB_tskatr]  /* p_runtsk->p_tinib->tskatr → r1 */
     1132        tst             r1, #TA_FPU
     1133        beq             1f                                              /* TA_FPU属性でない場合は分岐 */
     1134#ifdef USE_ARM_FPU_D32
     1135        vpush   {d16-d31}
     1136#endif /* USE_ARM_FPU_D32 */
     1137        vpush   {d0-d15}                                /* 全FPUレジスタの保存 */
     1138        vmrs    r1, fpscr
     1139        push    {r1,r2}                                 /* FPSCRの保存 */
     11401:                                                                      /* r2はアラインメントのため */
     1141#endif /* USE_ARM_FPU */
    10011142        str             sp, [r0,#TCB_sp]                /* スタックポインタを保存 */
    10021143        adr             r1, ret_exc_r                   /* 実行再開番地を保存 */
     
    10071148        /*
    10081149         *  コンテキストを復帰する.
    1009          */
    1010         ldmfd   sp!, {r6-r11}                   /* 非スクラッチレジスタの復帰 */
     1150         *
     1151         * 【この時点のレジスタ状態】
     1152         *  r4:p_runtsk(タスク切換え後)
     1153         */
     1154#ifdef USE_ARM_FPU
     1155        ldr             r2, [r4,#TCB_p_tinib]   /* p_runtsk->p_tinib → r2 */
     1156        ldr             r1, [r2,#TINIB_tskatr]  /* p_runtsk->p_tinib->tskatr → r1 */
     1157        tst             r1, #TA_FPU
     1158        vmrs    r0, fpexc
     1159        biceq   r0, r0, #FPEXC_ENABLE
     1160        orrne   r0, r0, #FPEXC_ENABLE
     1161        vmsr    fpexc, r0                               /* FPEXCを設定 */
     1162        beq             1f                                              /* TA_FPU属性でない場合は分岐 */
     1163        pop             {r1,r2}                                 /* FPSCRの復帰 */
     1164        vmsr    fpscr, r1
     1165        vpop    {d0-d15}                                /* 全FPUレジスタの復帰 */
     1166#ifdef USE_ARM_FPU_D32
     1167        vpop    {d16-d31}
     1168#endif /* USE_ARM_FPU_D32 */
     11691:
     1170#endif /* USE_ARM_FPU */
     1171        pop             {r6-r11}                                /* 残りのレジスタの復帰 */
    10111172
    10121173ALABEL(exc_handler_4)
     
    10311192
    10321193#if __TARGET_ARCH_ARM < 6
    1033         ldmfd   sp!, {r0}                               /* 戻り先のcpsrをspsrに設定 */
     1194        pop             {r0}                                    /* 戻り先のcpsrをspsrに設定 */
    10341195        msr             spsr_cxsf, r0
    10351196        ldmfd   sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */
    10361197                                                                        /* ^付きなので,spsr → cpsr */
    10371198#else /* __TARGET_ARCH_ARM < 6 */
    1038         ldmfd   sp!, {r0-r5,r12,lr}
     1199        pop             {r0-r5,r12,lr}                  /* スクラッチレジスタ+αの復帰 */
    10391200        rfefd   sp!
    10401201#endif /* __TARGET_ARCH_ARM < 6 */
     
    10611222        bne             nk_exc_handler_2                /*                      ならnk_exc_handler_2に分岐 */
    10621223
     1224#ifdef USE_ARM_FPU
     1225        /*
     1226         *  FPUをディスエーブルする.
     1227         */
     1228        vmrs    r0, fpexc
     1229        str             r0, [sp]                                /* FPEXCを保存(r0の場所)*/
     1230        bic             r0, r0, #FPEXC_ENABLE
     1231        vmsr    fpexc, r0                               /* FPEXCを設定 */
     1232#endif /* USE_ARM_FPU */
     1233       
    10631234        /*
    10641235         *  非タスクコンテキスト用のスタックに切り換える.
     
    10681239        ldr             sp, [r2]
    10691240        push    {r0,r3}                                 /* 切換え前のスタックポインタを保存 */
    1070                                                                         /* r0はスペース確保のため */
     1241                                                                        /* r0はアラインメントのため */
    10711242ALABEL(nk_exc_handler_2)
    10721243        /*
     
    11011272        pop             {r0,r3}
    11021273        mov             sp, r3
     1274
     1275#ifdef USE_ARM_FPU
     1276        /*
     1277         *  FPUを元に戻す.
     1278         */
     1279        ldr             r0, [sp]                                /* FPEXCを復帰 */
     1280        vmsr    fpexc, r0
     1281#endif /* USE_ARM_FPU */
    11031282        b               exc_handler_5
    1104 
     1283       
    11051284/*
    11061285 *  ステータスレジスタの操作関数
Note: See TracChangeset for help on using the changeset viewer.