From 4933487e3ffe3b4e753a48a5e72bc33e4881ff94 Mon Sep 17 00:00:00 2001 From: ryuz Date: Tue, 9 Nov 2010 22:54:43 +0900 Subject: [PATCH] add sh2a-fpu --- kernel/build/sh/sh2a-fpu/gcc/gmake.mak | 166 +++++++++ kernel/include/arch/proc/sh/sh2a-fpu/proc.h | 77 ++++ kernel/include/arch/proc/sh/sh2a-fpu/procatr.h | 52 +++ kernel/source/arch/proc/sh/sh2a-fpu/gcc/kcre_ctx.S | 54 +++ kernel/source/arch/proc/sh/sh2a-fpu/gcc/kdis_int.S | 31 ++ kernel/source/arch/proc/sh/sh2a-fpu/gcc/kena_int.S | 39 ++ kernel/source/arch/proc/sh/sh2a-fpu/gcc/kexc_hdr.S | 405 +++++++++++++++++++++ kernel/source/arch/proc/sh/sh2a-fpu/gcc/kint_hdr.S | 190 ++++++++++ kernel/source/arch/proc/sh/sh2a-fpu/gcc/krst_ctx.S | 30 ++ kernel/source/arch/proc/sh/sh2a-fpu/gcc/kswi_ctx.S | 58 +++ kernel/source/arch/proc/sh/sh2a-fpu/gcc/kwai_int.S | 29 ++ kernel/source/arch/proc/sh/sh2a-fpu/val_int.c | 18 + sample/sh/sh7262/gcc/Makefile | 4 +- 13 files changed, 1151 insertions(+), 2 deletions(-) create mode 100644 kernel/build/sh/sh2a-fpu/gcc/gmake.mak create mode 100644 kernel/include/arch/proc/sh/sh2a-fpu/proc.h create mode 100644 kernel/include/arch/proc/sh/sh2a-fpu/procatr.h create mode 100644 kernel/source/arch/proc/sh/sh2a-fpu/gcc/kcre_ctx.S create mode 100644 kernel/source/arch/proc/sh/sh2a-fpu/gcc/kdis_int.S create mode 100644 kernel/source/arch/proc/sh/sh2a-fpu/gcc/kena_int.S create mode 100644 kernel/source/arch/proc/sh/sh2a-fpu/gcc/kexc_hdr.S create mode 100644 kernel/source/arch/proc/sh/sh2a-fpu/gcc/kint_hdr.S create mode 100644 kernel/source/arch/proc/sh/sh2a-fpu/gcc/krst_ctx.S create mode 100644 kernel/source/arch/proc/sh/sh2a-fpu/gcc/kswi_ctx.S create mode 100644 kernel/source/arch/proc/sh/sh2a-fpu/gcc/kwai_int.S create mode 100644 kernel/source/arch/proc/sh/sh2a-fpu/val_int.c diff --git a/kernel/build/sh/sh2a-fpu/gcc/gmake.mak b/kernel/build/sh/sh2a-fpu/gcc/gmake.mak new file mode 100644 index 0000000..b409b47 --- /dev/null +++ b/kernel/build/sh/sh2a-fpu/gcc/gmake.mak @@ -0,0 +1,166 @@ +# ---------------------------------------------------------------------------- +# Hyper Operating System V4 Advance +# makefile for sh2 +# +# Copyright (C) 1998-2010 by Project HOS +# http://sourceforge.jp/projects/hos/ +# ---------------------------------------------------------------------------- + + +# -------------------------------------- +# %jp{各種設定}{setting} +# -------------------------------------- + +# %jp{ターゲットライブラリ名}%en{target library name} +TARGET ?= libhosv4a + + +# %jp{ツール定義}%jp{tools} +GCC_ARCH ?= sh-elf- +CMD_CC ?= $(GCC_ARCH)gcc +CMD_ASM ?= $(GCC_ARCH)gcc +CMD_LIBR ?= $(GCC_ARCH)ar + + +# %jp{アーキテクチャ定義}%en{architecture} +ARCH_NAME ?= sh2a-fpu +ARCH_PROC ?= sh/sh2a-fpu +ARCH_IRC ?= simple +ARCH_CC ?= gcc + + +# %jp{ディレクトリ定義}%en{directories} +TOP_DIR = ../../../../.. +KERNEL_DIR = $(TOP_DIR)/kernel +KERNEL_MAKINC_DIR = $(KERNEL_DIR)/build/common/gmake +INC_PROC_DIR = $(KERNEL_DIR)/include/arch/proc/$(ARCH_PROC) +INC_IRC_DIR = $(KERNEL_DIR)/include/arch/irc/$(ARCH_IRC) +SRC_PROC_DIR = $(KERNEL_DIR)/source/arch/proc/$(ARCH_PROC) +SRC_PROC_CC_DIR = $(KERNEL_DIR)/source/arch/proc/$(ARCH_PROC)/$(ARCH_CC) +SRC_IRC_DIR = $(KERNEL_DIR)/source/arch/irc/$(ARCH_IRC) +SRC_IRC_CC_DIR = $(KERNEL_DIR)/source/arch/irc/$(ARCH_IRC)/$(ARCH_CC) +CFGRTR_DIR = $(TOP_DIR)/cfgrtr/build/gcc + + +# %jp{コンフィギュレータ定義}%en{kernel configurator} +CFGRTR = h4acfg-$(ARCH_NAME) + + +# %jp{カーネル指定}%en{kernel flag} +KERNEL = Yes + + +# %jp{共通定義読込み}%en{common setting} +include $(KERNEL_MAKINC_DIR)/common.inc + + +# %jp{パス設定}%en{add source directories} +INC_DIRS += $(INC_PROC_DIR) $(INC_IRC_DIR) +SRC_DIRS += $(SRC_PROC_DIR) $(SRC_PROC_DIR) $(SRC_PROC_CC_DIR) $(SRC_IRC_DIR) $(SRC_IRC_CC_DIR) + + +# %jp{ベクタの高速化}%en{fast vector} +ifeq ($(FAST_VECTOR),Yes) +A_DEFS += _KERNEL_FAST_INTVEC="ON" +endif + + +# %jp{オプションフラグ} +AFLAGS = -m2a +CFLAGS = -m2a +ARFLAGS = + + +# %jp{コンパイラ依存の設定読込み}%en{compiler dependent definitions} +include $(KERNEL_MAKINC_DIR)/$(ARCH_CC)_d.inc + +# %jp{ライブラリ生成用設定読込み}%en{definitions for library} +include $(KERNEL_MAKINC_DIR)/maklib_d.inc + + + + +# -------------------------------------- +# %jp{ソースファイル}%en{source files} +# -------------------------------------- + +# %jp{アセンブラファイルの追加}%en{assembry sources} +ASRCS += $(SRC_PROC_CC_DIR)/kdis_int.S +ASRCS += $(SRC_PROC_CC_DIR)/kena_int.S +ASRCS += $(SRC_PROC_CC_DIR)/kwai_int.S +ASRCS += $(SRC_PROC_CC_DIR)/kcre_ctx.S +ASRCS += $(SRC_PROC_CC_DIR)/krst_ctx.S +ASRCS += $(SRC_PROC_CC_DIR)/kswi_ctx.S +ASRCS += $(SRC_PROC_CC_DIR)/kint_hdr.S +ASRCS += $(SRC_PROC_CC_DIR)/kexc_hdr.S + +# %jp{C言語ファイルの追加}%en{C sources} +CSRCS += $(SRC_PROC_DIR)/val_int.c +CSRCS += $(SRC_IRC_DIR)/chg_ilv.c +CSRCS += $(SRC_IRC_DIR)/chg_imsk.c +CSRCS += $(SRC_IRC_DIR)/clr_int.c +CSRCS += $(SRC_IRC_DIR)/dis_int.c +CSRCS += $(SRC_IRC_DIR)/ena_int.c +CSRCS += $(SRC_IRC_DIR)/get_ilv.c +CSRCS += $(SRC_IRC_DIR)/get_imsk.c + + +# %jp{カーネル共通ソースの追加}%en{kernel common sources} +include $(KERNEL_MAKINC_DIR)/knlsrc.inc + + + + +# -------------------------------------- +# %jp{ルール定義}%en{rules} +# -------------------------------------- + +# %jp{ALL}%en{all} +.PHONY : all +all: makelib_all + $(MAKE) -C $(CFGRTR_DIR) -f gmake.mak TARGET=$(CFGRTR) ARCH_PROC=$(ARCH_PROC) ARCH_IRC=$(ARCH_IRC) + +# %jp{クリーン}%en{clean} +.PHONY : clean +clean: makelib_clean + $(MAKE) -C $(CFGRTR_DIR) -f gmake.mak TARGET=$(CFGRTR) ARCH_PROC=$(ARCH_PROC) ARCH_IRC=$(ARCH_IRC) clean + $(RM) -f *.lst + +# %jp{依存関係更新}%en{make depend} +.PHONY : depend +depend: makelib_depend + +# %jp{ソース一括コピー}%en{source files copy} +.PHONY : srccpy +srccpy: makelib_srccpy + + +# %jp{ライブラリ生成用設定読込み}%en{rules for library} +include $(KERNEL_MAKINC_DIR)/maklib_r.inc + +# %jp{コンパイラ依存のルール定義読込み}%en{rules for compiler} +include $(KERNEL_MAKINC_DIR)/$(ARCH_CC)_r.inc + + + + +# -------------------------------------- +# %jp{依存関係}%en{dependency} +# -------------------------------------- + +# %jp{カーネル依存関係読込み}{dependency list of kernel sources} +include $(KERNEL_MAKINC_DIR)/knldep.inc + + +$(OBJS_DIR)/val_int.$(EXT_OBJ) : $(COMMON_HEADERS) +$(OBJS_DIR)/chg_ilv.$(EXT_OBJ) : $(COMMON_HEADERS) +$(OBJS_DIR)/clr_int.$(EXT_OBJ) : $(COMMON_HEADERS) +$(OBJS_DIR)/dis_int.$(EXT_OBJ) : $(COMMON_HEADERS) +$(OBJS_DIR)/ena_int.$(EXT_OBJ) : $(COMMON_HEADERS) +$(OBJS_DIR)/get_ilv.$(EXT_OBJ) : $(COMMON_HEADERS) +$(OBJS_DIR)/chg_imsk.$(EXT_OBJ) : $(COMMON_HEADERS) +$(OBJS_DIR)/get_imsk.$(EXT_OBJ) : $(COMMON_HEADERS) + + + +# end of file diff --git a/kernel/include/arch/proc/sh/sh2a-fpu/proc.h b/kernel/include/arch/proc/sh/sh2a-fpu/proc.h new file mode 100644 index 0000000..b74679a --- /dev/null +++ b/kernel/include/arch/proc/sh/sh2a-fpu/proc.h @@ -0,0 +1,77 @@ +/** + * Hyper Operating System V4 Advance + * + * @file procatr.h + * @brief %jp{プロセッサアーキテクチャ固有機能(SH2 processor)} + * + * Copyright (C) 1998-2006 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#ifndef _KERNEL__arch__proc__sh__sh2a_fpu__proc_h__ +#define _KERNEL__arch__proc__sh__sh2a_fpu__proc_h__ + + +/** %jp{コンテキスト情報保存ブロック}%en{Execution context control block} */ +typedef struct _kernel_t_ctxcb +{ + VP_INT sp; +} _KERNEL_T_CTXCB; + +/** %jp{割込みコンテキスト制御ブロック} */ +typedef struct _kernel_t_ictxcb +{ + H imsk; + B intcnt; + VP isp; +} _KERNEL_T_ICTXCB; + + +extern _KERNEL_T_ICTXCB _kernel_ictxcb; /**< %jp{割込みコンテキスト制御ブロック} */ + + +#ifdef __cplusplus +extern "C" { +#endif + +void _kernel_ena_int(void); /**< %jp{割込み許可}%en{Enable interrupt} */ +void _kernel_dis_int(void); /**< %jp{割込み禁止}%en{Disable interrupt} */ +void _kernel_wai_int(void); /**< %jp{割込み待ち(アイドル時の処理)}%en{Wait for interrupt(sleep)} */ + +void _kernel_cre_ctx(_KERNEL_T_CTXCB *pk_ctxcb, VP isp, FP entry, VP_INT par1, VP_INT par2); /**< %jp{実行コンテキストの作成}%en{Create execution context)} */ +void _kernel_sta_ctx(_KERNEL_T_CTXCB *pk_ctxcb); /**< %jp{実行コンテキストの開始}%en{Stert context)} */ +void _kernel_rst_ctx(VP_INT par1, VP_INT par2, VP isp, FP entry); /**< %jp{実行コンテキストのリスタート}%en{Restert context)} */ +void _kernel_swi_ctx(_KERNEL_T_CTXCB *pk_ctxcb_nxt, _KERNEL_T_CTXCB *pk_ctxcb_now); /**< %jp{実行コンテキストの切替}%en{Switch context)} */ + + +#ifdef __cplusplus +} +#endif + + + +#define _KERNEL_INI_PRC() do{}while(0) /**< %jp{プロセッサの初期化}%en{Initialize processor} */ + +#define _KERNEL_INI_INT(stksz, stk) do { _kernel_ictxcb.isp = (VB *)(stk) + (stksz); } while (0) +#define _KERNEL_ENA_INT() _kernel_ena_int() /**< %jp{割込み許可}%en{Enable interrupt} */ +#define _KERNEL_DIS_INT() _kernel_dis_int() /**< %jp{割込み禁止}%en{Disable interrupt} */ +#define _KERNEL_WAI_INT() _kernel_wai_int() /**< %jp{割込み待ち(アイドル時の処理)}%en{Wait for interrupt(sleep)} */ + +#define _KERNEL_CRE_CTX(pk_ctxcb, stksz, stk, isp, entry, par1, par2) \ + _kernel_cre_ctx((pk_ctxcb), (isp), (entry), (par1), (par2)) /**< %jp{実行コンテキスト生成}%en{Create execution context)} */ +#define _KERNEL_DEL_CTX(pk_ctxcb) _kernel_del_ctx(pk_ctxcb) +#define _KERNEL_RST_CTX(pk_ctxcb, stksz, stk, isp, entry, par1, par2) \ + _kernel_rst_ctx((par1), (par2), (isp), (entry)) /**< %jp{実行コンテキストリスタート}%en{Restert context)} */ +#define _KERNEL_STA_CTX(pk_ctxcb) _kernel_sta_ctx(pk_ctxcb) +#define _KERNEL_SWI_CTX(pk_ctxcb_now, pk_ctxcb_nxt) \ + _kernel_swi_ctx((pk_ctxcb_nxt), (pk_ctxcb_now)) /**< %jp{コンテキストのスイッチ}%en{Switch context)} */ + + + + +#endif /* _KERNEL__arch__proc__sh__sh2a_fpu__proc_h__ */ + + + +/* end of file */ diff --git a/kernel/include/arch/proc/sh/sh2a-fpu/procatr.h b/kernel/include/arch/proc/sh/sh2a-fpu/procatr.h new file mode 100644 index 0000000..06c93c1 --- /dev/null +++ b/kernel/include/arch/proc/sh/sh2a-fpu/procatr.h @@ -0,0 +1,52 @@ +/** + * Hyper Operating System V4 Advance + * + * @file procatr.h + * @brief %jp{プロセッサアーキテクチャ固有属性定義(SH2 processor)} + * + * Copyright (C) 1998-2010 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#ifndef _KERNEL__arch__proc__sh__sh2a_fpu__procatr_h__ +#define _KERNEL__arch__proc__sh__sh2a_fpu__procatr_h__ + + +/* %jp{プロセッサアーキテクチャ定義のあるインクルードパス} */ +#define _KERNEL_PROCATR_INC_PATH "sh/sh2a-fpu" + + +/* %jp{プロセッサアーキテクチャに依存した属性} */ +#define _KERNEL_PROCATR_CTX_STK FALSE /**< %jp{コンテキスト生成にスタック領域の指定が必要か?} */ +#define _KERNEL_PROCATR_CTX_STKSZ FALSE /**< %jp{コンテキスト生成にスタックサイズの指定が必要か?} */ +#define _KERNEL_PROCATR_CTX_ISP TRUE /**< %jp{コンテキスト生成に初期スタックポインタ値が必要か?} */ +#define _KERNEL_PROCATR_CTX_DEL FALSE /**< %jp{別コンテキストからのコンテキスト削除が必要か?} */ +#define _KERNEL_PROCATR_CTX_RST TRUE /**< %jp{自コンテキストのリスタートが可能か?} */ + +#define _KERNEL_PROCATR_TMIN_STKSZ (4*16) /**< %jp{最低限必要なスタックサイズ(byte単位)} */ + +#define _KERNEL_PROCATR_SPT_SMP FALSE /**< %jp{SMPに対応しているか?} */ +#define _KERNEL_PROCATR_SPT_MULTINT TRUE /**< %jp{多重割込みに対応しているか?} */ + +#define _KERNEL_PROCATR_TMIN_INHNO 64 /**< %jp{割込みハンドラ番号の最小値} */ +#define _KERNEL_PROCATR_TMAX_INHNO 512 /**< %jp{割込みハンドラ番号の最大値} */ + +#define _KERNEL_PROCATR_TMIN_EXCNO 4 /**< %jp{CPU例外ハンドラ番号の最小値} */ +#define _KERNEL_PROCATR_TMAX_EXCNO 63 /**< %jp{CPU例外ハンドラ番号の最大値} */ + +#define _KERNEL_PROCATR_EXCSTK_NUM 0 /**< %jp{CPU例外処理用スタックは何本必要か?} */ +#define _KERNEL_PROCATR_INTSTK_NUM 1 /**< %jp{割込みスタックは何本必要か?} */ + +#define _KERNEL_PROCATR_SIGNED_INT 0 /**< %jp{符号付整数と符号無し整数のどちらが得意か?(符号付き:1, 符号無し:-1, 同じ:0)} */ +#define _KERNEL_PROCATR_TBIT_INT 32 /**< %jp{プロセッサに最適な整数型のビット数} */ +#define _KERNEL_PROCATR_TBIT_PTR 32 /**< %jp{ポインタのビット数} */ +#define _KERNEL_PROCATR_MEM_ALIGN 8 /**< %jp{適切なメモリのアライメント(byte単位)} */ +#define _KERNEL_PROCATR_STK_ALIGN 4 /**< %jp{適切なスタックのアライメント(byte単位)} */ +#define _KERNEL_PROCATR_ALLOW_UNALIGN FALSE /**< %jp{アンアラインアクセスは可能か?} */ + + +#endif /* _KERNEL__arch__proc__sh__sh2a_fpu__procatr_h__ */ + + +/* end of file */ diff --git a/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kcre_ctx.S b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kcre_ctx.S new file mode 100644 index 0000000..15e1e53 --- /dev/null +++ b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kcre_ctx.S @@ -0,0 +1,54 @@ +/* ------------------------------------------------------------------------ */ +/* Hyper Operating System V4 Advance */ +/* */ +/* Copyright (C) 1998-2006 by Project HOS */ +/* http://sourceforge.jp/projects/hos/ */ +/* ------------------------------------------------------------------------ */ + + + .text + + +/************************************************ + 実行コンテキストエントリーアドレス + ************************************************/ + .align 2 +ctx_entry: + mov r9, r4 /* 実行時パラメータ1を設定 */ + jmp @r8 /* 実行開始アドレスに分岐 */ + mov r10, r5 /* 実行時パラメータ2を設定(遅延スロット) */ + + +/************************************************ + 実行コンテキストの作成 + _kernel_cre_ctx( + _KERNEL_T_CTXCB *pk_ctxcb, 作成するコンテキスト [r4] + VP isp, 初期スタックポインタ [r5] + FP entry, 実行アドレス [r6] + VP_INT par1, 実行時パラメータ1 [r7] + VP_INT par2) 実行時パラメータ2 [@(0, r15)] + ************************************************/ + .align 2 + .global __kernel_cre_ctx +__kernel_cre_ctx: + add #-40, r5 /* スタックに領域を確保 */ + mov.l r6, @(36, r5) /* 実行アドレスを r8 の領域に設定 */ + mov.l r7, @(32, r5) /* 実行時パラメータ1を r9 の領域に設定 */ + mov.l @(0, r15), r0 + mov.l r0, @(28, r5) /* 実行時パラメータ2を r10 の領域に設定 */ + mov.l addr_ctx_entry, r0 + mov.l r0, @(0, r5) /* 実行エントリポイントを pr の領域に設定 */ + rts + mov.l r5, @(0, r4) /* スタックポインタを保存(遅延スロット) */ + + .align 2 +addr_ctx_entry: + .long ctx_entry + + + + + .end + + +/* end of file */ diff --git a/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kdis_int.S b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kdis_int.S new file mode 100644 index 0000000..5eb9903 --- /dev/null +++ b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kdis_int.S @@ -0,0 +1,31 @@ +/* ------------------------------------------------------------------------ */ +/* Hyper Operating System V4 Advance */ +/* */ +/* Copyright (C) 1998-2006 by Project HOS */ +/* http://sourceforge.jp/projects/hos/ */ +/* ------------------------------------------------------------------------ */ + + + + .text + + +/************************************************ + 割り込み禁止 + void _kernel_dis_int(void) + ************************************************/ + .align 2 + .global __kernel_dis_int +__kernel_dis_int: + stc sr, r0 + or #0xf0, r0 /* 全割り込みマスク */ + ldc r0, sr + rts + nop + + + + .end + + +/* end of file */ diff --git a/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kena_int.S b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kena_int.S new file mode 100644 index 0000000..b3ba2d7 --- /dev/null +++ b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kena_int.S @@ -0,0 +1,39 @@ +/* ------------------------------------------------------------------------ */ +/* Hyper Operating System V4 Advance */ +/* */ +/* Copyright (C) 1998-2006 by Project HOS */ +/* http://sourceforge.jp/projects/hos/ */ +/* ------------------------------------------------------------------------ */ + + + + .text + + +/************************************************ + 割り込み許可 + void _kernel_ena_int(void) + ************************************************/ + .align 2 + .global __kernel_ena_int +__kernel_ena_int: + mov.l addr_ictxcb, r2 + stc sr, r0 + mov.w @r2, r1 + or #0xf0, r0 + xor #0xf0, r0 + or r1, r0 + ldc r0, sr + rts + nop + + + .align 2 +addr_ictxcb: + .long __kernel_ictxcb + + + .end + + +/* end of file */ diff --git a/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kexc_hdr.S b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kexc_hdr.S new file mode 100644 index 0000000..97e0d1f --- /dev/null +++ b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kexc_hdr.S @@ -0,0 +1,405 @@ +/* ------------------------------------------------------------------------ */ +/* Hyper Operating System V4 Advance */ +/* */ +/* Copyright (C) 1998-2006 by Project HOS */ +/* http://sourceforge.jp/projects/hos/ */ +/* ------------------------------------------------------------------------ */ + + + .global __kernel_exc_hdr + + + + .text + + +/************************************************ + 高速割り込みベクタ利用時、bra で分岐可能な + 位置にベクタ入り口を設置。ただし未使用の + ベクタまでリンクされてしまう。 + ************************************************/ + +#ifdef _KERNEL_FAST_EXCVEC + + .global __kernel_vector_004 + .global __kernel_vector_005 + .global __kernel_vector_006 + .global __kernel_vector_007 + .global __kernel_vector_008 + .global __kernel_vector_009 + .global __kernel_vector_010 + .global __kernel_vector_011 + .global __kernel_vector_012 + .global __kernel_vector_013 + .global __kernel_vector_014 + .global __kernel_vector_015 + .global __kernel_vector_016 + .global __kernel_vector_017 + .global __kernel_vector_018 + .global __kernel_vector_019 + .global __kernel_vector_020 + .global __kernel_vector_021 + .global __kernel_vector_022 + .global __kernel_vector_023 + .global __kernel_vector_024 + .global __kernel_vector_025 + .global __kernel_vector_026 + .global __kernel_vector_027 + .global __kernel_vector_028 + .global __kernel_vector_029 + .global __kernel_vector_030 + .global __kernel_vector_031 + .global __kernel_vector_032 + .global __kernel_vector_033 + .global __kernel_vector_034 + .global __kernel_vector_035 + .global __kernel_vector_036 + .global __kernel_vector_037 + .global __kernel_vector_038 + .global __kernel_vector_039 + .global __kernel_vector_040 + .global __kernel_vector_041 + .global __kernel_vector_042 + .global __kernel_vector_043 + .global __kernel_vector_044 + .global __kernel_vector_045 + .global __kernel_vector_046 + .global __kernel_vector_047 + .global __kernel_vector_048 + .global __kernel_vector_049 + .global __kernel_vector_050 + .global __kernel_vector_051 + .global __kernel_vector_052 + .global __kernel_vector_053 + .global __kernel_vector_054 + .global __kernel_vector_055 + .global __kernel_vector_056 + .global __kernel_vector_057 + .global __kernel_vector_058 + .global __kernel_vector_059 + .global __kernel_vector_060 + .global __kernel_vector_061 + .global __kernel_vector_062 + .global __kernel_vector_063 + +__kernel_vector_004: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #4, r4 + +__kernel_vector_005: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #5, r4 + +__kernel_vector_006: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #6, r4 + +__kernel_vector_007: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #7, r4 + +__kernel_vector_008: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #8, r4 + +__kernel_vector_009: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #9, r4 + +__kernel_vector_010: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #10, r4 + +__kernel_vector_011: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #11, r4 + +__kernel_vector_012: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #12, r4 + +__kernel_vector_013: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #13, r4 + +__kernel_vector_014: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #14, r4 + +__kernel_vector_015: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #15, r4 + +__kernel_vector_016: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #16, r4 + +__kernel_vector_017: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #17, r4 + +__kernel_vector_018: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #18, r4 + +__kernel_vector_019: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #19, r4 + +__kernel_vector_020: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #20, r4 + +__kernel_vector_021: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #21, r4 + +__kernel_vector_022: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #22, r4 + +__kernel_vector_023: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #23, r4 + +__kernel_vector_024: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #24, r4 + +__kernel_vector_025: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #25, r4 + +__kernel_vector_026: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #26, r4 + +__kernel_vector_027: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #27, r4 + +__kernel_vector_028: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #28, r4 + +__kernel_vector_029: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #29, r4 + +__kernel_vector_030: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #30, r4 + +__kernel_vector_031: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #31, r4 + +__kernel_vector_032: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #32, r4 + +__kernel_vector_033: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #33, r4 + +__kernel_vector_034: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #34, r4 + +__kernel_vector_035: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #35, r4 + +__kernel_vector_036: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #36, r4 + +__kernel_vector_037: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #37, r4 + +__kernel_vector_038: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #38, r4 + +__kernel_vector_039: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #39, r4 + +__kernel_vector_040: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #40, r4 + +__kernel_vector_041: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #41, r4 + +__kernel_vector_042: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #42, r4 + +__kernel_vector_043: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #43, r4 + +__kernel_vector_044: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #44, r4 + +__kernel_vector_045: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #45, r4 + +__kernel_vector_046: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #46, r4 + +__kernel_vector_047: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #47, r4 + +__kernel_vector_048: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #48, r4 + +__kernel_vector_049: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #49, r4 + +__kernel_vector_050: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #50, r4 + +__kernel_vector_051: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #51, r4 + +__kernel_vector_052: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #52, r4 + +__kernel_vector_053: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #53, r4 + +__kernel_vector_054: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #54, r4 + +__kernel_vector_055: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #55, r4 + +__kernel_vector_056: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #56, r4 + +__kernel_vector_057: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #57, r4 + +__kernel_vector_058: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #58, r4 + +__kernel_vector_059: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #59, r4 + +__kernel_vector_060: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #60, r4 + +__kernel_vector_061: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #61, r4 + +__kernel_vector_062: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #62, r4 + +__kernel_vector_063: + mov.l r4, @-r15 + bra __kernel_exc_hdr + mov #63, r4 + +#endif + + +/************************************************ + CPU例外ハンドラ + + r4をスタックに積んだ後、r4に割り込み番号を + 格納してここに分岐するものとする +************************************************/ +__kernel_exc_hdr: + /* まだ未実装 */ + + mov.l @r15+, r4 + rte + nop + + + .end + + +/* end of file */ diff --git a/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kint_hdr.S b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kint_hdr.S new file mode 100644 index 0000000..1044db6 --- /dev/null +++ b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kint_hdr.S @@ -0,0 +1,190 @@ +/* ------------------------------------------------------------------------ */ +/* Hyper Operating System V4 Advance */ +/* */ +/* Copyright (C) 1998-2010 by Project HOS */ +/* http://sourceforge.jp/projects/hos/ */ +/* ------------------------------------------------------------------------ */ + + + .global __kernel_int_hdr + .global __kernel_ictxcb + .global __kernel_sta_inh + .global __kernel_exe_inh + .global __kernel_end_inh + + + .text + + +#define ICTXCB_IMSK 0 +#define ICTXCB_INTCNT 2 +#define ICTXCB_ISP 4 + + +/************************************************ + 割込みハンドラ + + レジスタバンク数以上の多重割込みネストは無いと + ものとする。 + ************************************************/ + .align 2 +__kernel_int_hdr: + /* ---- 多重割込みをマスク */ + stc sr, r0 + /* mov r0, r8 */ /* r8 に sr 保存 */ + or #0xf0, r0 + ldc r0, sr /* 全割込みマスク */ + + /* ---- 割込み番号取得 */ + mov.l addr_ibnr, r0 + mov.l @r0, r0 + and #0x0f, r0 + shll8 r0 + shlr r0 + add #-64, r0 + ldbank @r0, r0 + shlr2 r0 + mov r0, r9 /* r9に割り込み番号 */ + + /* ---- 割込みマスク値の設定&多重割込み判定 */ + mov.l addr_ictxcb, r10 + mov.b @(ICTXCB_INTCNT, r10), r0 /* 割込みネストカウンタ取り出し */ + cmp/eq #0, r0 /* 初回割込み判定 */ + mov.w @r0, r11 /* r11に古い割込みマスク値格納 */ + add #1, r0 /* 割込みネストカウンタ加算 */ + mov.w r0, @(ICTXCB_IMSK, r10) /* 新しい割込みマスク値設定 */ + bf/s multiple_int /* 多重割込み処理へ分岐 */ + mov.b r0, @(ICTXCB_INTCNT, r10) /* 割込みネスト値を設定(遅延スロット) */ + + /* ==== 初回割込みの処理 */ + + /* ---- スタック入れ替え */ + mov r15, r12 /* r12に現在のスタックを退避 */ + mov.l @(ICTXCB_ISP, r10), r15 /* 割込み用スタックを設定 */ + + /* ---- 割込み開始処理呼び出し */ + mov.l addr_sta_inh, r1 + jsr @r1 + + /* ---- 割込み実行処理呼び出し */ + mov.l addr_exe_inh, r1 + jsr @r1 + mov r9, r4 /* 割込み番号を引数とする(遅延スロット) */ + + /* ---- スタックの復帰 */ + mov r12, r15 + + /* ---- 割込みカウンタのクリア */ + xor r0, r0 + mov.b r0, @(ICTXCB_INTCNT, r10) + + /* ---- 割込みマスク値復帰 */ + mov.l @(4, r15), r0 /* 割込み前の sr を取り出し */ + and #0xf0, r0 /* 割込みマスク値取り出し */ + cmp/eq r0, r11 /* 古い割込みマスク値と比較 */ + bf/s return_int /* 不一致なら既に割込み処理中とみなす */ + mov.w r3, @(ICTXCB_IMSK, r10) /* 割込み前の状態に割込みマスク値を設定(遅延スロット) */ + + /* ---- 割込み終了処理呼び出し */ + resbank + mov.l r0, @-r15 + mov.l r1, @-r15 + mov.l r2, @-r15 + mov.l r3, @-r15 + mov.l r4, @-r15 + mov.l r5, @-r15 + mov.l r6, @-r15 + mov.l r7, @-r15 + sts.l pr, @-r15 + sts.l fpscr, @-r15 + sts.l fpul, @-r15 + fmov.d dr0, @-r15 + fmov.d dr2, @-r15 + fmov.d dr4, @-r15 + fmov.d dr6, @-r15 + fmov.d dr8, @-r15 + fmov.d dr10, @-r15 + + mov.l addr_end_inh, r2 + jsr @r2 + + /* ---- 復帰時割込みマスクの設定 */ + mov.l @(96, r15), r0 /* 割込み前の sr を取り出し */ + or #0xf0, r0 /* 割込みマスク部分クリアの前処理(一旦ビットを立てる) */ + mov.l addr_ictxcb, r1 + xor #0xf0, r0 /* 割込みマスク部分クリア(立てといて反転させる) */ + mov.w @r1, r1 /* マスク値取得 */ + or r1, r0 /* マスク値を設定 */ + mov.l r0, @(96, r15) /* 復帰時SRの設定 */ + + fmov.d @r15+, dr0 + fmov.d @r15+, dr2 + fmov.d @r15+, dr4 + fmov.d @r15+, dr6 + fmov.d @r15+, dr8 + fmov.d @r15+, dr10 + lds.l @r15+, fpul + lds.l @r15+, fpscr + lds.l @r15+, pr + mov.l @r15+, r7 + mov.l @r15+, r6 + mov.l @r15+, r5 + mov.l @r15+, r4 + mov.l @r15+, r3 + mov.l @r15+, r2 + mov.l @r15+, r1 + mov.l @r15+, r0 + + rte + nop + + + /* ---- 復帰 */ +return_int: + resbank + rte + nop + + + + /* ==== 多重割込みの処理 */ + .ALIGN 4 +multiple_int: + /* ---- 割込み実行処理呼び出し */ + mov.l addr_exe_inh, r1 + jsr @r1 /* 割込み番号(r4)を引数とする */ + mov.l r3, @-r15 /* 古いマスク値を保存 */ + + /* ---- 割込みカウンタの減算 */ + mov.l addr_ictxcb, r1 + mov.b @(ICTXCB_INTCNT, r1), r0 + add #-1, r0 + mov.b r0, @(ICTXCB_INTCNT, r1) + + /* ---- 割込みマスク値の復帰 */ + mov.l @r15+, r3 /* 古いマスク値を復帰 */ + bra return_int + mov.w r3, @r1 + + + .align 2 +addr_ictxcb: + .long __kernel_ictxcb /* 割込みコンテキスト制御ブロック */ + +addr_sta_inh: + .long __kernel_sta_inh /* 割込み開始処理 */ + +addr_exe_inh: + .long __kernel_exe_inh /* 割込み実行処理 */ + +addr_end_inh: + .long __kernel_end_inh /* 割込み終了処理 */ + +addr_ibnr: + .long 0xfffe080e /* IBNR */ + + + .end + + +/* end of file */ diff --git a/kernel/source/arch/proc/sh/sh2a-fpu/gcc/krst_ctx.S b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/krst_ctx.S new file mode 100644 index 0000000..f904c6c --- /dev/null +++ b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/krst_ctx.S @@ -0,0 +1,30 @@ +/* ------------------------------------------------------------------------ */ +/* Hyper Operating System V4 Advance */ +/* */ +/* Copyright (C) 1998-2006 by Project HOS */ +/* http://sourceforge.jp/projects/hos/ */ +/* ------------------------------------------------------------------------ */ + + + + .text + +/************************************************ + 実行コンテキストのリスタート + void _kernel_rst_ctx( + VP_INT par1, 実行時パラメータ1 [r4] + VP_INT par2, 実行時パラメータ2 [r5] + VP isp, 初期スタックポインタ [r6] + FP entry) 実行アドレス [r7] +************************************************/ + .align 2 + .global __kernel_rst_ctx +__kernel_rst_ctx: + jmp @r7 /* 実行アドレスに分岐 */ + mov r6, r15 /* スタックポインタリセット(遅延スロット) */ + + + .end + + +/* end of file */ diff --git a/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kswi_ctx.S b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kswi_ctx.S new file mode 100644 index 0000000..7b2d05a --- /dev/null +++ b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kswi_ctx.S @@ -0,0 +1,58 @@ +/* ------------------------------------------------------------------------ */ +/* Hyper Operating System V4 Advance */ +/* */ +/* Copyright (C) 1998-2006 by Project HOS */ +/* http://sourceforge.jp/projects/hos/ */ +/* ------------------------------------------------------------------------ */ + + + .text + + +/************************************************ + 実行コンテキストの切替 + void _kernel_swi_ctx( + _KERNEL_T_CTXCB *pk_ctxcb_nxt, 切り替え先のコンテキスト [r4] + _KERNEL_T_CTXCB *pk_ctxcb_now) 現在のコンテキスト [r5] +************************************************/ + .align 2 + .global __kernel_swi_ctx +__kernel_swi_ctx: + mov.l r8, @-r15 /* レジスタを退避 */ + mov.l r9, @-r15 + mov.l r10, @-r15 + mov.l r11, @-r15 + mov.l r12, @-r15 + mov.l r13, @-r15 + mov.l r14, @-r15 + sts.l macl, @-r15 + sts.l mach, @-r15 + sts.l pr, @-r15 + mov.l r15, @(0, r5) /* スタックポインタ保存 */ + /* ---- このまま _kernel_sta_ctx に続ける */ + +/************************************************ + 実行コンテキストの開始 + void _kernel_sta_ctx( + _KERNEL_T_CTXCB *pk_ctxcb) 開始するコンテキスト [r4] +************************************************/ + .global __kernel_sta_ctx +__kernel_sta_ctx: + mov.l @(0, r4), r15 /* スタックポインタ復帰 */ + lds.l @r15+, pr /* r8-r14,prを復帰 */ + lds.l @r15+, mach + lds.l @r15+, macl + mov.l @r15+, r14 + mov.l @r15+, r13 + mov.l @r15+, r12 + mov.l @r15+, r11 + mov.l @r15+, r10 + mov.l @r15+, r9 + rts + mov.l @r15+, r8 + + + .end + + +/* end of file */ diff --git a/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kwai_int.S b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kwai_int.S new file mode 100644 index 0000000..be1bd42 --- /dev/null +++ b/kernel/source/arch/proc/sh/sh2a-fpu/gcc/kwai_int.S @@ -0,0 +1,29 @@ +/* ------------------------------------------------------------------------ */ +/* Hyper Operating System V4 Advance */ +/* */ +/* Copyright (C) 1998-2006 by Project HOS */ +/* http://sourceforge.jp/projects/hos/ */ +/* ------------------------------------------------------------------------ */ + + + + .text + + +/************************************************ + 割り込み待ち + void _kernel_wai_int(void) +************************************************/ + .align 2 + .global __kernel_wai_int +__kernel_wai_int: + ; sleep + bra __kernel_wai_int + nop + + + + .end + + +/* end of file */ diff --git a/kernel/source/arch/proc/sh/sh2a-fpu/val_int.c b/kernel/source/arch/proc/sh/sh2a-fpu/val_int.c new file mode 100644 index 0000000..ee341e5 --- /dev/null +++ b/kernel/source/arch/proc/sh/sh2a-fpu/val_int.c @@ -0,0 +1,18 @@ +/** + * Hyper Operating System V4 Advance + * + * @file val_int.c + * @brief %jp{割込み用変数定義} + * + * Copyright (C) 1998-2006 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + +#include "core/core.h" + + +_KERNEL_T_ICTXCB _kernel_ictxcb; /**< %jp{割込みコンテキスト制御ブロック} */ + + +/* end of file */ + diff --git a/sample/sh/sh7262/gcc/Makefile b/sample/sh/sh7262/gcc/Makefile index f757d03..024629e 100644 --- a/sample/sh/sh7262/gcc/Makefile +++ b/sample/sh/sh7262/gcc/Makefile @@ -25,7 +25,7 @@ CMD_OBJCNV ?= $(GCC_ARCH)objcopy # %jp{アーキテクチャ定義}%en{architecture} -ARCH_NAME ?= sh2 +ARCH_NAME ?= sh2a-fpu ARCH_CC ?= gcc @@ -34,7 +34,7 @@ TOP_DIR = ../../../.. KERNEL_DIR = $(TOP_DIR)/kernel KERNEL_CFGRTR_DIR = $(TOP_DIR)/cfgrtr/build/gcc KERNEL_MAKINC_DIR = $(KERNEL_DIR)/build/common/gmake -KERNEL_BUILD_DIR = $(KERNEL_DIR)/build/sh/sh2/gcc +KERNEL_BUILD_DIR = $(KERNEL_DIR)/build/sh/$(ARCH_NAME)/$(ARCH_CC) # %jp{コンフィギュレータ定義} -- 2.11.0