TOPPERS/FMPカーネルソース勉強会(1) start.S

TOPPERS/FMPカーネルソース勉強会(1) start.S

 <この項は書きかけです。順次追記します。>

アセンブラのソースコードの拡張子はSを使う。
最初に呼び出すコード。

~/workdir/RPi64Toppers/fmp/target/rpi_arm64_gcc/start.S

```start.S
/*
 *  TOPPERS Software
 *      Toyohashi Open Platform for Embedded Real-Time Systems
 *
 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
 *                              Toyohashi Univ. of Technology, JAPAN
 *  Copyright (C) 2005-2017 by Embedded and Real-Time Systems Laboratory
 *              Graduate School of Information Science, Nagoya Univ., JAPAN
 *
 *  上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
 *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
 *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
 *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
 *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
 *      スコード中に含まれていること．
 *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
 *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
 *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
 *      の無保証規定を掲載すること．
 *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
 *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
 *      と．
 *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
 *        作権表示，この利用条件および下記の無保証規定を掲載すること．
 *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
 *        報告すること．
 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
 *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
 *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
 *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
 *      免責すること．
 *
 *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
 *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
 *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
 *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
 *  の責任を負わない．
 *
 *  @(#) $Id: start.S 1148 2016-01-08 08:15:59Z ertl-toshinaga $
 */

/*
 *  カーネル用のスタートアップモジュール(RPI-ARM64用)
 */
#define TOPPERS_MACRO_ONLY
#define UINT_C(val)     (val)       /* uint_t型の定数を作るマクロ */
#define ULONG_C(val)    (val)       /* ulong_t型の定数を作るマクロ */

#include "kernel_impl.h"
#include "target_asm.inc"

/*
 *  同期用のマジックナンバー
 */
#define MAGIC_START 0x87654321

/*
 *  startのデバッグ
 */
//#define DEBUG_CORE0
#define DEBUG_JTAG
//#define DEBUG_MU
//#define DEBUG_STUB

    ATEXT
    AALIGN(2)
    AGLOBAL(start)
ALABEL(start)

#ifdef DEBUG_CORE0
    /*
     *  コア0だけ実行
     */
ALABEL(dbgcore0)
    mrs   x0, mpidr_el1
    ldr   x1, =MPIDR_AFF0_MASK
    and   x0, x0, x1
    cmp   x0, xzr
    b.eq  dbgcore0_exit
ALABEL(dbgcore0_sleep)
    wfi
    b     dbgcore0_sleep
ALABEL(dbgcore0_exit)
#endif /* DEBUG_CORE0 */

#ifdef DEBUG_JTAG
    /*
     *  JTAGの有効化
     */
ALABEL(dbgjtag)
    mrs   x0, mpidr_el1
    ldr   x1, =MPIDR_AFF0_MASK
    and   x0, x0, x1
    cmp   x0, xzr
    b.ne  dbgjtag_exit
ALABEL(dbgjtag_gpfsel)
    ldr   x0, =GPIO_GPFSEL2
    ldr   w1, [x0]
    mov   w3, #7            /* FSEL22 <= ALT4 */
    lsl   w3, w3, #6
    mvn   w3, w3
    and   w1, w1, w3
    mov   w3, #3
    lsl   w3, w3, #6
    orr   w1, w1, w3
    mov   w3, #7            /* FSEL23 <= ALT4 */
    lsl   w3, w3, #9
    mvn   w3, w3
    and   w1, w1, w3
    mov   w3, #3
    lsl   w3, w3, #9
    orr   w1, w1, w3
    mov   w3, #7            /* FSEL24 <= ALT4 */
    lsl   w3, w3, #12
    mvn   w3, w3
    and   w1, w1, w3
    mov   w3, #3
    lsl   w3, w3, #12
    orr   w1, w1, w3
    mov   w3, #7            /* FSEL25 <= ALT4 */
    lsl   w3, w3, #15
    mvn   w3, w3
    and   w1, w1, w3
    mov   w3, #3
    lsl   w3, w3, #15
    orr   w1, w1, w3
    mov   w3, #7            /* FSEL26 <= ALT4 */
    lsl   w3, w3, #18
    mvn   w3, w3
    and   w1, w1, w3
    mov   w3, #3
    lsl   w3, w3, #18
    orr   w1, w1, w3
    mov   w3, #7            /* FSEL27 <= ALT4 */
    lsl   w3, w3, #21
    mvn   w3, w3
    and   w1, w1, w3
    mov   w3, #3
    lsl   w3, w3, #21
    orr   w1, w1, w3
    str   w1, [x0]
    dmb   sy
ALABEL(dbgjtag_gppud)
    ldr   x0, =GPIO_GPPUD
    ldr   w1, =0x00000000
    str   w1, [x0]
    dmb   sy
    mov   w2, #150
ALABEL(dbgjtag_gppud_loop)
    nop
    sub   w2, w2, #1
    cmp   w2, wzr
    bne   dbgjtag_gppud_loop
ALABEL(dbgjtag_gppudclk0)
    ldr   x0, =GPIO_GPPUDCLK0
    ldr   w1, =0x0fc00000
    str   w1, [x0]
    dmb   sy
    mov   w2, #150
ALABEL(dbgjtag_gppudclk0_loop)
    nop
    sub   w2, w2, #1
    cmp   w2, wzr
    bne   dbgjtag_gppudclk0_loop
ALABEL(dbgjtag_clear_gppudclk0)
    ldr   x0, =GPIO_GPPUDCLK0
    ldr   w1, =0x00000000
    str   w1, [x0]
    dmb   sy
    mov   w2, #150
ALABEL(dbgjtag_clear_gppudclk0_loop)
    nop
    sub   w2, w2, #1
    cmp   w2, wzr
    bne   dbgjtag_clear_gppudclk0_loop
ALABEL(dbgjtag_exit)
#endif /* DEBUG_JTAG */

#ifdef DEBUG_MU
    /*
     *  Mini Uartを有効化
     *  config.txtにenable_uart=1を記載しても良い
     */
ALABEL(dbgmu)
    mrs   x0, mpidr_el1
    ldr   x1, =MPIDR_AFF0_MASK
    and   x0, x0, x1
    cmp   x0, xzr
    b.ne  dbgmu_exit
ALABEL(dbgmu_gpfsel)
    ldr   x0, =GPIO_GPFSEL1
    ldr   w1, [x0]
    mov   w3, #7            /* FSEL14 <= ALT5 */
    lsl   w3, w3, #12
    mvn   w3, w3
    and   w1, w1, w3
    mov   w3, #2
    lsl   w3, w3, #12
    orr   w1, w1, w3
    mov   w3, #7            /* FSEL15 <= ALT5 */
    lsl   w3, w3, #15
    mvn   w3, w3
    and   w1, w1, w3
    mov   w3, #2
    lsl   w3, w3, #15
    orr   w1, w1, w3
    str   w1, [x0]
    dmb   sy
ALABEL(dbgmu_gppud)
    ldr   x0, =GPIO_GPPUD
    ldr   w1, =0x00000000
    str   w1, [x0]
    dmb   sy
    mov   w2, #150
ALABEL(dbgmu_gppud_loop)
    nop
    sub   w2, w2, #1
    cmp   w2, wzr
    bne   dbgmu_gppud_loop
ALABEL(dbgmu_gppudclk0)
    ldr   x0, =GPIO_GPPUDCLK0
    ldr   w1, =0x0fc00000
    str   w1, [x0]
    dmb   sy
    mov   w2, #150
ALABEL(dbgmu_gppudclk0_loop)
    nop
    sub   w2, w2, #1
    cmp   w2, wzr
    bne   dbgmu_gppudclk0_loop
ALABEL(dbgmu_clear_gppudclk0)
    ldr   x0, =GPIO_GPPUDCLK0
    mov   w1, #0x0
    str   w1, [x0]
    dmb   sy
    mov   w2, #150
ALABEL(dbgmu_clear_gppudclk0_loop)
    nop
    sub   w2, w2, #1
    cmp   w2, wzr
    bne   dbgmu_clear_gppudclk0_loop
ALABEL(dbgmu_regcfg)
    ldr   x0, =AUX_ENABLES
    ldr   w1, [x0]
    orr   w1, w1, #AUX_ENABLES_MU_EN_BIT
    str   w1, [x0]
    ldr   x0, =MU_BAUD
    mov   w1, #((250000000 / (115200 * 8)) - 1)
    str   w1, [x0]
    dmb   sy
ALABEL(dbgmu_test)
    ldr   x1, =MU_LSR
    ldr   w0, [x1]
    mov   w2, #MU_LSR_TX_EMPTY_BIT
    and   w0, w0, w2
    cmp   w0, #MU_LSR_TX_EMPTY_BIT
    b.ne  dbgmu_test
    ldr   x1, =MU_IO
    mov   w0, #0x41
    str   w0, [x1]
ALABEL(dbgmu_exit)
#endif /* DEBUG_MU */

#ifdef DEBUG_STUB
    /*
     *  stubを配置
     */
ALABEL(dbgstub_loop)
    b     dbgstub_loop
#endif /* DEBUG_STUB */

    /*
     *  FIQ / IRQの禁止
     */
    mov   x0, #(DAIF_F_BIT AOR DAIF_I_BIT)
    msr   daif, x0

    /*
     *  現在のELによって処理を変える
     */
    mrs   x0, CurrentEL
    and   x0, x0, #(CURRENTEL_EL_MASK)
#ifdef INIT_MONITOR
    cmp   x0, #(CURRENTEL_EL_EL3)
    b.eq  start_el3
#endif /* INIT_MONITOR */
#ifdef INIT_HYPERVISOR
    cmp   x0, #(CURRENTEL_EL_EL2)
    b.eq  start_el2
#endif /* INIT_HYPERVISOR */
    cmp   x0, #(CURRENTEL_EL_EL1)
    b.eq  start_el1

#ifdef INIT_MONITOR
    /*
     *  EL3の処理
     */
ALABEL(start_el3)

    /*
     *  EL3の設定
     *  EL2 をAArch64に設定，セキュアタイマ，セキュリティ状態の設定
     */
//#ifdef TOPPERS_SAFEG_SECURE
//    mov w0, #(SCR_RW_BIT | SCR_ST_BIT)
//#else /* TOPPERS_SAFEG_SECURE */
    mov w0, #(SCR_RW_BIT | SCR_NS_BIT)
//#endif /* TOPPERS_SAFEG_SECURE */
    msr scr_el3, x0
    isb

    /*
     *  スタックポインタと，フレームポインタの初期化
     */
    my_istkpt x0, x1        /* FMP */
    mov   sp, x0
    mov   x29, xzr          /* フレームポインタ(r29) */

    /*
     *  target_mon_initializeの呼び出し
     *
     *  EL3で行う初期化を実行
     */
    bl    target_mon_initialize

    /*
     *  EL2へドロップ
     */
ALABEL(drop_el2)
//#ifdef TOPPERS_SAFEG_SECURE
//    adr   x0, start_el1
//    msr   elr_el3, x0
//    mov   x0, #(DAIF_F_BIT AOR DAIF_I_BIT AOR MODE_AARCH64_EL1H)
//    msr   spsr_el3, x0
//#else /* TOPPERS_SAFEG_SECURE */
    adr   x0, start_el2
    msr   elr_el3, x0
    mov   x0, #(DAIF_F_BIT AOR DAIF_I_BIT AOR MODE_AARCH64_EL2H)
    msr   spsr_el3, x0
//#endif /* TOPPERS_SAFEG_SECURE */
    eret
#endif /* INIT_MONITOR */

#ifdef INIT_HYPERVISOR
    /*
     *  EL2の処理
     */
ALABEL(start_el2)

    /*
     *  EL2の設定
     *  EL1とEL0 をAArch64に設定
     */
    mov x0, #(HCR_RW_BIT)
    msr hcr_el2, x0
    isb

    /*
     *  スタックポインタと，フレームポインタの初期化
     */
    my_istkpt x0, x1        /* FMP */
    mov   sp, x0
    mov   x29, xzr          /* フレームポインタ(r29) */

    /*
     *  target_hyp_initializeの呼び出し
     *
     *  EL2で行う初期化を実行
     */
    bl    target_hyp_initialize

    /*
     *  EL1へドロップ
     */
ALABEL(drop_el1)
    adr   x0, start_el1
    msr   elr_el2, x0
    mov   x0, #(DAIF_F_BIT AOR DAIF_I_BIT AOR MODE_AARCH64_EL1H)
    msr   spsr_el2, x0
    eret
#endif /* INIT_HYPERVISOR */

    /*
     *  EL1の処理
     */
ALABEL(start_el1)

    /*
     *  スタックポインタと，フレームポインタの初期化
     */
    my_istkpt x0, x1        /* FMP */
    mov   sp, x0
    mov   x29, xzr          /* フレームポインタ(r29) */

    /*
     *  hardware_init_hookの呼び出し （0でない場合）
     *
     *  ターゲットハードウェアに依存して必要な初期化処理がある場合
     *  は，hardware_init_hook という関数を用意する
     */
    ldr   x0, =hardware_init_hook
    cmp   x0, #0x00
    b.eq  start_1
    blr   x0

ALABEL(start_1)

    /*
     *  マスタプロセッサ以外は初期化待ち
     */
    my_core_index x0, x1
    cmp   x0, #(TOPPERS_MASTER_PRCID - 1)
    b.ne  slave_wait

    /*
     *  マスタプロセッサは変数を初期化
     */
    ldr   x0, =start_sync
    str   wzr, [x0]

#ifndef TOPPERS_OMIT_BSS_INIT
    /*
     *  bssセクションのクリア
     */
    ldr   x1, =BSS_START
    ldr   x2, =BSS_END
    cmp   x1, x2
    b.hs  start_3
ALABEL(start_2)
    str   xzr, [x1], #8
    cmp   x1, x2
    b.lo  start_2
#endif /* TOPPERS_OMIT_BSS_INIT */

ALABEL(start_3)

#ifndef TOPPERS_OMIT_DATA_INIT
    /*
     *  dataセクションの初期化(ROM化対応)
     *  IDATA_START から IDATA_END までを，DATA_START 以降に
     *  コピーする
     */
    ldr   x1, =IDATA_START
    ldr   x3, =IDATA_END
    cmp   x1, x3
    b.hs  start_5
    ldr   x2, =DATA_START
ALABEL(start_4)
    ldr   x0, [x1], #8
    str   x0, [x2], #8
    cmp   x1, x3
    b.lo  start_4
#endif /* TOPPERS_OMIT_DATA_INIT */

    /*
     *  software_init_hook を呼出し（0 でない場合）
     *
     *  ソフトウェア環境（特にライブラリ）に依存して必要な初期化処
     *  理がある場合は，software_init_hook という関数を用意すれば
     *  よい．
     */
ALABEL(start_5)
    ldr   x0, =software_init_hook
    cmp   x0, xzr
    b.eq  start_6
    blr   x0

    /*
     *  target_mprc_initialize の呼び出し
     *
     *  sta_ker 以前にマスタプロセッサのみで行う必要のある初期化を実行
     */
ALABEL(start_6)
    bl    target_mprc_initialize

    /*
     *  カーネルを起動する
     */
ALABEL(start_7)
    ldr   x0, =start_sync
    ldr   w1, =MAGIC_START
    mov   x2, xzr
ALABEL(start_8)
    str   w1, [x0, x2]
    add   x2, x2, #4
    cmp   x2, #(TNUM_PRCID * 4)
    b.ne  start_8

    /* 全コアに通知 */
    sev

    /* マスタプロセッサ用のstart_syncを初期化 */
    my_core_index x1, x3
    lsl   x1, x1, #3
    str   w2, [x0, x1]
    bl    sta_ker

    /*
     *  マスタプロセッサ以外の初期化待ちルーチン
     */
ALABEL(slave_wait)
    my_core_index x0, x1
    lsl   x0, x0, #2
    ldr   x1, =start_sync
ALABEL(slave_wait_1)
    ldr   w2, =MAGIC_START
    ldr   w3, [x1, x0]
    cmp   w3, w2
    b.ne  slave_wait_1
    str   wzr, [x1, x0]
    bl    sta_ker
```

