[363] | 1 | /*
|
---|
| 2 | * TOPPERS/JSP Kernel
|
---|
| 3 | * Toyohashi Open Platform for Embedded Real-Time Systems/
|
---|
| 4 | * Just Standard Profile Kernel
|
---|
| 5 | *
|
---|
| 6 | * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
|
---|
| 7 | * Toyohashi Univ. of Technology, JAPAN
|
---|
| 8 | * Copyright (C) 2000-2003 by Industrial Technology Institute,
|
---|
| 9 | * Miyagi Prefectural Government, JAPAN
|
---|
| 10 | *
|
---|
| 11 | * ä¸è¨èä½æ¨©è
|
---|
| 12 | ã¯ï¼ä»¥ä¸ã® (1)ã(4) ã®æ¡ä»¶ãï¼Free Software Foundation
|
---|
| 13 | * ã«ãã£ã¦å
|
---|
| 14 | ¬è¡¨ããã¦ãã GNU General Public License ã® Version 2 ã«è¨
|
---|
| 15 | * è¿°ããã¦ããæ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ã¢ï¼æ¬ã½ããã¦ã§ã¢
|
---|
| 16 | * ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹å¤ã»åé
|
---|
| 17 | å¸ï¼ä»¥ä¸ï¼
|
---|
| 18 | * å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼
|
---|
| 19 | * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½
|
---|
| 20 | * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼
|
---|
| 21 | * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼
|
---|
| 22 | * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿
|
---|
| 23 | * ç¨ã§ããå½¢ã§åé
|
---|
| 24 | å¸ããå ´åã«ã¯ï¼åé
|
---|
| 25 | å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨
|
---|
| 26 | * è
|
---|
| 27 | ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨
|
---|
| 28 | * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
|
---|
| 29 | * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿
|
---|
| 30 | * ç¨ã§ããªãå½¢ã§åé
|
---|
| 31 | å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã
|
---|
| 32 | * ã¨ï¼
|
---|
| 33 | * (a) åé
|
---|
| 34 | å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è
|
---|
| 35 | ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è
|
---|
| 36 | * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
|
---|
| 37 | * (b) åé
|
---|
| 38 | å¸ã®å½¢æ
|
---|
| 39 | ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã«
|
---|
| 40 | * å ±åãããã¨ï¼
|
---|
| 41 | * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ
|
---|
| 42 | * 害ãããï¼ä¸è¨èä½æ¨©è
|
---|
| 43 | ããã³TOPPERSããã¸ã§ã¯ããå
|
---|
| 44 | 責ãããã¨ï¼
|
---|
| 45 | *
|
---|
| 46 | * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è
|
---|
| 47 | ã
|
---|
| 48 | * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ãã®é©ç¨å¯è½æ§ã
|
---|
| 49 | * å«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´
|
---|
| 50 | * æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ãã®è²¬ä»»ãè² ããªãï¼
|
---|
| 51 | */
|
---|
| 52 |
|
---|
| 53 | #define _MACRO_ONLY
|
---|
| 54 |
|
---|
| 55 | #include "jsp_kernel.h"
|
---|
| 56 | #include "offset.h"
|
---|
| 57 |
|
---|
| 58 | .section .text
|
---|
| 59 | .align 2
|
---|
| 60 |
|
---|
| 61 | .set noat
|
---|
| 62 | /* atã¬ã¸ã¹ã¿ãå©ç¨ããã¨ãã«ã¯ã¼ãã³ã°ãåºåããªãããæå® */
|
---|
| 63 | .set noreorder
|
---|
| 64 |
|
---|
| 65 | /*
|
---|
| 66 | * ä¾å¤/å²ãè¾¼ã¿åºå
|
---|
| 67 | ¥å£å¦çã«ã¼ãã³ï¼ä¸è¬ä¾å¤ï¼
|
---|
| 68 | *
|
---|
| 69 | * ä»æ§ï¼
|
---|
| 70 | * ã»CPUä¾å¤ãã³ãã©ã¯ãéã¿ã¹ã¯ã³ã³ããã¹ãã§å®è¡ããã
|
---|
| 71 | * ã»k0 ã¬ã¸ã¹ã¿ããå²è¾¼ã¿ï¼ä¾å¤ãã¹ãã«ã¦ã³ã¿ã¨ãã¦ä½¿ç¨ããã
|
---|
| 72 | * ã»reqflg ããã§ãã¯ããåã«å²è¾¼ã¿ãç¦æ¢ããªãã¨ãreqflg ããã§ãã¯å¾ã«èµ·åã
|
---|
| 73 | * ããå²è¾¼ã¿ãã³ãã©å
|
---|
| 74 | ã§ãã£ã¹ããããè¦æ±ãããå ´åã«ãã£ã¹ããããããªãã
|
---|
| 75 | * ã»å²è¾¼ã¿è¨±å¯ï¼ä¸è¨±å¯ã®å¦çã¯ãEXLããããç¨ãã¦è¡ãã
|
---|
| 76 | * ããã¯ãå¼åºå
|
---|
| 77 | ã®ã³ã³ããã¹ãã® CPUããã¯ç¶æ
|
---|
| 78 | ãä¿åããããã§ããã
|
---|
| 79 | * ãã ããå
|
---|
| 80 | ±éé¨ã«å¦çã移è¡ããå ´åã«ã¯IEããããç¨ãã¦ãå²è¾¼ã¿è¨±å¯ï¼ä¸è¨±å¯
|
---|
| 81 | * ãå®ç¾ããå¿
|
---|
| 82 | è¦ãããããã«ãIEãããã«ããå²è¾¼ã¿è¨±å¯ï¼ä¸è¨±å¯ã«å¤æ´ãã¦ãã
|
---|
| 83 | * äºã«æ³¨æã
|
---|
| 84 | * ï¼ä¾ï¼é
|
---|
| 85 | 延ãã£ã¹ãããã®å¦çã«å
|
---|
| 86 | ¥ãç´åãã¿ã¹ã¯ä¾å¤å¦çãå¼åºãç´åï¼
|
---|
| 87 | *
|
---|
| 88 | * Cè¨èªã«ã¼ãã³ã§long longåã使ãå ´åã¯ã¬ã¸ã¹ã¿ã®å¾
|
---|
| 89 | é¿ï¼å¾©å
|
---|
| 90 | ãdouble wordã§è¡
|
---|
| 91 | * ãã¹ãã ãã使ç¨é »åº¦ãä½ãã®ã¨ãåºå
|
---|
| 92 | ¥å£å¦çã®ãªã¼ãã¼ããããèãã¦ãwordã§å¾
|
---|
| 93 |
|
---|
| 94 | * é¿ï¼å¾©å
|
---|
| 95 | ãè¡ã£ã¦ãããå°æ¥çã«ã¯å¾
|
---|
| 96 | é¿ãããã¼ã¿ãµã¤ãºãã¿ã¹ã¯å±æ§ã§æå®ã§ãã
|
---|
| 97 | * ããã«ããäºå®
|
---|
| 98 | */
|
---|
| 99 |
|
---|
| 100 | .global general_exception
|
---|
| 101 | .global join_interrupt_and_exception
|
---|
| 102 | /* é¢æ°å¼åº(proc_interrupt_sys)æã«å¿
|
---|
| 103 | è¦ */
|
---|
| 104 |
|
---|
| 105 | general_exception:
|
---|
| 106 | addi sp, sp, -25*4
|
---|
| 107 | sw sp, 0*4(sp) /* EXCSTACKæ§é ä½ç¨(cpu_experré¢æ°ç¨) */
|
---|
| 108 | sw at, 1*4(sp)
|
---|
| 109 | sw v0, 2*4(sp)
|
---|
| 110 | sw v1, 3*4(sp)
|
---|
| 111 | sw a0, 4*4(sp)
|
---|
| 112 | sw a1, 5*4(sp)
|
---|
| 113 | sw a2, 6*4(sp)
|
---|
| 114 | sw a3, 7*4(sp)
|
---|
| 115 | sw t0, 8*4(sp)
|
---|
| 116 | sw t1, 9*4(sp)
|
---|
| 117 | sw t2, 10*4(sp)
|
---|
| 118 | sw t3, 11*4(sp)
|
---|
| 119 | sw t4, 12*4(sp)
|
---|
| 120 | sw t5, 13*4(sp)
|
---|
| 121 | sw t6, 14*4(sp)
|
---|
| 122 | sw t7, 15*4(sp)
|
---|
| 123 | sw t8, 16*4(sp)
|
---|
| 124 | sw t9, 17*4(sp)
|
---|
| 125 | sw gp, 18*4(sp)
|
---|
| 126 | sw fp, 19*4(sp)
|
---|
| 127 | sw ra, 20*4(sp)
|
---|
| 128 |
|
---|
| 129 | mfc0 a1, Status /* a1 -> ä¾å¤å¦çã§ä½¿ã */
|
---|
| 130 | mfc0 t1, EPC
|
---|
| 131 |
|
---|
| 132 | sw a1, 21*4(sp) /* Status */
|
---|
| 133 | sw t1, 22*4(sp) /* EPC */
|
---|
| 134 |
|
---|
| 135 | mfhi t2 /* ä¹é¤ç®ã¬ã¸ã¹ã¿ HI ã®å¾
|
---|
| 136 | é¿ */
|
---|
| 137 | mflo t3 /* ä¹é¤ç®ã¬ã¸ã¹ã¿ LO ã®å¾
|
---|
| 138 | é¿ */
|
---|
| 139 |
|
---|
| 140 | sw t2, 23*4(sp) /* HI */
|
---|
| 141 | sw t3, 24*4(sp) /* LO */
|
---|
| 142 |
|
---|
| 143 | move a0, sp /* ä¾å¤ãã³ãã©ã®å¼æ°è¨å® */
|
---|
| 144 | /* å¼æ°ã¯ãä¾å¤çºçæã®ãã¼ã¿ãéé¿ããã¹ã¿ãã¯é åã¸ã®ãã¤ã³ã¿
|
---|
| 145 | å²è¾¼ã¿ã³ã³ããã¼ã©ã®ãã¼ã¿ãå«ããã¨è¤éã«ãªãããã
|
---|
| 146 | 対象ã¯MIPS3ã³ã¢ã®ã¬ã¸ã¹ã¿é¨åã®ã¿ã¨ããã */
|
---|
| 147 |
|
---|
| 148 | PUSH_ICU_IPM /* å²è¾¼ã¿ã³ã³ããã¼ã©ã®å²è¾¼ã¿ãã¹ã¯ã®
|
---|
| 149 | å¾
|
---|
| 150 | é¿ãã¯ã(ã·ã¹ãã ä¾åé¨ã§å®ç¾©) */
|
---|
| 151 |
|
---|
| 152 | bgtz k0, multipul_exception /* å段ã®ä¾å¤ã¨å¤éä¾å¤ã®å¤å¥ */
|
---|
| 153 | addi k0, k0, 1 /* ãã¹ãã«ã¦ã³ã¿ã®ã¤ã³ã¯ãªã¡ã³ã */
|
---|
| 154 |
|
---|
| 155 | /* å段ã®ä¾å¤ã®å ´å */
|
---|
| 156 | first_exception:
|
---|
| 157 | la t3, _stack_top /* _stack_top ã¯ãã·ã¹ãã ä¾åé¨
|
---|
| 158 | (ãªã³ã«ã¹ã¯ãªããæ¨å¥¨)å®ç¾© */
|
---|
| 159 | /* ã¹ã¿ãã¯ãã¤ã³ã¿ã®æ¸ç®(t3=t3-4)ã¯ã
|
---|
| 160 | _stack_top è¨å®æã«è¡ã£ã¦ããã®ã§ã
|
---|
| 161 | ããã§ã¯ä¸è¦ */
|
---|
| 162 | sw sp, (t3) /* ã¿ã¹ã¯ã¹ã¿ãã¯ãã¤ã³ã¿ã®ä¿å */
|
---|
| 163 | move sp, t3 /* ã¹ã¿ãã¯åãæ¿ã */
|
---|
| 164 |
|
---|
| 165 | jal proc_interrupt_and_exception /* å²è¾¼ã¿ã¨ä¾å¤ã®å¤å¥å¦ç㸠*/
|
---|
| 166 | nop
|
---|
| 167 |
|
---|
| 168 | /* å²è¾¼ã¿ç¦æ¢ã§æ»ã£ã¦ãã */
|
---|
| 169 | la t2, reqflg
|
---|
| 170 | lw t3, (t2) /* t3 = reqflg */
|
---|
| 171 | lw sp, (sp) /* ã¹ã¿ãã¯åãæ¿ã */
|
---|
| 172 | beq t3, zero, ret_to_task_int /* ãã£ã¹ãããè¦æ±ããªãå ´å */
|
---|
| 173 | nop
|
---|
| 174 |
|
---|
| 175 | j ret_int /* å²è¾¼ã¿ï¼ä¾å¤ã®åºå£å¦ç㸠*/
|
---|
| 176 | sw zero, (t2) /* reqflg ã®ã¯ãªã¢ */
|
---|
| 177 |
|
---|
| 178 | /* å¤éä¾å¤ï¼å¤éå²è¾¼ã¿ï¼ã®å ´å (ä¾å¤ãã³ãã©ã®å¼æ°ã¯æ¢ã« a0 ã«è¨å®æ¸ã¿) */
|
---|
| 179 | multipul_exception:
|
---|
| 180 | jal proc_interrupt_and_exception /* å²è¾¼ã¿ã¨ä¾å¤ã®å¤å¥å¦ç㸠*/
|
---|
| 181 | nop
|
---|
| 182 |
|
---|
| 183 | /* ãã£ã¹ãããã£ãå¼ã°ãã«åç´ã«å²è¾¼ã¿å
|
---|
| 184 | ï¼ä¾å¤çºçå
|
---|
| 185 | ï¼ã«æ»ãå ´å */
|
---|
| 186 | ret_to_task_int:
|
---|
| 187 | POP_ICU_IPM /* å²è¾¼ã¿ã³ã³ããã¼ã©ã®å²è¾¼ã¿ãã¹ã¯ã®
|
---|
| 188 | 復帰ãã¯ã(ã·ã¹ãã ä¾åé¨ã§å®ç¾©) */
|
---|
| 189 |
|
---|
| 190 | lw t0, 23*4(sp) /* HI */
|
---|
| 191 | lw t1, 24*4(sp) /* LO */
|
---|
| 192 |
|
---|
| 193 | mthi t0 /* ä¹é¤ç®ã¬ã¸ã¹ã¿ HI ã®å¾©å
|
---|
| 194 | */
|
---|
| 195 | mtlo t1 /* ä¹é¤ç®ã¬ã¸ã¹ã¿ LO ã®å¾©å
|
---|
| 196 | */
|
---|
| 197 |
|
---|
| 198 | /* ä¿çï¼long longåã使ç¨ããå ´å */
|
---|
| 199 | lw t0, 21*4(sp) /* Status */
|
---|
| 200 | lw t1, 22*4(sp) /* EPC */
|
---|
| 201 |
|
---|
| 202 | lw at, 1*4(sp)
|
---|
| 203 | lw v0, 2*4(sp)
|
---|
| 204 | lw v1, 3*4(sp)
|
---|
| 205 | lw a0, 4*4(sp)
|
---|
| 206 | lw a1, 5*4(sp)
|
---|
| 207 | lw a2, 6*4(sp)
|
---|
| 208 | lw a3, 7*4(sp)
|
---|
| 209 |
|
---|
| 210 | /*
|
---|
| 211 | * å¤éä¾å¤æãªã®ã§ãã¿ã¹ã¯ã¹ã¤ããããªãå ´åãªã®ã§ãã¿ã¹ã¯ã³ã³ããã¹ã
|
---|
| 212 | * ã®å²è¾¼ã¿ãã¹ã¯ãå¤æ´ããã¦ããå¿é
|
---|
| 213 | ã¯ãªãã
|
---|
| 214 | * ï¼ã¹ãã¼ã¿ã¹ã¬ã¸ã¹ã¿ã¯å
|
---|
| 215 | ã®å¤ããã®ã¾ã¾æ¸ãæ»ãï¼
|
---|
| 216 | */
|
---|
| 217 | mtc0 t0, Status
|
---|
| 218 | mtc0 t1, EPC
|
---|
| 219 |
|
---|
| 220 | lw t0, 8*4(sp)
|
---|
| 221 | lw t1, 9*4(sp)
|
---|
| 222 | lw t2, 10*4(sp)
|
---|
| 223 | lw t3, 11*4(sp)
|
---|
| 224 | lw t4, 12*4(sp)
|
---|
| 225 | lw t5, 13*4(sp)
|
---|
| 226 | lw t6, 14*4(sp)
|
---|
| 227 | lw t7, 15*4(sp)
|
---|
| 228 | lw t8, 16*4(sp)
|
---|
| 229 | lw t9, 17*4(sp)
|
---|
| 230 | lw gp, 18*4(sp)
|
---|
| 231 | lw fp, 19*4(sp)
|
---|
| 232 | lw ra, 20*4(sp)
|
---|
| 233 |
|
---|
| 234 | addi sp, sp, 25*4 /* ERET å½ä»¤ã¯ãç´å¾ã®å½ä»¤ãå®è¡ããªã
|
---|
| 235 | ã®ã§é
|
---|
| 236 | 延ã¹ãããã«ã¯å
|
---|
| 237 | ¥ããããªãã*/
|
---|
| 238 |
|
---|
| 239 | eret /* ä¾å¤ããã®å¾©å¸° */
|
---|
| 240 | nop
|
---|
| 241 |
|
---|
| 242 | /*
|
---|
| 243 | * å²è¾¼ã¿ã¨ä¾å¤ã®å¤å¥å¦çé¢æ°
|
---|
| 244 | * 以ä¸ã®ã¬ã¸ã¹ã¿ã«å¤ã代å
|
---|
| 245 | ¥æ¸ã¿
|
---|
| 246 | * a0 : ä¾å¤ãã³ãã©ã®å¼æ°, a1 : ã¹ãã¼ã¿ã¹ã¬ã¸ã¹ã¿
|
---|
| 247 | */
|
---|
| 248 | proc_interrupt_and_exception:
|
---|
| 249 | addi sp, sp, -4
|
---|
| 250 | sw ra, 0(sp)
|
---|
| 251 |
|
---|
| 252 | mfc0 a2, Cause
|
---|
| 253 | andi t2, a2, ExcCode_mask
|
---|
| 254 | beq t2, zero, proc_interrupt /* å²è¾¼ã¿ã¨ä¾å¤ã®å¤å¥ */
|
---|
| 255 | /* ããããç´æ¥proc_interrupt_sysã¸é£ã³ããããå±ããªã
|
---|
| 256 | å¯è½æ§ãããã®ã§ãä¸åº¦proc_interruptã«é£ã¶ã */
|
---|
| 257 | nop
|
---|
| 258 |
|
---|
| 259 | /* å²è¾¼ã¿ä»¥å¤ã®ä¾å¤ã®å¦ç */
|
---|
| 260 | la t4, exc_table
|
---|
| 261 | /* a1 = Status */
|
---|
| 262 | ori t5, a1, SR_EXL
|
---|
| 263 | xori t5, t5, SR_EXL /* EXLãããã¯ãªã¢ */
|
---|
| 264 | /* å²è¾¼ã¿ä»¥å¤ã®ä¾å¤ã¯CPUããã¯ç¶æ
|
---|
| 265 | ã§ãåãä»ããã®ã§ãCPUããã¯
|
---|
| 266 | ç¶æ
|
---|
| 267 | ãä¿åããå¿
|
---|
| 268 | è¦ãããããã®ããIEãããã¯æä½ããã«ãå²ã
|
---|
| 269 | è¾¼ã¿ç¦æ¢ã»è¨±å¯ã¯EXLããããç¨ãã¦å®ç¾ãã */
|
---|
| 270 | add t6, t4, t2 /* ä¾å¤ã³ã¼ã対å¿ã¢ãã¬ã¹ã®è¨å® */
|
---|
| 271 | lw t7, (t6) /* Cè¨èªã«ã¼ãã³ã®å¼åºã¢ãã¬ã¹åå¾ */
|
---|
| 272 | jalr t7 /* Cè¨èªã«ã¼ãã³å¼ã³åºã */
|
---|
| 273 | mtc0 t5, Status /* å²è¾¼ã¿è¨±å¯ (EXLããã = 0) */
|
---|
| 274 |
|
---|
| 275 | mfc0 t0, Status
|
---|
| 276 | ori t0, t0, SR_EXL
|
---|
| 277 | mtc0 t0, Status /* å²è¾¼ã¿ç¦æ¢ (EXLããã = 1) */
|
---|
| 278 |
|
---|
| 279 | NOP_FOR_CP0_HAZARD /* CP0ãã¶ã¼ãã®ããã®æé稼ããã¯ã
|
---|
| 280 | (ãã®ãã¯ãã¯ã·ã¹ãã ä¾åé¨å®ç¾©) */
|
---|
| 281 |
|
---|
| 282 | j join_interrupt_and_exception /* ä¾å¤ã»å²è¾¼ã¿ã®åæµå°ç¹ã¸ */
|
---|
| 283 | nop
|
---|
| 284 |
|
---|
| 285 | /* å²è¾¼ã¿ã®å ´åã®å¦ç */
|
---|
| 286 | proc_interrupt:
|
---|
| 287 |
|
---|
| 288 | /*
|
---|
| 289 | * å²è¾¼ã¿ã³ã³ããã¼ã©ã®å¤æ§æ§ã«å¯¾å¿ãããããå®è£
|
---|
| 290 | ã¯ã·ã¹ãã ä¾åé¨ã§è¡ãã
|
---|
| 291 | * å®è£
|
---|
| 292 | æ¹æ³ã¯ã
|
---|
| 293 | * ãã¯ãï¼PROC_INTERRUPT_SYSï¼ã¾ãã¯ãé¢æ°å¼åº(proc_interrupt_sys)
|
---|
| 294 | * ã¨ããã
|
---|
| 295 | *
|
---|
| 296 | * ã»å¼åºæã«ã»ããããã¦ããå¼æ°
|
---|
| 297 | * a1 : ã¹ãã¼ã¿ã¹ã¬ã¸ã¹ã¿
|
---|
| 298 | * a2 : åå ã¬ã¸ã¹ã¿
|
---|
| 299 | *
|
---|
| 300 | * ã»å®è£
|
---|
| 301 | æã«ã¯ãraã¬ã¸ã¹ã¿ãç ´å£ãã¦ã¯ãªããªãã
|
---|
| 302 | *
|
---|
| 303 | * ã»å®è£
|
---|
| 304 | ããå
|
---|
| 305 | ·ä½çãªå¦çã®æµãï¼
|
---|
| 306 | * 1. å²è¾¼ã¿è¦å ã®å¤å¥
|
---|
| 307 | * 2. å²è¾¼ã¿ãã¹ã¯ï¼ã³ã¢ãå²è¾¼ã¿ã³ã³ããã¼ã©ï¼ã®è¨å®
|
---|
| 308 | * 3. å²è¾¼ã¿è¨±å¯
|
---|
| 309 | * 4. ï¼£è¨èªã«ã¼ãã³ã®å¼åº
|
---|
| 310 | * 5. å²è¾¼ã¿ç¦æ¢
|
---|
| 311 | * 6. å²è¾¼ã¿ã³ã³ããã¼ã©ã®å²è¾¼ã¿è¦æ±ã®ã¯ãªã¢
|
---|
| 312 | * (7. join_interrupt_and_exceptionã«æ»ãã; é¢æ°å¼åºã®å ´å)
|
---|
| 313 | */
|
---|
| 314 |
|
---|
| 315 | #ifdef PROC_INTERRUPT_SYS
|
---|
| 316 | PROC_INTERRUPT_SYS
|
---|
| 317 | #else /* PROC_INTERRUPT_SYS */
|
---|
| 318 | j proc_interrupt_sys
|
---|
| 319 | nop
|
---|
| 320 | #endif /* PROC_INTERRUPT_SYS */
|
---|
| 321 |
|
---|
| 322 | /* ä¾å¤ã»å²è¾¼ã¿å¦çã®åæµå°ç¹ */
|
---|
| 323 | join_interrupt_and_exception:
|
---|
| 324 | addi k0, k0, -1 /* ãã¹ãã«ã¦ã³ã¿ ãã£ã¯ãªã¡ã³ã */
|
---|
| 325 | lw ra, (sp) /* ra ã復å
|
---|
| 326 | */
|
---|
| 327 | jr ra /* proc_interrupt_and_exeption ã®å¼åºå
|
---|
| 328 |
|
---|
| 329 | ã«æ»ã */
|
---|
| 330 | addi sp, sp, 4
|
---|
| 331 |
|
---|
| 332 | /*
|
---|
| 333 | * å²ãè¾¼ã¿ãã³ãã©/CPUä¾å¤ãã³ãã©åºå£å¦ç
|
---|
| 334 | *
|
---|
| 335 | * æ»ãå
|
---|
| 336 | ãã¿ã¹ã¯ã³ã³ããã¹ãã§reqflgãã»ããããã¦ããå ´åã®ã¿ãããã«ããã
|
---|
| 337 | * ã»k0 = 0ãå²è¾¼ã¿ç¦æ¢ç¶æ
|
---|
| 338 | ãæ±ç¨ã¬ã¸ã¹ã¿ãä¿åããç¶æ
|
---|
| 339 | ã§å¼ã³åºããã¨ã
|
---|
| 340 | * ã»t1ã«runtskã®å¤ãå
|
---|
| 341 | ¥ãã¦ããret_int_1ã«ã¸ã£ã³ããããã¨ã
|
---|
| 342 | */
|
---|
| 343 |
|
---|
| 344 | ret_int:
|
---|
| 345 | POP_ICU_IPM /* å²è¾¼ã¿ã³ã³ããã¼ã©ã®å²è¾¼ã¿ãã¹ã¯ã®
|
---|
| 346 | 復帰ãã¯ã(ã·ã¹ãã ä¾åé¨ã§å®ç¾©) */
|
---|
| 347 |
|
---|
| 348 | lw t1, 21*4(sp) /* Status */
|
---|
| 349 | ori t1, t1, SR_EXL /* å²è¾¼ã¿å¦çã«å
|
---|
| 350 | ¥ãã¨ãã®ãCPUããã¯
|
---|
| 351 | ç¶æ
|
---|
| 352 | ãä¿æãããã®ã§ãå²è¾¼ã¿ç¦æ¢ã¯
|
---|
| 353 | EXLããããç¨ãã¦è¡ãã */
|
---|
| 354 | mtc0 t1, Status /* MIPS3ã³ã¢ã®å²è¾¼ã¿ãã¹ã¯ã®å¾©å¸°
|
---|
| 355 | + EXLãããã«ããå²è¾¼ã¿ç¦æ¢ */
|
---|
| 356 |
|
---|
| 357 | la t0, enadsp
|
---|
| 358 | la t3, runtsk
|
---|
| 359 | lw t2, (t0) /* t2 = enadsp */
|
---|
| 360 | lw t1, (t3) /* t1 = runtsk */
|
---|
| 361 | beq t2, zero, ret_int_1 /* ãã£ã¹ãããç¦æ¢ãªãã¸ã£ã³ã */
|
---|
| 362 | nop
|
---|
| 363 | la t4, schedtsk
|
---|
| 364 | lw t5, (t4) /* t5 = schedtsk */
|
---|
| 365 | beq t1, t5, ret_int_1 /* runtsk = schedtsk ãªãã¸ã£ã³ã */
|
---|
| 366 | nop
|
---|
| 367 |
|
---|
| 368 | /* ãã£ã¹ãããã£ãçµç±ããå ´åã®å¦ç (t1 = runtsk ã«æ³¨æ) */
|
---|
| 369 | /* ãããããå²è¾¼ã¿ç¦æ¢ï¼è¨±å¯ããEXLããããç¨ãã¦å®ç¾ããæ¹æ³ã«å¤æ´ */
|
---|
| 370 | mfc0 t0, Status
|
---|
| 371 | ori t0, t0, SR_EXL_IE
|
---|
| 372 | xori t0, t0, SR_EXL_IE /* lock_cpu ç¸å½ (å²è¾¼ã¿ç¦æ¢)
|
---|
| 373 | + EXLãããã¯ãªã¢ (å²è¾¼ã¿è¨±å¯) */
|
---|
| 374 | mtc0 t0, Status
|
---|
| 375 |
|
---|
| 376 | addi sp, sp, -8*4 /* ã¹ã¯ã©ããã¬ã¸ã¹ã¿ã®ä¿å */
|
---|
| 377 | sw s0, 0*4(sp)
|
---|
| 378 | sw s1, 1*4(sp)
|
---|
| 379 | sw s2, 2*4(sp)
|
---|
| 380 | sw s3, 3*4(sp)
|
---|
| 381 | sw s4, 4*4(sp)
|
---|
| 382 | sw s5, 5*4(sp)
|
---|
| 383 | sw s6, 6*4(sp)
|
---|
| 384 | sw s7, 7*4(sp)
|
---|
| 385 | /* t1 = runtsk ã«æ³¨æ */
|
---|
| 386 | sw sp, TCB_sp(t1) /* runtsk->sp = sp
|
---|
| 387 | (ã¿ã¹ã¯ã¹ã¿ãã¯ãã¤ã³ã¿ã®ä¿å) */
|
---|
| 388 | la t2, ret_int_r
|
---|
| 389 |
|
---|
| 390 | j dispatcher /* ãã£ã¹ãããã£å¼ã³åºã */
|
---|
| 391 | sw t2, TCB_pc(t1) /* runtsk->pc = ret_int_r
|
---|
| 392 | (å®è¡åéçªå°ã®ä¿å) */
|
---|
| 393 |
|
---|
| 394 | /*
|
---|
| 395 | * å²è¾¼ã¿ã»ä¾å¤ã®åºå£å¦ç
|
---|
| 396 | * ã»ãã£ã¹ãããã£å¦çã«ããã¦ãt1 = runtsk ã¨ãªã£ã¦ãããã¨ã«æ³¨æ
|
---|
| 397 | * ã»ã¹ã¿ãã¯ãã¤ã³ã¿ãè¨å®æ¸ã¿
|
---|
| 398 | */
|
---|
| 399 | /* ãã£ã¹ãããã£å¼ã³åºãå¾ã®ã¿ã¹ã¯ã³ã³ããã¹ãããã®åæµå°ç¹ */
|
---|
| 400 | ret_int_r:
|
---|
| 401 | lw s0, 0*4(sp) /* ã¹ã¯ã©ããã¬ã¸ã¹ã¿ã®å¾©å
|
---|
| 402 | */
|
---|
| 403 | lw s1, 1*4(sp)
|
---|
| 404 | lw s2, 2*4(sp)
|
---|
| 405 | lw s3, 3*4(sp)
|
---|
| 406 | lw s4, 4*4(sp)
|
---|
| 407 | lw s5, 5*4(sp)
|
---|
| 408 | lw s6, 6*4(sp)
|
---|
| 409 | lw s7, 7*4(sp)
|
---|
| 410 | addi sp, sp, 8*4
|
---|
| 411 |
|
---|
| 412 | mfc0 t0, Status
|
---|
| 413 | ori t0, t0, SR_EXL_IE /* unlock_cpu ç¸å½ (å²è¾¼ã¿è¨±å¯)
|
---|
| 414 | + EXLãããã»ãã (å²è¾¼ã¿ç¦æ¢) */
|
---|
| 415 | mtc0 t0, Status
|
---|
| 416 |
|
---|
| 417 | /* ãã£ã¹ãããã£ãçµç±ããªãå ´åã®åæµå°ç¹ (t1 = runtsk ã«æ³¨æ) */
|
---|
| 418 | ret_int_1:
|
---|
| 419 |
|
---|
| 420 | /* ã¿ã¹ã¯ä¾å¤å¦çè¦æ±ã®ãã§ã㯠*/
|
---|
| 421 | lb t2, TCB_enatex(t1)
|
---|
| 422 | andi t4, t2, TCB_enatex_mask /* t3 = runtsk->enatex */
|
---|
| 423 | beq t4, zero, ret_int_2 /* ã¿ã¹ã¯ä¾å¤å¦çç¦æ¢ã®æãã¸ã£ã³ã */
|
---|
| 424 | nop
|
---|
| 425 |
|
---|
| 426 | lw t5, TCB_texptn(t1) /* t5 = runtsk->texptn */
|
---|
| 427 | beq t5, zero, ret_int_2 /* ã¿ã¹ã¯ä¾å¤è¦æ±ãç¡ãæãã¸ã£ã³ã */
|
---|
| 428 | nop
|
---|
| 429 |
|
---|
| 430 | mfc0 t0, Status
|
---|
| 431 | ori t0, t0, SR_EXL_IE
|
---|
| 432 | xori t0, t0, SR_EXL_IE /* lock_cpuç¸å½ (å²è¾¼ã¿ç¦æ¢)
|
---|
| 433 | + EXLãããã¯ãªã¢ (å²è¾¼ã¿è¨±å¯) */
|
---|
| 434 | mtc0 t0, Status
|
---|
| 435 |
|
---|
| 436 | jal call_texrtn /* ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³(ã¿ã¼ã²ããé
|
---|
| 437 | ä¾åé¨å®ç¾©)ã®å¼ã³åºã */
|
---|
| 438 | nop
|
---|
| 439 | /* call_texrtn()(task.c)ã§ã¯ãå®éã®ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³å¼ã³
|
---|
| 440 | åºãåå¾ã§ãunlock_cpuãlock_cpuå¦çãè¡ã£ã¦ããã®ã§ãç¶æ
|
---|
| 441 | ã¯
|
---|
| 442 | ä¿æãããã */
|
---|
| 443 |
|
---|
| 444 | mfc0 t0, Status
|
---|
| 445 | ori t0, t0, SR_EXL_IE /* unlock_cpu ç¸å½ (å²è¾¼ã¿è¨±å¯)
|
---|
| 446 | + EXLãããã»ãã (å²è¾¼ã¿ç¦æ¢) */
|
---|
| 447 | mtc0 t0, Status
|
---|
| 448 | /* ããã¾ã§ããå²è¾¼ã¿ç¦æ¢ï¼è¨±å¯ããEXLããããç¨ãã¦å®ç¾ããæ¹æ³ */
|
---|
| 449 |
|
---|
| 450 | ret_int_2:
|
---|
| 451 | /* ã¬ã¸ã¹ã¿ã®å¾©å¸° (Statusã¬ã¸ã¹ã¿ã¯ãæ¢ã«å¾©å
|
---|
| 452 | æ¸ã¿) */
|
---|
| 453 | lw t1, 22*4(sp) /* EPC */
|
---|
| 454 | mtc0 t1, EPC
|
---|
| 455 |
|
---|
| 456 | lw t2, 23*4(sp) /* HI */
|
---|
| 457 | lw t3, 24*4(sp) /* LO */
|
---|
| 458 |
|
---|
| 459 | mthi t2 /* ä¹é¤ç®ã¬ã¸ã¹ã¿ HI ã®å¾©å
|
---|
| 460 | */
|
---|
| 461 | mtlo t3 /* ä¹é¤ç®ã¬ã¸ã¹ã¿ LO ã®å¾©å
|
---|
| 462 | */
|
---|
| 463 |
|
---|
| 464 | lw at, 1*4(sp)
|
---|
| 465 | lw v0, 2*4(sp)
|
---|
| 466 | lw v1, 3*4(sp)
|
---|
| 467 | lw a0, 4*4(sp)
|
---|
| 468 | lw a1, 5*4(sp)
|
---|
| 469 | lw a2, 6*4(sp)
|
---|
| 470 | lw a3, 7*4(sp)
|
---|
| 471 | lw t0, 8*4(sp)
|
---|
| 472 | lw t1, 9*4(sp)
|
---|
| 473 | lw t2, 10*4(sp)
|
---|
| 474 | lw t3, 11*4(sp)
|
---|
| 475 | lw t4, 12*4(sp)
|
---|
| 476 | lw t5, 13*4(sp)
|
---|
| 477 | lw t6, 14*4(sp)
|
---|
| 478 | lw t7, 15*4(sp)
|
---|
| 479 | lw t8, 16*4(sp)
|
---|
| 480 | lw t9, 17*4(sp)
|
---|
| 481 |
|
---|
| 482 | lw gp, 18*4(sp)
|
---|
| 483 | lw fp, 19*4(sp)
|
---|
| 484 | lw ra, 20*4(sp)
|
---|
| 485 |
|
---|
| 486 | addi sp, sp, 25*4
|
---|
| 487 |
|
---|
| 488 | eret /* å²è¾¼ã¿/ä¾å¤å¦çããã®å¾©å¸° */
|
---|
| 489 | nop
|
---|
| 490 |
|
---|
| 491 | /*
|
---|
| 492 | * ã¿ã¹ã¯ãã£ã¹ãããã£
|
---|
| 493 | * ã»dispatch ã¯ãk0 = 0ãCPUããã¯(å²è¾¼ã¿ç¦æ¢)ç¶æ
|
---|
| 494 | ã§å¼ã³åºããªããã°ãªããªãã
|
---|
| 495 | * ã»exit_and_dispatch ã¯ï¼k0 = 0ãCPUããã¯(å²è¾¼ã¿ç¦æ¢)ç¶æ
|
---|
| 496 | ã§å¼ã³åºãã®ãåå
|
---|
| 497 | * ããããã«ã¼ãã«èµ·åå¦çã®ããï¼k0 = 1ã§å¼ã³åºããå ´åã«ã対å¿ãã¦ããã
|
---|
| 498 | */
|
---|
| 499 |
|
---|
| 500 | .global dispatch
|
---|
| 501 | .global exit_and_dispatch
|
---|
| 502 |
|
---|
| 503 | /* ã¿ã¹ã¯ãã£ã¹ãããã£ãæ示çã«å¼ã³åºãæ */
|
---|
| 504 | dispatch:
|
---|
| 505 | addi sp, sp, -13*4
|
---|
| 506 | sw at, 1*4(sp) /* ã¹ã¯ã©ããã¬ã¸ã¹ã¿ã®å¾
|
---|
| 507 | é¿ */
|
---|
| 508 | sw s0, 2*4(sp)
|
---|
| 509 | sw s1, 3*4(sp)
|
---|
| 510 | sw s2, 4*4(sp)
|
---|
| 511 | sw s3, 5*4(sp)
|
---|
| 512 | sw s4, 6*4(sp)
|
---|
| 513 | sw s5, 7*4(sp)
|
---|
| 514 | sw s6, 8*4(sp)
|
---|
| 515 | sw s7, 9*4(sp)
|
---|
| 516 | sw gp, 10*4(sp)
|
---|
| 517 | sw fp, 11*4(sp)
|
---|
| 518 | sw ra, 12*4(sp)
|
---|
| 519 |
|
---|
| 520 | la t0, runtsk
|
---|
| 521 | la t2, dispatch_r
|
---|
| 522 | lw t1, (t0) /* t1 = runtsk */
|
---|
| 523 | sw sp, TCB_sp(t1) /* runtsk->sp = sp */
|
---|
| 524 | j dispatcher
|
---|
| 525 | sw t2, TCB_pc(t1) /* runtsk->pc = dispatch_r */
|
---|
| 526 |
|
---|
| 527 | /* ç¾å¨å®è¡ä¸ã®ã³ã³ããã¹ããæ¨ã¦ã¦ãã¿ã¹ã¯ãã£ã¹ãããã£ãå¼ã³åºãæ */
|
---|
| 528 | exit_and_dispatch:
|
---|
| 529 | move k0, zero /* ãã¹ãã«ã¦ã³ã¿ãã¯ãªã¢ */
|
---|
| 530 |
|
---|
| 531 | dispatcher:
|
---|
| 532 | /* ããã«ã¯ CPUããã¯ï¼å²ãè¾¼ã¿ç¦æ¢ï¼ã§æ¥ãã㨠*/
|
---|
| 533 | la t0, schedtsk
|
---|
| 534 | lw t1, (t0) /* t1 = schedtsk */
|
---|
| 535 | beq t1, zero, dispatcher_2 /* schedtsk ãç¡ããã°å²è¾¼ã¿å¾
|
---|
| 536 | ã¡ã¸ */
|
---|
| 537 | nop
|
---|
| 538 |
|
---|
| 539 | dispatcher_1:
|
---|
| 540 | la t0, runtsk
|
---|
| 541 | sw t1, (t0) /* runtsk = t1 (= schedtsk)
|
---|
| 542 | (ã¿ã¹ã¯ã¹ã¤ããã®å®è¡) */
|
---|
| 543 | lw t2, TCB_pc(t1) /* å®è¡åéçªå°ãåå¾ããã
|
---|
| 544 | å®è¡åéçªå°ã¯ä»¥ä¸ã®3éã
|
---|
| 545 | ã»ãã£ã¹ãããã£ã®åºå£ dispatch_r
|
---|
| 546 | ã»å²è¾¼ã¿ï¼ä¾å¤ã®åºå£ ret_int_r
|
---|
| 547 | ã»ã¿ã¹ã¯èµ·åç´å¾ activate_r
|
---|
| 548 | ãããã®å ´åã t1=runtsk ã¨ãã¦å¼ã³
|
---|
| 549 | åºãã¦ãããã¨ã«æ³¨æã */
|
---|
| 550 | jr t2 /* å®è¡åéçªå°ã¸ã¸ã£ã³ã */
|
---|
| 551 | lw sp, TCB_sp(t1) /* ã¹ã¿ãã¯ãã¤ã³ã¿ã復å
|
---|
| 552 | */
|
---|
| 553 |
|
---|
| 554 | /*
|
---|
| 555 | * å®è¡ãã¹ãã¿ã¹ã¯ãç¾ããã¾ã§å¾
|
---|
| 556 | ã¤å¦ç
|
---|
| 557 | *
|
---|
| 558 | * ããã§ã³ã³ããã¹ããåãæããã®ã¯ï¼
|
---|
| 559 | * ã»ããã§çºçããå²è¾¼ã¿å¦çã«ã©ã®ã¹ã¿ãã¯ã使ããã¨ããåé¡ã®è§£æ±º
|
---|
| 560 | * ã»å²è¾¼ã¿ãã³ãã©å
|
---|
| 561 | ã§ã®ã¿ã¹ã¯ãã£ã¹ãããã®é²æ¢
|
---|
| 562 | * ã¨ããäºã¤ã®æå³ãããï¼
|
---|
| 563 | */
|
---|
| 564 | dispatcher_2:
|
---|
| 565 | la t2, runtsk
|
---|
| 566 | sw zero, (t2) /* runtsk = NULL
|
---|
| 567 | ããã¯ãiget_id ããTSK_NONEãè¿ã
|
---|
| 568 | å ´åã«å¯¾å¿ããããã*/
|
---|
| 569 |
|
---|
| 570 | la sp, _stack_top /* ã¹ã¿ãã¯åãæ¿ã */
|
---|
| 571 | /* _stack_top ã¯ãã·ã¹ãã ä¾åé¨
|
---|
| 572 | (ãªã³ã«ã¹ã¯ãªããæ¨å¥¨)å®ç¾© */
|
---|
| 573 | li k0, 1 /* ãã¹ãã«ã¦ã³ã¿ï¼1 */
|
---|
| 574 |
|
---|
| 575 | /* ã«ã¼ãå
|
---|
| 576 | ã§ä½¿ãå®æ°ã®æºå */
|
---|
| 577 | la t2, reqflg /* reqflg ã®ã¢ãã¬ã¹ */
|
---|
| 578 | li t3, ~SR_ERL_EXL /* Status ã®å²è¾¼ã¿é¢é£ããã */
|
---|
| 579 | li t4, ~SR_IE /* Status ã®å²è¾¼ã¿è¨±å¯ããã */
|
---|
| 580 |
|
---|
| 581 | dispatcher_3:
|
---|
| 582 | mfc0 t1, Status
|
---|
| 583 | and t1, t1, t3 /* ERL, EXL ãããã¯ãªã¢ */
|
---|
| 584 | ori t1, t1, SR_IE /* IEãããã»ãã */
|
---|
| 585 | mtc0 t1, Status /* å²è¾¼ã¿è¨±å¯ : unlock_cpu ç¸å½ */
|
---|
| 586 | and t1, t1, t4 /* IEããããªã»ãã */
|
---|
| 587 | mtc0 t1, Status /* å²è¾¼ã¿ç¦æ¢ : lock_cpu ç¸å½ */
|
---|
| 588 |
|
---|
| 589 | NOP_FOR_CP0_HAZARD /* CP0ãã¶ã¼ãã®ããã®æé稼ããã¯ã
|
---|
| 590 | (ãã®ãã¯ãã¯ã·ã¹ãã ä¾åé¨å®ç¾©) */
|
---|
| 591 |
|
---|
| 592 | lw t5, (t2) /* t5 = reqflg */
|
---|
| 593 |
|
---|
| 594 | beq t5, zero, dispatcher_3 /* ãã£ã¹ãããè¦æ±ããªããã°ã«ã¼ãã®
|
---|
| 595 | å
|
---|
| 596 | é 㸠*/
|
---|
| 597 | nop
|
---|
| 598 | sw zero, (t2) /* reqflg = NULL (reqflgãã¯ãªã¢) */
|
---|
| 599 | j dispatcher /* å®è¡åéçªå°ã®åå¾å¦çã¸ã¸ã£ã³ã */
|
---|
| 600 | move k0, zero /* ãã¹ãã«ã¦ã³ã¿ãã¯ãªã¢ */
|
---|
| 601 |
|
---|
| 602 | /*
|
---|
| 603 | * ãã£ã¹ãããã£åºå£å¦ç
|
---|
| 604 | * ã»ãã£ã¹ãããã£å¦çã«ããã¦ãt1 = runtsk ã¨ãªã£ã¦ãããã¨ã«æ³¨æ
|
---|
| 605 | * ã»ã¹ã¿ãã¯ãã¤ã³ã¿ãè¨å®æ¸ã¿
|
---|
| 606 | */
|
---|
| 607 | dispatch_r:
|
---|
| 608 | lw at, 1*4(sp) /* ã¹ã¯ã©ããã¬ã¸ã¹ã¿ã復帰 */
|
---|
| 609 | lw s0, 2*4(sp)
|
---|
| 610 | lw s1, 3*4(sp)
|
---|
| 611 | lw s2, 4*4(sp)
|
---|
| 612 | lw s3, 5*4(sp)
|
---|
| 613 | lw s4, 6*4(sp)
|
---|
| 614 | lw s5, 7*4(sp)
|
---|
| 615 | lw s6, 8*4(sp)
|
---|
| 616 | lw s7, 9*4(sp)
|
---|
| 617 | lw gp, 10*4(sp)
|
---|
| 618 | lw fp, 11*4(sp)
|
---|
| 619 | lw ra, 12*4(sp)
|
---|
| 620 | addi sp, sp, 13*4
|
---|
| 621 |
|
---|
| 622 | /* ã¿ã¹ã¯ä¾å¤å¦çè¦æ±ã®ãã§ã㯠*/
|
---|
| 623 | lb t2, TCB_enatex(t1)
|
---|
| 624 | andi t4, t2, TCB_enatex_mask /* t4 = runtsk->enatex */
|
---|
| 625 | beq t4, zero, dispatch_r_1 /* ã¿ã¹ã¯ä¾å¤å¦çç¦æ¢ã®æãã¸ã£ã³ã */
|
---|
| 626 | nop
|
---|
| 627 |
|
---|
| 628 | lw t5, TCB_texptn(t1) /* t5 = runtsk->texptn */
|
---|
| 629 | beq t5, zero, dispatch_r_1 /* ã¿ã¹ã¯ä¾å¤è¦æ±ãç¡ãæãã¸ã£ã³ã */
|
---|
| 630 | nop
|
---|
| 631 |
|
---|
| 632 | j call_texrtn /* ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³(ã¿ã¼ã²ããé
|
---|
| 633 | ä¾åé¨å®ç¾©)ã®å¼ã³åºã */
|
---|
| 634 | nop
|
---|
| 635 | /* call_texrtn()(task.c)ã§ã¯ãå®éã®ã¿ã¹ã¯ä¾å¤å¦çã«ã¼ãã³å¼ã³
|
---|
| 636 | åºãåå¾ã§ãunlock_cpuãlock_cpuå¦çãè¡ã£ã¦ããã®ã§ãç¶æ
|
---|
| 637 | ã¯
|
---|
| 638 | ä¿æãããã */
|
---|
| 639 |
|
---|
| 640 | dispatch_r_1:
|
---|
| 641 | jr ra /* dispatch å¼ã³åºãå
|
---|
| 642 | ã¸æ»ã */
|
---|
| 643 | nop
|
---|
| 644 |
|
---|
| 645 | /*
|
---|
| 646 | * ã¿ã¹ã¯èµ·åå¦ç
|
---|
| 647 | * ã»ãã£ã¹ãããã£å¦çã«ããã¦ãt1 = runtsk ã¨ãªã£ã¦ãããã¨ã«æ³¨æ
|
---|
| 648 | * ã»ã¹ã¿ãã¯ãã¤ã³ã¿ãè¨å®æ¸ã¿
|
---|
| 649 | */
|
---|
| 650 |
|
---|
| 651 | .globl activate_r
|
---|
| 652 |
|
---|
| 653 | activate_r:
|
---|
| 654 | /* ããã«æ¥ãã¨ãã¯ãCPUããã¯ã«ãªã£ã¦ããï¼IEããã = 0) */
|
---|
| 655 |
|
---|
| 656 | /* å²ãè¾¼ã¿è¨±å¯ã®æºå */
|
---|
| 657 | mfc0 t0, Status
|
---|
| 658 | ori t0, t0, SR_ERL_EXL_IE /* xorã使ãããã1度ãããã»ãããã */
|
---|
| 659 | xori t0, t0, SR_ERL_EXL /* ERL, EXLããããã¯ãªã¢
|
---|
| 660 | (IEãããã¯æ®ã) */
|
---|
| 661 |
|
---|
| 662 | /* ã¿ã¹ã¯é¢ä¿ã®è¨å®æºå */
|
---|
| 663 | /* t1 = runtsk (ãã£ã¹ãããã£ã§è¨å®) */
|
---|
| 664 | lw t2, TCB_tinib(t1) /* t2 = runtsk->tinib */
|
---|
| 665 |
|
---|
| 666 | /* ã¿ã¹ã¯èµ·åçªå°ã®è¨å® */
|
---|
| 667 | lw t3, TINIB_task(t2) /* t3 = runtsk->tinib->task */
|
---|
| 668 |
|
---|
| 669 | /* ã¿ã¹ã¯ã¸ã®å¼æ°ï¼æ¡å¼µæ
|
---|
| 670 | å ±ï¼è¨å® */
|
---|
| 671 | lw a0, TINIB_exinf(t2) /* a0 = runtsk->tinib->exinf */
|
---|
| 672 |
|
---|
| 673 | mtc0 t0, Status /* unlock_cpu ç¸å½ (å²è¾¼ã¿è¨±å¯) */
|
---|
| 674 |
|
---|
| 675 | la ra, ext_tsk /* ã¿ã¹ã¯ããã®æ»ãçªå°ãè¨å® */
|
---|
| 676 |
|
---|
| 677 | j t3 /* ã¿ã¹ã¯èµ·å */
|
---|
| 678 | nop
|
---|