cpu_support.s

来自「嵌入式系统开发 TOPPERS and JSP Kernel Release 」· S 代码 · 共 413 行

S
413
字号
/*  * *  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 *  * 惧淡螟侯涪荚は·Free Software Foundation によって给山されている  * GNU General Public License の Version 2 に淡揭されている掘凤か·笆 * 布の(1)×(4)の掘凤を塔たす眷圭に嘎り·塑ソフトウェア∈塑ソフトウェ * アを猖恃したものを崔むˉ笆布票じ∷を蝗脱ˇ剩澜ˇ猖恃ˇ浩芹邵∈笆布· * 网脱と钙ぶ∷することを痰浸で钓满するˉ * (1) 塑ソフトウェアをソ〖スコ〖ドの妨で网脱する眷圭には·惧淡の螟侯 *     涪山绩·この网脱掘凤および布淡の痰瘦沮惮年が·そのままの妨でソ〖 *     スコ〖ド面に崔まれていることˉ * (2) 塑ソフトウェアを浩网脱材墙なバイナリコ〖ド∈リロケ〖タブルオブ *     ジェクトファイルやライブラリなど∷の妨で网脱する眷圭には·网脱 *     に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯涪山绩· *     この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ * (3) 塑ソフトウェアを浩网脱稍材墙なバイナリコ〖ドの妨または怠达に寥 *     み哈んだ妨で网脱する眷圭には·肌のいずれかの掘凤を塔たすことˉ *   (a) 网脱に燃うドキュメント∈网脱荚マニュアルなど∷に·惧淡の螟侯 *       涪山绩·この网脱掘凤および布淡の痰瘦沮惮年を非很することˉ *   (b) 网脱の妨轮を·侍に年める数恕によって·惧淡螟侯涪荚に鼠桂する *       ことˉ * (4) 塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じるいかなる禄 *     巢からも·惧淡螟侯涪荚を倘勒することˉ *  * 塑ソフトウェアは·痰瘦沮で捏丁されているものであるˉ惧淡螟侯涪荚は· * 塑ソフトウェアに簇して·その努脱材墙拉も崔めて·いかなる瘦沮も乖わ * ないˉまた·塑ソフトウェアの网脱により木儡弄または粗儡弄に栏じたい * かなる禄巢に簇しても·その勒扦を砷わないˉ * *  @(#) $Id: cpu_support.S,v 1.1 2002/04/05 08:47:14 honda Exp $ */#define _MACRO_ONLY#include "jsp_kernel.h"#include "offset.h"#include "sys_config.h"#include "cpu_config.h"#include "microblaze_asm.inc"#include "microblaze.h"/* * MDK2.1のINTCの菇陇は·驴脚充り哈みをサポ〖トすることが稍材墙であるˉ * しかしながら·海稿の恃构により驴脚充り哈みが材墙になることを雇胃して * 肋纷するˉ * 恶挛弄には·充り哈みを减け烧けた箕爬でもっとも充り哈み庭黎刨が光い * 充り哈みについてのみ借妄を乖うˉ * *//* * INTCの肋纷について· *//* *  瘦赂するレジスタ *  R3-R4   Return Valus        (Volatile) *  R5-R10  Passing parameters  (Volatile) *  R11-R12 Temporaries         (Volatile) *  R14     Return address for interrupt *  R15     Return address for Sub-routine *  R16     Return address for Trap(Debugger) *  R17     Return address for Exeptions * ?R18     Reserved for Assember     */#define STACK_TOP STACKTOP - 0x4 #define INTC_ISR (INTC_BASE + INTC_INT_STATUS_REG)#define INTC_IPR (INTC_BASE + INTC_INT_PENDING_REG)#define INTC_IER (INTC_BASE + INTC_INT_ENABLE_REG)#define INTC_IAR (INTC_BASE + INTC_INT_ACK_REG)#define INTC_SIE (INTC_BASE + INTC_SET_INT_ENABLE)#define INTC_CIE (INTC_BASE + INTC_CLEAR_INT_ENABLE)#define INTC_IVR (INTC_BASE + INTC_INT_VECTOR_REG)#define INTC_MER (INTC_BASE + INTC_MASTER_ENABLE_REG)/* *  毋嘲エントリ *  Not Support! */	.text	.globl exception_entry	.align 2exception_entry:	nop		.text	.globl interrupt_entry	.align 2interrupt_entry:/* * スタックポインタの磊り仑えが涩妥 */	addik r1,r1,-64	swi r3,  r1, 60	swi r4,  r1, 56	swi r5,  r1, 52	swi r6,  r1, 48	swi r7,  r1, 44	swi r8,  r1, 40	swi r9,  r1, 36	swi r10, r1, 32	swi r11, r1, 28	swi r12, r1, 24	swi r14, r1, 20	swi r15, r1, 16	swi r16, r1, 12	swi r17, r1, 8	swi r18, r1, 4	mfs r3,  rmsr     /* msrの瘦赂 */	swi r3,  r1, 0	swi r24, r0, 0xFFFF8204 	lwi   r5,  r13, interrupt_count	bgti  r5,  nest_int      /* ネスト搀眶が1笆惧ならスタックを磊り仑えない */		/*	 * スタックポインタ磊り仑え	 */	la    r4,  r0, STACK_TOP   /* タスク迫惟婶のスタックの粕み哈み */	sw    r1,  r0, r4          /* タスクスタックの瘦赂             */	Mov   r1,  r4              /* スタックポインタ磊り仑え         */nest_int:	/*      * 充哈みネスト搀眶のインクリメント	 */	addi  r5,  r5,  1 	swi   r5,  r13, interrupt_count	lwi   r3,  r0, INTC_IVR    /* ベクタの粕み哈み                 */	swi   r0,  r0, INTC_MER    /* INTC_MER = 0x0 INTC匿贿          */	ori   r4,  r0, 0x02        /* r4 = 0x02                        */	mts   rmsr,r4              /* 充哈み钓材(MSR(IE)をセット)      */	add   r3,  r3, r3          /* ベクタを4擒                      */	add   r3,  r3, r3	        	lwi   r5,  r3, int_handler_table /* ハンドラアドレスの粕み哈み */	Push  r3                   /* ベクタをスタックに姥む           */	brald r15, r5             /* ハンドラ钙び叫し */	 nop	Pop   r3                  /* ベクタアドレスの艰评              */   	lwi   r5,  r3, int_bit_table 	swi   r5,  r0, INTC_IAR   /* ACK                               */	mts   rmsr,r0             /* 充哈み敦贿                        */	ori   r4,  r0, 0x03       /* r4 = 0x03                         */	swi   r4,  r0, INTC_MER   /* INTC_MER = 0x0 INTCスタ〖ト       */	/*	 *  充哈みネスト搀眶のデクリメント     */	lwi   r5,  r13, interrupt_count	addi  r5,  r5,  -1 	swi   r5,  r13, interrupt_count		bgti  r5,  ret_to_task_int      /* ネスト搀眶が1笆惧なら提る */	lw   r1,  r0, r1	            /* スタックポインタを提す    */  	lwi   r4,  r13, reqflg          /* reqflg のチェック         */	beqi  r4,  ret_to_task_int      /* FALSE なら タスクに提る   */	bri   ret_int                   /* TRUE なら ret_int に      */ret_to_task_int:	lwi  r3,  r1, 0	mts  rmsr,r3	lwi  r18, r1, 4	lwi  r17, r1, 8	lwi  r16, r1, 12	lwi  r15, r1, 16	lwi  r14, r1, 20	lwi  r12, r1, 24	lwi  r11, r1, 28	lwi  r10, r1, 32	lwi  r9,  r1, 36	lwi  r8,  r1, 40	lwi  r7,  r1, 44	lwi  r6,  r1, 48	lwi  r5,  r1, 52	lwi  r4,  r1, 56	lwi  r3,  r1, 60	rtid r14,0 	addik r1,r1,64	/*	 * 踏判峡の充哈みが券栏すると钙び叫される	 * Not Yet!	 */	.globl no_reg_interrupt	.align 2no_reg_interrupt:	nop	/*	 * タスクディスパッチャ	 * 	 * dispatch は·interrupt_count = 0      * MSRの IE=0 の充哈み敦贿觉轮で钙び叫さなければならないˉ	 * exit_and_dispatch も票屯に·interrupt_count = 0 充哈み敦贿觉轮で     * 钙び叫すのが付搂であるが·カ〖ネル弹瓢箕に滦炳するため·     * interrupt_count = 1 で钙び叫した眷圭にも滦炳しているˉ	 *    	 */		.globl dispatch	.align  2dispatch:	addi  r1,  r1,  -60  /* スクラッチレジスタ笆嘲を瘦赂する */	swi   r15, r1,  56	swi   r18, r1,  52   /* 涩妥か? */	swi   r19, r1,  48	swi   r20, r1,  44	swi   r21, r1,  40	swi   r22, r1,  36	swi   r23, r1,  32	swi   r24, r1,  28	swi   r25, r1,  24	swi   r26, r1,  20	swi   r27, r1,  16	swi   r28, r1,  12	swi   r29, r1,  8	swi   r30, r1,  4	swi   r31, r1,  0	lwi   r4 , r13, runtsk     /* r4 <- runtsk */	swi   r1 , r4,  TCB_sp 	   /* タスクスタックをTCBに瘦赂 */		la    r5 , r0,  dispatch_r /* 悸乖浩倡戎孟を瘦赂 */	swi   r5 , r4,  TCB_pc     /* 悸乖浩倡戎孟をTCBに瘦赂   */	bri   dispatcherdispatch_r:	lwi  r31,  r1, 0      /* レジスタを牲耽 */	lwi  r30,  r1, 4	lwi  r29,  r1, 8	lwi  r28,  r1, 12	lwi  r27,  r1, 16	lwi  r26,  r1, 20	lwi  r25,  r1, 24	lwi  r24,  r1, 28	lwi  r23,  r1, 32	lwi  r22,  r1, 36	lwi  r21,  r1, 40	lwi  r20,  r1, 44	lwi  r19,  r1, 48	lwi  r18,  r1, 52	addi r1,   r1, 56   /* スタックポインタを提す */	/*	 *  タスク毋嘲借妄ル〖チンの弹瓢	 *  dispatch_r は dispatcher から钙び叫されるため·	 *  tcb のアドレスは r4 に掐っている     *  Not Yet!	 */	lwi  r5,  r4,  TCB_enatex  /* r5 <- enatex                 */	andi r6,  r5,  TCB_enatex_mask  	beqi r6,  dispatch_r_1     /* enatex が FALSE ならリタ〖ン */	lwi  r7,  r4,  TCB_texptn  /* r5 <- texptn                 */	beqi r7,  dispatch_r_1     /* texptn が 0 でなければ       */	brlid r15  call_texrtn     /* タスク毋嘲ル〖チンの钙び叫し */		 nopdispatch_r_1:	Pop     r15	rtsd	r15,8 	 nop	.globl exit_and_dispatchexit_and_dispatch:	/* interrupt_count をクリア */	swi   r0,  r13, interrupt_count dispatcher:	/*	 * ここは充哈み敦贿で丸ること	 */	lwi  r4,  r13, schedtsk  /* r4 <- schedtsk              */	beqi r4,  dispatcher_1   /* schedtsk があるか           */	swi  r4,  r13, runtsk    /* schedtsk を runtsk に       */	lwi  r1,  r4,  TCB_sp    /* TCBからタスクスタックを牲耽 */	lwi  r5,  r4,  TCB_pc    /* TCBから悸乖浩倡戎孟を牲耽   */	bra  r5	  dispatcher_1:	/*	 * ここで充哈みモ〖ドに磊り仑えるのは·ここで券栏する充哈み借妄     * にどのスタックを蝗うかという啼玛の豺疯と·充哈みハンドラ柒で	 * のタスクディスパッチの松贿という2つの罢蹋があるˉ	 */	la   r1,  r0,  STACKTOP         /* 充哈みスタックに恃构             */	la   r6,  r0,  1                /* interrupt_count を1に            */	swi  r6,  r13, interrupt_count	la   r5,  r0, 0x02              /* r5 = 0x02                        */dispatcher_2:	mts   rmsr, r5                  /* 充哈み钓材(MSR(IE)をセット)      */	mts   rmsr, r0                  /* 充哈み敦贿(MSR(IE)をクリア)      */	lwi   r6,  r13,  reqflg         /* r6 <- reqflg                     */	beqi  r6,  dispatcher_2         /* reqflg が FALSE なら             */	swi   r0,  r13, interrupt_count /* interrupt_count をクリア         */	swi   r0,  r13,  reqflg         /* reqflg を FALSE に               */		bri   dispatcher	/*	 *  充哈みハンドラ/CPU毋嘲ハンドラ叫庚借妄	 * 	 * 提り黎がタスクで reqflg がセットされている眷圭のみここにくるˉ	 * interrupt_count = 0·充哈み敦贿觉轮·スクラッチレジスタを瘦赂した	 * 觉轮で钙び叫すことˉ	 */	.align 2	.globl ret_int	.globl ret_excret_exc:ret_int:	swi  r0,  r13,  reqflg   /* reqflg を FALSE に */	lwi  r5,  r13,  runtsk   /* r5 <- runtsk        */	lwi  r6,  r13,  enadsp   /* r6 <- enadsp        */	beqi r6,  ret_int_1      /* enadsp が FALSE なら ret_int_1 へ */	lwi  r4,  r13,  schedtsk /* r4 <- schedtsk                    */	sub  r6,  r4,   r5       /* runtsk と schedtsk が票じなら     */	beqi r6,  ret_int_1      /* ret_int_1 へ                      */	addi  r1,  r1,  -52      /* 荒りのレジスタを瘦赂する          */	swi   r19, r1,  48	swi   r20, r1,  44	swi   r21, r1,  40	swi   r22, r1,  36	swi   r23, r1,  32	swi   r24, r1,  28	swi   r25, r1,  24	swi   r26, r1,  20	swi   r27, r1,  16	swi   r28, r1,  12	swi   r29, r1,  8	swi   r30, r1,  4	swi   r31, r1,  0		swi   r1 , r5,  TCB_sp 	   /* タスクスタックをTCBに瘦赂 */		la    r6 , r0,  ret_int_r  /* 悸乖浩倡戎孟を瘦赂 */	swi   r6 , r5,  TCB_pc     /* 悸乖浩倡戎孟をTCBに瘦赂   */	bri   dispatcherret_int_r:		lwi  r31,  r1,  0      /* レジスタを牲耽 */	lwi  r30,  r1,  4	lwi  r29,  r1,  8	lwi  r28,  r1,  12	lwi  r27,  r1,  16	lwi  r26,  r1,  20	lwi  r25,  r1,  24	lwi  r24,  r1,  28	lwi  r23,  r1,  32	lwi  r22,  r1,  36	lwi  r21,  r1,  40	lwi  r20,  r1,  44	lwi  r19,  r1,  48	addi r1,   r1,  52ret_int_1:	/*	 * タスク毋嘲ル〖チンの弹瓢	 * ret_int_r は dispatcher から钙び叫されるため·	 * tcb のアドレスは r4 に掐っている     * Not Yet!	 */	lwi  r5,  r4,  TCB_enatex  /* r5 <- enatex                 */	andi r6,  r5,  TCB_enatex_mask  	beqi r6,  ret_int_2        /* enatex が FALSE ならリタ〖ン */	lwi  r7,  r4,  TCB_texptn  /* r5 <- texptn                 */	beqi r7,  ret_int_2        /* texptn が 0 でなければ       */	brlid r15  call_texrtn     /* タスク毋嘲ル〖チンの钙び叫し */		 nopret_int_2:	lwi  r3,  r1, 0    /* MSR を提す∈充哈みIE=0で充哈み敦贿になる∷*/	mts  rmsr,r3	lwi  r18, r1, 4	lwi  r17, r1, 8	lwi  r16, r1, 12	lwi  r15, r1, 16	lwi  r14, r1, 20	lwi  r12, r1, 24	lwi  r11, r1, 28	lwi  r10, r1, 32	lwi  r9,  r1, 36	lwi  r8,  r1, 40	lwi  r7,  r1, 44	lwi  r6,  r1, 48	lwi  r5,  r1, 52	lwi  r4,  r1, 56	lwi  r3,  r1, 60	rtid r14,0 	 addik r1,r1,64		/*	 * タスク弹瓢借妄	 */	.text	.globl activate_r	.align 2activate_r:	ori   r4,  r0, 0x02        /* r4 = 0x02                        */	mts   rmsr,r4              /* 充哈み钓材(MSR(IE)をセット)      */	Pop   r11                  /* タスクの悸乖戎孟                 */	Pop   r5                   /* 苞眶∈exinf∷                    */	la    r15, r0,  ext_tsk -8 /* タスクからの提り黎               */	bra   r11                  /* タスクの悸乖倡幌                 */

⌨️ 快捷键说明

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