```
 *  Copyright (C) 2005-2017 by Embedded and Real-Time Systems Laboratory
 *              Graduate School of Information Science, Nagoya Univ., JAPAN
```
名古屋大学で作成。

```
 *  @(#) $Id: start.S 1148 2016-01-08 08:15:59Z ertl-toshinaga $
```
toshinaga さんが登録。

```

#include "kernel_impl.h"
#include "target_asm.inc"
```
kernel_impl.hは
~/workdir/RPi64Toppers/fmp/kernel/kernel_impl.h

```kernel_impl.h
/*
 *  TOPPERS/FMP Kernel
 *      Toyohashi Open Platform for Embedded Real-Time Systems/
 *      Flexible MultiProcessor Kernel
 * 
 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
 *                              Toyohashi Univ. of Technology, JAPAN
 *  Copyright (C) 2004-2014 by Embedded and Real-Time Systems Laboratory
 *              Graduate School of Information Science, Nagoya Univ., JAPAN
 * 
 *  上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
 *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
 *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
 *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
 *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
 *      スコード中に含まれていること．
 *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
 *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
 *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
 *      の無保証規定を掲載すること．
 *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
 *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
 *      と．
 *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
 *        作権表示，この利用条件および下記の無保証規定を掲載すること．
 *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
 *        報告すること．
 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
 *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
 *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
 *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
 *      免責すること．
 * 
 *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
 *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
 *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
 *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
 *  の責任を負わない．
 * 
 *  @(#) $Id: kernel_impl.h 1080 2014-12-25 15:25:16Z ertl-honda $
 */

/*
 *		TOPPERS/FMPカーネル内部向け標準ヘッダファイル
 *
 *  このヘッダファイルは，カーネルを構成するプログラムのソースファイル
 *  で必ずインクルードするべき標準ヘッダファイルである．
 *
 *  アセンブリ言語のソースファイルからこのファイルをインクルードする時
 *  は，TOPPERS_MACRO_ONLYを定義しておく．これにより，マクロ定義以外を
 *  除くようになっている．
 */

#ifndef TOPPERS_KERNEL_IMPL_H
#define TOPPERS_KERNEL_IMPL_H

/*
 *  カーネルの内部識別名のリネーム
 */
#include "kernel_rename.h"

/*
 *  アプリケーションと共通のヘッダファイル
 */
#include <kernel.h>

/*
 *  システムログ機能のための定義
 */
#include <t_syslog.h>

/*
 *  型キャストを行うマクロの定義
 */
#ifndef CAST
#define CAST(type, val)		((type)(val))
#endif /* CAST */

/*
 *  プロセッサIDの最小値の定義
 */
#define TMIN_PRCID		1		/* プロセッサIDの最小値 */

/*
 *  オブジェクトIDの最小値の定義
 */
#define TMIN_TSKID		1		/* タスクIDの最小値 */
#define TMIN_SEMID		1		/* セマフォIDの最小値 */
#define TMIN_FLGID		1		/* フラグIDの最小値 */
#define TMIN_DTQID		1		/* データキューIDの最小値 */
#define TMIN_PDQID		1		/* 優先度データキューIDの最小値 */
#define TMIN_MBXID		1		/* メールボックスIDの最小値 */
#define TMIN_MPFID		1		/* 固定長メモリプールIDの最小値 */
#define TMIN_CYCID		1		/* 周期ハンドラIDの最小値 */
#define TMIN_ALMID		1		/* アラームハンドラIDの最小値 */
#define TMIN_SPNID		1		/* スピンロックIDの最小値 */     

/*
 *  優先度の段階数の定義
 */
#define TNUM_TPRI		(TMAX_TPRI - TMIN_TPRI + 1)
#define TNUM_MPRI		(TMAX_MPRI - TMIN_MPRI + 1)
#define TNUM_INTPRI		(TMAX_INTPRI - TMIN_INTPRI + 1)

/*
 *  PCB関連の定義
 */
#include "pcb.h"

/*
 *  ターゲット依存情報の定義
 */
#include "target_config.h"

/*
 *  すべての関数をコンパイルするための定義
 */
#ifdef ALLFUNC
#include "allfunc.h"
#endif /* ALLFUNC */

/*
 *  ビットフィールドでの符号無し整数型
 *
 *  8ビット以下の幅のビットフィールドで，符号無し整数値を保持したい場合
 *  に用いるべきデータ型．ANSI Cでは，ビットフィールドのデータ型には
 *  intとunsigned intしか許されないため，デフォルトの定義はunsigned
 *  intとしているが，ターゲットおよびツール依存で，unsigned charまたは
 *  unsigned shortに定義した方が効率が良い場合がある．
 */
#ifndef BIT_FIELD_UINT
#define BIT_FIELD_UINT		unsigned int
#endif /* BIT_FIELD_UINT */

/*
 *  ビットフィールドでのブール型
 *
 *  1ビット幅のビットフィールドで，ブール値を保持したい場合に用いるべき
 *  データ型．デフォルトではBIT_FIELD_UINTと同一に定義しているが，ブー
 *  ル値を保持することを明示するために別の名称としている．
 */
#ifndef BIT_FIELD_BOOL
#define BIT_FIELD_BOOL		BIT_FIELD_UINT
#endif /* BIT_FIELD_BOOL */

/*
 *  ヘッダファイルを持たないモジュールの関数・変数の宣言
 */
#ifndef TOPPERS_MACRO_ONLY

/*
 *  各モジュールの初期化（kernel_cfg.c）
 */
extern void	initialize_object(void);

/*
 *  グローバル初期化ルーチンの実行（kernel_cfg.c）
 */
extern void	call_global_inirtn(void);

/*
 *  ローカル初期化ルーチンの実行（kernel_cfg.c）
 */
extern void	call_local_inirtn(void);

/*
 *  グローバル終了処理ルーチンの実行（kernel_cfg.c）
 */
extern void	call_global_terrtn(void);

/*
 *  ローカル終了処理ルーチンの実行（kernel_cfg.c）
 */
extern void	call_local_terrtn(void);

/*
 *  非タスクコンテキスト用のスタック領域（kernel_cfg.c）
 */
extern const SIZE	istksz_table[];		/* スタック領域のサイズ（丸めた値） */
extern STK_T *const	istk_table[];		/* スタック領域の先頭番地 */
#ifdef TOPPERS_ISTKPT
extern STK_T *const	istkpt_table[];		/* スタックポインタの初期値 */
#endif /* TOPPERS_ISTKPT */

/*
 *  カーネルの起動（startup.c）
 */
extern void	sta_ker(void);

/*
 *  カーネルの終了処理（startup.c）
 */
extern void	exit_kernel(void);

#endif /* TOPPERS_MACRO_ONLY */
#endif /* TOPPERS_KERNEL_IMPL_H */
```

```
#include "kernel_rename.h"
/* アプリケーションと共通のヘッダファイル */
#include <kernel.h>
```
~/workdir/RPi64Toppers/fmp/kernel/kernel_rename.h

```kernel_rename.h
/* This file is generated from kernel_rename.def by genrename. */

#ifndef TOPPERS_KERNEL_RENAME_H
#define TOPPERS_KERNEL_RENAME_H

/*
 *  startup.c
 */
#define exit_kernel					_kernel_exit_kernel

/*
 *  mp.c
 */
#define giant_lock					_kernel_giant_lock
#define ext_ker_reqflg				_kernel_ext_ker_reqflg
#define ipi_handler					_kernel_ipi_handler
#define dispatch_request			_kernel_dispatch_request
#define ext_ker_request				_kernel_ext_ker_request
#define initialize_pcb				_kernel_initialize_pcb
#define barrier_sync				_kernel_barrier_sync
#define t_acquire_tsk_lock_prcid	_kernel_t_acquire_tsk_lock_prcid
#define t_acquire_tsk_lock_self		_kernel_t_acquire_tsk_lock_self
#define t_acquire_tsk_lock_self_without_runnable_check	_kernel_t_acquire_tsk_lock_self_without_runnable_check
#define t_acquire_nested_tsk_lock_self	_kernel_t_acquire_nested_tsk_lock_self
#define t_acquire_tsk_lock			_kernel_t_acquire_tsk_lock
#define t_acquire_tsk_lock_alm		_kernel_t_acquire_tsk_lock_alm
#define t_acquire_tsk_lock_cyc		_kernel_t_acquire_tsk_lock_cyc
#define i_acquire_tsk_lock_prcid	_kernel_i_acquire_tsk_lock_prcid
#define i_acquire_tsk_lock_self		_kernel_i_acquire_tsk_lock_self
#define i_acquire_tsk_lock			_kernel_i_acquire_tsk_lock
#define i_acquire_tsk_lock_alm		_kernel_i_acquire_tsk_lock_alm
#define t_acquire_obj_lock			_kernel_t_acquire_obj_lock
#define i_acquire_obj_lock			_kernel_i_acquire_obj_lock
#define release_tsk_lock			_kernel_release_tsk_lock
#define release_nested_tsk_lock		_kernel_release_nested_tsk_lock
#define release_dual_tsk_lock		_kernel_release_dual_tsk_lock
#define release_obj_lock			_kernel_release_obj_lock
#define acquire_tsk_lock_without_preemption_self	_kernel_acquire_tsk_lock_without_preemption_self
#define acquire_nested_tsk_lock_without_preemption	_kernel_acquire_nested_tsk_lock_without_preemption
#define t_acquire_nested_tsk_lock	_kernel_t_acquire_nested_tsk_lock
#define t_acquire_dual_tsk_lock		_kernel_t_acquire_dual_tsk_lock
#define t_acquire_dual_tsk_lock_alm	_kernel_t_acquire_dual_tsk_lock_alm
#define t_acquire_dual_tsk_lock_cyc	_kernel_t_acquire_dual_tsk_lock_cyc
#define t_acquire_nested_dual_tsk_lock	_kernel_t_acquire_nested_dual_tsk_lock
#define i_acquire_nested_tsk_lock	_kernel_i_acquire_nested_tsk_lock
#define i_acquire_dual_tsk_lock		_kernel_i_acquire_dual_tsk_lock
#define i_acquire_dual_tsk_lock_alm	_kernel_i_acquire_dual_tsk_lock_alm

/*
 *  task.c
 */
#define initialize_task				_kernel_initialize_task
#define search_schedtsk				_kernel_search_schedtsk
#define make_runnable				_kernel_make_runnable
#define make_non_runnable			_kernel_make_non_runnable
#define make_dormant				_kernel_make_dormant
#define make_active					_kernel_make_active
#define change_priority				_kernel_change_priority
#define rotate_ready_queue			_kernel_rotate_ready_queue
#define call_texrtn					_kernel_call_texrtn
#define dispatch_call_texrtn		_kernel_dispatch_call_texrtn
#define calltex						_kernel_calltex
#define migrate_self				_kernel_migrate_self
#define exit_and_migrate_self		_kernel_exit_and_migrate_self
#define set_lowest_precedence		_kernel_set_lowest_precedence

/*
 *  wait.c
 */
#define make_wait_tmout				_kernel_make_wait_tmout
#define wait_complete				_kernel_wait_complete
#define wait_tmout					_kernel_wait_tmout
#define wait_tmout_ok				_kernel_wait_tmout_ok
#define wait_release				_kernel_wait_release
#define wobj_make_wait				_kernel_wobj_make_wait
#define wobj_make_wait_tmout		_kernel_wobj_make_wait_tmout
#define init_wait_queue				_kernel_init_wait_queue

/*
 *  time_event.c
 */
#define current_time				_kernel_current_time
#define min_time					_kernel_min_time
#define next_time					_kernel_next_time
#define next_subtime				_kernel_next_subtime
#define last_index					_kernel_last_index
#define initialize_tmevt			_kernel_initialize_tmevt
#define tmevt_up					_kernel_tmevt_up
#define tmevt_down					_kernel_tmevt_down
#define tmevtb_insert				_kernel_tmevtb_insert
#define tmevtb_delete				_kernel_tmevtb_delete
#define tmevt_lefttim				_kernel_tmevt_lefttim
#define signal_time					_kernel_signal_time
#define get_my_current_time			_kernel_get_my_current_time

/*
 *  semaphore.c
 */
#define initialize_semaphore		_kernel_initialize_semaphore

/*
 *  eventflag.c
 */
#define initialize_eventflag		_kernel_initialize_eventflag
#define check_flg_cond				_kernel_check_flg_cond

/*
 *  dataqueue.c
 */
#define initialize_dataqueue		_kernel_initialize_dataqueue
#define enqueue_data				_kernel_enqueue_data
#define force_enqueue_data			_kernel_force_enqueue_data
#define dequeue_data				_kernel_dequeue_data
#define send_data					_kernel_send_data
#define force_send_data				_kernel_force_send_data
#define receive_data				_kernel_receive_data

/*
 *  pridataq.c
 */
#define initialize_pridataq			_kernel_initialize_pridataq
#define enqueue_pridata				_kernel_enqueue_pridata
#define dequeue_pridata				_kernel_dequeue_pridata
#define send_pridata				_kernel_send_pridata
#define receive_pridata				_kernel_receive_pridata

/*
 *  mailbox.c
 */
#define initialize_mailbox			_kernel_initialize_mailbox

/*
 *  mempfix.c
 */
#define initialize_mempfix			_kernel_initialize_mempfix
#define get_mpf_block				_kernel_get_mpf_block

/*
 *  cyclic.c
 */
#define initialize_cyclic			_kernel_initialize_cyclic
#define call_cychdr					_kernel_call_cychdr

/*
 *  alarm.c
 */
#define initialize_alarm			_kernel_initialize_alarm
#define call_almhdr					_kernel_call_almhdr

/*
 *  spin_lock.c
 */
#define initialize_spin_lock		_kernel_initialize_spin_lock
#define force_unlock_spin			_kernel_force_unlock_spin

/*
 *  interrupt.c
 */
#define initialize_interrupt		_kernel_initialize_interrupt

/*
 *  exception.c
 */
#define initialize_exception		_kernel_initialize_exception

/*
 *  kernel_cfg.c
 */
#define p_pcb_table					_kernel_p_pcb_table
#define initialize_object			_kernel_initialize_object
#define call_global_inirtn			_kernel_call_global_inirtn
#define call_local_inirtn			_kernel_call_local_inirtn
#define call_global_terrtn			_kernel_call_global_terrtn
#define call_local_terrtn			_kernel_call_local_terrtn
#define tmax_tskid					_kernel_tmax_tskid
#define tinib_table					_kernel_tinib_table
#define torder_table				_kernel_torder_table
#define tcb_table					_kernel_tcb_table
#define p_tcb_table					_kernel_p_tcb_table
#define tmax_semid					_kernel_tmax_semid
#define seminib_table				_kernel_seminib_table
#define semcb_table					_kernel_semcb_table
#define p_semcb_table				_kernel_p_semcb_table
#define tmax_flgid					_kernel_tmax_flgid
#define flginib_table				_kernel_flginib_table
#define flgcb_table					_kernel_flgcb_table
#define p_flgcb_table				_kernel_p_flgcb_table
#define tmax_dtqid					_kernel_tmax_dtqid
#define dtqcb_table					_kernel_dtqcb_table
#define dtqinib_table				_kernel_dtqinib_table
#define p_dtqcb_table				_kernel_p_dtqcb_table
#define tmax_pdqid					_kernel_tmax_pdqid
#define pdqcb_table					_kernel_pdqcb_table
#define pdqinib_table				_kernel_pdqinib_table
#define p_pdqcb_table				_kernel_p_pdqcb_table
#define tmax_mbxid					_kernel_tmax_mbxid
#define mbxinib_table				_kernel_mbxinib_table
#define p_mbxcb_table				_kernel_p_mbxcb_table
#define tmax_mpfid					_kernel_tmax_mpfid
#define mpfinib_table				_kernel_mpfinib_table
#define mpfcb_table					_kernel_mpfcb_table
#define p_mpfcb_table				_kernel_p_mpfcb_table
#define tmax_cycid					_kernel_tmax_cycid
#define cycinib_table				_kernel_cycinib_table
#define cyccb_table					_kernel_cyccb_table
#define p_cyccb_table				_kernel_p_cyccb_table
#define tmax_almid					_kernel_tmax_almid
#define alminib_table				_kernel_alminib_table
#define almcb_table					_kernel_almcb_table
#define p_almcb_table				_kernel_p_almcb_table
#define tmax_spnid					_kernel_tmax_spnid
#define spninib_table				_kernel_spninib_table
#define spncb_table					_kernel_spncb_table
#define p_spncb_table				_kernel_p_spncb_table
#define tnum_inhno					_kernel_tnum_inhno
#define inhinib_table				_kernel_inhinib_table
#define tnum_intno					_kernel_tnum_intno
#define intinib_table				_kernel_intinib_table
#define tnum_excno					_kernel_tnum_excno
#define excinib_table				_kernel_excinib_table
#define tmevt_heap					_kernel_tmevt_heap
#define p_tevtcb_table				_kernel_p_tevtcb_table
#define p_tmevt_heap_table			_kernel_p_tmevt_heap_table
#define tevtcb						_kernel_tevtcb
#define istksz_table				_kernel_istksz_table
#define istk_table					_kernel_istk_table
#define istkpt_table				_kernel_istkpt_table

/*
 *  syslog.c
 */
#define p_syslogcb_table			_kernel_p_syslogcb_table


#ifdef TOPPERS_LABEL_ASM

/*
 *  startup.c
 */
#define _exit_kernel				__kernel_exit_kernel

/*
 *  mp.c
 */
#define _giant_lock					__kernel_giant_lock
#define _ext_ker_reqflg				__kernel_ext_ker_reqflg
#define _ipi_handler				__kernel_ipi_handler
#define _dispatch_request			__kernel_dispatch_request
#define _ext_ker_request			__kernel_ext_ker_request
#define _initialize_pcb				__kernel_initialize_pcb
#define _barrier_sync				__kernel_barrier_sync
#define _t_acquire_tsk_lock_prcid	__kernel_t_acquire_tsk_lock_prcid
#define _t_acquire_tsk_lock_self	__kernel_t_acquire_tsk_lock_self
#define _t_acquire_tsk_lock_self_without_runnable_check	__kernel_t_acquire_tsk_lock_self_without_runnable_check
#define _t_acquire_nested_tsk_lock_self	__kernel_t_acquire_nested_tsk_lock_self
#define _t_acquire_tsk_lock			__kernel_t_acquire_tsk_lock
#define _t_acquire_tsk_lock_alm		__kernel_t_acquire_tsk_lock_alm
#define _t_acquire_tsk_lock_cyc		__kernel_t_acquire_tsk_lock_cyc
#define _i_acquire_tsk_lock_prcid	__kernel_i_acquire_tsk_lock_prcid
#define _i_acquire_tsk_lock_self	__kernel_i_acquire_tsk_lock_self
#define _i_acquire_tsk_lock			__kernel_i_acquire_tsk_lock
#define _i_acquire_tsk_lock_alm		__kernel_i_acquire_tsk_lock_alm
#define _t_acquire_obj_lock			__kernel_t_acquire_obj_lock
#define _i_acquire_obj_lock			__kernel_i_acquire_obj_lock
#define _release_tsk_lock			__kernel_release_tsk_lock
#define _release_nested_tsk_lock	__kernel_release_nested_tsk_lock
#define _release_dual_tsk_lock		__kernel_release_dual_tsk_lock
#define _release_obj_lock			__kernel_release_obj_lock
#define _acquire_tsk_lock_without_preemption_self	__kernel_acquire_tsk_lock_without_preemption_self
#define _acquire_nested_tsk_lock_without_preemption	__kernel_acquire_nested_tsk_lock_without_preemption
#define _t_acquire_nested_tsk_lock	__kernel_t_acquire_nested_tsk_lock
#define _t_acquire_dual_tsk_lock	__kernel_t_acquire_dual_tsk_lock
#define _t_acquire_dual_tsk_lock_alm	__kernel_t_acquire_dual_tsk_lock_alm
#define _t_acquire_dual_tsk_lock_cyc	__kernel_t_acquire_dual_tsk_lock_cyc
#define _t_acquire_nested_dual_tsk_lock	__kernel_t_acquire_nested_dual_tsk_lock
#define _i_acquire_nested_tsk_lock	__kernel_i_acquire_nested_tsk_lock
#define _i_acquire_dual_tsk_lock	__kernel_i_acquire_dual_tsk_lock
#define _i_acquire_dual_tsk_lock_alm	__kernel_i_acquire_dual_tsk_lock_alm

/*
 *  task.c
 */
#define _initialize_task			__kernel_initialize_task
#define _search_schedtsk			__kernel_search_schedtsk
#define _make_runnable				__kernel_make_runnable
#define _make_non_runnable			__kernel_make_non_runnable
#define _make_dormant				__kernel_make_dormant
#define _make_active				__kernel_make_active
#define _change_priority			__kernel_change_priority
#define _rotate_ready_queue			__kernel_rotate_ready_queue
#define _call_texrtn				__kernel_call_texrtn
#define _dispatch_call_texrtn		__kernel_dispatch_call_texrtn
#define _calltex					__kernel_calltex
#define _migrate_self				__kernel_migrate_self
#define _exit_and_migrate_self		__kernel_exit_and_migrate_self
#define _set_lowest_precedence		__kernel_set_lowest_precedence

/*
 *  wait.c
 */
#define _make_wait_tmout			__kernel_make_wait_tmout
#define _wait_complete				__kernel_wait_complete
#define _wait_tmout					__kernel_wait_tmout
#define _wait_tmout_ok				__kernel_wait_tmout_ok
#define _wait_release				__kernel_wait_release
#define _wobj_make_wait				__kernel_wobj_make_wait
#define _wobj_make_wait_tmout		__kernel_wobj_make_wait_tmout
#define _init_wait_queue			__kernel_init_wait_queue

/*
 *  time_event.c
 */
#define _current_time				__kernel_current_time
#define _min_time					__kernel_min_time
#define _next_time					__kernel_next_time
#define _next_subtime				__kernel_next_subtime
#define _last_index					__kernel_last_index
#define _initialize_tmevt			__kernel_initialize_tmevt
#define _tmevt_up					__kernel_tmevt_up
#define _tmevt_down					__kernel_tmevt_down
#define _tmevtb_insert				__kernel_tmevtb_insert
#define _tmevtb_delete				__kernel_tmevtb_delete
#define _tmevt_lefttim				__kernel_tmevt_lefttim
#define _signal_time				__kernel_signal_time
#define _get_my_current_time		__kernel_get_my_current_time

/*
 *  semaphore.c
 */
#define _initialize_semaphore		__kernel_initialize_semaphore

/*
 *  eventflag.c
 */
#define _initialize_eventflag		__kernel_initialize_eventflag
#define _check_flg_cond				__kernel_check_flg_cond

/*
 *  dataqueue.c
 */
#define _initialize_dataqueue		__kernel_initialize_dataqueue
#define _enqueue_data				__kernel_enqueue_data
#define _force_enqueue_data			__kernel_force_enqueue_data
#define _dequeue_data				__kernel_dequeue_data
#define _send_data					__kernel_send_data
#define _force_send_data			__kernel_force_send_data
#define _receive_data				__kernel_receive_data

/*
 *  pridataq.c
 */
#define _initialize_pridataq		__kernel_initialize_pridataq
#define _enqueue_pridata			__kernel_enqueue_pridata
#define _dequeue_pridata			__kernel_dequeue_pridata
#define _send_pridata				__kernel_send_pridata
#define _receive_pridata			__kernel_receive_pridata

/*
 *  mailbox.c
 */
#define _initialize_mailbox			__kernel_initialize_mailbox

/*
 *  mempfix.c
 */
#define _initialize_mempfix			__kernel_initialize_mempfix
#define _get_mpf_block				__kernel_get_mpf_block

/*
 *  cyclic.c
 */
#define _initialize_cyclic			__kernel_initialize_cyclic
#define _call_cychdr				__kernel_call_cychdr

/*
 *  alarm.c
 */
#define _initialize_alarm			__kernel_initialize_alarm
#define _call_almhdr				__kernel_call_almhdr

/*
 *  spin_lock.c
 */
#define _initialize_spin_lock		__kernel_initialize_spin_lock
#define _force_unlock_spin			__kernel_force_unlock_spin

/*
 *  interrupt.c
 */
#define _initialize_interrupt		__kernel_initialize_interrupt

/*
 *  exception.c
 */
#define _initialize_exception		__kernel_initialize_exception

/*
 *  kernel_cfg.c
 */
#define _p_pcb_table				__kernel_p_pcb_table
#define _initialize_object			__kernel_initialize_object
#define _call_global_inirtn			__kernel_call_global_inirtn
#define _call_local_inirtn			__kernel_call_local_inirtn
#define _call_global_terrtn			__kernel_call_global_terrtn
#define _call_local_terrtn			__kernel_call_local_terrtn
#define _tmax_tskid					__kernel_tmax_tskid
#define _tinib_table				__kernel_tinib_table
#define _torder_table				__kernel_torder_table
#define _tcb_table					__kernel_tcb_table
#define _p_tcb_table				__kernel_p_tcb_table
#define _tmax_semid					__kernel_tmax_semid
#define _seminib_table				__kernel_seminib_table
#define _semcb_table				__kernel_semcb_table
#define _p_semcb_table				__kernel_p_semcb_table
#define _tmax_flgid					__kernel_tmax_flgid
#define _flginib_table				__kernel_flginib_table
#define _flgcb_table				__kernel_flgcb_table
#define _p_flgcb_table				__kernel_p_flgcb_table
#define _tmax_dtqid					__kernel_tmax_dtqid
#define _dtqcb_table				__kernel_dtqcb_table
#define _dtqinib_table				__kernel_dtqinib_table
#define _p_dtqcb_table				__kernel_p_dtqcb_table
#define _tmax_pdqid					__kernel_tmax_pdqid
#define _pdqcb_table				__kernel_pdqcb_table
#define _pdqinib_table				__kernel_pdqinib_table
#define _p_pdqcb_table				__kernel_p_pdqcb_table
#define _tmax_mbxid					__kernel_tmax_mbxid
#define _mbxinib_table				__kernel_mbxinib_table
#define _p_mbxcb_table				__kernel_p_mbxcb_table
#define _tmax_mpfid					__kernel_tmax_mpfid
#define _mpfinib_table				__kernel_mpfinib_table
#define _mpfcb_table				__kernel_mpfcb_table
#define _p_mpfcb_table				__kernel_p_mpfcb_table
#define _tmax_cycid					__kernel_tmax_cycid
#define _cycinib_table				__kernel_cycinib_table
#define _cyccb_table				__kernel_cyccb_table
#define _p_cyccb_table				__kernel_p_cyccb_table
#define _tmax_almid					__kernel_tmax_almid
#define _alminib_table				__kernel_alminib_table
#define _almcb_table				__kernel_almcb_table
#define _p_almcb_table				__kernel_p_almcb_table
#define _tmax_spnid					__kernel_tmax_spnid
#define _spninib_table				__kernel_spninib_table
#define _spncb_table				__kernel_spncb_table
#define _p_spncb_table				__kernel_p_spncb_table
#define _tnum_inhno					__kernel_tnum_inhno
#define _inhinib_table				__kernel_inhinib_table
#define _tnum_intno					__kernel_tnum_intno
#define _intinib_table				__kernel_intinib_table
#define _tnum_excno					__kernel_tnum_excno
#define _excinib_table				__kernel_excinib_table
#define _tmevt_heap					__kernel_tmevt_heap
#define _p_tevtcb_table				__kernel_p_tevtcb_table
#define _p_tmevt_heap_table			__kernel_p_tmevt_heap_table
#define _tevtcb						__kernel_tevtcb
#define _istksz_table				__kernel_istksz_table
#define _istk_table					__kernel_istk_table
#define _istkpt_table				__kernel_istkpt_table

/*
 *  syslog.c
 */
#define _p_syslogcb_table			__kernel_p_syslogcb_table


#endif /* TOPPERS_LABEL_ASM */

#include "target_rename.h"

#endif /* TOPPERS_KERNEL_RENAME_H */
```

~/workdir/RPi64Toppers/fmp/target/rpi_arm64_gcc/target_rename.h

```target_rename.h
/* This file is generated from target_rename.def by genrename. */

#ifndef TOPPERS_TARGET_RENAME_H
#define TOPPERS_TARGET_RENAME_H

/*
 *  start.S
 */
#define start_sync					_kernel_start_sync

/*
 *  target_config.c
 */
#define target_mon_initialize		_kernel_target_mon_initialize
#define target_hyp_initialize		_kernel_target_hyp_initialize
#define target_mprc_initialize		_kernel_target_mprc_initialize
#define target_mmu_init				_kernel_target_mmu_init
#define target_initialize			_kernel_target_initialize
#define target_exit					_kernel_target_exit


#ifdef TOPPERS_LABEL_ASM

/*
 *  start.S
 */
#define _start_sync					__kernel_start_sync

/*
 *  target_config.c
 */
#define _target_mon_initialize		__kernel_target_mon_initialize
#define _target_hyp_initialize		__kernel_target_hyp_initialize
#define _target_mprc_initialize		__kernel_target_mprc_initialize
#define _target_mmu_init			__kernel_target_mmu_init
#define _target_initialize			__kernel_target_initialize
#define _target_exit				__kernel_target_exit


#endif /* TOPPERS_LABEL_ASM */

#include "arm64_gcc/bcm283x/chip_rename.h"

#endif /* TOPPERS_TARGET_RENAME_H */
```


~/workdir/RPi64Toppers/fmp/kernel/kernel.h

```
```

target_asm.incは
~/workdir/RPi64Toppers/fmp/target/rpi_arm64_gcc/target_asm.inc

```target_asm.inc
#ifndef TOPPERS_TARGET_ASM_INC
#define TOPPERS_TARGET_ASM_INC

/*
 *  チップ依存モジュール（BCM283X用）
 */
#include "chip_asm.inc"

#endif /* TOPPERS_TARGET_ASM_INC */
```

~/workdir/RPi64Toppers/fmp/arch/arm64_gcc/bcm283x/chip_asm.inc

```chip_asm.inc
/*
 *  TOPPERS/FMP Kernel
 *      Toyohashi Open Platform for Embedded Real-Time Systems/
 *      Flexible MultiProcessor Kernel
 *
 *  Copyright (C) 2007-2012 by Embedded and Real-Time Systems Laboratory
 *              Graduate School of Information Science, Nagoya Univ., JAPAN
 *
 *  上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
 *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
 *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
 *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
 *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
 *      スコード中に含まれていること．
 *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
 *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
 *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
 *      の無保証規定を掲載すること．
 *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
 *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
 *      と．
 *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
 *        作権表示，この利用条件および下記の無保証規定を掲載すること．
 *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
 *        報告すること．
 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
 *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
 *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
 *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
 *      免責すること．
 *
 *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
 *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
 *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
 *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
 *  の責任を負わない．
 *
 *  @(#) $Id: chip_asm.inc 1149 2016-01-08 08:19:14Z ertl-toshinaga $
 */

#ifndef TOPPERS_CHIP_ASM_INC
#define TOPPERS_CHIP_ASM_INC

.macro my_core_index re_reg sc_reg1
    mrs   \re_reg, mpidr_el1
    and   \re_reg, \re_reg, #MPIDR_AFF0_MASK
.endm

#ifdef USE_THREAD_ID_PCB
.macro my_pcb re_reg sc_reg1
    mrs   \re_reg, tpidr_el1
.endm
#else  /* USE_THREAD_ID_PCB */
.macro my_pcb re_reg sc_reg1
    mrs   \re_reg, mpidr_el1
    and   \sc_reg1, \re_reg, #MPIDR_AFF0_MASK
    ldr   \re_reg, =p_pcb_table
    ldr   \re_reg, [\re_reg, \sc_reg1, lsl #3]
.endm
#endif /* USE_THREAD_ID_PCB */

.macro my_istkpt re_reg sc_reg1
    mrs   \re_reg, mpidr_el1
    and   \sc_reg1, \re_reg, #MPIDR_AFF0_MASK
    ldr   \re_reg, =_kernel_istkpt_table
    ldr   \re_reg, [\re_reg, \sc_reg1, lsl #3]
.endm

#include "arm64_gcc/common/core_asm.inc"

#endif /* TOPPERS_CHIP_ASM_INC */
```

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
# 文書履歴
2018年03月13日　初版 1.00
2018年03月19日　1.01 誤植訂正
@khsk さんから編集要請　start.S 
enalbe → enable
khsk 2018年03月19日 13時10分 (JST)
- * config.txtにenalbe_uart=1を記載しても良い
+ * config.txtにenable_uart=1を記載しても良い
---Typo

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.