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

📄 cpu_support.s

📁 toppers操作系统源码
💻 S
📖 第 1 页 / 共 2 页
字号:
 	beq     t2, zero, ret_int_1	/* ディスパッチ敦贿ならジャンプ */	nop	la      t4, schedtsk	lw      t5, (t4)		/* t5 = schedtsk */	beq     t1, t5, ret_int_1	/* runtsk = schedtsk ならジャンプ */	nop/* ディスパッチャを沸统する眷圭の借妄 (t1 = runtsk に庙罢) */	/* ここから、充哈み敦贿】钓材を、EXLビットを脱いて悸附する数恕に恃构 */	mfc0	t0, Status	ori	t0, t0, SR_EXL_IE	xori	t0, t0, SR_EXL_IE	/* lock_cpu 陵碰 (充哈み敦贿)					    + EXLビットクリア (充哈み钓材) */	mtc0	t0, Status	addi    sp, sp, -8*4		/* スクラッチレジスタの瘦赂 */	sw      s0, 0*4(sp)	sw      s1, 1*4(sp)	sw      s2, 2*4(sp)	sw      s3, 3*4(sp)	sw      s4, 4*4(sp)	sw      s5, 5*4(sp)	sw      s6, 6*4(sp)	sw      s7, 7*4(sp)					/* t1 = runtsk に庙罢  */	sw      sp, TCB_sp(t1)		/* runtsk->sp = sp					   (タスクスタックポインタの瘦赂) */	la      t2, ret_int_r	j       dispatcher		/* ディスパッチャ钙び叫し */	sw      t2, TCB_pc(t1)		/* runtsk->pc = ret_int_r					   (悸乖浩倡戎孟の瘦赂) *//* * 充哈みˇ毋嘲の叫庚借妄 *   ˇディスパッチャ借妄において、t1 = runtsk となっていることに庙罢 *   ˇスタックポインタも肋年貉み *//* ディスパッチャ钙び叫し稿のタスクコンテキストからの圭萎孟爬 */ret_int_r:	lw      s0, 0*4(sp)		/* スクラッチレジスタの牲傅 */	lw      s1, 1*4(sp)	lw      s2, 2*4(sp)	lw      s3, 3*4(sp) 	lw      s4, 4*4(sp)	lw      s5, 5*4(sp)	lw      s6, 6*4(sp)	lw      s7, 7*4(sp)	addi    sp, sp, 8*4	mfc0	t0, Status	ori	t0, t0, SR_EXL_IE	/* unlock_cpu 陵碰 (充哈み钓材)					    + EXLビットセット (充哈み敦贿) */	mtc0	t0, Status/* ディスパッチャを沸统しない眷圭の圭萎孟爬 (t1 = runtsk に庙罢) */ret_int_1:	/* タスク毋嘲借妄妥滇のチェック */	lb      t2, TCB_enatex(t1)	andi    t4, t2, TCB_enatex_mask /* t3 = runtsk->enatex  */	beq     t4, zero, ret_int_2     /* タスク毋嘲借妄敦贿の箕、ジャンプ */	nop	lw      t5, TCB_texptn(t1)      /* t5 = runtsk->texptn */	beq     t5, zero, ret_int_2	/* タスク毋嘲妥滇が痰い箕、ジャンプ */	nop	mfc0	t0, Status	ori	t0, t0, SR_EXL_IE	xori	t0, t0, SR_EXL_IE	/* lock_cpu陵碰 (充哈み敦贿)					    + EXLビットクリア (充哈み钓材) */	mtc0	t0, Status	jal     call_texrtn             /* タスク毋嘲借妄ル〖チン(タ〖ゲット润					   巴赂婶年盗)の钙び叫し */	nop		/* call_texrtn()(task.c)では、悸狠のタスク毋嘲借妄ル〖チン钙び		   叫し涟稿で、unlock_cpu、lock_cpu借妄を乖っているので、觉轮は		   瘦积される。 */	mfc0	t0, Status	ori	t0, t0, SR_EXL_IE	/* unlock_cpu 陵碰 (充哈み钓材)					    + EXLビットセット (充哈み敦贿) */	mtc0	t0, Status	/* ここまでが、充哈み敦贿】钓材を、EXLビットを脱いて悸附する数恕 */ret_int_2:	/* レジスタの牲耽 (Statusレジスタは、贷に牲傅貉み) */	lw      t1, 22*4(sp)		/* EPC */	mtc0    t1, EPC	lw      t2, 23*4(sp)		/* HI */	lw      t3, 24*4(sp)		/* LO */	mthi    t2			/* 捐近换レジスタ HI の牲傅 */	mtlo    t3			/* 捐近换レジスタ LO の牲傅 */	lw      at,  1*4(sp)	lw      v0,  2*4(sp)	lw      v1,  3*4(sp)	lw      a0,  4*4(sp)	lw      a1,  5*4(sp)	lw      a2,  6*4(sp)	lw      a3,  7*4(sp)	lw      t0,  8*4(sp)	lw      t1,  9*4(sp)	lw      t2, 10*4(sp)	lw      t3, 11*4(sp)	lw      t4, 12*4(sp)	lw      t5, 13*4(sp)	lw      t6, 14*4(sp)	lw      t7, 15*4(sp)	lw      t8, 16*4(sp)	lw      t9, 17*4(sp)	lw      gp, 18*4(sp)	lw      fp, 19*4(sp)	lw      ra, 20*4(sp)	addi    sp, sp, 25*4	eret				/* 充哈み/毋嘲借妄からの牲耽 */	nop/* *  タスクディスパッチャ *  ˇdispatch は、k0 = 0、CPUロック(充哈み敦贿)觉轮で钙び叫さなければならない。 *  ˇexit_and_dispatch は·k0 = 0、CPUロック(充哈み敦贿)觉轮で钙び叫すのが付搂 *    しかし、カ〖ネル弹瓢借妄のため·k0 = 1で钙び叫した眷圭にも滦炳している。 */	.global dispatch	.global exit_and_dispatch/* タスクディスパッチャを汤绩弄に钙び叫す箕 */dispatch:	addi    sp, sp, -13*4	sw      at,  1*4(sp)		/* スクラッチレジスタの略闰 */	sw      s0,  2*4(sp)	sw      s1,  3*4(sp)	sw      s2,  4*4(sp)	sw      s3,  5*4(sp)	sw      s4,  6*4(sp)	sw      s5,  7*4(sp)	sw      s6,  8*4(sp)	sw      s7,  9*4(sp)	sw      gp, 10*4(sp)	sw      fp, 11*4(sp)	sw      ra, 12*4(sp)	la      t0, runtsk	la      t2, dispatch_r	lw      t1, (t0)		/* t1 = runtsk */	sw      sp, TCB_sp(t1)		/* runtsk->sp = sp */	j       dispatcher	sw      t2, TCB_pc(t1)		/* runtsk->pc = dispatch_r *//* 附哼悸乖面のコンテキストを嘉てて、タスクディスパッチャを钙び叫す箕 */exit_and_dispatch:	move    k0, zero		/* ネストカウンタをクリア */dispatcher:	/* ここには CPUロック∈充り哈み敦贿∷で丸ること */	la      t0, schedtsk	lw      t1, (t0)		/* t1 = schedtsk */	beq     t1, zero, dispatcher_2	/* schedtsk が痰ければ充哈み略ちへ */	nopdispatcher_1:	la      t0, runtsk	sw      t1, (t0)		/* runtsk = t1 (= schedtsk)					   (タスクスイッチの悸乖) */	lw      t2, TCB_pc(t1)		/* 悸乖浩倡戎孟を艰评する。					   悸乖浩倡戎孟は笆布の3奶り					     ˇディスパッチャの叫庚  dispatch_r					     ˇ充哈み】毋嘲の叫庚    ret_int_r					     ˇタスク弹瓢木稿        activate_r					   いずれの眷圭も t1=runtsk として钙び					   叫していることに庙罢。 */	jr      t2			/* 悸乖浩倡戎孟へジャンプ */	lw      sp, TCB_sp(t1)		/* スタックポインタを牲傅 */	/*	 *  悸乖すべきタスクが附れるまで略つ借妄	 *	 *  ここでコンテキストを磊り垂えるのは·	 *    ˇここで券栏する充哈み借妄にどのスタックを蝗うかという啼玛の豺疯	 *    ˇ充哈みハンドラ柒でのタスクディスパッチの松贿	 *  という企つの罢蹋があるˉ	 */ dispatcher_2:	la	t2, runtsk	sw	zero, (t2)		/* runtsk = NULL					   これは、iget_id が、TSK_NONEを手す					   眷圭に滦炳するため。*/	la      sp, _stack_top		/* スタック磊り仑え */					/* _stack_top は、システム巴赂婶					   (リンカスクリプト夸京)年盗 */	li      k0, 1			/* ネストカウンタ♂1 */	/* ル〖プ柒で蝗う年眶の洁洒 */	la      t2, reqflg              /* reqflg のアドレス */	li      t3, ~SR_ERL_EXL         /* Status の充哈み簇息ビット */	li      t4, ~SR_IE              /* Status の充哈み钓材ビット */dispatcher_3:	mfc0    t1, Status	and     t1, t1, t3		/* ERL, EXL ビットクリア */	ori     t1, t1, SR_IE		/* IEビットセット */	mtc0    t1, Status		/* 充哈み钓材 : unlock_cpu 陵碰 */	and     t1, t1, t4		/* IEビットリセット */	mtc0    t1, Status		/* 充哈み敦贿 : lock_cpu 陵碰 */	NOP_FOR_CP0_HAZARD		/* CP0ハザ〖ドのための箕粗苍ぎマクロ					   (このマクロはシステム巴赂婶年盗) */	lw      t5, (t2)		/* t5 = reqflg */	beq     t5, zero, dispatcher_3	/* ディスパッチ妥滇がなければル〖プの					   黎片へ */	nop	sw      zero, (t2)		/* reqflg = NULL (reqflgをクリア) */	j       dispatcher		/* 悸乖浩倡戎孟の艰评借妄へジャンプ */	move    k0, zero		/* ネストカウンタをクリア *//* *  ディスパッチャ叫庚借妄 *  ˇディスパッチャ借妄において、t1 = runtsk となっていることに庙罢 *  ˇスタックポインタも肋年貉み */dispatch_r: 	lw      at,  1*4(sp)		/* スクラッチレジスタを牲耽 */	lw      s0,  2*4(sp)	lw      s1,  3*4(sp)	lw      s2,  4*4(sp)	lw      s3,  5*4(sp)	lw      s4,  6*4(sp)	lw      s5,  7*4(sp)	lw      s6,  8*4(sp)	lw      s7,  9*4(sp)	lw      gp, 10*4(sp)	lw      fp, 11*4(sp)	lw      ra, 12*4(sp)	addi    sp, sp, 13*4	/* タスク毋嘲借妄妥滇のチェック */	lb      t2, TCB_enatex(t1)	andi    t4, t2, TCB_enatex_mask	/* t4 = runtsk->enatex */	beq     t4, zero, dispatch_r_1	/* タスク毋嘲借妄敦贿の箕、ジャンプ */	nop	lw      t5, TCB_texptn(t1)	/* t5 = runtsk->texptn */	beq     t5, zero, dispatch_r_1	/* タスク毋嘲妥滇が痰い箕、ジャンプ */	nop	j       call_texrtn		/* タスク毋嘲借妄ル〖チン(タ〖ゲット润					   巴赂婶年盗)の钙び叫し */	nop		/* call_texrtn()(task.c)では、悸狠のタスク毋嘲借妄ル〖チン钙び		   叫し涟稿で、unlock_cpu、lock_cpu借妄を乖っているので、觉轮は		   瘦积される。 */dispatch_r_1:	jr      ra			/* dispatch 钙び叫し傅へ提る */	nop/* *  タスク弹瓢借妄 *  ˇディスパッチャ借妄において、t1 = runtsk となっていることに庙罢 *  ˇスタックポインタも肋年貉み */	.globl activate_ractivate_r:	/* ここに丸るときは、CPUロックになっている∈IEビット = 0) */	/* 充り哈み钓材の洁洒 */	mfc0    t0, Status	ori     t0, t0, SR_ERL_EXL_IE   /* xorを蝗うため、1刨ビットセットする */	xori    t0, t0, SR_ERL_EXL      /* ERL, EXLビットをクリア					   (IEビットは荒す)  */	/* タスク簇犯の肋年洁洒 */					/* t1 = runtsk (ディスパッチャで肋年) */	lw      t2, TCB_tinib(t1)       /* t2 = runtsk->tinib */	/* タスク弹瓢戎孟の肋年 */	lw      t3, TINIB_task(t2)      /* t3 = runtsk->tinib->task */	/* タスクへの苞眶∈橙磨攫鼠∷肋年 */	lw      a0, TINIB_exinf(t2)     /* a0 = runtsk->tinib->exinf */	mtc0    t0, Status              /* unlock_cpu 陵碰 (充哈み钓材) */	la      ra, ext_tsk             /* タスクからの提り戎孟を肋年 */	j       t3                      /* タスク弹瓢 */	nop

⌨️ 快捷键说明

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