HOS-V4 Advance の開発リポジトリ
Revision | 3c4d7491790f57d9722e3b8ec2c8b5bf2f27e499 (tree) |
---|---|
Time | 2014-03-01 11:41:19 |
Author | Ryuji Fuchikami <ryuz@user...> |
Commiter | Ryuji Fuchikami |
add cortex-a9 base
@@ -0,0 +1,150 @@ | ||
1 | +# ---------------------------------------------------------------------------- | |
2 | +# Hyper Operating System V4 Advance | |
3 | +# makefile for Cortex-M3 | |
4 | +# | |
5 | +# Copyright (C) 1998-2011 by Project HOS | |
6 | +# http://sourceforge.jp/projects/hos/ | |
7 | +# ---------------------------------------------------------------------------- | |
8 | + | |
9 | + | |
10 | + | |
11 | +# -------------------------------------- | |
12 | +# %jp{各種設定}%en{setting} | |
13 | +# -------------------------------------- | |
14 | + | |
15 | +# %jp{ターゲットライブラリ名}%en{target library name} | |
16 | +TARGET ?= libhosv4a | |
17 | + | |
18 | + | |
19 | +# %jp{ツール定義}%jp{tools} | |
20 | +GCC_ARCH ?= arm-none-eabi- | |
21 | +CMD_CC ?= $(GCC_ARCH)gcc | |
22 | +CMD_ASM ?= $(GCC_ARCH)gcc | |
23 | +CMD_LIBR ?= $(GCC_ARCH)ar | |
24 | + | |
25 | + | |
26 | +# %jp{アーキテクチャ定義}%en{architecture} | |
27 | +ARCH_NAME ?= cortex_a9 | |
28 | +ARCH_PROC ?= arm/arm_v7a | |
29 | +ARCH_IRC ?= none | |
30 | +ARCH_CC ?= gcc | |
31 | + | |
32 | + | |
33 | +# %jp{ディレクトリ定義}%en{directories} | |
34 | +TOP_DIR = ../../../../.. | |
35 | +KERNEL_DIR = $(TOP_DIR)/kernel | |
36 | +KERNEL_MAKINC_DIR = $(KERNEL_DIR)/build/common/gmake | |
37 | +INC_PROC_DIR = $(KERNEL_DIR)/include/arch/proc/$(ARCH_PROC) | |
38 | +INC_IRC_DIR = $(KERNEL_DIR)/include/arch/irc/$(ARCH_IRC) | |
39 | +SRC_PROC_DIR = $(KERNEL_DIR)/source/arch/proc/$(ARCH_PROC) | |
40 | +SRC_PROC_CC_DIR = $(KERNEL_DIR)/source/arch/proc/$(ARCH_PROC)/$(ARCH_CC) | |
41 | +SRC_IRC_DIR = $(KERNEL_DIR)/source/arch/irc/$(ARCH_IRC) | |
42 | +SRC_IRC_CC_DIR = $(KERNEL_DIR)/source/arch/irc/$(ARCH_IRC)/$(ARCH_CC) | |
43 | +CFGRTR_DIR = $(TOP_DIR)/cfgrtr/build/gcc | |
44 | + | |
45 | + | |
46 | +# %jp{コンフィギュレータ定義}%en{kernel configurator} | |
47 | +CFGRTR = h4acfg-$(ARCH_NAME) | |
48 | + | |
49 | + | |
50 | +# %jp{カーネル指定}%en{kernel flag} | |
51 | +KERNEL = Yes | |
52 | + | |
53 | + | |
54 | +# %jp{共通定義読込み}%en{common setting} | |
55 | +include $(KERNEL_MAKINC_DIR)/common.inc | |
56 | + | |
57 | + | |
58 | +# %jp{パス設定}%en{add source directories} | |
59 | +INC_DIRS += $(INC_PROC_DIR) $(INC_IRC_DIR) | |
60 | +SRC_DIRS += $(SRC_PROC_DIR) $(SRC_PROC_DIR) $(SRC_PROC_CC_DIR) $(SRC_IRC_DIR) $(SRC_IRC_CC_DIR) | |
61 | + | |
62 | + | |
63 | +# %jp{オプションフラグ}%en{option flags} | |
64 | +AFLAGS = -mcpu=cortex-a9 -mthumb | |
65 | +CFLAGS = -mcpu=cortex-a9 -mthumb | |
66 | +ARFLAGS = | |
67 | + | |
68 | + | |
69 | +# %jp{コンパイラ依存の設定読込み}%en{compiler dependent definitions} | |
70 | +include $(KERNEL_MAKINC_DIR)/$(ARCH_CC)_d.inc | |
71 | + | |
72 | +# %jp{ライブラリ生成用設定読込み}%en{definitions for library} | |
73 | +include $(KERNEL_MAKINC_DIR)/maklib_d.inc | |
74 | + | |
75 | + | |
76 | + | |
77 | + | |
78 | +# -------------------------------------- | |
79 | +# %jp{ソースファイル}%en{source files} | |
80 | +# -------------------------------------- | |
81 | + | |
82 | +# %jp{アセンブラファイルの追加}%en{assembry sources} | |
83 | +ASRCS += $(SRC_PROC_CC_DIR)/kdis_int.S | |
84 | +ASRCS += $(SRC_PROC_CC_DIR)/kena_int.S | |
85 | +ASRCS += $(SRC_PROC_CC_DIR)/kcre_ctx.S | |
86 | +ASRCS += $(SRC_PROC_CC_DIR)/krst_ctx.S | |
87 | +ASRCS += $(SRC_PROC_CC_DIR)/kswi_ctx.S | |
88 | +ASRCS += $(SRC_PROC_CC_DIR)/kwai_int.S | |
89 | +ASRCS += $(SRC_PROC_CC_DIR)/kirq_hdr.S | |
90 | + | |
91 | +# %jp{C言語ファイルの追加}%en{C sources} | |
92 | +CSRCS += $(SRC_PROC_DIR)/val_int.c | |
93 | + | |
94 | +# %jp{カーネル共通ソースの追加}%en{kernel common sources} | |
95 | +include $(KERNEL_MAKINC_DIR)/knlsrc.inc | |
96 | + | |
97 | + | |
98 | + | |
99 | + | |
100 | +# -------------------------------------- | |
101 | +# %jp{ルール定義}%en{rules} | |
102 | +# -------------------------------------- | |
103 | + | |
104 | +# %jp{ALL}%en{all} | |
105 | +.PHONY : all | |
106 | +all: makelib_all | |
107 | + $(MAKE) -C $(CFGRTR_DIR) TARGET=$(CFGRTR) ARCH_PROC=$(ARCH_PROC) ARCH_IRC=$(ARCH_IRC) | |
108 | + | |
109 | +# %jp{クリーン}%en{clean} | |
110 | +.PHONY : clean | |
111 | +clean: makelib_clean | |
112 | + $(MAKE) -C $(CFGRTR_DIR) TARGET=$(CFGRTR) ARCH_PROC=$(ARCH_PROC) ARCH_IRC=$(ARCH_IRC) clean | |
113 | + $(RM) -f *.lst | |
114 | + | |
115 | +# %jp{依存関係更新}%en{make depend} | |
116 | +.PHONY : depend | |
117 | +depend: makelib_depend | |
118 | + | |
119 | +# %jp{ソース一括コピー}%en{source files copy} | |
120 | +.PHONY : srccpy | |
121 | +srccpy: makelib_srccpy | |
122 | + | |
123 | + | |
124 | +# %jp{ライブラリ生成用設定読込み}%en{rules for library} | |
125 | +include $(KERNEL_MAKINC_DIR)/maklib_r.inc | |
126 | + | |
127 | +# %jp{コンパイラ依存のルール定義読込み}%en{rules for compiler} | |
128 | +include $(KERNEL_MAKINC_DIR)/$(ARCH_CC)_r.inc | |
129 | + | |
130 | + | |
131 | + | |
132 | + | |
133 | +# -------------------------------------- | |
134 | +# %jp{依存関係}%en{dependency} | |
135 | +# -------------------------------------- | |
136 | + | |
137 | +# %jp{カーネル依存関係読込み}{dependency list of kernel sources} | |
138 | +include $(KERNEL_MAKINC_DIR)/knldep.inc | |
139 | + | |
140 | + | |
141 | +$(OBJS_DIR)/val_int.$(EXT_OBJ) : $(COMMON_HEADERS) | |
142 | +$(OBJS_DIR)/kini_irc.$(EXT_OBJ) : $(COMMON_HEADERS) | |
143 | +$(OBJS_DIR)/kexe_irc.$(EXT_OBJ) : $(COMMON_HEADERS) | |
144 | +$(OBJS_DIR)/ena_int.$(EXT_OBJ) : $(COMMON_HEADERS) | |
145 | +$(OBJS_DIR)/dis_int.$(EXT_OBJ) : $(COMMON_HEADERS) | |
146 | +$(OBJS_DIR)/vclr_int.$(EXT_OBJ) : $(COMMON_HEADERS) | |
147 | + | |
148 | + | |
149 | + | |
150 | +# end of file |
@@ -0,0 +1,85 @@ | ||
1 | +/** | |
2 | + * Hyper Operating System V4 Advance | |
3 | + * | |
4 | + * @file proc.h | |
5 | + * @brief %jp{コンテキスト制御}%en{context control} | |
6 | + * | |
7 | + * Copyright (C) 1998-2014 by Project HOS | |
8 | + * http://sourceforge.jp/projects/hos/ | |
9 | + */ | |
10 | + | |
11 | + | |
12 | +#ifndef _KERNEL__arch__proc__arm__arm_v7a__proc_h__ | |
13 | +#define _KERNEL__arch__proc__arm__arm_v7a__proc_h__ | |
14 | + | |
15 | + | |
16 | + | |
17 | +#define _KERNEL_IMSK_F 0x40 /**< %jp{FIQ割込みマスクビット} */ | |
18 | +#define _KERNEL_IMSK_I 0x80 /**< %jp{IRQ割込みマスクビット} */ | |
19 | + | |
20 | +#define _KERNEL_IMSK_LV0 0xc0 /**< %jp{割込みマスクレベル0(すべてマスク)} */ | |
21 | +#define _KERNEL_IMSK_LV1 0x80 /**< %jp{割込みマスクレベル1(FIQのみ許可)} */ | |
22 | +#define _KERNEL_IMSK_LV2 0x00 /**< %jp{割込みマスクレベル2(すべて許可)} */ | |
23 | + | |
24 | + | |
25 | + | |
26 | +/** %jp{コンテキスト制御ブロック} */ | |
27 | +typedef struct _kernel_t_ctxcb | |
28 | +{ | |
29 | + VP sp; | |
30 | +} _KERNEL_T_CTXCB; | |
31 | + | |
32 | +/** %jp{割込みコンテキスト制御ブロック} */ | |
33 | +typedef struct _kernel_t_ictxcb | |
34 | +{ | |
35 | + UB imsk; | |
36 | + UB intcnt; | |
37 | + VP isp; | |
38 | +} _KERNEL_T_ICTXCB; | |
39 | + | |
40 | + | |
41 | +extern _KERNEL_T_ICTXCB _kernel_ictxcb; /**< %jp{割込みコンテキスト制御ブロック} */ | |
42 | + | |
43 | + | |
44 | + | |
45 | +#ifdef __cplusplus | |
46 | +extern "C" { | |
47 | +#endif | |
48 | + | |
49 | +void _kernel_ena_int(void); /**< %jp{割込み許可} */ | |
50 | +void _kernel_dis_int(void); /**< %jp{割込み禁止} */ | |
51 | +void _kernel_wai_int(void); /**< %jp{割込み待ち(アイドル時の処理)} */ | |
52 | + | |
53 | +void _kernel_cre_ctx(_KERNEL_T_CTXCB *pk_ctxcb, VP isp, FP entry, VP_INT par1, VP_INT par2); /**< %jp{実行コンテキストの作成} */ | |
54 | +void _kernel_rst_ctx(VP_INT par1, VP_INT par2, FP entry, VP isp); /**< %jp{実行コンテキストのリスタート} */ | |
55 | +void _kernel_sta_ctx(_KERNEL_T_CTXCB *pk_ctxcb); /**< %jp{実行コンテキストの開始} */ | |
56 | +void _kernel_swi_ctx(_KERNEL_T_CTXCB *pk_ctxinf_nxt, _KERNEL_T_CTXCB *pk_ctxcb_now); /**< %jp{実行コンテキストの切替} */ | |
57 | + | |
58 | +#ifdef __cplusplus | |
59 | +} | |
60 | +#endif | |
61 | + | |
62 | + | |
63 | + | |
64 | +#define _KERNEL_INI_PRC() do {} while (0) /**< %jp{プロセッサ固有の初期化} */ | |
65 | + | |
66 | +#define _KERNEL_INI_INT(stksz, stk) do { _kernel_ictxcb.isp = (VB *)(stk) + (stksz); } while (0) /**< %jp{割込み初期化} */ | |
67 | +#define _KERNEL_ENA_INT() _kernel_ena_int() /**< %jp{割込み許可} */ | |
68 | +#define _KERNEL_DIS_INT() _kernel_dis_int() /**< %jp{割込み禁止} */ | |
69 | +#define _KERNEL_WAI_INT() _kernel_wai_int() /**< %jp{割込み待ち(アイドル時の処理)} */ | |
70 | + | |
71 | +#define _KERNEL_CRE_CTX(pk_ctxcb, stksz, stk, isp, entry, exinf1, exinf2) \ | |
72 | + _kernel_cre_ctx((pk_ctxcb), (isp), (entry), (exinf1), (exinf2)) /**< %jp{実行コンテキストの作成} */ | |
73 | +#define _KERNEL_DEL_CTX(pk_ctxcb) do {} while (0) /**< %jp{実行コンテキストの削除} */ | |
74 | +#define _KERNEL_RST_CTX(pk_ctxcb, stksz, stk, isp, entry, exinf1, exinf2) \ | |
75 | + _kernel_rst_ctx((exinf1), (exinf2), (entry), (isp)) /**< %jp{実行コンテキストのリスタート} */ | |
76 | +#define _KERNEL_STA_CTX(pk_ctxcb) _kernel_sta_ctx(pk_ctxcb) | |
77 | +#define _KERNEL_SWI_CTX(pk_ctxcb_now, pk_ctxinf_nxt) \ | |
78 | + _kernel_swi_ctx((pk_ctxinf_nxt), (pk_ctxcb_now)) /**< %jp{実行コンテキストの切替} */ | |
79 | + | |
80 | + | |
81 | +#endif /* _KERNEL__arch__proc__arm__arm_v7a__proc_h__ */ | |
82 | + | |
83 | + | |
84 | + | |
85 | +/* end of file */ |
@@ -0,0 +1,72 @@ | ||
1 | +/** | |
2 | + * Hyper Operating System V4 Advance | |
3 | + * | |
4 | + * @file ctxctl.h | |
5 | + * @brief %jp{コンテキスト制御}%en{context control} | |
6 | + * | |
7 | + * Copyright (C) 1998-2014 by Project HOS | |
8 | + * http://sourceforge.jp/projects/hos/ | |
9 | + */ | |
10 | + | |
11 | + | |
12 | +#ifndef _KERNEL__arch__proc__arm__arm_v7a__procatr_h__ | |
13 | +#define _KERNEL__arch__proc__arm__arm_v7a__procatr_h__ | |
14 | + | |
15 | + | |
16 | + | |
17 | +/* %jp{プロセッサアーキテクチャ定義のあるインクルードパス} */ | |
18 | +#define _KERNEL_PROCATR_INC_PATH "arm/arm_v7a" | |
19 | + | |
20 | + | |
21 | +/* %jp{プロセッサアーキテクチャに依存した属性} */ | |
22 | +#define _KERNEL_PROCATR_CTX_STK FALSE /**< %jp{コンテキスト生成にスタック領域の指定が必要か?} */ | |
23 | +#define _KERNEL_PROCATR_CTX_STKSZ FALSE /**< %jp{コンテキスト生成にスタックサイズの指定が必要か?} */ | |
24 | +#define _KERNEL_PROCATR_CTX_ISP TRUE /**< %jp{コンテキスト生成に初期スタックポインタ値が必要か?} */ | |
25 | +#define _KERNEL_PROCATR_CTX_DEL FALSE /**< %jp{別コンテキストからのコンテキスト削除が必要か?} */ | |
26 | +#define _KERNEL_PROCATR_CTX_RST TRUE /**< %jp{自コンテキストのリスタートが可能か?} */ | |
27 | + | |
28 | +#define _KERNEL_PROCATR_TMIN_STKSZ (4*16) /**< %jp{最低限必要なスタックサイズ(byte単位)} */ | |
29 | +#define _KERNEL_PROCATR_DEF_SYSSTKSZ 64 | |
30 | +#define _KERNEL_PROCATR_DEF_INTSTKSZ 256 | |
31 | + | |
32 | +#define _KERNEL_PROCATR_SPT_SMP FALSE /**< %jp{SMPに対応しているか?} */ | |
33 | +#define _KERNEL_PROCATR_SPT_MULTINT TRUE /**< %jp{多重割込みに対応しているか?} */ | |
34 | + | |
35 | +#define _KERNEL_PROCATR_TMIN_INHNO 0 /**< %jp{割込みハンドラ番号の最小値} */ | |
36 | +#define _KERNEL_PROCATR_TMAX_INHNO 1 /**< %jp{割込みハンドラ番号の最大値} */ | |
37 | + | |
38 | +#define _KERNEL_PROCATR_TMIN_EXCNO 0 /**< %jp{CPU例外ハンドラ番号の最小値} */ | |
39 | +#define _KERNEL_PROCATR_TMAX_EXCNO 4 /**< %jp{CPU例外ハンドラ番号の最大値} */ | |
40 | + | |
41 | +#define _KERNEL_PROCATR_SYSSTK_NUM 2 /**< %jp{システムスタックは何本必要か?} */ | |
42 | + | |
43 | +#define _KERNEL_PROCATR_SIGNED_INT 0 /**< %jp{符号付整数と符号無し整数のどちらが得意か?(符号付き:1, 符号無し:-1, 同じ:0)} */ | |
44 | +#define _KERNEL_PROCATR_TBIT_INT 32 /**< %jp{プロセッサに最適な整数型のビット数} */ | |
45 | +#define _KERNEL_PROCATR_TBIT_PTR 32 /**< %jp{ポインタのビット数} */ | |
46 | +#define _KERNEL_PROCATR_MEM_ALIGN 32 /**< %jp{適切なメモリのアライメント(byte単位)} */ | |
47 | +#define _KERNEL_PROCATR_STK_ALIGN 8 /**< %jp{適切なスタックのアライメント(byte単位)} */ | |
48 | +#define _KERNEL_PROCATR_ALLOW_UNALIGN FALSE /**< %jp{アンアラインアクセスは可能か?} */ | |
49 | + | |
50 | +#define _KERNEL_PROCATR_SYS_CTX FALSE /**< %jp{コンテキスト状態管理をプロセッサで実施するか?} */ | |
51 | +#define _KERNEL_PROCATR_SYS_LOC FALSE /**< %jp{CPUロック状態管理をプロセッサで実施するか?} */ | |
52 | +#define _KERNEL_PROCATR_SYS_DSP FALSE /**< %jp{ディスパッチ禁止状態管理をプロセッサで実施するか?} */ | |
53 | +#define _KERNEL_PROCATR_SYS_SYS FALSE /**< %jp{システム状態管理をプロセッサで実施するか?} */ | |
54 | +#define _KERNEL_PROCATR_SYS_DLY FALSE /**< %jp{遅延ディスパッチ保留状態管理をプロセッサで実施するか?} */ | |
55 | + | |
56 | + | |
57 | +/* %jp{ARM固有の定数} */ | |
58 | +#define _KERNEL_ARM_INHNO_IRQ 0 /**< %jp{IRQ割込みの割込みハンドラ番号} */ | |
59 | +#define _KERNEL_ARM_INHNO_FIQ 1 /**< %jp{FIQ割込みの割込みハンドラ番号} */ | |
60 | + | |
61 | +#define _KERNEL_ARM_EXCNO_RST 0 /**< %jp{リセットのCPU例外ハンドラ番号} */ | |
62 | +#define _KERNEL_ARM_EXCNO_UND 1 /**< %jp{無効命令例外のCPU例外ハンドラ番号} */ | |
63 | +#define _KERNEL_ARM_EXCNO_SWI 2 /**< %jp{ソフトウェア割込みのCPU例外ハンドラ番号} */ | |
64 | +#define _KERNEL_ARM_EXCNO_PRE 3 /**< %jp{プリフェッチアボートのCPU例外ハンドラ番号} */ | |
65 | +#define _KERNEL_ARM_EXCNO_ABT 4 /**< %jp{データアボートのCPU例外ハンドラ番号} */ | |
66 | + | |
67 | + | |
68 | + | |
69 | +#endif /* _KERNEL__arch__proc__arm__arm_v7a__procatr_h__ */ | |
70 | + | |
71 | + | |
72 | +/* end of file */ |
@@ -0,0 +1,36 @@ | ||
1 | +/** | |
2 | + * Hyper Operating System V4 Advance | |
3 | + * | |
4 | + * Copyright (C) 1998-2006 by Project HOS | |
5 | + * http://sourceforge.jp/projects/hos/ | |
6 | + */ | |
7 | + | |
8 | + | |
9 | +/* %jp{割込みハンドラ番号}%en{interruput handler number} */ | |
10 | +#define INHNO_IRQ 0 | |
11 | +#define INHNO_FIQ 1 | |
12 | + | |
13 | + | |
14 | +/* %jp{_KERNEL_T_ICTXCB構造体オフセット} */ | |
15 | +#define ICTXCB_IMSK 0 | |
16 | +#define ICTXCB_INTCNT 1 | |
17 | +#define ICTXCB_ISP 4 | |
18 | + | |
19 | + | |
20 | +/* %jp{プロセッサモード定義} */ | |
21 | +#define Mode_USR 0x10 /* USR モード */ | |
22 | +#define Mode_FIQ 0x11 /* FIQ モード */ | |
23 | +#define Mode_IRQ 0x12 /* IRQ モード */ | |
24 | +#define Mode_SVC 0x13 /* SVC モード */ | |
25 | +#define Mode_ABT 0x17 /* ABT モード */ | |
26 | +#define Mode_UND 0x1b /* UND モード */ | |
27 | +#define Mode_SYS 0x1f /* SYS モード */ | |
28 | +#define Mode_MASK 0x1f /* モードビットマスク */ | |
29 | + | |
30 | +/* %jp{フラグ定義} */ | |
31 | +#define T_Bit 0x20 /* T ビット */ | |
32 | +#define F_Bit 0x40 /* F ビット */ | |
33 | +#define I_Bit 0x80 /* I ビット */ | |
34 | + | |
35 | + | |
36 | +/* end of file */ |
@@ -0,0 +1,49 @@ | ||
1 | +/** | |
2 | + * Hyper Operating System V4 Advance | |
3 | + * | |
4 | + * Copyright (C) 1998-2014 by Project HOS | |
5 | + * http://sourceforge.jp/projects/hos/ | |
6 | + */ | |
7 | + | |
8 | + | |
9 | +#include "arm_v7a.inc" | |
10 | + | |
11 | + | |
12 | + .code 16 | |
13 | + .text | |
14 | + .align 2 | |
15 | + | |
16 | +/************************************************ | |
17 | + 実行コンテキストの作成 | |
18 | + void _kernel_cre_ctx( | |
19 | + _KERNEL_T_CTXCB *pk_ctxcb, r0 :作成するコンテキスト | |
20 | + VP isp, r1 :スタックポインタ | |
21 | + FP entry, r2 :実行アドレス | |
22 | + VP_INT par1, r3 :実行時パラメータ | |
23 | + VP_INT par2) sp[0]:実行時パラメータ | |
24 | + ************************************************/ | |
25 | + .global _kernel_cre_ctx | |
26 | +_kernel_cre_ctx: | |
27 | + sub r1, #36 /* スタックを確保 */ | |
28 | + str r2, [r1, #0] /* r4 部分にentryを設定 */ | |
29 | + str r3, [r1, #4] /* r5 部分にpar1を設定 */ | |
30 | + ldr r2, [sp, #0] /* par2を取り出し */ | |
31 | + str r2, [r1, #8] /* r6 部分にpar2を設定 */ | |
32 | + adr r2, ctx_entry /* エントリーアドレス設定 */ | |
33 | + add r2, #1 /* Thumbモードアドレスとして設定 */ | |
34 | + str r2, [r1, #32] /* lr 部分にエントリーアドレスを設定 */ | |
35 | + str r1, [r0] /* ctxcb に新 sp を保存 */ | |
36 | + bx lr /* リターン */ | |
37 | + | |
38 | +/************************************************ | |
39 | + 実行コンテキストエントリーアドレス | |
40 | + ************************************************/ | |
41 | +ctx_entry: | |
42 | + mov r0, r5 /* par1を設定 */ | |
43 | + mov r1, r6 /* par2を設定 */ | |
44 | + bx r4 /* entry を実行 */ | |
45 | + | |
46 | + .end | |
47 | + | |
48 | + | |
49 | +/* end of file */ |
@@ -0,0 +1,28 @@ | ||
1 | +/** | |
2 | + * Hyper Operating System V4 Advance | |
3 | + * | |
4 | + * Copyright (C) 1998-2014 by Project HOS | |
5 | + * http://sourceforge.jp/projects/hos/ | |
6 | + */ | |
7 | + | |
8 | + | |
9 | +#include "arm_v7a.inc" | |
10 | + | |
11 | + | |
12 | + .text | |
13 | + .align 2 | |
14 | + | |
15 | +/************************************************ | |
16 | + 割り込み禁止 | |
17 | + void _kernel_dis_int(void) | |
18 | + ************************************************/ | |
19 | + .global _kernel_dis_int | |
20 | +_kernel_dis_int: | |
21 | + cpsid fi /* 割り込み禁止 */ | |
22 | + bx lr /* リターン */ | |
23 | + | |
24 | + | |
25 | + .end | |
26 | + | |
27 | + | |
28 | +/* end of file */ |
@@ -0,0 +1,34 @@ | ||
1 | +/** | |
2 | + * Hyper Operating System V4 Advance | |
3 | + * | |
4 | + * Copyright (C) 1998-2014 by Project HOS | |
5 | + * http://sourceforge.jp/projects/hos/ | |
6 | + */ | |
7 | + | |
8 | + | |
9 | +#include "arm_v7a.inc" | |
10 | + | |
11 | + .code 32 | |
12 | + .text | |
13 | + .align 2 | |
14 | + | |
15 | +/************************************************ | |
16 | + 割り込み許可 | |
17 | + void _kernel_ena_int(void) | |
18 | + ************************************************/ | |
19 | + .global _kernel_ena_int | |
20 | + .global _kernel_ictxcb | |
21 | +_kernel_ena_int: | |
22 | + ldr r1, =_kernel_ictxcb | |
23 | + mrs r0, cpsr /* cpsr取得 */ | |
24 | + ldrb r1, [r1, #ICTXCB_IMSK] /* 割込みマスク値取得 */ | |
25 | + bic r0, r0, #(F_Bit | I_Bit) /* FビットとIビットをクリア */ | |
26 | + orr r0, r0, r1 /* 割込みマスク設定 */ | |
27 | + msr cpsr_c, r0 /* cpsr設定 */ | |
28 | + bx lr /* リターン */ | |
29 | + | |
30 | + | |
31 | + .end | |
32 | + | |
33 | + | |
34 | +/* end of file */ |
@@ -0,0 +1,116 @@ | ||
1 | +/** | |
2 | + * Hyper Operating System V4 Advance | |
3 | + * | |
4 | + * Copyright (C) 1998-2014 by Project HOS | |
5 | + * http://sourceforge.jp/projects/hos/ | |
6 | + */ | |
7 | + | |
8 | + | |
9 | +#include "arm_v7a.inc" | |
10 | + | |
11 | + | |
12 | + .code 32 | |
13 | + .text | |
14 | + .align 2 | |
15 | + | |
16 | + .global _kernel_ictxcb | |
17 | + .global _kernel_sta_inh | |
18 | + .global _kernel_end_inh | |
19 | + .global _kernel_exe_inh | |
20 | + | |
21 | +/************************************************ | |
22 | + IRQ handler | |
23 | + ************************************************/ | |
24 | + .global _kernel_irq_hdr | |
25 | +_kernel_irq_hdr: | |
26 | + /* ---- レジスタ退避 */ | |
27 | + sub lr, lr, #4 /* リターンアドレス算出 */ | |
28 | + /* srsfd #Mode_SYS! */ /* lr_irq, spsr_irqをSYSモードスタックに退避 */ | |
29 | + .long 0xf96d051f | |
30 | + cps #Mode_SYS /* SYSモードに移行 */ | |
31 | + stmfd sp!, {r0-r3, r12, lr} /* 汎用レジスタ退避 */ | |
32 | + mrs r2, cpsr /* cpsrをr2に退避 */ | |
33 | + cpsid fi /* 割り込み禁止 */ | |
34 | + | |
35 | + /* ---- 割込みマスク設定 */ | |
36 | + ldr r0, =_kernel_ictxcb | |
37 | + ldr r3, [r0, #ICTXCB_IMSK] /* 古いimsk値を取り出し */ | |
38 | + and r2, r2, #(F_Bit | I_Bit) | |
39 | + strb r2, [r0, #ICTXCB_IMSK] /* cpsr値をimsk値に設定 */ | |
40 | + | |
41 | + /* ---- 多重割込み判定 */ | |
42 | + ldrb r1, [r0, #ICTXCB_INTCNT] /* 割り込みネストカウンタ値取得 */ | |
43 | + add r1, r1, #1 /* 割り込みネストカウンタインクリメント */ | |
44 | + strb r1, [r0, #ICTXCB_INTCNT] /* 割り込みネストカウンタ設定 */ | |
45 | + cmp r1, #1 | |
46 | + bne multiple_int /* 多重割り込みなら分岐 */ | |
47 | + | |
48 | + /* ---- SPを割込みコンテキストのものに切替え */ | |
49 | + mov r1, sp /* タスクのSPを保存 */ | |
50 | + ldr sp, [r0, #ICTXCB_ISP] /* 割り込み用スタックに切り替え */ | |
51 | + stmfd sp!, {r1, r3} /* タスクのSPと旧imask保存 */ | |
52 | + | |
53 | + /* ---- 割込み開始処理 */ | |
54 | + bl _kernel_sta_inh /* 割り込み開始 */ | |
55 | + | |
56 | + /* ---- 割込みハンドラ実行 */ | |
57 | + mov r0, #INHNO_IRQ | |
58 | + bl _kernel_exe_inh | |
59 | + | |
60 | + /* ---- 割込み処理の終了設定 */ | |
61 | + ldmfd sp!, {r1, r3} /* 汎用レジスタ復帰 */ | |
62 | + mov sp, r1 /* SPを元のコンテキストのものに戻す */ | |
63 | + ldr r0, =_kernel_ictxcb /* 割り込みネストカウンタのアドレス取得 */ | |
64 | + mov r1, #0 /* 割り込みネストカウンタを0に戻す */ | |
65 | + strb r1, [r0, #ICTXCB_INTCNT] /* 割り込みネストカウンタ値設定 */ | |
66 | + | |
67 | + /* ---- 割込みマスク値復帰処理 */ | |
68 | + ldr r1, [sp, #28] /* spsr_irq 値取り出し */ | |
69 | + and r1, r1, #(F_Bit | I_Bit) | |
70 | + cmp r1, r3 /* 旧imsk値と比較 */ | |
71 | + bne return_int /* 不一致なら終了処理スキップ */ | |
72 | + strb r3, [r0, #ICTXCB_IMSK] /* マスク値復帰 */ | |
73 | + | |
74 | + /* ---- 割込み終了処理 */ | |
75 | + bl _kernel_end_inh /* 割り込み終了処理 */ | |
76 | + | |
77 | + ldr r0, =_kernel_ictxcb | |
78 | + ldr r1, [sp, #28] /* spsr_irq 値取り出し */ | |
79 | + ldrb r0, [r0, #ICTXCB_IMSK] /* この時点でのimsk値取り出し */ | |
80 | + bic r1, r1, #(F_Bit | I_Bit) | |
81 | + and r0, r0, #(F_Bit | I_Bit) | |
82 | + orr r1, r1, r0 | |
83 | + str r1, [sp, #28] /* spsr_irq にimsk値反映 */ | |
84 | + | |
85 | +return_int: | |
86 | + /* ---- 復帰処理 */ | |
87 | + ldmfd sp!, {r0-r3, r12, lr} /* 汎用レジスタ復帰 */ | |
88 | + rfefd sp! /* リターン */ | |
89 | + | |
90 | + | |
91 | + /* ---- 多重割り込み処理 */ | |
92 | +multiple_int: | |
93 | + /* ---- スタックを8バイトアライメントに移動 */ | |
94 | + mov r1, sp /* 割り込み発生時のSYSモードのSPに8の倍数の保証されないので */ | |
95 | + bic sp, sp, #0x7 | |
96 | + stmfd sp!, {r0, r1} /* タスクのSPを割り込み用スタックに保存(8の倍数になるようにr1も) */ | |
97 | + | |
98 | + /* ---- 割り込みハンドラ実行 */ | |
99 | + mov r0, #INHNO_IRQ | |
100 | + bl _kernel_exe_inh | |
101 | + | |
102 | + /* ---- スタックアライメント復帰 */ | |
103 | + ldmfd sp!, {r0, r1} /* 汎用レジスタ復帰 */ | |
104 | + mov sp, r1 | |
105 | + | |
106 | + /* ---- 割り込みカウンタ復帰 */ | |
107 | + ldrb r1, [r0, #ICTXCB_INTCNT] | |
108 | + add r1, r1, #1 | |
109 | + strb r1, [r0, #ICTXCB_INTCNT] | |
110 | + b return_int /* 復帰処理 */ | |
111 | + | |
112 | + | |
113 | + .end | |
114 | + | |
115 | + | |
116 | +/* end of file */ |
@@ -0,0 +1,31 @@ | ||
1 | +/** | |
2 | + * Hyper Operating System V4 Advance | |
3 | + * | |
4 | + * Copyright (C) 1998-2014 by Project HOS | |
5 | + * http://sourceforge.jp/projects/hos/ | |
6 | + */ | |
7 | + | |
8 | + | |
9 | +#include "arm_v7a.inc" | |
10 | + | |
11 | + | |
12 | + .text | |
13 | + .align 2 | |
14 | + | |
15 | +/************************************************ | |
16 | + 実行コンテキストのリスタート | |
17 | + void _kernel_rst_ctx( | |
18 | + VP_INT par1, r0 : 実行時パラメータ | |
19 | + VP_INT par2, r1 : 実行時パラメータ | |
20 | + FP entry, r2 : 実行アドレス | |
21 | + VP isp) r3 : スタックポインタ | |
22 | + ************************************************/ | |
23 | + .global _kernel_rst_ctx | |
24 | +_kernel_rst_ctx: | |
25 | + mov sp, r3 /* スタックを初期値にリセット */ | |
26 | + bx r2 /* エントリーアドレスから再開始 */ | |
27 | + | |
28 | + .end | |
29 | + | |
30 | + | |
31 | +/* end of file */ |
@@ -0,0 +1,42 @@ | ||
1 | +/** | |
2 | + * Hyper Operating System V4 Advance | |
3 | + * | |
4 | + * Copyright (C) 1998-2014 by Project HOS | |
5 | + * http://sourceforge.jp/projects/hos/ | |
6 | + */ | |
7 | + | |
8 | + | |
9 | +#include "arm_v7a.inc" | |
10 | + | |
11 | + | |
12 | + .text | |
13 | + .align 2 | |
14 | + | |
15 | +/************************************************ | |
16 | + 実行コンテキストの切替 | |
17 | + void _kernel_swi_ctx( | |
18 | + _KERNEL_T_CTXCB *pk_ctxinf_nxt, r0 : 現在のコンテキストの保存先 | |
19 | + _KERNEL_T_CTXCB *pk_ctxinf_now) r1 : 切り替えるコンテキスト | |
20 | + ************************************************/ | |
21 | + .global _kernel_swi_ctx | |
22 | +_kernel_swi_ctx: | |
23 | + stmfd sp!, {r4-r11, lr} /* レジスタ保存 */ | |
24 | + str sp, [r1] /* スタックポインタ保存 */ | |
25 | + /* --- そのまま _kernel_sta_ctx に続ける */ | |
26 | + | |
27 | + | |
28 | +/************************************************ | |
29 | + 実行コンテキストの開始 | |
30 | + void _kernel_sta_ctx( | |
31 | + _KERNEL_T_CTXCB *pk_ctxcb) r0: 実行を開始するコンテキスト | |
32 | + ************************************************/ | |
33 | + .global _kernel_sta_ctx | |
34 | +_kernel_sta_ctx: | |
35 | + ldr sp, [r0] /* スタックポインタ復帰 */ | |
36 | + ldmfd sp!, {r4-r11, pc} /* レジスタ復帰 */ | |
37 | + | |
38 | + .end | |
39 | + | |
40 | + | |
41 | +; end of file | |
42 | + |
@@ -0,0 +1,27 @@ | ||
1 | +/** | |
2 | + * Hyper Operating System V4 Advance | |
3 | + * | |
4 | + * Copyright (C) 1998-2014 by Project HOS | |
5 | + * http://sourceforge.jp/projects/hos/ | |
6 | + */ | |
7 | + | |
8 | + | |
9 | +#include "arm_v7a.inc" | |
10 | + | |
11 | + .text | |
12 | + .align 2 | |
13 | + | |
14 | +/************************************************ | |
15 | + 割り込み待ち(CPUのアイドル処理) | |
16 | + void _kernel_wai_int(void); | |
17 | + ************************************************/ | |
18 | + .global _kernel_wai_int | |
19 | +_kernel_wai_int: | |
20 | + /* mcr p15, 0, r0, c7, c0, 4 */ /* WaitForInterrupt */ | |
21 | + b _kernel_wai_int | |
22 | + | |
23 | + | |
24 | + .end | |
25 | + | |
26 | + | |
27 | +/* end of file */ |
@@ -0,0 +1,18 @@ | ||
1 | +/** | |
2 | + * Hyper Operating System V4 Advance | |
3 | + * | |
4 | + * @file val_int.c | |
5 | + * @brief %jp{割込み用変数定義} | |
6 | + * | |
7 | + * Copyright (C) 1998-2006 by Project HOS | |
8 | + * http://sourceforge.jp/projects/hos/ | |
9 | + */ | |
10 | + | |
11 | +#include "core/core.h" | |
12 | + | |
13 | + | |
14 | +_KERNEL_T_ICTXCB _kernel_ictxcb; /**< %jp{割込みコンテキスト制御ブロック} */ | |
15 | + | |
16 | + | |
17 | +/* end of file */ | |
18 | + |