⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpu_support.s

📁 toppers操作系统源码
💻 S
字号:
/* *  TOPPERS/JSP Kernel *      Toyohashi Open Platform for Embedded Real-Time Systems/ *      Just Standard Profile Kernel *  *  Copyright (C) 2000-2002 by Embedded and Real-Time Systems Laboratory *                              Toyohashi Univ. of Technology, JAPAN *  *  Copyright (C) 2005 by Freelines CO.,Ltd *  *  惧淡螟侯涪荚は·笆布の (1)×(4) の掘凤か·Free Software Foundation  *  によって给山されている GNU General Public License の Version 2 に淡 *  揭されている掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェア *  を猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· *  网脱と钙ぶ∷することを痰浸で钓满するˉ *  (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *      涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *      スコ〖ド面に崔まれていることˉ *  (2) 塑ソフトウェアを·ライブラリ妨及など·戮のソフトウェア倡券に蝗 *      脱できる妨で浩芹邵する眷圭には·浩芹邵に燃うドキュメント∈网脱 *      荚マニュアルなど∷に·惧淡の螟侯涪山绩·この网脱掘凤および布淡 *      の痰瘦沮惮年を非很することˉ *  (3) 塑ソフトウェアを·怠达に寥み哈むなど·戮のソフトウェア倡券に蝗 *      脱できない妨で浩芹邵する眷圭には·肌のいずれかの掘凤を塔たすこ *      とˉ *    (a) 浩芹邵に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟 *        侯涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *    (b) 浩芹邵の妨轮を·侍に年める数恕によって·TOPPERSプロジェクトに *        鼠桂することˉ *  (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *      巢からも·惧淡螟侯涪荚およびTOPPERSプロジェクトを倘勒することˉ *  *  塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚お *  よびTOPPERSプロジェクトは·塑ソフトウェアに簇して·その努脱材墙拉も *  崔めて·いかなる瘦沮も乖わないˉまた·塑ソフトウェアの网脱により木 *  儡弄または粗儡弄に栏じたいかなる禄巢に簇しても·その勒扦を砷わないˉ *  *  @(#) $Id: cpu_support.S,v 1.8 2005/12/12 09:08:16 honda Exp $ *//* *	プロセッサ巴赂モジュ〖ル アセンブリ咐胳婶∈V850ES脱∷ */#define	_MACRO_ONLY#include "v850asm.inc"#include "jsp_kernel.h"#include "offset.h"/* *  タスクディスパッチャ */Function	__kernel_dispatch		/*		 * コンテキストの锣闰 		 *  30 20 21 22 23 24 25 26 27 28 29 31		 */	Push	ep		/* 瘦赂滦据レジスタの瘦赂 */	addi	-44, sp, sp	mov	sp, ep	sst.w	r20, 40[ep]	sst.w	r21, 36[ep]	sst.w	r22, 32[ep]	sst.w	r23, 28[ep]	sst.w	r24, 24[ep]	sst.w	r25, 20[ep]	sst.w	r26, 16[ep]	sst.w	r27, 12[ep]	sst.w	r28, 8[ep]	sst.w	r29, 4[ep]	sst.w	r31, 0[ep]			/* スタックと肌の弹瓢戎孟を瘦赂 */	Lea	__kernel_runtsk, ep	sld.w	0[ep], ep	sst.w	sp, TCB_sp[ep]	Lea	dispatch_r, r10	sst.w	r10, TCB_pc[ep]	stsr	psw, r10	sst.w	r10, TCB_psw[ep]		/*		 * 肌のタスクの洁洒 __kernel_exit_and_dispatch		 *		 *  泼にexit盖铜の借妄はしてないので 动扩ディスパッチにも蝗ってる		 */Label __kernel_exit_and_dispatch		/* intnestをクリア */	Lea	_intnest, r10	st.w	r0, 0[r10]		/* 充哈みスタックの锣闰 */	cmp	r2, r0	bnz	1f	mov	r3, r2		/* 肌に弹瓢すべきタスクの粕み叫し */1:	Lea	__kernel_schedtsk, r10	ld.w	0[r10], r10	cmp	r10,r0	bne	1f		/* 肌に弹瓢すべきタスクがない */	mov	r2, r3		/* intnestを1にする */	mov	r0, r10	add	1, r10	Lea	_intnest, r11	st.w	r10, 0[r11]		/* 充り哈み略ち */	ei	nop	nop	nop	nop	nop	di		/* intnestをクリアする */	Lea	_intnest, r10	st.w	r0, 0[r10]	jr	1b1:		/* runtsk = schedtsk; */	Lea	__kernel_runtsk, r11	st.w	r10, 0[r11]		/* スタックと肌の弹瓢戎孟を牲耽 */	mov	r10, ep	sld.w	TCB_pc[ep], r31	sld.w	TCB_sp[ep], r3	sld.w	TCB_psw[ep], r10	ldsr	r10, psw	jmp	r31		/* ディスパッチャの牲耽ル〖チン */Label dispatch_r		/* タスク毋嘲 */	jarl	__kernel_calltex, r31			/* 锣闰したコンテキストの牲耽 */	mov	sp, ep	sld.w	 40[ep],r20	sld.w	 36[ep],r21	sld.w	 32[ep],r22	sld.w	 28[ep],r23	sld.w	 24[ep],r24	sld.w	 20[ep],r25	sld.w	 16[ep],r26	sld.w	 12[ep],r27	sld.w	 8[ep],r28	sld.w	 4[ep],r29	sld.w	 0[ep],r31	addi	44, sp, sp	Pop	ep	jmp	r31/* *  タスク弹瓢箕借妄 */Function __kernel_activate_r	Lea	__kernel_runtsk, ep	ld.w	0[ep], ep	ld.w	TCB_tinib[ep], ep	ld.w	TINIB_exinf[ep], r6	ld.w	TINIB_task[ep], r10	Lea	_ext_tsk, r31		ei	jmp	r10/* *  充哈みハンドラ】CPU毋嘲ハンドラ叫庚借妄 * *  ret_int は充哈みモ〖ドˇ充哈み敦贿觉轮で·ret_exc はマスタモ〖ドˇ *  充哈み敦贿觉轮で钙び叫さなければならないˉまた ret_exc は·スクラッ *  チレジスタを瘦赂した觉轮で钙び叫すことˉ */.extern _InterruptHandlerEntry.extern __kernel_runtsk.extern __kernel_calltex/* * 充哈みハンドラ * *  ハンドラ弹瓢涟に手笛猛呈羌レジスタとスクラッチレジスタを锣闰するˉ *  充哈みハンドラ柒でタスクスイッチが券栏したときのみ链てのレジスタ *  を锣闰するˉ * * それぞれ觉斗に炳じて肌のような借妄を乖う * ˇハンドラがない眷圭 *    侯度拌侯喇 -> ハンドラ粕叫 -> 侯度拌撬逮 * * ˇハンドラがあり、驴脚充哈みである眷圭 *    侯度拌侯喇 -> ハンドラ粕叫 -> レジスタA凡锣闰 -> ハンドラ弹瓢 *     -> レジスタA凡牲耽 -> 侯度拌撬逮 * * ˇハンドラがあり、タスクから充哈みがかかり、ハンドラ柒で磊仑がない眷圭 *    侯度拌侯喇 -> ハンドラ粕叫 -> レジスタA凡锣闰 -> スタック磊仑 *     -> ハンドラ弹瓢 -> タスク毋嘲弹瓢 -> レジスタA凡锣闰 *     -> 侯度拌撬逮 * * ˇハンドラがあり、タスクから充哈みがかかり、ハンドラ柒で磊仑がある眷圭 *    侯度拌侯喇 -> ハンドラ粕叫 -> レジスタA凡锣闰 -> スタック磊仑 *     -> ハンドラ弹瓢 -> レジスタB凡锣闰 -> ディスパッチャ *     -> レジスタB凡牲耽 -> タスク毋嘲弹瓢 -> レジスタA凡锣闰 *     -> 侯度拌撬逮 * * 锣闰レジスタ呈羌界进 (アドレス惧疤から界) *  R10 R11 *  R1-R9 *  R11-R19 *  R31 *  EIPC EIPSW */	.data	.align 4__intcount:	.long 0	Function vector_handler		/* 侯度挝拌の侯喇 */	add	-8,   sp	st.w	r10, 4[sp]	st.w	r11, 0[sp]		/* intnestをインクリメント */	Lea	_intnest, r11	ld.w	0[r11], r10	add	1, r10	st.w	r10, 0[r11]		/*		 * ハンドラ弹瓢戎孟の粕み叫し		 *    R10 : ハンドラの戎孟		 */	stsr	ecr, r10	shr	2, r10	add	-4, r10	Lea	_InterruptHandlerEntry, r11	add	r10, r11	ld.w	0[r11], r10		/* ハンドラが痰ければ篓姜位 */	cmp	0,r10	bne	1f	stsr	ecr, r6	jarl	_cpu_experr, r31	be	end_handler1:	/*	 * レジスタ锣闰 	 *	 * 呈羌界进 : (10 11) ^ 12..19 6..9 31 eipc eipsw | (sp)	 */	mov	r30, r11		/* epを蝗いたいのでちょっと锣闰 */	addi	-80, r3, r30	mov	r30, r3			/* スタックに瓤鼻 */	sst.w	r1,  76[ep]	sst.w	r2,  72[ep]	sst.w	r3,  68[ep]	sst.w	r4,  64[ep]	sst.w	r5,  60[ep]	sst.w	r6,  56[ep]	sst.w	r7,  52[ep]	sst.w	r8,  48[ep]	sst.w	r9,  44[ep]	sst.w	r12, 40[ep]	sst.w	r13, 36[ep]	sst.w	r14, 32[ep]	sst.w	r15, 28[ep]	sst.w	r16, 24[ep]	sst.w	r17, 20[ep]	sst.w	r18, 16[ep]	sst.w	r19, 12[ep]	sst.w	r31,  8[ep]	stsr	eipc, r6		/* 驴脚充哈み滦忽 */	sst.w	r6 ,  4[ep]	stsr	eipsw, r6	sst.w	r6 ,  0[ep]	mov	r11,  r30		/* ep牲耽 */		/*		 * コンテキストチェックとスタック磊り仑え		 */		/* 驴脚充り哈みチェック */	Lea	_intnest, r11	ld.w	0[r11], r11	cmp	1, r11	ble	1f			/* 驴脚充哈み */	st.w	r3, -4[r3]	add	-4, r3	jr	2f1:		/* タスクコンテキスト惧での充哈み */		/* 附哼のスタック疤弥を充り哈みスタック惧に瘦赂 */	st.w	r3, -4[r2]		/* スタック磊り仑え */	addi	-4,r2, r32:		/*		 * ハンドラ弹瓢		 */	Lea	ret_int, r31	ei	jmp	r10	/*	 * 充り哈みからの牲耽借妄	 */Label	ret_int	di		/* intnestをディクリメント */	Lea	_intnest, r11	ld.w	0[r11], r10	mov	1, r11	sub	r11, r10	Lea	_intnest, r11	st.w	r10, 0[r11]		/* スタックの牲耽 */	ld.w	0[r3],sp		/* どこへ若んでくのかチェック */	Lea	_intnest, r11	ld.w	0[r11], r10	cmp	r0, r10	bne	recover_from_int		/* 		 * タスクへ若んでく眷圭ならreqflgをチェック		 * 妥滇があれば链レジスタを瘦赂してタスクディスパッチャへ		 */	Lea	__kernel_reqflg, r10	ld.w	0[r10], r11	cmp	r0, r11	bnz	getting_ready_for_contextswitchrecover_from_int_with_tskctx:		/* タスクに若んでいく涟にタスク毋嘲 */	jarl	__kernel_calltex, r31recover_from_int:	/*	 * レジスタ牲耽 	 *	 * 呈羌界进 : (10 11) 12..19 6..9 31 eipc eipsw ^ | (sp)	 */	mov	r30, r11		/* epを蝗いたいのでちょっと锣闰 */	mov	r3,  r30	sld.w	4[ep],r10	ldsr	r10, eipc	sld.w	0[ep],r10	ldsr	r10, eipsw	sld.w	76[ep], r1	sld.w	72[ep], r2	sld.w	68[ep], r3	sld.w	64[ep], r4	sld.w	60[ep], r5	sld.w	56[ep], r6	sld.w	52[ep], r7	sld.w	48[ep], r8	sld.w	44[ep], r9	sld.w	40[ep], r12	sld.w	36[ep], r13	sld.w	32[ep], r14	sld.w	28[ep], r15	sld.w	24[ep], r16	sld.w	20[ep], r17	sld.w	16[ep], r18	sld.w	12[ep], r19	sld.w	 8[ep], r31	addi	80, r30, r3	mov	r11, r30end_handler:	/*	 * 侯度挝拌の牲耽	 *	 * 呈羌界进 : 10 11 ^ (12..19 6..9 31 eipc eipsw | sp)	 */	add	8, sp	ld.w	-4[sp], r10	ld.w	-8[sp], r11		reti	/*	 * タスクスイッチ券栏に燃う链レジスタ锣闰	 *	 * 呈羌界进 : (10 11 12..19 6..9 31 eipc eipsw | sp) ^ 	 *            30 20..29 1 4..9	 */getting_ready_for_contextswitch:		/* reqflg = 0 */	st.w	r0, 0[r10]		st.w	ep, -4[sp]		/*epを蝗いたいので靠っ黎に锣闰 */	addi	-68, sp, ep	sst.w	r20, 64[ep]	sst.w	r21, 60[ep]	sst.w	r22, 56[ep]	sst.w	r23, 52[ep]	sst.w	r24, 48[ep]	sst.w	r25, 44[ep]	sst.w	r26, 40[ep]	sst.w	r27, 36[ep]	sst.w	r28, 32[ep]	sst.w	r29, 28[ep]	sst.w	 r1, 24[ep]	sst.w	 r4, 20[ep]	sst.w	 r5, 16[ep]	sst.w	 r6, 12[ep]	sst.w	 r7,  8[ep]	sst.w	 r8,  4[ep]	sst.w	 r9,  0[ep]	mov		ep, sp		/* TCBの面咳を饯赖して牲耽攫鼠を肋年 */	Lea	__kernel_runtsk, ep	sld.w	0[ep], ep				/* ep = _kernel_runtsk */		sst.w	r3, TCB_sp[ep]	Lea	recover_from_contextswitch, r10	sst.w	r10, TCB_pc[ep]	stsr	psw, r10	sst.w	r10, TCB_psw[ep]			/* タスクディスパッチャへ */	Lea	__kernel_exit_and_dispatch, r10	ldsr	r10, eipc	/* カ〖ネル柒で充哈み敦贿にすべきなのに充哈み钓材になっている */	/* 舱疥があり、充哈みのタイミングによってはシステムが撬镁します。*/	stsr	eipsw, r10	ori	0x20,r10,r10	ldsr	r10, eipsw    	reti	/*	 * 充哈み忙叫箕コンテキストスイッチの牲耽ル〖チン	 *	 * 呈羌界进 : (10 11 12..19 6..9 31 eipc eipsw | sp 	 *             30 20..29 1 4..9) ^	 */recover_from_contextswitch:	di		/* 锣闰したレジスタの办婶牲耽 */	mov		sp, ep	sld.w	64[ep], r20	sld.w	60[ep], r21	sld.w	56[ep], r22	sld.w	52[ep], r23	sld.w	48[ep], r24	sld.w	44[ep], r25	sld.w	40[ep], r26	sld.w	36[ep], r27	sld.w	32[ep], r28	sld.w	28[ep], r29	sld.w	24[ep], r1	sld.w	20[ep], r4	sld.w	16[ep], r5	sld.w	12[ep], r6	sld.w	 8[ep], r7	sld.w	 4[ep], r8	sld.w	 0[ep], r9	addi	68, sp, sp		/* おおもとの牲耽借妄へ若ばす */	jr recover_from_int_with_tskctx/* * CPUロック觉轮の艰评 * *   充哈み敦贿ならCPUロック觉轮 */Function _sense_lock	stsr	psw, r10	shr	5, r10	andi	1, r10, r10	jmp	r31

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -