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

ASP3, TINET, mbed を更新

Location:
EcnlProtoTool/trunk/asp3_dcre/arch
Files:
6 added
46 edited
2 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/MANIFEST

    r270 r429  
    11PACKAGE asp3_arch_arm_gcc
    2 VERSION 3.1.0
     2VERSION 3.2.0
    33
    44MANIFEST
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/Makefile.core

    r321 r429  
    22#               Makefileのコア依存部(ARM用)
    33#
    4 #  $Id$
     4#  $Id: Makefile.core 755 2016-06-12 10:08:22Z ertl-hiro $
    55#
    66
     
    5050#  START_OBJSをstart.oに設定し,LDFLAGSに-nostdlibを追加する.
    5151#
    52 START_OBJS = start.o
     52START_OBJS := start.o
     53START_OBJS := $(addprefix $(OBJDIR)/, $(START_OBJS))
    5354
    54 $(START_OBJS): %.o: %.S
    55         $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
     55$(START_OBJS): $(OBJDIR)/%.o: %.S
     56        $(CC) -c -o $@ -MD -MP -MF $(DEPDIR)/$*.d $(CFLAGS) $(KERNEL_CFLAGS) $<
    5657
    57 LDFLAGS := -nostdlib $(LDFLAGS)
     58LDFLAGS := -nodefaultlibs $(LDFLAGS)
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/arm.c

    r321 r429  
    137137 *  ARMv7におけるデータキャッシュの無効化
    138138 *
    139  *  レベル0のキャッシュのみを無効化する.
     139 *  バリアを2か所に入れているのは,ARMアーキテクチャリファレンスマニュ
     140 *  アルのサンプルコードを踏襲した.
    140141 */
    141142#if __TARGET_ARCH_ARM == 7
     
    144145armv7_invalidate_dcache(void)
    145146{
    146         uint32_t        reg;
     147        uint32_t        clidr, ccsidr;
     148        uint32_t        level, no_levels;
    147149        uint32_t        way, no_ways, shift_way;
    148150        uint32_t        set, no_sets, shift_set;
    149 
    150         CP15_WRITE_CSSELR(0U);
    151         CP15_READ_CCSIDR(reg);
    152         no_sets = ((reg >> 13) & 0x7fffU) + 1;
    153         shift_set = (reg & 0x07U) + 4;
    154         no_ways = ((reg >> 3) & 0x3ffU) + 1;
    155         shift_way = count_leading_zero(no_ways);
    156 
    157         for (way = 0; way < no_ways; way++){
    158                 for (set = 0; set < no_sets; set++) {
    159                         reg = (way << shift_way) | (set << shift_set);
    160                         CP15_WRITE_DCISW(reg);
     151        uint32_t        waylevel, setwaylevel;
     152
     153        CP15_READ_CLIDR(clidr);
     154        no_levels = (clidr >> 24) & 0x07U;
     155        for (level = 0; level < no_levels; level++) {
     156                if (((clidr >> (level * 3)) & 0x07U) >= 0x02U) {
     157                        CP15_WRITE_CSSELR(level << 1);
     158                        inst_sync_barrier();
     159                        CP15_READ_CCSIDR(ccsidr);
     160                        no_sets = ((ccsidr >> 13) & 0x7fffU) + 1;
     161                        shift_set = (ccsidr & 0x07U) + 4;
     162                        no_ways = ((ccsidr >> 3) & 0x3ffU) + 1;
     163                        shift_way = count_leading_zero(no_ways - 1);
     164
     165                        for (way = 0; way < no_ways; way++) {
     166                                waylevel = (way << shift_way) | (level << 1);
     167                                for (set = 0; set < no_sets; set++) {
     168                                        setwaylevel = waylevel | (set << shift_set);
     169                                        CP15_WRITE_DCISW(setwaylevel);
     170                                }
     171                        }
    161172                }
    162173        }
     174        data_sync_barrier();
    163175}
    164176
     
    168180 *  ARMv7におけるデータキャッシュのクリーンと無効化
    169181 *
    170  *  レベル0のキャッシュのみをクリーンと無効化する.
     182 *  バリアを2か所に入れているのは,ARMアーキテクチャリファレンスマニュ
     183 *  アルのサンプルコードを踏襲した.
    171184 */
    172185#if __TARGET_ARCH_ARM == 7
     
    175188armv7_clean_and_invalidate_dcache(void)
    176189{
    177         uint32_t        reg;
     190        uint32_t        clidr, ccsidr;
     191        uint32_t        level, no_levels;
    178192        uint32_t        way, no_ways, shift_way;
    179193        uint32_t        set, no_sets, shift_set;
    180 
    181         CP15_WRITE_CSSELR(0U);
    182         CP15_READ_CCSIDR(reg);
    183         no_sets = ((reg >> 13) & 0x7fffU) + 1;
    184         shift_set = (reg & 0x07U) + 4;
    185         no_ways = ((reg >> 3) & 0x3ffU) + 1;
    186         shift_way = count_leading_zero(no_ways);
    187 
    188         for (way = 0; way < no_ways; way++){
    189                 for (set = 0; set < no_sets; set++) {
    190                         reg = (way << shift_way) | (set << shift_set);
    191                         CP15_WRITE_DCCISW(reg);
     194        uint32_t        waylevel, setwaylevel;
     195
     196        CP15_READ_CLIDR(clidr);
     197        no_levels = (clidr >> 24) & 0x07U;
     198        for (level = 0; level < no_levels; level++) {
     199                if (((clidr >> (level * 3)) & 0x07U) >= 0x02U) {
     200                        CP15_WRITE_CSSELR(level << 1);
     201                        inst_sync_barrier();
     202                        CP15_READ_CCSIDR(ccsidr);
     203                        no_sets = ((ccsidr >> 13) & 0x7fffU) + 1;
     204                        shift_set = (ccsidr & 0x07U) + 4;
     205                        no_ways = ((ccsidr >> 3) & 0x3ffU) + 1;
     206                        shift_way = count_leading_zero(no_ways - 1);
     207
     208                        for (way = 0; way < no_ways; way++) {
     209                                waylevel = (way << shift_way) | (level << 1);
     210                                for (set = 0; set < no_sets; set++) {
     211                                        setwaylevel = waylevel | (set << shift_set);
     212                                        CP15_WRITE_DCCISW(setwaylevel);
     213                                }
     214                        }
    192215                }
    193216        }
     217        data_sync_barrier();
    194218}
    195219
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/arm.h

    r321 r429  
    55 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    66 *                              Toyohashi Univ. of Technology, JAPAN
    7  *  Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
     7 *  Copyright (C) 2006-2019 by Embedded and Real-Time Systems Laboratory
    88 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    99 *
     
    5353 */
    5454#ifndef TOPPERS_MACRO_ONLY
    55 #ifndef TECSGEN
    56 #include "arm_insn.h"                           /* tecsgenが解釈できないためスキップ */
    57 #endif /* TECSGEN */
     55#include "arm_insn.h"
    5856#endif /*  TOPPERS_MACRO_ONLY */
    5957
     
    117115#define CP15_SCTLR_DCACHE               UINT_C(0x00000004)
    118116#define CP15_SCTLR_MMU                  UINT_C(0x00000001)
     117
     118/*
     119 *  CP15のコプロセッサアクセス制御レジスタ(CPACR)の設定値
     120 */
     121#define CP15_CPACR_ASEDIS                       UINT_C(0x80000000)
     122#define CP15_CPACR_D32DIS                       UINT_C(0x40000000)
     123#define CP15_CPACR_CP11_FULLACCESS      UINT_C(0x00c00000)
     124#define CP15_CPACR_CP10_FULLACCESS      UINT_C(0x00300000)
    119125
    120126/*
     
    193199#define ARM_MMU_DSCR1_TEX010            0x02000U        /* TEXビットが010 */
    194200#define ARM_MMU_DSCR1_TEX100            0x04000U        /* TEXビットが100 */
    195 #define ARM_MMU_DSCR1_AP01                      0x00400U        /* APビットが01 */
    196 #define ARM_MMU_DSCR1_AP10                      0x00800U        /* APビットが10 */
    197 #define ARM_MMU_DSCR1_AP11                      0x00c00U        /* APビットが11 */
    198201#define ARM_MMU_DSCR1_CB00                      0x00000U        /* Cビットが0,Bビットが0 */
    199202#define ARM_MMU_DSCR1_CB01                      0x00004U        /* Cビットが0,Bビットが1 */
     
    201204#define ARM_MMU_DSCR1_CB11                      0x0000cU        /* Cビットが1,Bビットが1 */
    202205
    203 #if __TARGET_ARCH_ARM >= 6
     206#if __TARGET_ARCH_ARM < 6
     207
     208#define ARMV5_MMU_DSCR1_AP01            0x00400U        /* APビットが01 */
     209#define ARMV5_MMU_DSCR1_AP10            0x00800U        /* APビットが10 */
     210#define ARMV5_MMU_DSCR1_AP11            0x00c00U        /* APビットが11 */
     211
     212#else /* __TARGET_ARCH_ARM < 6 */
     213
    204214#define ARMV6_MMU_DSCR1_NONGLOBAL       0x20000U        /* グローバルでない */
    205 #define ARMV6_MMU_DSCR1_APX0            0x00000U        /* APXビットが0 */
    206 #define ARMV6_MMU_DSCR1_APX1            0x08000U        /* APXビットが1 */
     215#define ARMV6_MMU_DSCR1_AP001           0x00400         /* APビットが001 */
     216#define ARMV6_MMU_DSCR1_AP010           0x00800         /* APビットが010 */
     217#define ARMV6_MMU_DSCR1_AP011           0x00c00         /* APビットが011 */
     218#define ARMV6_MMU_DSCR1_AP101           0x08400         /* APビットが101 */
     219#define ARMV6_MMU_DSCR1_AP110           0x08800         /* APビットが110 */
     220#define ARMV6_MMU_DSCR1_AP111           0x08c00         /* APビットが111 */
    207221#define ARMV6_MMU_DSCR1_ECC                     0x00200U        /* ECCが有効(MPCore)*/
    208222#define ARMV6_MMU_DSCR1_NOEXEC          0x00010U        /* 実行不可 */
    209 #endif /* __TARGET_ARCH_ARM >= 6 */
     223
     224#endif /* __TARGET_ARCH_ARM < 6 */
    210225
    211226/*
     
    237252#define ARMV6_MMU_DSCR2_NONGLOBAL       0x0800U         /* グローバルでない */
    238253#define ARMV6_MMU_DSCR2_SHARED          0x0400U         /* プロセッサ間で共有 */
    239 #define ARMV6_MMU_DSCR2_APX0            0x0000U         /* APXビットが0 */
    240 #define ARMV6_MMU_DSCR2_APX1            0x0200U         /* APXビットが1 */
    241 #define ARMV6_MMU_DSCR2_AP01            0x0010U         /* APビットが01 */
    242 #define ARMV6_MMU_DSCR2_AP10            0x0020U         /* APビットが10 */
    243 #define ARMV6_MMU_DSCR2_AP11            0x0030U         /* APビットが11 */
     254#define ARMV6_MMU_DSCR2_AP001           0x0010          /* APビットが001 */
     255#define ARMV6_MMU_DSCR2_AP010           0x0020          /* APビットが010 */
     256#define ARMV6_MMU_DSCR2_AP011           0x0030          /* APビットが011 */
     257#define ARMV6_MMU_DSCR2_AP101           0x0210          /* APビットが101 */
     258#define ARMV6_MMU_DSCR2_AP110           0x0220          /* APビットが110 */
     259#define ARMV6_MMU_DSCR2_AP111           0x0230          /* APビットが111 */
    244260
    245261/* ラージページのディスクリプタ用 */
     
    318334
    319335/*
    320  *  プロセッサ番号の取得
     336 *  自プロセッサのインデックス(0オリジン)の取得
    321337 *
    322  *  マルチプロセッサアフィニティレジスタを読んで,その下位8ビットを返す.
    323  *  ARMv6では,マルチプロセッサをサポートしている場合にのみ使用できる.
     338 *  マルチプロセッサアフィニティレジスタを読んで,その下位8ビットを返
     339 *  す.ARMv6では,マルチプロセッサをサポートしている場合にのみ使用で
     340 *  きる.
    324341 */
    325342#if __TARGET_ARCH_ARM >= 6
    326343
    327 Inline uint32_t
    328 arm_prc_index(void)
     344Inline uint_t
     345get_my_prcidx(void)
    329346{
    330347        uint32_t        reg;
    331348
    332349        CP15_READ_MPIDR(reg);
    333         return(reg & 0xffU);
     350        return((uint_t)(reg & 0xffU));
    334351}
    335352
     
    444461
    445462#endif /* TOPPERS_MACRO_ONLY */
     463
     464/*
     465 *  浮動小数点例外制御レジスタ(FPEXC)の設定値
     466 */
     467#define FPEXC_ENABLE            UINT_C(0x40000000)
     468
    446469#endif /* TOPPERS_ARM_H */
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/arm_insn.h

    r321 r429  
    55 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    66 *                              Toyohashi Univ. of Technology, JAPAN
    7  *  Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
     7 *  Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory
    88 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    99 *
     
    105105 *  Thumbモードではmrs/msr命令が使用できないため,関数として実現して,
    106106 *  ARMモードに移行して実行する.
     107 *
     108 *  current_cpsrとset_cpsrは,__thumb__が定義されない場合にはヘッダファ
     109 *  イル中で定義されるインライン関数になるため,core_rename.defに登録
     110 *  せず,先頭の_kernel_を手書きしている.
    107111 */
    108112
     
    110114 *  ステータスレジスタ(CPSR)の現在値の読出し
    111115 */
    112 extern uint32_t current_cpsr(void);
     116extern uint32_t _kernel_current_cpsr(void);
     117#define current_cpsr()  _kernel_current_cpsr()
    113118
    114119/*
    115120 *  ステータスレジスタ(CPSR)の現在値の変更
    116121 */
    117 extern void set_cpsr(uint32_t cpsr);
     122extern void _kernel_set_cpsr(uint32_t cpsr);
     123#define set_cpsr(cpsr)  _kernel_set_cpsr(cpsr)
    118124
    119125#endif /* __thumb__ */
     
    220226#define CP15_READ_ACTLR(reg)    Asm("mrc p15, 0, %0, c1, c0, 1":"=r"(reg))
    221227#define CP15_WRITE_ACTLR(reg)   Asm("mcr p15, 0, %0, c1, c0, 1"::"r"(reg))
     228
     229/* コプロセッサアクセス制御レジスタ */
     230#define CP15_READ_CPACR(reg)    Asm("mrc p15, 0, %0, c1, c0, 2":"=r"(reg))
     231#define CP15_WRITE_CPACR(reg)   Asm("mcr p15, 0, %0, c1, c0, 2"::"r"(reg))
    222232
    223233/*
     
    293303
    294304/* ドメインアクセス制御レジスタ */
    295 #define CP15_WRITE_DACR(reg)    Asm("mcr p15, 0, %0, c3, c0, 0":: "r"(reg))
     305#define CP15_WRITE_DACR(reg)    Asm("mcr p15, 0, %0, c3, c0, 0"::"r"(reg))
    296306
    297307/* コンテキストIDレジスタ(ARMv6以降)*/
    298308#if __TARGET_ARCH_ARM >= 6
    299 #define CP15_WRITE_CONTEXTIDR(reg) Asm("mcr p15, 0, %0, c13, c0, 1" ::"r"(reg))
     309#define CP15_WRITE_CONTEXTIDR(reg) Asm("mcr p15, 0, %0, c13, c0, 1"::"r"(reg))
    300310#endif /* __TARGET_ARCH_ARM >= 6 */
    301311
     
    415425
    416426#endif /* __TARGET_ARCH_ARM == 7 */
     427
     428/*
     429 *  浮動小数点例外制御レジスタ(FPEXC)の現在値の読出し
     430 */
     431Inline uint32_t
     432current_fpexc(void)
     433{
     434        uint32_t        fpexc;
     435
     436        Asm("vmrs %0, fpexc" : "=r"(fpexc));
     437        return(fpexc);
     438}
     439
     440/*
     441 *  浮動小数点例外制御レジスタ(FPEXC)の現在値の変更
     442 */
     443Inline void
     444set_fpexc(uint32_t fpexc)
     445{
     446        Asm("vmsr fpexc, %0" : : "r"(fpexc));
     447}
     448
    417449#endif /* TOPPERS_ARM_INSN_H */
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_cfg1_out.h

    r321 r429  
    55 */
    66
    7 /*
    8  *  cfg1_out.cのリンクに必要な定義
    9  */
    10 
    117#include <kernel.h>
    128
    13 void sta_ker(void){}
     9void sta_ker(void) { }
    1410STK_T *const    _kernel_istkpt;
    15 
    16 /*
    17  *  offset.hを生成するための定義
    18  */
    19 const uint8_t   MAGIC_1 = 0x12;
    20 const uint16_t  MAGIC_2 = 0x1234;
    21 const uint32_t  MAGIC_4 = 0x12345678;
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_check.trb

    r321 r429  
    33#               パス3の生成スクリプトのコア依存部(ARM用)
    44#
    5 #  $Id$
     5#  $Id: core_check.trb 730 2016-04-03 02:04:52Z ertl-hiro $
    66#
    77
     
    2020inhTable = SYMBOL("_kernel_inh_table")
    2121offset = SYMBOL("__etext") - SYMBOL("__data_start__")
    22 $cfgData[:DEF_INH].each do |key, params|
     22$cfgData[:DEF_INH].each do |_, params|
    2323  inthdr = PEEK(inhTable + offset + params[:inhno] * $sizeof_FP, $sizeof_FP)
    2424
     
    3939#
    4040excTable = SYMBOL("_kernel_exc_table")
    41 $cfgData[:DEF_EXC].each do |key, params|
     41$cfgData[:DEF_EXC].each do |_, params|
    4242  exchdr = PEEK(excTable + params[:excno] * $sizeof_FP, $sizeof_FP)
    4343
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_kernel.h

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2004-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    5353
    5454/*
     55 *  ターゲット定義のタスク属性
     56 */
     57#define TA_FPU          UINT_C(0x08)    /* FPUレジスタをコンテキストに含める */
     58
     59/*
    5560 *  スタックの型
    5661 *
     
    6267 *  CPU例外ハンドラ番号の数
    6368 */ 
    64 #define TNUM_EXCNO              6
     69#define TNUM_EXCNO              7
    6570
    6671/*
    6772 *  CPU例外ハンドラ番号の定義
    6873 */
    69 #define EXCNO_UNDEF             0
    70 #define EXCNO_SVC               1
    71 #define EXCNO_PABORT    2
    72 #define EXCNO_DABORT    3
    73 #define EXCNO_IRQ               4
    74 #define EXCNO_FIQ               5
     74#define EXCNO_UNDEF             UINT_C(0)               /* 未定義命令 */
     75#define EXCNO_SVC               UINT_C(1)               /* スーパバイザコール */
     76#define EXCNO_PABORT    UINT_C(2)               /* プリフェッチアボート */
     77#define EXCNO_DABORT    UINT_C(3)               /* データアボート */
     78#define EXCNO_IRQ               UINT_C(4)               /* IRQ割込み */
     79#define EXCNO_FIQ               UINT_C(5)               /* FIQ割込み */
     80#define EXCNO_FATAL             UINT_C(6)               /* フェイタルデータアボート */
    7581
    7682#ifndef TOPPERS_MACRO_ONLY
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_kernel.trb

    r321 r429  
    66#
    77#   Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN
    8 #   Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     8#   Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99#               Graduate School of Information Science, Nagoya Univ., JAPAN
    1010#
     
    3838#   の責任を負わない.
    3939#
    40 #   $Id$
     40#   $Id: core_kernel.trb 662 2016-02-27 02:33:51Z ertl-hiro $
    4141#
    4242
     
    4848#  有効なCPU例外ハンドラ番号
    4949#
    50 $EXCNO_VALID = [ 0, 1, 2, 3, 4, 5 ]
     50$EXCNO_VALID = [ 0, 1, 2, 3, 4, 5, 6 ]
    5151
    5252#
    5353#  DEF_EXCで使用できるCPU例外ハンドラ番号
    5454#
    55 $EXCNO_DEFEXC_VALID = [ 0, 1, 2, 3, 5 ]
     55$EXCNO_DEFEXC_VALID = [ 0, 1, 2, 3, 5, 6 ]
    5656
    5757#
     
    6565$kernelCfgC.comment_header("Interrupt Handler Table")
    6666
    67 $kernelCfgC.add("FP _kernel_inh_table[TNUM_INHNO] = {")
     67$kernelCfgC.add("/*const*/FP _kernel_inh_table[TNUM_INHNO] = {")
    6868$INHNO_VALID.each_with_index do |inhnoVal, index|
    6969  $kernelCfgC.add(",") if index > 0
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_kernel_impl.c

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2006-2016 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 *
     
    7373 */
    7474Inline void
    75 config_section_entry(ARM_MMU_CONFIG *p_ammuc)
     75config_section_entry(const ARM_MMU_CONFIG *p_ammuc)
    7676{
    7777        uint32_t        vaddr = p_ammuc->vaddr;
     
    8080        uint_t          i;
    8181
     82        assert(vaddr % ARM_SECTION_SIZE == 0);
     83        assert(paddr % ARM_SECTION_SIZE == 0);
     84        assert(size % ARM_SECTION_SIZE == 0);
    8285        while (size > 0) {
    8386#ifdef USE_ARM_SSECTION
     
    170173
    171174/*
     175 *  FPUの初期化
     176 */
     177#ifdef USE_ARM_FPU
     178
     179void
     180arm_fpu_initialize(void)
     181{
     182        uint32_t        reg;
     183
     184        /*
     185         *  CP10とCP11をアクセス可能に設定する.
     186         */
     187        CP15_READ_CPACR(reg);
     188        reg |= (CP15_CPACR_CP10_FULLACCESS | CP15_CPACR_CP11_FULLACCESS);
     189        CP15_WRITE_CPACR(reg);
     190
     191        /*
     192         *  FPUをディスエーブルする.
     193         */
     194        set_fpexc(current_fpexc() & ~FPEXC_ENABLE);
     195}
     196
     197#endif /* USE_ARM_FPU */
     198
     199/*
    172200 *  コア依存の初期化
    173201 */
     
    187215        arm_mmu_initialize();
    188216#endif /* USE_ARM_MMU */
     217
     218        /*
     219         *  FPUの初期化
     220         */
     221#ifdef USE_ARM_FPU
     222        arm_fpu_initialize();
     223#endif /* USE_ARM_FPU */
    189224
    190225        /*
     
    306341                syslog_0(LOG_EMERG, "FIQ exception occurs.");
    307342                break;
     343        case EXCNO_FATAL:
     344                syslog_0(LOG_EMERG, "Fatal Data Abort exception occurs.");
     345                break;
    308346        }
    309347        xlog_sys(p_excinf);
    310348
    311         if (excno == EXCNO_PABORT || excno == EXCNO_DABORT) {
     349        if (excno == EXCNO_PABORT || excno == EXCNO_DABORT
     350                                                                                || excno == EXCNO_FATAL) {
    312351                uint32_t        fsr, far;
    313352
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_kernel_impl.h

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2006-2016 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#define TARGET_TSKATR           (TA_FPU)
     61/*#endif /* USE_ARM_FPU */
     62
     63/*
    5764 *  エラーチェック方法の指定
    5865 */
     
    6875#define CHECK_MPF_ALIGN         4               /* 固定長メモリプール領域のアライン単位 */
    6976#define CHECK_MPF_NONNULL                       /* 固定長メモリプール領域の非NULLチェック */
     77#define CHECK_MPK_ALIGN         4               /* カーネルメモリプール領域のアライン単位 */
     78#define CHECK_MPK_NONNULL                       /* カーネルメモリプール領域の非NULL  */
     79                                                                        /*                                                      チェック */
    7080#define CHECK_MB_ALIGN          4               /* 管理領域のアライン単位 */
    7181
     
    269279 *  非タスクコンテキストからのディスパッチ要求
    270280 */
    271 #define request_dispatch()
     281#define request_dispatch_retint()
    272282
    273283/*
     
    324334 *  割込みハンドラテーブル(kernel_cfg.c)
    325335 */
    326 extern FP inh_table[TNUM_INHNO];
     336extern /*const*/FP inh_table[TNUM_INHNO];
    327337
    328338/*
     
    447457 *  MMUの設定情報(メモリエリアの情報)(target_kernel_impl.c)
    448458 */
    449 extern ARM_MMU_CONFIG arm_memory_area[];
     459extern const ARM_MMU_CONFIG arm_memory_area[];
    450460
    451461/*
     
    458468
    459469#ifndef TOPPERS_MACRO_ONLY
     470
     471/*
     472 *  FPUの初期化
     473 */
     474#ifdef USE_ARM_FPU
     475extern void arm_fpu_initialize(void);
     476#endif /* USE_ARM_FPU */
    460477
    461478/*
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_offset.trb

    r321 r429  
    33#               オフセットファイル生成用Rubyテンプレート(ARM用)
    44#
    5 #  $Id$
     5#  $Id: core_offset.trb 572 2016-02-01 14:40:09Z ertl-hiro $
    66#
    77
     
    1414#  フィールドのオフセットの定義の生成
    1515#
    16 GenerateDefine("TCB_p_tinib", $offsetof_TCB_p_tinib)
    17 GenerateDefine("TCB_sp", $offsetof_TCB_sp)
    18 GenerateDefine("TCB_pc", $offsetof_TCB_pc)
    19 GenerateDefine("TINIB_exinf", $offsetof_TINIB_exinf)
    20 GenerateDefine("TINIB_task", $offsetof_TINIB_task)
    21 GenerateDefine("TINIB_stksz", $offsetof_TINIB_stksz)
    22 GenerateDefine("TINIB_stk", $offsetof_TINIB_stk)
    23 GenerateDefine("T_EXCINF_cpsr", $offsetof_T_EXCINF_cpsr)
     16$offsetH.append(<<EOS)
     17#define TCB_p_tinib             #{$offsetof_TCB_p_tinib}
     18#define TCB_sp                  #{$offsetof_TCB_sp}
     19#define TCB_pc                  #{$offsetof_TCB_pc}
     20#define TINIB_tskatr    #{$offsetof_TINIB_tskatr}
     21#define TINIB_exinf             #{$offsetof_TINIB_exinf}
     22#define TINIB_task              #{$offsetof_TINIB_task}
     23#define TINIB_stksz             #{$offsetof_TINIB_stksz}
     24#define TINIB_stk               #{$offsetof_TINIB_stk}
     25#define T_EXCINF_cpsr   #{$offsetof_T_EXCINF_cpsr}
     26EOS
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_rename.def

    r331 r429  
    1616dabort_handler
    1717fiq_handler
    18 current_cpsr
    19 set_cpsr
    2018
    2119# core_kernel_impl.c
    2220excpt_nest_count
    2321arm_mmu_initialize
     22arm_fpu_initialize
    2423core_initialize
    2524core_terminate
     
    2827default_int_handler
    2928default_exc_handler
     29
     30# mpcore_kernel_impl.c
     31mpcore_initialize
     32mpcore_terminate
     33
     34# mpcore_timer.c
     35target_hrt_initialize
     36target_hrt_terminate
     37target_hrt_handler
     38target_ovrtimer_initialize
     39target_ovrtimer_terminate
     40target_ovrtimer_handler
    3041
    3142# gic_kernel_impl.c
     
    4758pl310_invalidate_all
    4859pl310_clean_and_invalidate_all
    49 
    50 # target_kernel_impl.c
    51 arm_tnum_memory_area
    52 arm_memory_area
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_rename.h

    r321 r429  
    2525#define dabort_handler                          _kernel_dabort_handler
    2626#define fiq_handler                                     _kernel_fiq_handler
    27 #define current_cpsr                            _kernel_current_cpsr
    28 #define set_cpsr                                        _kernel_set_cpsr
    2927
    3028/*
     
    3331#define excpt_nest_count                        _kernel_excpt_nest_count
    3432#define arm_mmu_initialize                      _kernel_arm_mmu_initialize
     33#define arm_fpu_initialize                      _kernel_arm_fpu_initialize
    3534#define core_initialize                         _kernel_core_initialize
    3635#define core_terminate                          _kernel_core_terminate
     
    3938#define default_int_handler                     _kernel_default_int_handler
    4039#define default_exc_handler                     _kernel_default_exc_handler
     40
     41/*
     42 *  mpcore_kernel_impl.c
     43 */
     44#define mpcore_initialize                       _kernel_mpcore_initialize
     45#define mpcore_terminate                        _kernel_mpcore_terminate
     46
     47/*
     48 *  mpcore_timer.c
     49 */
     50#define target_hrt_initialize           _kernel_target_hrt_initialize
     51#define target_hrt_terminate            _kernel_target_hrt_terminate
     52#define target_hrt_handler                      _kernel_target_hrt_handler
     53#define target_ovrtimer_initialize      _kernel_target_ovrtimer_initialize
     54#define target_ovrtimer_terminate       _kernel_target_ovrtimer_terminate
     55#define target_ovrtimer_handler         _kernel_target_ovrtimer_handler
    4156
    4257/*
     
    6580#define pl310_clean_and_invalidate_all  _kernel_pl310_clean_and_invalidate_all
    6681
    67 /*
    68  *  target_kernel_impl.c
    69  */
    70 #define arm_tnum_memory_area            _kernel_arm_tnum_memory_area
    71 #define arm_memory_area                         _kernel_arm_memory_area
    72 
    7382
    7483#endif /* TOPPERS_CORE_RENAME_H */
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_sil.h

    r321 r429  
    55 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    66 *                              Toyohashi Univ. of Technology, JAPAN
    7  *  Copyright (C) 2004-2016 by Embedded and Real-Time Systems Laboratory
     7 *  Copyright (C) 2004-2018 by Embedded and Real-Time Systems Laboratory
    88 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    99 *
     
    8686 *  ステータスレジスタ(CPSR)の現在値の読出し
    8787 */
    88 extern uint32_t current_cpsr(void);
    89 #define TOPPERS_current_cpsr()  current_cpsr()
     88extern uint32_t _kernel_current_cpsr(void);
     89#define TOPPERS_current_cpsr()  _kernel_current_cpsr()
    9090
    9191/*
    9292 *  ステータスレジスタ(CPSR)の現在値の変更
    9393 */
    94 extern void set_cpsr(uint32_t cpsr);
    95 #define TOPPERS_set_cpsr(cpsr)  current_cpsr(cpsr)
     94extern void _kernel_set_cpsr(uint32_t cpsr);
     95#define TOPPERS_set_cpsr(cpsr)  _kernel_set_cpsr(cpsr)
    9696
    9797#endif /* __thumb__ */
     
    138138#define SIL_UNL_INT()   (TOPPERS_set_fiq_irq(TOPPERS_fiq_irq_mask))
    139139
     140/*
     141 *  メモリ同期バリア
     142 */
     143#ifdef DATA_SYNC_BARRIER
     144#define TOPPERS_SIL_WRITE_SYNC()        DATA_SYNC_BARRIER()
     145#elif __TARGET_ARCH_ARM <= 6
     146#define TOPPERS_SIL_WRITE_SYNC() \
     147                                                Asm("mcr p15, 0, %0, c7, c10, 4"::"r"(0):"memory")
     148#else /* __TARGET_ARCH_ARM <= 6 */
     149#define TOPPERS_SIL_WRITE_SYNC()        Asm("dsb":::"memory")
     150#endif
     151
    140152#endif /* TOPPERS_MACRO_ONLY */
    141153#endif /* TOPPERS_CORE_SIL_H */
  • 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
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_sym.def

    r331 r429  
    11TARGET_ARCH_ARM,__TARGET_ARCH_ARM
    2 USE_INTCFG_TABLE,true,bool,defined(USE_INTCFG_TABLE)
     2USE_ARM_FPU,true,bool,defined(USE_ARM_FPU),false
     3USE_ARM_FPU_D32,true,bool,defined(USE_ARM_FPU_D32),false
     4USE_INTCFG_TABLE,true,bool,defined(USE_INTCFG_TABLE),false
     5TA_FPU
    36sizeof_TCB,sizeof(TCB)
    47offsetof_TCB_p_tinib,"offsetof(TCB,p_tinib)"
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_test.h

    r321 r429  
    44 *      Advanced Standard Profile Kernel
    55 *
    6  *  Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
     6 *  Copyright (C) 2006-2019 by Embedded and Real-Time Systems Laboratory
    77 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    88 *
     
    3636 *  の責任を負わない.
    3737 *
    38  *  $Id$
     38 *  $Id: core_test.h 1244 2019-07-16 21:41:05Z ertl-hiro $
    3939 */
    4040
     
    5454
    5555/*
    56  *  CPU例外の発生
     56 *  不正アドレスの定義(メモリのない番地に設定する)
    5757 */
    58 
    5958#ifndef ILLEGAL_IADDR
    6059#define ILLEGAL_IADDR                   0xd0000000U             /* 不正命令アドレス */
     
    6665
    6766/*
     67 *  サンプルプログラムで用いるCPU例外の発生
     68 */
     69#if defined(USE_CPUEXC_SVC)
     70
     71#define CPUEXC1                                 EXCNO_SVC               /* スーパバイザコール */
     72#define RAISE_CPU_EXCEPTION             RAISE_CPU_EXCEPTION_SVC
     73#define PREPARE_RETURN_CPUEXC   PREPARE_RETURN_CPUEXC_SVC
     74
     75#elif defined(USE_CPUEXC_PABORT)
     76
     77#define CPUEXC1                                 EXCNO_PABORT    /* プリフェッチアボート */
     78#define RAISE_CPU_EXCEPTION             RAISE_CPU_EXCEPTION_PABORT
     79#define PREPARE_RETURN_CPUEXC   PREPARE_RETURN_CPUEXC_PABORT
     80
     81#elif defined(USE_CPUEXC_DABORT)
     82
     83#define CPUEXC1                                 EXCNO_DABORT    /* データアボート */
     84#define RAISE_CPU_EXCEPTION             RAISE_CPU_EXCEPTION_DABORT
     85#define PREPARE_RETURN_CPUEXC   PREPARE_RETURN_CPUEXC_DABORT
     86
     87#elif defined(USE_CPUEXC_FATAL)
     88
     89#define CPUEXC1                                 EXCNO_FATAL             /* フェイタルデータアボート */
     90#define RAISE_CPU_EXCEPTION             RAISE_CPU_EXCEPTION_FATAL
     91/* フェイタルデータアボート例外ハンドラからリターンしてはならない */
     92
     93#else
     94
     95#define CPUEXC1                                 EXCNO_UNDEF             /* 未定義命令 */
     96#define RAISE_CPU_EXCEPTION             RAISE_CPU_EXCEPTION_UNDEF
     97#define PREPARE_RETURN_CPUEXC   PREPARE_RETURN_CPUEXC_UNDEF
     98
     99#endif
     100
     101/*
    68102 *  スーパバイザコールによるCPU例外の発生
    69103 *
    70  *  CPU例外ハンドラから,そのままリターンすることができる.svc命令によ
    71  *  りlrレジスタが上書きされるため,lrレジスタは破壊されるものと指定し
    72  *  ている.
     104 *  svc #0によりCPU例外を発生させる.svc命令によりlrレジスタが上書きさ
     105 *  れるため,lrレジスタは破壊されるものと指定している.CPU例外ハンド
     106 *  ラからそのままリターンすることで,svc命令の次の命令から実行が継続
     107 *  する.
    73108 */
    74 #if defined(USE_SVC_CPUEXC)
    75 
    76 #define CPUEXC1                                 EXCNO_SVC               /* スーパバイザコール */
    77 #define RAISE_CPU_EXCEPTION             Asm("svc #0":::"lr")
    78 #define PREPARE_RETURN_CPUEXC
     109#define RAISE_CPU_EXCEPTION_SVC                 Asm("svc #0":::"lr")
     110#define PREPARE_RETURN_CPUEXC_SVC
    79111
    80112/*
    81113 *  プリフェッチアボートによるCPU例外の発生
    82114 *
    83  *  プリフェッチアボートを起こした命令をスキップしてCPU例外ハンドラから
    84  *  リターンするために,戻り番地はそのままで良い(ARMモードで使うことを
    85  *  想定).
     115 *  不正な番地を関数の先頭番地として呼び出すことで,プリフェッチアボー
     116 *  トによるCPU例外を発生させる.不正な番地に分岐した命令をスキップし
     117 *  てCPU例外ハンドラからリターンするために,戻り番地には,lrレジスタ
     118 *  の値(不正な番地への分岐命令からのリターン番地が入っている)を設定
     119 *  する.
    86120 */
    87 #elif defined(USE_PABORT_CPUEXC)
    88 
    89 #define CPUEXC1                                 EXCNO_PABORT    /* プリフェッチアボート */
    90 #define RAISE_CPU_EXCEPTION             ((void (*)(void)) ILLEGAL_IADDR)()
    91 #define PREPARE_RETURN_CPUEXC
     121#define RAISE_CPU_EXCEPTION_PABORT              (((void (*)(void)) ILLEGAL_IADDR)())
     122#define PREPARE_RETURN_CPUEXC_PABORT    (((T_EXCINF *) p_excinf)->pc \
     123                                                                                        = ((T_EXCINF *) p_excinf)->lr)
    92124
    93125/*
    94126 *  データアボートによるCPU例外の発生
    95127 *
    96  *  データアボートを起こした命令をスキップしてCPU例外ハンドラからリター
    97  *  ンするために,戻り番地から4を減算する(ARMモードで使うことを想定).
     128 *  不正な番地をリードすることで,データアボートによるCPU例外を発生さ
     129 *  せる.データアボートを起こした命令をスキップしてCPU例外ハンドラか
     130 *  らリターンするために,戻り番地から4を減算する(ARMモードで使うこと
     131 *  を想定している).
    98132 */
    99 #elif defined(USE_DABORT_CPUEXC)
    100 
    101 #include "arm.h"
    102 #define CPUEXC1                                 EXCNO_DABORT    /* データアボート */
    103 #define RAISE_CPU_EXCEPTION             (void)(*((volatile uint32_t *) ILLEGAL_DADDR))
    104 #define PREPARE_RETURN_CPUEXC   ((T_EXCINF *) p_excinf)->pc -= 4U
     133#define RAISE_CPU_EXCEPTION_DABORT              (void)(*((volatile uint32_t *) \
     134                                                                                                                        ILLEGAL_DADDR))
     135#define PREPARE_RETURN_CPUEXC_DABORT    (((T_EXCINF *) p_excinf)->pc -= 4U)
    105136
    106137/*
    107  *  フェイタルデータアボート処理
     138 *  フェイタルデータアボートによるCPU例外の発生
    108139 *
    109  *  スタックポインタを不正にして,フェイタルデータアボート処理を行わせ
    110  *  る.CPU例外ハンドラからはリターンできない.
     140 *  スタックポインタを不正にして,未定義命令を実行することで,フェイタ
     141 *  ルデータアボートによるCPU例外を発生させる.CPU例外ハンドラからリター
     142 *  ンしてはならない.
    111143 */
    112 #elif defined(USE_FATAL_DABORT_CPUEXC)
    113 
    114 #define CPUEXC1                                 EXCNO_DABORT    /* データアボート */
    115 #define RAISE_CPU_EXCEPTION             Asm("mov sp, %0"::"I"(ILLEGAL_DADDR))
     144#define RAISE_CPU_EXCEPTION_FATAL               Asm("mov sp, %0\n" \
     145                                                                                  "\t.word 0xf0500090" \
     146                                                                                  ::"I"(ILLEGAL_DADDR))
    116147
    117148/*
    118149 *  未定義命令によるCPU例外の発生
    119150 *
    120  *  RAISE_CPU_EXCEPTIONは,ARMモードで使うことを想定している.CPU例外ハ
    121  *  ンドラから,そのままリターンすることができる.使用している未定義命
    122  *  令は,"Multiply and multiply accumulate"命令群のエンコーディング内
    123  *  における未定義命令である.
     151 *  未定義命令によりCPU例外を発生させる.使用している未定義命令は,
     152 *  "Multiply and multiply accumulate"命令群のエンコーディング内におけ
     153 *  る未定義命令である.CPU例外ハンドラからそのままリターンすることで,
     154 *  未定義命令の次の命令から実行が継続する(ARMモードで使うことを想定
     155 *  している).
    124156 */
    125 #else
     157#define RAISE_CPU_EXCEPTION_UNDEF               Asm(".word 0xf0500090")
     158#define PREPARE_RETURN_CPUEXC_UNDEF
    126159
    127 #define CPUEXC1                                 EXCNO_UNDEF             /* 未定義命令 */
    128 #define RAISE_CPU_EXCEPTION             Asm(".word 0xf0500090")
    129 #define PREPARE_RETURN_CPUEXC
    130 
    131 #endif
    132160#endif /* TOPPERS_CORE_TEST_H */
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/core_unrename.h

    r321 r429  
    2626#undef dabort_handler
    2727#undef fiq_handler
    28 #undef current_cpsr
    29 #undef set_cpsr
    3028
    3129/*
     
    3432#undef excpt_nest_count
    3533#undef arm_mmu_initialize
     34#undef arm_fpu_initialize
    3635#undef core_initialize
    3736#undef core_terminate
     
    4039#undef default_int_handler
    4140#undef default_exc_handler
     41
     42/*
     43 *  mpcore_kernel_impl.c
     44 */
     45#undef mpcore_initialize
     46#undef mpcore_terminate
     47
     48/*
     49 *  mpcore_timer.c
     50 */
     51#undef target_hrt_initialize
     52#undef target_hrt_terminate
     53#undef target_hrt_handler
     54#undef target_ovrtimer_initialize
     55#undef target_ovrtimer_terminate
     56#undef target_ovrtimer_handler
    4257
    4358/*
     
    6681#undef pl310_clean_and_invalidate_all
    6782
    68 /*
    69  *  target_kernel_impl.c
    70  */
    71 #undef arm_tnum_memory_area
    72 #undef arm_memory_area
    73 
    7483
    7584#endif /* TOPPERS_CORE_RENAME_H */
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/gic_kernel_impl.c

    r321 r429  
    227227         */
    228228        gicd_set_priority(intno, INT_IPM(intpri));
    229         gicd_set_target(intno, 1U << arm_prc_index());
     229        gicd_set_target(intno, 1U << get_my_prcidx());
    230230
    231231        /*
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/gic_kernel_impl.h

    r321 r429  
    33 *      Toyohashi Open Platform for Embedded Real-Time Systems
    44 *
    5  *  Copyright (C) 2006-2017 by Embedded and Real-Time Systems Laboratory
     5 *  Copyright (C) 2006-2019 by Embedded and Real-Time Systems Laboratory
    66 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    77 *
     
    6767 *  割込み番号の定義
    6868 */
    69 #define GIC_INTNO_SGI0          0U
    70 #define GIC_INTNO_PPI0          16U
    71 #define GIC_INTNO_SPI0          32U
     69#define GIC_INTNO_SGI0          UINT_C(0)
     70#define GIC_INTNO_PPI0          UINT_C(16)
     71#define GIC_INTNO_SPI0          UINT_C(32)
    7272
    7373/*
     
    126126#define GICC_EOIR               GIC_REG(GICC_BASE, 0x10)
    127127#define GICC_RPR                GIC_REG(GICC_BASE, 0x14)
    128 #define GICC_HPIR               GIC_REG(GICC_BASE, 0x18)
     128#define GICC_HPPIR              GIC_REG(GICC_BASE, 0x18)
    129129
    130130/*
     
    198198gicc_set_priority(uint_t pri)
    199199{
    200         sil_wrw_mem(GICC_PMR, pri);
     200        sil_swrw_mem(GICC_PMR, pri);
    201201}
    202202
     
    230230gicd_disable_int(INTNO intno)
    231231{
    232         sil_wrw_mem(GICD_ICENABLER(intno / 32), (1U << (intno % 32)));
     232        sil_swrw_mem(GICD_ICENABLER(intno / 32), (1U << (intno % 32)));
    233233}
    234234
     
    239239gicd_enable_int(INTNO intno)
    240240{
    241         sil_wrw_mem(GICD_ISENABLER(intno / 32), (1U << (intno % 32)));
     241        sil_swrw_mem(GICD_ISENABLER(intno / 32), (1U << (intno % 32)));
    242242}
    243243
     
    248248gicd_clear_pending(INTNO intno)
    249249{
    250         sil_wrw_mem(GICD_ICPENDR(intno / 32), (1U << (intno % 32)));
     250        sil_swrw_mem(GICD_ICPENDR(intno / 32), (1U << (intno % 32)));
    251251}
    252252
     
    257257gicd_set_pending(INTNO intno)
    258258{
    259         sil_wrw_mem(GICD_ISPENDR(intno / 32), (1U << (intno % 32)));
     259        sil_swrw_mem(GICD_ISPENDR(intno / 32), (1U << (intno % 32)));
    260260}
    261261
     
    271271
    272272/*
     273 *  ソフトウェア生成割込み(SGI)の生成
     274 */
     275Inline void
     276gicd_raise_sgi(INTNO intno)
     277{
     278        sil_swrw_mem(GICD_SGIR, (0x02000000 | intno));
     279}
     280
     281/*
    273282 *  割込みのコンフィグレーション
    274283 */
     
    279288        uint32_t        reg;
    280289
    281         reg = sil_rew_mem(GICD_ICFGR(intno / 16));
    282         reg &= ~(0x03U << shift);
    283         reg |= (config << shift);
    284         sil_wrw_mem(GICD_ICFGR(intno / 16), reg);
     290        if (intno >= GIC_INTNO_PPI0) {
     291                reg = sil_rew_mem(GICD_ICFGR(intno / 16));
     292                reg &= ~(0x03U << shift);
     293                reg |= (config << shift);
     294                sil_wrw_mem(GICD_ICFGR(intno / 16), reg);
     295        }
    285296}
    286297
     
    318329 *  割込みターゲットプロセッサの設定
    319330 *
    320  *  prcsは,ターゲットとするプロセッサを表すビットのビット毎論理和で指
    321  *  定する.
     331 *  affinityは,ターゲットとするプロセッサを表すビットのビット毎論理和
     332 *  で指定する.
    322333 *              プロセッサ0 : 0x01
    323334 *              プロセッサ1 : 0x02
     
    326337 */
    327338Inline void
    328 gicd_set_target(INTNO intno, uint_t prcs)
     339gicd_set_target(INTNO intno, uint_t affinity)
    329340{
    330341        uint_t          shift = (intno % 4) * 8;
     
    333344        reg = sil_rew_mem(GICD_ITARGETSR(intno / 4));
    334345        reg &= ~(0xffU << shift);
    335         reg |= (prcs << shift);
     346        reg |= (affinity << shift);
    336347        sil_wrw_mem(GICD_ITARGETSR(intno / 4), reg);
    337348}
     
    373384 */
    374385#ifndef TOPPERS_MACRO_ONLY
     386
     387/*
     388 *  割込み属性の設定のチェック
     389 */
     390Inline bool_t
     391check_intno_cfg(INTNO intno)
     392{
     393        return(intcfg_table[intno] != 0U);
     394}
    375395
    376396/*
     
    393413
    394414/*
     415 *  割込み要求禁止フラグが操作できる割込み番号の範囲の判定
     416 */
     417#ifdef GIC_SUPPORT_DISABLE_SGI
     418#define VALID_INTNO_DISINT(intno)       VALID_INTNO(intno)
     419#else /* GIC_SUPPORT_DISABLE_SGI */
     420#define VALID_INTNO_DISINT(intno) \
     421                                (GIC_INTNO_PPI0 <= (intno) && (intno) <= TMAX_INTNO)
     422#endif /* GIC_SUPPORT_DISABLE_SGI */
     423
     424/*
    395425 *  割込み要求禁止フラグのセット
    396  *
    397  *  intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのセッ
    398  *  トし,割込みを禁止する.割込み属性が設定されていない割込み要求ライ
    399  *  ンが指定された場合には,falseを返す.
    400  */
    401 Inline bool_t
     426 */
     427Inline void
    402428disable_int(INTNO intno)
    403429{
    404         if (intcfg_table[intno] == 0U) {
    405                 return(false);
    406         }
    407430        gicd_disable_int(intno);
    408         return(true);
    409431}
    410432
    411433/*
    412434 *  割込み要求禁止フラグのクリア
    413  *
    414  *  intnoで指定された割込み要求ラインに対する割込み要求禁止フラグのクリ
    415  *  アし,割込みを許可する.割込み属性が設定されていない割込み要求ライ
    416  *  ンが指定された場合には,falseを返す.
     435 */
     436Inline void
     437enable_int(INTNO intno)
     438{
     439        gicd_enable_int(intno);
     440}
     441
     442/*
     443 *  割込み要求がクリアできる割込み番号の範囲の判定
     444 */
     445#define VALID_INTNO_CLRINT(intno) \
     446                                (GIC_INTNO_PPI0 <= (intno) && (intno) <= TMAX_INTNO)
     447
     448/*
     449 *  割込み要求がクリアできる状態か?
    417450 */
    418451Inline bool_t
    419 enable_int(INTNO intno)
    420 {
    421         if (intcfg_table[intno] == 0U) {
    422                 return(false);
     452check_intno_clear(INTNO intno)
     453{
     454        return(true);
     455}
     456
     457/*
     458 *  割込み要求のクリア
     459 */
     460Inline void
     461clear_int(INTNO intno)
     462{
     463        gicd_clear_pending(intno);
     464}
     465
     466/*
     467 *  割込みが要求できる状態か?
     468 */
     469Inline bool_t
     470check_intno_raise(INTNO intno)
     471{
     472        return(true);
     473}
     474
     475/*
     476 *  割込みの要求
     477 */
     478Inline void
     479raise_int(INTNO intno)
     480{
     481        if (intno < GIC_INTNO_PPI0) {
     482                gicd_raise_sgi(intno);
    423483        }
    424         gicd_enable_int(intno);
    425         return(true);
    426 }
    427 
    428 /*
    429  *  割込み要求のクリア
    430  */
    431 Inline void
    432 clear_int(INTNO intno)
    433 {
    434         gicd_clear_pending(intno);
     484        else {
     485                gicd_set_pending(intno);
     486        }
    435487}
    436488
     
    444496}
    445497
    446 /*
    447  *  割込み要求のセット
    448  */
    449 Inline void
    450 raise_int(INTNO intno)
    451 {
    452         gicd_set_pending(intno);
    453 }
    454 
    455498#endif /* TOPPERS_MACRO_ONLY */
    456499#endif /* TOPPERS_GIC_KERNEL_IMPL_H */
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/gic_support.S

    r321 r429  
    55 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    66 *                              Toyohashi Univ. of Technology, JAPAN
    7  *  Copyright (C) 2006-2017 by Embedded and Real-Time Systems Laboratory
     7 *  Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory
    88 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    99 *
     
    7070         *  割込み要因を取得する.
    7171         */
     72#ifdef GIC_PL390_ERRATA                 /* GIC 390 Errata 801120への対策 */
     73        ldr             r1, =GICC_HPPIR
     74        ldr             r0, [r1]       
     75#endif /* GIC_PL390_ERRATA */
    7276        ldr             r1, =GICC_IAR
    7377        ldr             r3, [r1]
    74 
    75         /*
    76          *  割込み番号を求める.
    77          */
    7878        lsl             r4, r3, #22                     /* 下位10ビットを取り出す */
    7979        lsr             r4, r4, #22
    8080
    81         /*
    82          *  割込み要求をクリアする.
    83          */
    84         and             r0, r4, #31
    85         mov             r2, #1
    86         lsl             r0, r2, r0
    87         ldr             r2, =GICD_ICPENDR(0)
    88         lsr             r1, r4, #5
    89         str             r0, [r2,r1,lsl #2]
     81#ifdef GIC_PL390_ERRATA                 /* GIC 390 Errata 733075への対策 */
     82        movw    r0, #1023
     83        cmp             r4, r0
     84        beq             irc_begin_int_errata_1
     85        movw    r0, #1022
     86        cmp             r4, r0
     87        beq             irc_begin_int_errata_1
     88        cmp             r3, #0
     89        bne             irc_begin_int_errata_2
     90        ldr             r1, =GICD_ISACTIVER(0)          /* 割込み要求があるかチェック */
     91        ldr             r0, [r1]
     92        tst             r0, #0x01
     93        movweq  r4, #1024                                       /* 無効な割込みとみなす */
     94ALABEL(irc_begin_int_errata_1)
     95        ldr             r1, =GICD_IPRIORITYR(0)         /* 割込み優先度レジスタ0に書き込み */
     96        ldr             r0, [r1]
     97        str             r0, [r1]
     98        asm_data_sync_barrier r0
     99ALABEL(irc_begin_int_errata_2)
     100#endif /* GIC_PL390_ERRATA */
    90101
    91102        /*
     
    107118
    108119        /*
    109          *  割込み番号を返値としてリターンする.
     120         *  r4に割込み番号を入れた状態でリターンする.
    110121         */
    111122        bx              lr
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/pl310.c

    r428 r429  
    4343
    4444#include "kernel_impl.h"
    45 #include "core_pl310.h"
     45#include "pl310.h"
    4646
    4747Inline uint32_t
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/tUartPL011.c

    r321 r429  
    11/*
    2  *  TOPPERS/ASP Kernel
    3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
    4  *      Advanced Standard Profile Kernel
    5  *
    6  *  Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
     2 *  TOPPERS Software
     3 *      Toyohashi Open Platform for Embedded Real-Time Systems
     4 *
     5 *  Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory
    76 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    87 *
     
    9594        CELLCB  *p_cellcb = GET_CELLCB(idx);
    9695
    97         /*
    98          *  UARTをディスエーブル
    99          */
    100         sil_wrw_mem(UART_CR(ATTR_baseAddress), 0U);
    101 
    102         /*
    103          *  エラーフラグをクリア
    104          */
    105         sil_wrw_mem(UART_ECR(ATTR_baseAddress), 0U);
    106 
    107         /*
    108          *  FIFOを空にする
    109          */
    110         while (uart_pl011_getready(p_cellcb)) {
    111                 (void) uart_pl011_getchar(p_cellcb);
    112         }
    113 
    114         /*
    115          *  ボーレートと通信規格を設定
    116          */
    117         sil_wrw_mem(UART_IBRD(ATTR_baseAddress), ATTR_ibrd);
    118         sil_wrw_mem(UART_FBRD(ATTR_baseAddress), ATTR_fbrd);
    119         sil_wrw_mem(UART_LCR_H(ATTR_baseAddress), ATTR_lcr_h);
    120                
    121         /*
    122          *  UARTをイネーブル
    123          */
    124         sil_wrw_mem(UART_CR(ATTR_baseAddress),
     96        if (!VAR_opened) {
     97                /*
     98                 *  既にオープンしている場合は、二重にオープンしない.
     99                 */
     100
     101                /*
     102                 *  UARTをディスエーブル
     103                 */
     104                sil_wrw_mem(UART_CR(ATTR_baseAddress), 0U);
     105
     106                /*
     107                 *  エラーフラグをクリア
     108                 */
     109                sil_wrw_mem(UART_ECR(ATTR_baseAddress), 0U);
     110
     111                /*
     112                 *  FIFOを空にする
     113                 */
     114                while (uart_pl011_getready(p_cellcb)) {
     115                        (void) uart_pl011_getchar(p_cellcb);
     116                }
     117
     118                /*
     119                 *  ボーレートと通信規格を設定
     120                 */
     121                sil_wrw_mem(UART_IBRD(ATTR_baseAddress), ATTR_ibrd);
     122                sil_wrw_mem(UART_FBRD(ATTR_baseAddress), ATTR_fbrd);
     123                sil_wrw_mem(UART_LCR_H(ATTR_baseAddress), ATTR_lcr_h);
     124
     125                /*
     126                 *  UARTをイネーブル
     127                 */
     128                sil_wrw_mem(UART_CR(ATTR_baseAddress),
    125129                                                UART_CR_UARTEN|UART_CR_TXE|UART_CR_RXE);
     130
     131                VAR_opened = true;
     132        }
    126133}
    127134
     
    134141        CELLCB  *p_cellcb = GET_CELLCB(idx);
    135142
    136         /*
    137          *  UARTをディスエーブル
    138          */
    139         sil_wrw_mem(UART_CR(ATTR_baseAddress), 0U);
     143        if (VAR_opened) {
     144                /*
     145                 *  UARTをディスエーブル
     146                 */
     147                sil_wrw_mem(UART_CR(ATTR_baseAddress), 0U);
     148
     149                VAR_opened = false;
     150        }
    140151}
    141152
     
    232243        }
    233244}
     245
     246/*
     247 *  SIOドライバの終了処理
     248 */
     249void
     250eTerminate_main(CELLIDX idx)
     251{
     252        eSIOPort_close(idx);
     253}
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/tUartPL011.cdl

    r321 r429  
    11/*
    2  *  TOPPERS/ASP Kernel
    3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
    4  *      Advanced Standard Profile Kernel
     2 *  TOPPERS Software
     3 *      Toyohashi Open Platform for Embedded Real-Time Systems
    54 *
    65 *  Copyright (C) 2015 by Ushio Laboratory
    76 *              Graduate School of Engineering Science, Osaka Univ., JAPAN
    8  *  Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     7 *  Copyright (C) 2015-2018 by Embedded and Real-Time Systems Laboratory
    98 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    109 *
     
    5857
    5958        entry   siHandlerBody   eiISR;
     59        entry   sRoutineBody    eTerminate;
    6060
    6161        attr {
     
    6565                uint8_t         lcr_h;                  /* ライン制御レジスタの設定値 */
    6666        };
     67        var {
     68                bool_t          opened = false; /* オープン済み */
     69        };
    6770};
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/common/uart_pl011.h

    r321 r429  
    11/*
    2  *  TOPPERS/ASP Kernel
    3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
    4  *      Advanced Standard Profile Kernel
     2 *  TOPPERS Software
     3 *      Toyohashi Open Platform for Embedded Real-Time Systems
    54 *
    65 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/Makefile.chip

    r321 r429  
    22#               Makefile のチップ依存部(RZ/A1用)
    33#
    4 #  $Id$
     4#  $Id: Makefile.chip 720 2016-04-01 22:16:17Z ertl-hiro $
    55#
    66
     
    2222#
    2323KERNEL_DIRS := $(KERNEL_DIRS) $(CHIPDIR)
     24KERNEL_COBJS := $(KERNEL_COBJS) chip_kernel_impl.o mpcore_kernel_impl.o \
     25                                                                        gic_kernel_impl.o pl310.o chip_timer.o
    2426KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) gic_support.o
    25 KERNEL_COBJS := $(KERNEL_COBJS) chip_kernel_impl.o gic_kernel_impl.o \
    26                                                                                                                         chip_timer.o
     27
     28#
     29#  システムサービスに関する定義
     30#
     31SYSSVC_DIRS := $(SYSSVC_DIRS) $(CHIPDIR)
    2732
    2833#
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/chip_kernel.h

    r321 r429  
    33 *      Toyohashi Open Platform for Embedded Real-Time Systems/
    44 *      Advanced Standard Profile Kernel
    5  *
    6  *  Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
     5 * 
     6 *  Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory
    77 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    8  *
     8 * 
    99 *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    1010 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     
    2929 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
    3030 *      免責すること.
    31  *
     31 * 
    3232 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
    3333 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     
    3535 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
    3636 *  の責任を負わない.
    37  *
     37 * 
    3838 *  $Id$
    3939 */
     
    4242 *              kernel.hのターゲット依存部(RZ/A1用)
    4343 *
    44  *  このヘッダファイルは,kernel.hからインクルードされる.他のファイル
    45  *  から直接インクルードすることはない.このファイルをインクルードする
    46  *  前に,t_stddef.hがインクルードされるので,それに依存してもよい.
     44 *  このヘッダファイルは,target_kernel.h(または,そこからインクルー
     45 *  ドされるファイル)のみからインクルードされる.他のファイルから直接
     46 *  インクルードしてはならない.
    4747 */
    4848
     
    6666 *  サポートできる機能の定義
    6767 *
    68  *  ena_int/dis_intとオーバランハンドラをサポートすることができる.
     68 *  ena_int/dis_int/clr_int/ras_int/prb_intとオーバランハンドラを
     69 *  サポートすることができる.
    6970 */
    7071#define TOPPERS_TARGET_SUPPORT_ENA_INT          /* ena_int */
    7172#define TOPPERS_TARGET_SUPPORT_DIS_INT          /* dis_int */
     73#define TOPPERS_TARGET_SUPPORT_CLR_INT          /* clr_int */
     74#define TOPPERS_TARGET_SUPPORT_RAS_INT          /* ras_int */
     75#define TOPPERS_TARGET_SUPPORT_PRB_INT          /* prb_int */
    7276#define TOPPERS_TARGET_SUPPORT_OVRHDR
    73 
    74 /*
    75  *  高分解能タイマのタイマ周期
    76  *
    77  *  2^32 / 33.33…を丸めた値とする.
    78  */
    79 #define TCYC_HRTCNT             128849019U
    80 
    81 /*
    82  *  高分解能タイマのカウント値の進み幅
    83  */
    84 #define TSTEP_HRTCNT    1U
    85 
    86 /*
    87  *  オーバランハンドラの残りプロセッサ時間に指定できる最大値
    88  *
    89  *  この値をOSタイマへの設定値に変換してタイマに設定した後,タイマの現
    90  *  在値を読み出してμ秒単位に変換できる値としている.タイマの現在値を
    91  *  μ秒単位に変換する時に34を加えるため,以下の条件を満たす最大の値と
    92  *  する.
    93  *              (TMAX_OVRTIM * 33 + TMAX_OVRTIM / 3 + 1) + 34 < 2^32
    94  */
    95 #define TMAX_OVRTIM             128849017U
    9677
    9778/*
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/chip_kernel.trb

    r321 r429  
    2727#  割込み要求ライン属性に関するターゲット依存のエラーチェック
    2828#
    29 $cfgData[:CFG_INT].each do |key, params|
    30   if $INTNO_IRQ0 <= key && key <= $INTNO_IRQ7
     29$cfgData[:CFG_INT].each do |_, params|
     30  if $INTNO_IRQ0 <= params[:intno] && params[:intno] <= $INTNO_IRQ7
    3131    # IRQ割込みの場合
    3232    #(TA_EDGEがセットされている場合)
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/chip_kernel_impl.c

    r321 r429  
    33 *      Toyohashi Open Platform for Embedded Real-Time Systems/
    44 *      Advanced Standard Profile Kernel
    5  *
     5 * 
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2006-2016 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
    10  *
     10 * 
    1111 *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    1212 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     
    3131 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
    3232 *      免責すること.
    33  *
     33 * 
    3434 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
    3535 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     
    3737 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
    3838 *  の責任を負わない.
    39  *
     39 * 
    4040 *  $Id$
    4141 */
     
    4646
    4747#include "kernel_impl.h"
     48#include <sil.h>
    4849#include "interrupt.h"
     50#include "pl310.h"
    4951
    5052/*
     
    5557{
    5658        /*
    57          *  キャッシュをディスエーブル
     59         *  MPCore依存の初期化
    5860         */
    59         arm_disable_cache();
     61        mpcore_initialize();
    6062
    6163        /*
    62          *  コア依存の初期化
     64         *  L2キャッシュコントローラ(PL310)の初期化
    6365         */
    64         core_initialize();
    65 
    66         /*
    67          *  キャッシュをイネーブル
    68          */
    69         arm_enable_cache();
    70 
    71         /*
    72          *  GICのディストリビュータの初期化
    73          */
    74         gicd_initialize();
    75 
    76         /*
    77          *  GICのCPUインタフェースの初期化
    78          */
    79         gicc_initialize();
    80 
    81         /*
    82          *  分岐予測の無効化とイネーブル
    83          */
    84         arm_invalidate_bp();
    85         arm_enable_bp();
     66        pl310_initialize(0x0U, ~0x0U);
    8667}
    8768
    8869/*
    89  *  チップ依存の終了処理
     70 *  チップ依存の終了処理
    9071 */
    9172void
    9273chip_terminate(void)
    9374{
    94         extern void    software_term_hook(void);
    95         void (*volatile fp)(void) = software_term_hook;
    96 
    9775        /*
    98          *  software_term_hookへのポインタを,一旦volatile指定のあるfpに代
    99          *  入してから使うのは,0との比較が最適化で削除されないようにするた
    100          *  めである.
     76         *  MPCore依存の終了処理
    10177         */
    102         if (fp != 0) {
    103                 (*fp)();
    104         }
    105 
    106         /*
    107          *  GICのCPUインタフェースの終了処理
    108          */
    109         gicc_terminate();
    110 
    111         /*
    112          *  GICのディストリビュータの終了処理
    113          */
    114         gicd_terminate();
    115 
    116         /*
    117          *  コア依存の終了処理
    118          */
    119         core_terminate();
     78        mpcore_terminate();
    12079}
    12180
     
    177136         */
    178137        gicd_set_priority(intno, INT_IPM(intpri));
    179         gicd_set_target(intno, 1U << arm_prc_index());
     138        gicd_set_target(intno, 1U << get_my_prcidx());
    180139
    181140        /*
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/chip_kernel_impl.h

    r321 r429  
    33 *      Toyohashi Open Platform for Embedded Real-Time Systems/
    44 *      Advanced Standard Profile Kernel
    5  *
     5 * 
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2006-2016 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
    10  *
     10 * 
    1111 *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    1212 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     
    3131 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
    3232 *      免責すること.
    33  *
     33 * 
    3434 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
    3535 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     
    3737 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
    3838 *  の責任を負わない.
    39  *
     39 * 
    4040 *  $Id$
    4141 */
     
    5858
    5959/*
    60  *  MMUの使用に関する設定
     60 *  デフォルトの非タスクコンテキスト用のスタック領域の定義
    6161 */
    62 #define USE_ARM_MMU
    63 #define USE_ARM_SSECTION
     62#ifndef DEFAULT_ISTKSZ
     63#define DEFAULT_ISTKSZ  0x2000U                 /* 8KB */
     64#endif /* DEFAULT_ISTKSZ */
    6465
    6566/*
     
    7071
    7172/*
    72  *  GIC依存部の割込み管理機能の初期化は使用しない.
     73 *  GIC 390 Errataへの対策を実施
     74 */
     75#define GIC_PL390_ERRATA
     76
     77/*
     78 *  GIC依存部の割込み管理機能の初期化は使用しない
    7379 */
    7480#define OMIT_GIC_INITIALIZE_INTERRUPT
    7581
    7682/*
    77  *  GICに関する定義,コアで共通な定義
    78  *
    79  *  core_kernel_impl.hは,gic_kernel_impl.hからインクルードされる.
     83 *  MPCoreで共通な定義
    8084 */
    81 #include "gic_kernel_impl.h"
     85#include "mpcore_kernel_impl.h"
    8286
    8387#ifndef TOPPERS_MACRO_ONLY
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/chip_rename.def

    r331 r429  
    66target_hrt_initialize
    77target_hrt_terminate
    8 target_hrt_set_event
    9 target_hrt_raise_event
    108target_hrt_handler
    119target_ovrtimer_initialize
    1210target_ovrtimer_terminate
    13 target_ovrtimer_stop
    14 target_ovrtimer_get_current
    1511target_ovrtimer_handler
    1612
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/chip_rename.h

    r321 r429  
    1515#define target_hrt_initialize           _kernel_target_hrt_initialize
    1616#define target_hrt_terminate            _kernel_target_hrt_terminate
    17 #define target_hrt_set_event            _kernel_target_hrt_set_event
    18 #define target_hrt_raise_event          _kernel_target_hrt_raise_event
    1917#define target_hrt_handler                      _kernel_target_hrt_handler
    2018#define target_ovrtimer_initialize      _kernel_target_ovrtimer_initialize
    2119#define target_ovrtimer_terminate       _kernel_target_ovrtimer_terminate
    22 #define target_ovrtimer_stop            _kernel_target_ovrtimer_stop
    23 #define target_ovrtimer_get_current     _kernel_target_ovrtimer_get_current
    2420#define target_ovrtimer_handler         _kernel_target_ovrtimer_handler
    2521
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/chip_stddef.h

    r321 r429  
    1 /*
    2  *  TOPPERS Software
    3  *      Toyohashi Open Platform for Embedded Real-Time Systems
    4  *
    5  *  Copyright (C) 2007 by Embedded and Real-Time Systems Laboratory
    6  *              Graduate School of Information Science, Nagoya Univ., JAPAN
    7  *  Copyright (C) 2011-2016 by Embedded and Real-Time Systems Laboratory
    8  *              Graduate School of Information Science, Nagoya Univ., JAPAN
    9  *
    10  *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    11  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
    12  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
    13  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    14  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
    15  *      スコード中に含まれていること.
    16  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    17  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
    18  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
    19  *      の無保証規定を掲載すること.
    20  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    21  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
    22  *      と.
    23  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
    24  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
    25  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
    26  *        報告すること.
    27  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    28  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
    29  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
    30  *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
    31  *      免責すること.
    32  *
    33  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
    34  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    35  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
    36  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
    37  *  の責任を負わない.
    38  *
    39  *  $Id$
    40  */
    41 
    421/*
    432 *              t_stddef.hのチップ依存部(RZ/A1用)
     
    465 *  されるファイル)のみからインクルードされる.他のファイルから直接イ
    476 *  ンクルードしてはならない.
     7 *
     8 *  $Id$
    489 */
    4910
     
    6425
    6526/*
     27 *  開発環境で共通な定義
     28 */
     29#ifndef TOPPERS_MACRO_ONLY
     30#include <stdint.h>
     31#endif /* TOPPERS_MACRO_ONLY */
     32
     33#define TOPPERS_STDFLOAT_TYPE1
     34#include "tool_stddef.h"
     35
     36/*
    6637 *  コアで共通な定義
    6738 */
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/chip_sym.def

    r331 r429  
    1 TARGET_RZA1H,true,bool,defined(TARGET_RZA1H)
    2 TARGET_RZA1L,true,bool,defined(TARGET_RZA1L)
     1TARGET_RZA1H,true,bool,defined(TARGET_RZA1H),false
     2TARGET_RZA1L,true,bool,defined(TARGET_RZA1L),false
    33TA_NEGEDGE
    44TA_POSEDGE
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/chip_timer.c

    r321 r429  
    44 *      Advanced Standard Profile Kernel
    55 *
    6  *  Copyright (C) 2006-2017 by Embedded and Real-Time Systems Laboratory
     6 *  Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory
    77 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    88 *
     
    100100
    101101/*
    102  *  高分解能タイマへの割込みタイミングの設定
    103  */
    104 void
    105 target_hrt_set_event(HRTCNT hrtcnt)
    106 {
    107         uint32_t        cnt = hrtcnt * 33 + hrtcnt / 3 + 1;
    108         uint32_t        current;
    109 
    110         /*
    111          *  現在のカウント値を読み,hrtcnt後に割込みが発生するように設定する.
    112          */
    113         current = sil_rew_mem(OSTM_CNT(OSTM0_BASE));
    114         sil_wrw_mem(OSTM_CMP(OSTM0_BASE), current + cnt);
    115 
    116         /*
    117          *  上で現在のカウント値を読んで以降に,cnt以上カウントアップしてい
    118          *  た場合には,割込みを発生させる.
    119          */
    120         if (sil_rew_mem(OSTM_CNT(OSTM0_BASE)) - current >= cnt) {
    121                 raise_int(INTNO_OSTM0);
    122         }
    123 }
    124 
    125 /*
    126  *  高分解能タイマ割込みの要求
    127  */
    128 void
    129 target_hrt_raise_event(void)
    130 {
    131         raise_int(INTNO_OSTM0);
    132 }
    133 
    134 /*
    135102 *  タイマ割込みハンドラ
    136103 */
     
    143110        signal_time();
    144111}
     112
    145113/*
    146114 *  オーバランタイマドライバ
     
    183151
    184152/*
    185  *  オーバランタイマの停止
    186  */
    187 PRCTIM
    188 target_ovrtimer_stop(void)
    189 {
    190         uint32_t        cnt;
    191 
    192         /*
    193          *  OSタイマを停止する.
    194          */
    195         sil_wrb_mem(OSTM_TT(OSTM1_BASE), OSTM_TT_STOP);
    196 
    197         if (probe_int(INTNO_OSTM1)) {
    198                 /*
    199                  *  割込み要求が発生している場合
    200                  */
    201                 clear_int(INTNO_OSTM1);
    202                 return(0U);
    203         }
    204         else {
    205                 cnt = sil_rew_mem(OSTM_CNT(OSTM1_BASE));
    206                 return((PRCTIM)((cnt + 34) / 5 * 3 / 20));
    207         }
    208 }
    209 
    210 /*
    211  *  オーバランタイマの現在値の読出し
    212  */
    213 PRCTIM
    214 target_ovrtimer_get_current(void)
    215 {
    216         uint32_t        cnt;
    217 
    218         if (probe_int(INTNO_OSTM1)) {
    219                 /*
    220                  *  割込み要求が発生している場合
    221                  */
    222                 return(0U);
    223         }
    224         else {
    225                 cnt = sil_rew_mem(OSTM_CNT(OSTM1_BASE));
    226                 return((PRCTIM)((cnt + 34) / 5 * 3 / 20));
    227         }
    228 }
    229 
    230 /*
    231153 *  オーバランタイマ割込みハンドラ
    232154 *
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/chip_timer.cfg

    r321 r429  
    11/*
    2  *              タイマドライバのコンフィギュレーションファイル
     2 *              タイマドライバのコンフィギュレーションファイル(RZ/A1 OSタイマ用)
    33 *
    44 *  $Id$
     
    1010ATT_INI({ TA_NULL, 0, _kernel_target_hrt_initialize });
    1111ATT_TER({ TA_NULL, 0, _kernel_target_hrt_terminate });
     12
    1213CFG_INT(INTNO_TIMER, { TA_ENAINT|INTATR_TIMER, INTPRI_TIMER });
    1314DEF_INH(INHNO_TIMER, { TA_NULL, _kernel_target_hrt_handler });
     
    1718 */
    1819#ifdef TOPPERS_SUPPORT_OVRHDR
     20
    1921ATT_INI({ TA_NULL, 0, _kernel_target_ovrtimer_initialize });
    2022ATT_TER({ TA_NULL, 0, _kernel_target_ovrtimer_terminate });
     23
    2124CFG_INT(INTNO_OVRTIMER, { TA_ENAINT|INTATR_OVRTIMER, INTPRI_OVRTIMER });
    2225DEF_INH(INHNO_OVRTIMER, { TA_NULL, _kernel_target_ovrtimer_handler });
     26
    2327#endif /* TOPPERS_SUPPORT_OVRHDR */
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/chip_timer.h

    r321 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2005-2018 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    5151#define TOPPERS_CHIP_TIMER_H
    5252
     53#include "kernel/kernel_impl.h"
    5354#include <sil.h>
    5455#include "rza1.h"
     
    140141 *  生させるように設定する.
    141142 */
    142 extern void target_hrt_set_event(HRTCNT hrtcnt);
     143Inline void
     144target_hrt_set_event(HRTCNT hrtcnt)
     145{
     146        uint32_t        cnt = hrtcnt * 33 + hrtcnt / 3 + 1;
     147        uint32_t        current;
     148
     149        /*
     150         *  現在のカウント値を読み,hrtcnt後に割込みが発生するように設定する.
     151         */
     152        current = sil_rew_mem(OSTM_CNT(OSTM0_BASE));
     153        sil_wrw_mem(OSTM_CMP(OSTM0_BASE), current + cnt);
     154
     155        /*
     156         *  上で現在のカウント値を読んで以降に,cnt以上カウントアップしてい
     157         *  た場合には,割込みを発生させる.
     158         */
     159        if (sil_rew_mem(OSTM_CNT(OSTM0_BASE)) - current >= cnt) {
     160                raise_int(INTNO_OSTM0);
     161        }
     162}
    143163
    144164/*
    145165 *  高分解能タイマ割込みの要求
    146166 */
    147 extern  void target_hrt_raise_event(void);
     167Inline void
     168target_hrt_raise_event(void)
     169{
     170        raise_int(INTNO_OSTM0);
     171}
    148172
    149173/*
     
    184208 *  オーバランタイマの停止
    185209 */
    186 extern PRCTIM target_ovrtimer_stop(void);
     210Inline PRCTIM
     211target_ovrtimer_stop(void)
     212{
     213        uint32_t        cnt;
     214
     215        /*
     216         *  OSタイマを停止する.
     217         */
     218        sil_wrb_mem(OSTM_TT(OSTM1_BASE), OSTM_TT_STOP);
     219
     220        if (probe_int(INTNO_OSTM1)) {
     221                /*
     222                 *  割込み要求が発生している場合
     223                 */
     224                clear_int(INTNO_OSTM1);
     225                return(0U);
     226        }
     227        else {
     228                cnt = sil_rew_mem(OSTM_CNT(OSTM1_BASE));
     229                return((PRCTIM)((cnt + 34) / 5 * 3 / 20));
     230        }
     231}
    187232
    188233/*
    189234 *  オーバランタイマの現在値の読出し
    190235 */
    191 extern PRCTIM target_ovrtimer_get_current(void);
     236Inline PRCTIM
     237target_ovrtimer_get_current(void)
     238{
     239        uint32_t        cnt;
     240
     241        if (probe_int(INTNO_OSTM1)) {
     242                /*
     243                 *  割込み要求が発生している場合
     244                 */
     245                return(0U);
     246        }
     247        else {
     248                cnt = sil_rew_mem(OSTM_CNT(OSTM1_BASE));
     249                return((PRCTIM)((cnt + 34) / 5 * 3 / 20));
     250        }
     251}
    192252
    193253/*
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/chip_unrename.h

    r321 r429  
    1616#undef target_hrt_initialize
    1717#undef target_hrt_terminate
    18 #undef target_hrt_set_event
    19 #undef target_hrt_raise_event
    2018#undef target_hrt_handler
    2119#undef target_ovrtimer_initialize
    2220#undef target_ovrtimer_terminate
    23 #undef target_ovrtimer_stop
    24 #undef target_ovrtimer_get_current
    2521#undef target_ovrtimer_handler
    2622
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/rza1.h

    r321 r429  
    22 *  TOPPERS Software
    33 *      Toyohashi Open Platform for Embedded Real-Time Systems
    4  *
    5  *  Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
     4 * 
     5 *  Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory
    66 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    7  *
     7 * 
    88 *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    99 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     
    2828 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
    2929 *      免責すること.
    30  *
     30 * 
    3131 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
    3232 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     
    3434 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
    3535 *  の責任を負わない.
    36  *
     36 * 
    3737 *  $Id$
    3838 */
     
    4545#define TOPPERS_RZA1_H
    4646
     47#include <kernel.h>
    4748#include <sil.h>
     49#include "arm.h"
    4850
    4951/*
     
    8486
    8587/*
     88 *  CP15の補助制御レジスタ(ACTLR)の設定値
     89 */
     90#define CP15_ACTLR_SMP          UINT_C(0x00000040)
     91
     92/*
    8693 *  GIC依存部を使用するための定義
    8794 */
     
    9299#define GIC_TNUM_INTNO          UINT_C(538)
    93100#endif /* TOPPERS_RZA1H */
    94 #endif /* GIC_TNUM_INT */
     101#endif /* GIC_TNUM_INTNO */
    95102
    96103/*
     
    256263        reg = sil_reh_mem(RZA1_IRQRR);
    257264        reg &= ~(0x01U << (intno - INTNO_IRQ0));
    258         sil_wrh_mem(RZA1_IRQRR, reg);
     265        sil_swrh_mem(RZA1_IRQRR, reg);
    259266}
    260267
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/scif.h

    r321 r429  
    11/*
    2  *  TOPPERS/ASP Kernel
    3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
    4  *      Advanced Standard Profile Kernel
    5  *
     2 *  TOPPERS Software
     3 *      Toyohashi Open Platform for Embedded Real-Time Systems
     4 *
    65 *  Copyright (C) 2001-2011 by Industrial Technology Institute,
    76 *                              Miyagi Prefectural Government, JAPAN
    87 *  Copyright (C) 2007-2016 by Embedded and Real-Time Systems Laboratory
    98 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    10  *
     9 * 
    1110 *  上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    1211 *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     
    3130 *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
    3231 *      免責すること.
    33  *
     32 * 
    3433 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
    3534 *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     
    3736 *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
    3837 *  の責任を負わない.
    39  *
     38 * 
    4039 *  $Id$
    4140 */
     
    6665 *  シリアルモードレジスタ(SCIF_SCSMR)の設定値
    6766 */
     67#define SCIF_SCSMR_ASYNC        0x0000U         /* 調歩同期式モード */
    6868#define SCIF_SCSMR_SYNC         0x0080U         /* クロック同期式モード */
     69#define SCIF_SCSMR_8BIT         0x0000U         /* 8ビットデータ */
    6970#define SCIF_SCSMR_7BIT         0x0040U         /* 7ビットデータ */
    70 #define SCIF_SCSMR_PARITY       0x0020U         /* パリティビットの付加 */
     71#define SCIF_SCSMR_NOPARITY     0x0000U         /* パリティビットなし */
     72#define SCIF_SCSMR_PARITY       0x0020U         /* パリティビット付加 */
     73#define SCIF_SCSMR_EVEN         0x0000U         /* 偶数パリティ */
    7174#define SCIF_SCSMR_ODD          0x0010U         /* 奇数パリティ */
     75#define SCIF_SCSMR_1STOP        0x0000U         /* 1ストッピビット */
    7276#define SCIF_SCSMR_2STOP        0x0008U         /* 2ストッピビット */
    7377#define SCIF_SCSMR_CKS1         0x0000U         /* P1φクロック1 */
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/tSCIF.c

    r321 r429  
    11/*
    2  *  TOPPERS/ASP Kernel
    3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
    4  *      Advanced Standard Profile Kernel
     2 *  TOPPERS Software
     3 *      Toyohashi Open Platform for Embedded Real-Time Systems
    54 *
    6  *  Copyright (C) 2006-2016 by Embedded and Real-Time Systems Laboratory
     5 *  Copyright (C) 2006-2019 by Embedded and Real-Time Systems Laboratory
    76 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    87 *
     
    133132        uint_t  brr;
    134133
    135         if (VAR_initialized) {
    136                 /*
    137                  *  既に初期化している場合は、二重に初期化しない.
    138                  */
    139                 return;
    140         }
    141 
    142         brr = SCIF_CLK / (32 * ATTR_baudRate) - 1;
    143         assert(brr <= 255);
    144 
    145         sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress), 0U);
    146         sil_wrh_mem(SCIF_SCFCR(ATTR_baseAddress),
     134        if (!VAR_opened) {
     135                /*
     136                 *  既にオープンしている場合は、二重にオープンしない.
     137                 */
     138                brr = SCIF_CLK / (32 * ATTR_baudRate) - 1;
     139                assert(brr <= 255);
     140
     141                sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress), 0U);
     142                sil_wrh_mem(SCIF_SCFCR(ATTR_baseAddress),
    147143                                                        SCIF_SCFCR_TFRST|SCIF_SCFCR_RFRST);
    148         (void) sil_reh_mem(SCIF_SCFSR(ATTR_baseAddress));
    149         (void) sil_reh_mem(SCIF_SCLSR(ATTR_baseAddress));
    150         sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress), 0U);
    151         sil_wrh_mem(SCIF_SCLSR(ATTR_baseAddress), 0U);
    152         sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress), SCIF_SCSCR_INTCLK);
    153         sil_wrh_mem(SCIF_SCSMR(ATTR_baseAddress), SCIF_SCSMR_CKS1);
    154         sil_wrh_mem(SCIF_SCEMR(ATTR_baseAddress), 0U);
    155         sil_wrb_mem(SCIF_SCBRR(ATTR_baseAddress), (uint8_t) brr);
    156         sil_wrh_mem(SCIF_SCFCR(ATTR_baseAddress),
     144                (void) sil_reh_mem(SCIF_SCFSR(ATTR_baseAddress));
     145                (void) sil_reh_mem(SCIF_SCLSR(ATTR_baseAddress));
     146                sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress), 0U);
     147                sil_wrh_mem(SCIF_SCLSR(ATTR_baseAddress), 0U);
     148                sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress), SCIF_SCSCR_INTCLK);
     149                sil_wrh_mem(SCIF_SCSMR(ATTR_baseAddress),
     150                                                        SCIF_SCSMR_ASYNC|ATTR_mode|SCIF_SCSMR_CKS1);
     151                sil_wrh_mem(SCIF_SCEMR(ATTR_baseAddress), 0U);
     152                sil_wrb_mem(SCIF_SCBRR(ATTR_baseAddress), (uint8_t) brr);
     153                sil_wrh_mem(SCIF_SCFCR(ATTR_baseAddress),
    157154                                        SCIF_SCFCR_RSTRG_15|SCIF_SCFCR_RTRG_1|SCIF_SCFCR_TTRG_8);
    158         sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress),
     155                sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress),
    159156                                        SCIF_SCSCR_TE|SCIF_SCSCR_RE|SCIF_SCSCR_INTCLK);
    160157
    161         while ((sil_reh_mem(SCIF_SCFSR(ATTR_baseAddress)) & SCIF_SCFSR_RDF) != 0U) {
    162                 (void) sil_reb_mem(SCIF_SCFRDR(ATTR_baseAddress));
    163                 sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress), (uint16_t) ~(SCIF_SCFSR_RDF));
    164         }
    165         sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress), 0U);
    166 
    167         VAR_initialized = true;
     158                while ((sil_reh_mem(SCIF_SCFSR(ATTR_baseAddress)) & SCIF_SCFSR_RDF)
     159                                                                                                                                        != 0U) {
     160                        (void) sil_reb_mem(SCIF_SCFRDR(ATTR_baseAddress));
     161                        sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress),
     162                                                        (uint16_t) ~(SCIF_SCFSR_RDF));
     163                }
     164                sil_wrh_mem(SCIF_SCFSR(ATTR_baseAddress), 0U);
     165
     166                VAR_opened = true;
     167        }
    168168}
    169169
     
    176176        CELLCB  *p_cellcb = GET_CELLCB(idx);
    177177
    178         sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress), 0U);
     178        if (VAR_opened) {
     179                sil_wrh_mem(SCIF_SCSCR(ATTR_baseAddress), 0U);
     180
     181                VAR_opened = false;
     182        }
    179183}
    180184
     
    284288        }
    285289}
     290
     291/*
     292 *  SIOドライバの終了処理
     293 */
     294void
     295eTerminate_main(CELLIDX idx)
     296{
     297        CELLCB  *p_cellcb = GET_CELLCB(idx);
     298
     299        if (VAR_opened) {
     300                /*
     301                 *  送信FIFOが空になるまで待つ
     302                 */
     303                while ((sil_reh_mem(SCIF_SCFSR(ATTR_baseAddress))
     304                                                                                        & SCIF_SCFSR_TEND) == 0U) ;
     305                /*
     306                 *  ポートのクローズ
     307                 */
     308                eSIOPort_close(idx);
     309        }
     310}
  • EcnlProtoTool/trunk/asp3_dcre/arch/arm_gcc/rza1/tSCIF.cdl

    r321 r429  
    55 *  Copyright (C) 2015 by Ushio Laboratory
    66 *              Graduate School of Engineering Science, Osaka Univ., JAPAN
    7  *  Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     7 *  Copyright (C) 2015-2018 by Embedded and Real-Time Systems Laboratory
    88 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    99 *
     
    6161        entry   siHandlerBody   eiRxISR;
    6262        entry   siHandlerBody   eiTxISR;
     63        entry   sRoutineBody    eTerminate;
    6364
    6465        attr {
    6566                uintptr_t       baseAddress;    /* SCIFレジスタのベースアドレス */
    66                 uint32_t        baudRate;               /* ボーレートの設定値 */
     67                uint16_t        mode;                   /* モードレジスタの設定値 */
     68                uint32_t        baudRate;               /* ボーレート */
    6769        };
    6870        var {
    69                 bool_t          initialized = false;    /* 初期化済み */
     71                bool_t          opened = false; /* オープン済み */
    7072        };
    7173};
  • EcnlProtoTool/trunk/asp3_dcre/arch/gcc/tool_stddef.h

    r321 r429  
    55 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    66 *                              Toyohashi Univ. of Technology, JAPAN
    7  *  Copyright (C) 2004-2011 by Embedded and Real-Time Systems Laboratory
     7 *  Copyright (C) 2004-2018 by Embedded and Real-Time Systems Laboratory
    88 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    99 *
     
    9090 *
    9191 *  TOPPERS_STDINT_TYPE1: char/short/int/long longのビット長がそれぞれ
    92  *                        8/16/32/64ビットで,ポインタのビット長がlong
    93  *                        のビット長と一致する場合
     92 *                        8/16/32/64ビットで,size_tとポインタのビット
     93 *                        長がlongのビット長と一致する場合
    9494 */
    9595#ifdef TOPPERS_STDINT_TYPE1
     
    177177#define INT_LEAST8_MIN          INT8_MIN
    178178#define UINT_LEAST8_MAX         INT8_MAX
     179
     180#define SIZE_MAX                        ULONG_MAX
    179181
    180182#endif /* TOPPERS_STDINT_TYPE1 */
  • EcnlProtoTool/trunk/asp3_dcre/arch/tracelog/tTraceLog.c

    r331 r429  
    55 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    66 *                              Toyohashi Univ. of Technology, JAPAN
    7  *  Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
     7 *  Copyright (C) 2005-2019 by Embedded and Real-Time Systems Laboratory
    88 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    99 *
     
    4848#include "kernel/task.h"
    4949#include "kernel/time_event.h"
     50#ifdef TOPPERS_SUPPORT_PROTECT
     51#include "kernel/domain.h"
     52#endif /* TOPPERS_SUPPORT_PROTECT */
    5053#include <sil.h>
    5154#include <log_output.h>
     
    5659 *
    5760 *  デフォルトでは,ログ時刻として,高分解能タイマのカウント値を用いて
    58  *  いる.ターゲット依存で変更する場合には,SYSLOG_GET_LOGTIMに,ログ時
     61 *  いる.ターゲット依存で変更する場合には,TRACE_GET_LOGTIMに,ログ時
    5962 *  刻を取り出すマクロを定義する.
    6063 */
    61 #ifndef SYSLOG_GET_LOGTIM
    62 #define SYSLOG_GET_LOGTIM(p_logtim) \
     64#ifndef TRACE_GET_LOGTIM
     65#define TRACE_GET_LOGTIM(p_logtim) \
    6366                                (*(p_logtim) = target_hrt_get_current())
    64 #endif /* SYSLOG_GET_TIM */
    65 
    66 /*
    67  *  トレースログの開始
     67#endif /* TRACE_GET_TIM */
     68
     69/*
     70 *  トレースログの開始(受け口関数)
    6871 */
    6972ER
     
    8184
    8285/*
    83  *  トレースログの書込み
     86 *  トレースログの書込み(受け口関数)
    8487 */
    8588ER
     
    9497                 *  トレース時刻の設定
    9598                 */
    96                 SYSLOG_GET_LOGTIM(&(((SYSLOG *) p_trace)->logtim));
     99                TRACE_GET_LOGTIM(&(((SYSLOG *) p_trace)->logtim));
    97100
    98101                /*
     
    121124
    122125/*
    123  *  トレースログの読出し
     126 *  トレースログの読出し(受け口関数)
    124127 */
    125128ER
     
    203206        p_tcb = (TCB *) info;
    204207        if (p_tcb == NULL) {
    205                 tskid = 0;
     208                tskid = TSK_NONE;
    206209        }
    207210        else {
     
    240243}
    241244
     245#ifdef TOPPERS_SUPPORT_PROTECT
     246
     247static intptr_t
     248get_somid(intptr_t info)
     249{
     250        SOMINIB *p_sominib;
     251        ID              somid;
     252
     253        p_sominib = (SOMINIB *) info;
     254        if (p_sominib == NULL) {
     255                somid = TSOM_STP;
     256        }
     257        else {
     258                somid = SOMID(p_sominib);
     259        }
     260        return((intptr_t) somid);
     261}
     262
     263static intptr_t
     264get_twd_domid(intptr_t info)
     265{
     266        TWDINIB *p_twdinib;
     267        ID              domid;
     268
     269        p_twdinib = (TWDINIB *) info;
     270        domid = (ID)(p_twdinib->p_dominib - dominib_table) + TMIN_DOMID;
     271        return((intptr_t) domid);
     272}
     273
     274#endif /* TOPPERS_SUPPORT_PROTECT */
     275
    242276/*
    243277 *  トレースログの表示
     
    267301                tracemsg = "dispatch to task %d.";
    268302                break;
     303
     304#ifdef TOPPERS_SUPPORT_PROTECT
     305        case LOG_TYPE_SCYC|LOG_START:
     306                traceinfo[0] = get_somid(p_trace->logpar[0]);
     307                tracemsg = "system cycle starts with system operating mode %d.";
     308                break;
     309        case LOG_TYPE_TWD|LOG_START:
     310                if (p_trace->logpar[0] == 0) {
     311                        tracemsg = "idle window starts.";
     312                }
     313                else {
     314                        traceinfo[0] = get_twd_domid(p_trace->logpar[0]);
     315                        tracemsg = "time window for domain %d starts.";
     316                }
     317                break;
     318#endif /* TOPPERS_SUPPORT_PROTECT */
     319
    269320        case LOG_TYPE_COMMENT:
    270321                for (i = 1; i < TNUM_LOGPAR; i++) {
     
    313364}
    314365
    315 /* 
    316  *  トレースログのダンプ
    317  */
    318 void
    319 eTraceLog_dump(void)
     366/*
     367 *  トレースログのダンプ(受け口関数)
     368 */
     369void
     370eDump_main(uintptr_t exinf)
    320371{
    321372        TRACE   trace;
     
    325376        }
    326377}
    327 
    328 /*
    329  *  トレースログのダンプ(受け口関数)
    330  */
    331 void
    332 tTraceLog_eDump_main(uintptr_t exinf)
    333 {
    334         eTraceLog_dump();
    335 }
  • EcnlProtoTool/trunk/asp3_dcre/arch/tracelog/tTraceLog.cdl

    r321 r429  
    11/*
    2  *  TOPPERS/ASP Kernel
    3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
    4  *      Advanced Standard Profile Kernel
     2 *  TOPPERS Software
     3 *      Toyohashi Open Platform for Embedded Real-Time Systems
    54 *
    65 *  Copyright (C) 2015 by Ushio Laboratory
    76 *              Graduate School of Engineering Science, Osaka Univ., JAPAN
    8  *  Copyright (C) 2015,2016 by Embedded and Real-Time Systems Laboratory
     7 *  Copyright (C) 2015-2018 by Embedded and Real-Time Systems Laboratory
    98 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    109 *
     
    6867         */
    6968        ER              read([out] TRACE *p_trace);
    70 
    71         /*
    72          *  トレースログのダンプ
    73          */
    74         void    dump(void);
    7569};
    7670
     
    8175celltype tTraceLog {
    8276        entry   sTraceLog               eTraceLog;
    83         entry   sRoutineBody    eDump;          /* 終了処理ルーチンとの接続 */
    84         call    sPutLog                 cPutLog;        /* 低レベル出力との接続 */
     77        entry   sRoutineBody    eDump;          /* トレースログのダンプ */
     78        call    sPutLog                 cPutLog;        /* ダンプ先との接続 */
    8579
    8680        attr {
  • EcnlProtoTool/trunk/asp3_dcre/arch/tracelog/trace_log.h

    r331 r429  
    55 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    66 *                              Toyohashi Univ. of Technology, JAPAN
    7  *  Copyright (C) 2004-2016 by Embedded and Real-Time Systems Laboratory
     7 *  Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
    88 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    99 *
     
    4141
    4242/*
    43  *              トレースログに関する設定
     43 *              トレースログ機能のヘッダファイル
    4444 *
    4545 *  このインクルードファイルは,target_kernel_impl.hおよび
    46  *  target_syssvc.hのみからインクルードされる.また,トレースログ機能の
    47  *  初期化や記録の開始/停止,トレースログのダンプを行うプログラムから
    48  *  ンクルードすることを想定している.
    49  */
    50 
    51 #ifndef TOPPERS_TRACE_CONFIG_H
    52 #define TOPPERS_TRACE_CONFIG_H
     46 *  target_syssvc.hからインクルードされる.また,トレースログ機能の初
     47 *  期化や記録の開始/停止,トレースログのダンプを行うプログラムからイ
     48 *  ンクルードすることを想定している.
     49 */
     50
     51#ifndef TOPPERS_TRACE_LOG_H
     52#define TOPPERS_TRACE_LOG_H
    5353
    5454/*
     
    7575
    7676/*
    77  *  TECSで記述されたテストプログラム用のサービスを直接呼び出すための定義
     77 *  TECSで記述されたトレースログ機能を直接呼び出すための定義
    7878 *
    7979 *  C言語で記述されたアプリケーションから,TECSで記述されたトレースログ
     
    134134
    135135Inline void
    136 trace_write_1(uint_t type, intptr_t arg1)
     136trace_write_1(uint_t type, LOGPAR arg1)
    137137{
    138138        TRACE   trace;
     
    144144
    145145Inline void
    146 trace_write_2(uint_t type, intptr_t arg1, intptr_t arg2)
     146trace_write_2(uint_t type, LOGPAR arg1, LOGPAR arg2)
    147147{
    148148        TRACE   trace;
     
    155155
    156156Inline void
    157 trace_write_3(uint_t type, intptr_t arg1, intptr_t arg2, intptr_t arg3)
     157trace_write_3(uint_t type, LOGPAR arg1, LOGPAR arg2, LOGPAR arg3)
    158158{
    159159        TRACE   trace;
     
    174174
    175175#define trace_1(type, arg1) \
    176                                 trace_write_1(type, (intptr_t)(arg1))
     176                                trace_write_1(type, (LOGPAR)(arg1))
    177177
    178178#define trace_2(type, arg1, arg2) \
    179                                 trace_write_2(type, (intptr_t)(arg1), (intptr_t)(arg2))
     179                                trace_write_2(type, (LOGPAR)(arg1), (LOGPAR)(arg2))
    180180
    181181#define trace_3(type, arg1, arg2, arg3) \
    182                                 trace_write_3(type, (intptr_t)(arg1), (intptr_t)(arg2), \
    183                                                                                                                 (intptr_t)(arg3))
     182                                trace_write_3(type, (LOGPAR)(arg1), (LOGPAR)(arg2), \
     183                                                                                                                (LOGPAR)(arg3))
    184184
    185185/*
    186186 *  トレースログのダンプ
    187  *
    188  *  トレースログをダンプする.終了処理ルーチンとして登録することも想定
    189  *  している.引数として,ダンプ先となる文字出力関数へのポインタを渡す.
    190  *  ターゲット依存の低レベル文字出力を利用する場合には,target_putcを渡
    191  *  す.
    192187 */
    193188Inline void
     
    203198 */
    204199#define LOG_TSKSTAT(p_tcb)              trace_2(LOG_TYPE_TSKSTAT, p_tcb, p_tcb->tstat)
     200
     201#define LOG_DSP_LEAVE(p_tcb)    trace_1(LOG_TYPE_DSP|LOG_LEAVE, p_tcb)
     202
     203#ifdef TOPPERS_SUPPORT_PROTECT
     204#define LOG_SCYC_START(p_sominib)       trace_1(LOG_TYPE_SCYC|LOG_START, p_sominib)
     205#define LOG_TWD_START(p_twdinib)        trace_1(LOG_TYPE_TWD|LOG_START, p_twdinib)
     206#endif /* TOPPERS_SUPPORT_PROTECT */
    205207
    206208#define LOG_TSYSLOG_ESYSLOG_WRITE_ENTER(priority, p_syslog) \
    207209                                                                trace_wri_log((TRACE *) p_syslog)
    208210
    209 #endif /* TOPPERS_TRACE_CONFIG_H */
     211#endif /* TOPPERS_TRACE_LOG_H */
Note: See TracChangeset for help on using the changeset viewer.