📄 cpu_support.s
字号:
/* * * TOPPERS/JSP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Just Standard Profile Kernel * * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * * 惧淡螟侯涪荚は·笆布の (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.14 2005/07/27 10:38:55 honda Exp $ */#define _MACRO_ONLY /* * アプリケ〖ションと鼎奶のインクル〖ドファイル */#include <kernel.h> /* * タ〖ゲット巴赂攫鼠の年盗 */#include <t_config.h>#include "jsp_kernel.h"#include "offset.h"#include <microblaze_asm.inc>#include <microblaze.h>/* * 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 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 /* ベクタの粕み哈み */ add r3, r3, r3 /* ベクタを4擒 */ add r3, r3, r3 lwi r5, r3, int_handler_table /* ハンドラアドレスの粕み哈み */ lwi r6, r3, int_bit_table /* マスクビットの粕み哈み */ swi r6, r0, INTC_CIE /* 券栏した充哈みをマスク */ ori r4, r0, 0x02 | MSR_CACHE_SETTING /* r4 = 0x02 */ Push r6 /* マスクビットをスタックに */ mts rmsr,r4 /* 充哈み钓材(MSR(IE)をセット)*/ brald r15, r5 /* ハンドラ钙び叫し */ nop la r4, r0, MSR_CACHE_SETTING mts rmsr,r4 /* 充哈み敦贿 */// ori r4, r0, 0x03 /* r4 = 0x03 */// swi r4, r0, INTC_MER /* INTC_MER = 0x0 INTCスタ〖ト */ Pop r6 /* マスクビットの艰り叫し */// swi r6, r0, INTC_IAR /* ACK */ swi r6, r0, INTC_SIE /* 券栏充哈みの钓材 */ /* * 充哈みネスト搀眶のデクリメント */ 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, -64 /* スクラッチレジスタ笆嘲を瘦赂する */ swi r15, r1, 60 mfs r3, rmsr /* msrの瘦赂(キャッシュの肋年の瘦赂) */ swi r3, 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -