source: atk2-sc3-1.4.0-ntisr/arch/v850_gcc/prc_support.S@ 172

Last change on this file since 172 was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

File size: 82.3 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2012-2016 by Center for Embedded Computing Systems
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2012-2013 by FUJI SOFT INCORPORATED, JAPAN
9 * Copyright (C) 2012-2013 by FUJITSU VLSI LIMITED, JAPAN
10 * Copyright (C) 2012-2013 by NEC Communication Systems, Ltd., JAPAN
11 * Copyright (C) 2012-2013 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12 * Copyright (C) 2012-2013 by Renesas Electronics Corporation, JAPAN
13 * Copyright (C) 2012-2013 by Sunny Giken Inc., JAPAN
14 * Copyright (C) 2012-2013 by TOSHIBA CORPORATION, JAPAN
15 * Copyright (C) 2012-2013 by Witz Corporation, JAPAN
16 * Copyright (C) 2013 by Embedded and Real-Time Systems Laboratory
17 * Graduate School of Information Science, Nagoya Univ., JAPAN
18 *
19 * 上記著作権者
20は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
21 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
22 * 変・再é…
23å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
24 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
25 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
26 * スコード中に含まれていること.
27 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
28 * 用できる形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
30å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
31 * 者
32マニュアルなど)に,上記の著作権表示,この利用条件および下記
33 * の無保証規定を掲載すること.
34 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
35 * 用できない形で再é…
36å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
37 * と.
38 * (a) 再é…
39å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
40マニュアルなど)に,上記の著
41 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
42 * (b) 再é…
43å¸ƒã®å½¢æ…
44‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
45 * 報告すること.
46 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
47 * 害からも,上記著作権者
48およびTOPPERSプロジェクトをå…
49è²¬ã™ã‚‹ã“と.
50 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
51 * 由に基づく請求からも,上記著作権者
52およびTOPPERSプロジェクトを
53 * å…
54è²¬ã™ã‚‹ã“と.
55 *
56 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
57 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
58 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
59 * 用する者
60に対して,AUTOSARパートナーになることを求めている.
61 *
62 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
63お
64 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
65 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
66 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
67 * の責任を負わない.
68 *
69 * $Id: prc_support.S 189 2015-06-26 01:54:57Z t_ishikawa $
70 */
71
72/*
73 * ターゲット依存情
74報の定義
75 */
76#include <v850asm.inc>
77#include "offset.h"
78#include "Os_Cfg_asm.inc"
79
80#ifdef USE_ASMCONFIG_INC
81#include "asm_config.inc"
82#endif /* USE_ASMCONFIG_INC */
83
84#ifdef __v850e2v3__
85
86/*
87 * V850E2用の割込みコントローラ操作ルーチン
88 */
89.macro GET_ISPR reg
90 mov ISPR_H, AMARG(reg)
91 ld.h 0[AMARG(reg)],AMARG(reg)
92.endm
93
94.macro CLEAR_ISPR reg1, reg2
95 mov ISPC_H,AMARG(reg1)
96 mov 0xffff,AMARG(reg2)
97 st.h AMARG(reg2),0[AMARG(reg1)]
98 mov ISPR_H, AMARG(reg1)
99 st.h r0,0[AMARG(reg1)]
100.endm
101
102.macro SET_PMR reg_val, reg_tmp
103 mov PMR, AMARG(reg_tmp)
104 st.h AMARG(reg_val), 0[AMARG(reg_tmp)] /* set interrupt level */
105 syncm
106.endm
107
108#endif /* __v850e2v3__ */
109
110#ifdef __v850e3v5__
111
112/*
113 * V850E3V5用の割込みコントローラ操作ルーチン
114 */
115.macro GET_ISPR reg
116 stsr 10, AMARG(reg), 2
117.endm
118
119.macro SET_ISPR val, reg
120 movea AMARG(val),r0,AMARG(reg)
121 ldsr AMARG(reg), 10, 2
122 syncp
123.endm
124
125.macro SET_INTCFG val, reg
126 movea AMARG(val),r0,AMARG(reg)
127 ldsr AMARG(reg), 13, 2
128 syncp
129.endm
130
131.macro CLEAR_ISPR reg1, reg2
132 SET_INTCFG 1, AMARG(reg1) /* ISPR を書き換え可能に */
133 SET_ISPR 0, AMARG(reg1) /* ISPR のクリア */
134 SET_INTCFG 0, AMARG(reg1) /* ISPR を書き換え禁止に(自動更新に) */
135.endm
136
137.macro GET_PMR reg
138 stsr 11, AMARG(reg), 2
139.endm
140
141.macro SET_PMR reg_val, reg_tmp
142 stsr psw, AMARG(reg_tmp)
143 di
144 ldsr AMARG(reg_val), 11, 2
145 ldsr AMARG(reg_tmp), psw
146 syncp
147.endm
148
149.macro GET_ICSR reg
150 stsr sr12, AMARG(reg), 2
151.endm
152
153.macro SET_ICSR val, reg
154 movea AMARG(val),r0,AMARG(reg)
155 ldsr \reg, sr12, 2
156.endm
157
158#endif /* !__v850e3v5__ */
159
160
161/*
162 * OS割込み禁止マクロ
163 * ネストの一番外側で呼び出されることを想定している
164 */
165.macro OUTER_LOCK_OS_INT reg12, reg13
166
167 /* pmr_isr2_mask -> PMR */
168 Lea _pmr_isr2_mask, AMARG(reg13)
169 ld.h 0[AMARG(reg13)], AMARG(reg13)
170 SET_PMR AMARG(reg13), AMARG(reg12)
171
172 /* nested_lock_os_int_cnt = 1 */
173 Lea _nested_lock_os_int_cnt, AMARG(reg12)
174 mov 1, AMARG(reg13)
175 st.b AMARG(reg13), 0[AMARG(reg12)]
176
177.endm
178
179/*
180 * OS割込み禁止解除マクロ
181 * ネストの一番外側で呼び出されることを想定している
182 */
183.macro OUTER_UNLOCK_OS_INT reg12, reg13
184
185 /* nested_lock_os_int_cnt = 0 */
186 Lea _nested_lock_os_int_cnt, AMARG(reg12)
187 mov r0, AMARG(reg13)
188 st.b AMARG(reg13), 0[AMARG(reg12)]
189
190 /* pmr_setting_tbl[current_iintpri] -> PMR */
191 Lea _current_iintpri, AMARG(reg12)
192 ld.bu 0[AMARG(reg12)], AMARG(reg12)
193 shl 1, AMARG(reg12)
194
195 Lea _pmr_setting_tbl, AMARG(reg13)
196 add AMARG(reg12), AMARG(reg13)
197 ld.h 0[AMARG(reg13)], AMARG(reg13)
198 SET_PMR AMARG(reg13), AMARG(reg12) /* set interrupt level */
199
200.endm
201
202/* =begin modified for SC3 */
203/*
204 * OS割込み禁止マクロ
205 * ネストあり
206 */
207.macro NESTED_LOCK_OS_INT reg12, reg13
208 .macrolocal increment_nest_lock
209
210 /* nested_lock_os_int_cnt == 0 ? */
211 Lea _nested_lock_os_int_cnt, AMARG(reg13)
212 ld.b 0[AMARG(reg13)], AMARG(reg12)
213 cmp r0, AMARG(reg12)
214 bne increment_nest_lock
215
216 /* pmr_isr2_mask -> PMR */
217 Lea _pmr_isr2_mask, AMARG(reg13)
218 ld.h 0[AMARG(reg13)], AMARG(reg13)
219 SET_PMR AMARG(reg13), AMARG(reg12) /* set interrupt level */
220 Lea _nested_lock_os_int_cnt, AMARG(reg13)
221 mov r0, AMARG(reg12) /* nested_lock_os_int_cnt = 0 */
222
223FLABEL(increment_nest_lock)
224 /* nested_lock_os_int_cnt += 1 */
225 add 1, AMARG(reg12)
226 st.b AMARG(reg12), 0[AMARG(reg13)]
227
228.endm
229
230/*
231 * OS割込み禁止解除マクロ
232 * ネストあり
233 */
234.macro NESTED_UNLOCK_OS_INT reg12, reg13
235 .macrolocal nested_unlock_exit
236
237 /* nested_lock_os_int_cnt -= 1 */
238 Lea _nested_lock_os_int_cnt, AMARG(reg12)
239 ld.b 0[AMARG(reg12)], AMARG(reg13)
240 add -1, AMARG(reg13)
241 st.b AMARG(reg13), 0[AMARG(reg12)]
242 cmp r0, AMARG(reg13)
243 bne nested_unlock_exit
244
245 /* pmr_setting_tbl[current_iintpri] -> PMR */
246 Lea _current_iintpri, AMARG(reg12)
247 ld.bu 0[AMARG(reg12)], AMARG(reg12)
248 shl 1, AMARG(reg12)
249
250 Lea _pmr_setting_tbl, AMARG(reg13)
251 add AMARG(reg12), AMARG(reg13)
252 ld.h 0[AMARG(reg13)], AMARG(reg13)
253 SET_PMR AMARG(reg13), AMARG(reg12) /* set interrupt level */
254
255FLABEL(nested_unlock_exit)
256.endm
257
258.macro CHANGE_OS_STK reg12
259 .macrolocal change_ostk
260
261 Lea _saved_ostkpt, AMARG(reg12)
262 ld.w 0[AMARG(reg12)], AMARG(reg12)
263 cmp r0, AMARG(reg12)
264 bne change_ostk
265 Lea __ostkpt, AMARG(reg12)
266 ld.w 0[AMARG(reg12)], AMARG(reg12)
267FLABEL(change_ostk)
268 add -4, AMARG(reg12)
269 st.w sp, 0[AMARG(reg12)] /* スタックポインタの保存 */
270 mov AMARG(reg12), sp /* スタックポインタの切り替え */
271.endm
272
273
274/* =end modified for SC3 */
275
276 /*
277 * 割込み/例外のå…
278ˆé ­ã§å®Ÿè¡Œã™ã‚‹å‡¦ç†
279 */
280.macro PRE_INT_EXC
281#ifdef _RH850G3M_
282 /* 一部中断型例外ハンドラでのみ必
283要だが一律実行する */
284 syncp
285#endif /* _RH850G3M_ */
286.endm
287
288 /*
289 * 割込み例外å…
290¥ã‚Šå£ã§ã®ãƒ¬ã‚¸ã‚¹ã‚¿ã®ä¿å­˜ãƒžã‚¯ãƒ­
291 */
292.macro INT_EXC_SAVEREG workreg
293#ifndef TOPPERS_USE_PUSHSP
294#ifdef TOPPERS_USE_HFLOAT
295 addi -88 , sp , sp
296#else /* !TOPPERS_USE_HFLOAT */
297 addi -84 , sp , sp
298#endif /* TOPPERS_USE_HFLOAT */
299 st.w r30, 12[sp] /* r30(ep) */
300 /*
301 * 割込み発生前のr2はeiwrに保存されている
302 * ここで,r2はすでにワークレジスタとして
303 * 使用中であるため,上書きしない
304 * r2にå…
305¥ã£ã¦ã„る割込み番号を破壊しないように
306 */
307 stsr AMARG(workreg), r30 /* r2->r30に復帰 */
308 st.w r30, 76[sp]
309 mov sp, ep
310 sst.w r1, 80[ep]
311 sst.w r5, 72[ep]
312 sst.w r6, 68[ep]
313 sst.w r7, 64[ep]
314 sst.w r8, 60[ep]
315 sst.w r9, 56[ep]
316 sst.w r10, 52[ep]
317 sst.w r11, 48[ep]
318 sst.w r12, 44[ep]
319 sst.w r13, 40[ep]
320 sst.w r14, 36[ep]
321 sst.w r15, 32[ep]
322 sst.w r16, 28[ep]
323 sst.w r17, 24[ep]
324 sst.w r18, 20[ep]
325 sst.w r19, 16[ep]
326 sst.w r31, 8[ep]
327#ifdef TOPPERS_USE_HFLOAT
328 stsr fpsr, r19 /* load FPSR */
329 sst.w r19, 84[ep]
330#endif /* TOPPERS_USE_HFLOAT */
331
332#else /* TOPPERS_USE_PUSHSP */
333 pushsp r1-r1
334 /*
335 * 割込み発生前のr2はeiwrに保存されている
336 * ここで,r2はすでにワークレジスタとして
337 * 使用中であるため,上書きしない
338 * r2にå…
339¥ã£ã¦ã„る割込み番号を破壊しないように
340 */
341 stsr AMARG(workreg), r1 /* r2->r1に復帰 */
342 pushsp r1-r1
343#ifdef TOPPERS_USE_HFLOAT
344 stsr fpsr, r1 /* load FPSR */
345 pushsp r1-r1
346#endif /* TOPPERS_USE_HFLOAT */
347#ifndef NTC2ISR
348 pushsp r5-r19
349 pushsp r30-r31
350#else /* NTC2ISR */
351 pushsp r5-r31
352#endif /* NTC2ISR */
353 addi -8, sp , sp
354 mov sp, ep
355#endif /* TOPPERS_USE_PUSHSP */
356.endm
357
358 /*
359 * 割込み例外å…
360¥ã‚Šå£ã§ã®ãƒ¬ã‚¸ã‚¹ã‚¿ã®å¾©å¸°ãƒžã‚¯ãƒ­
361 */
362.macro INT_EXC_RESTOREREG workreg
363#ifndef TOPPERS_USE_PUSHSP
364#ifdef TOPPERS_USE_HFLOAT
365 sld.w 84[ep], r19
366 ldsr r19, fpsr /* store FPSR */
367#endif /* TOPPERS_USE_HFLOAT */
368 sld.w 80[ep], r1
369 sld.w 76[ep], r2
370 sld.w 72[ep], r5
371 sld.w 68[ep], r6
372 sld.w 64[ep], r7
373 sld.w 60[ep], r8
374 sld.w 56[ep], r9
375 sld.w 52[ep], r10
376 sld.w 48[ep], r11
377 sld.w 44[ep], r12
378 sld.w 40[ep], r13
379 sld.w 36[ep], r14
380 sld.w 32[ep], r15
381 sld.w 28[ep], r16
382 sld.w 24[ep], r17
383 sld.w 20[ep], r18
384 sld.w 16[ep], r19
385 sld.w 8[ep], r31
386#ifdef TOPPERS_USE_HFLOAT
387 addi 88, ep, sp
388#else /* !TOPPERS_USE_HFLOAT */
389 addi 84, ep, sp
390#endif /* TOPPERS_USE_HFLOAT */
391 sld.w 12[ep], r30 /* r30(ep) */
392 ldsr r2, AMARG(workreg) /* r2を退避 */
393
394#else /* TOPPERS_USE_PUSHSP */
395 addi 8, sp , sp
396#ifndef NTC2ISR
397 popsp r30-r31
398 popsp r5-r19
399#else /* NTC2ISR */
400 popsp r5-r31
401#endif /* NTC2ISR */
402#ifdef TOPPERS_USE_HFLOAT
403 popsp r1-r1
404 ldsr r1, fpsr /* store FPSR */
405#endif /* TOPPERS_USE_HFLOAT */
406 /*
407 * 割込み発生前のr2はeiwrに復帰
408 */
409 popsp r1-r1
410 ldsr r1, AMARG(workreg) /* r2->eiwrに復帰 */
411 popsp r1-r1
412#endif /* TOPPERS_USE_PUSHSP */
413.endm
414
415
416#ifdef __v850e3v5__
417 /*
418 * V850E3V5用ベクタ
419 * ここにRBASEが設定されることを想定(ここが電源投å…
420¥æ™‚の開始アドレス)
421 * (EIレベル割込みはテーブル参ç…
422§æ–¹å¼ã‚’使用するため本ベクタは使用しない)
423 */
424 .section .reset.text
425 .global __reset
426__reset:
427 jr __start
428 .rept 6
429 nop
430 .endr
431__syserr: /* 0x0010 */
432 jr _fe_exception_entry_cpu
433 .rept 6
434 nop
435 .endr
436__hvtrap: /* 0x0020 */
437 jr _fe_exception_entry_cpu
438 .rept 6
439 nop
440 .endr
441__fetrap: /* 0x0030 */
442 jr _fe_exception_entry_cpu
443 .rept 6
444 nop
445 .endr
446__trap0: /* 0x0040 */
447 jr _ei_exception_entry
448 .rept 6
449 nop
450 .endr
451__trap1: /* 0x0050 */
452 jr _ei_exception_entry
453 .rept 6
454 nop
455 .endr
456__rie: /* 0x0060 */
457 jr _ei_exception_entry
458 .rept 6
459 nop
460 .endr
461__fppfpi: /* 0x0070 */
462 jr _ei_exception_entry
463 .rept 6
464 nop
465 .endr
466__ucpop: /* 0x080 */
467 jr _fe_exception_entry_cpu
468 .rept 6
469 nop
470 .endr
471__mip: /* 0x0090 */
472 jr _fe_exception_entry_memory
473 .rept 6
474 nop
475 .endr
476__pie: /* 0x00a0 */
477 jr _fe_exception_entry_cpu
478 .rept 6
479 nop
480 .endr
481__debug: /* 0x00b0 */
482 jr __debug
483 .rept 6
484 nop
485 .endr
486__mae: /* 0x00c0 */
487 jr _fe_exception_entry_cpu
488 .rept 6
489 nop
490 .endr
491__rfu: /* 0x00d0 */
492 jr __rfu
493 .rept 6
494 nop
495 .endr
496__fenmi: /* 0x00e0 */
497 jr _fe_exception_entry_cpu
498 .rept 6
499 nop
500 .endr
501__feint: /* 0x00f0 */
502 jr _fe_exception_entry_cpu
503 .rept 6
504 nop
505 .endr
506__eiintn0: /*(優å…
507ˆåº¦0) 0x0100 */
508 jr _default_int_handler
509 .rept 6
510 nop
511 .endr
512__eiintn1: /*(優å…
513ˆåº¦1) 0x0110 */
514 jr _default_int_handler
515 .rept 6
516 nop
517 .endr
518__eiintn2: /*(優å…
519ˆåº¦2) 0x0120 */
520 jr _default_int_handler
521 .rept 6
522 nop
523 .endr
524__eiintn3: /*(優å…
525ˆåº¦3) 0x0130 */
526 jr _default_int_handler
527 .rept 6
528 nop
529 .endr
530__eiintn4: /*(優å…
531ˆåº¦4) 0x0140 */
532 jr _default_int_handler
533 .rept 6
534 nop
535 .endr
536__eiintn5: /*(優å…
537ˆåº¦5) 0x0150 */
538 jr _default_int_handler
539 .rept 6
540 nop
541 .endr
542__eiintn6: /*(優å…
543ˆåº¦6) 0x0160 */
544 jr _default_int_handler
545 .rept 6
546 nop
547 .endr
548__eiintn7: /*(優å…
549ˆåº¦7) 0x0170 */
550 jr _default_int_handler
551 .rept 6
552 nop
553 .endr
554__eiintn8: /*(優å…
555ˆåº¦8) 0x0180 */
556 jr _default_int_handler
557 .rept 6
558 nop
559 .endr
560__eiintn9: /*(優å…
561ˆåº¦9) 0x0190 */
562 jr _default_int_handler
563 .rept 6
564 nop
565 .endr
566__eiintn10: /*(優å…
567ˆåº¦10) 0x01a0 */
568 jr _default_int_handler
569 .rept 6
570 nop
571 .endr
572__eiintn11: /*(優å…
573ˆåº¦11) 0x01b0 */
574 jr _default_int_handler
575 .rept 6
576 nop
577 .endr
578__eiintn12: /*(優å…
579ˆåº¦12) 0x01c0 */
580 jr _default_int_handler
581 .rept 6
582 nop
583 .endr
584__eiintn13: /*(優å…
585ˆåº¦13) 0x01d0 */
586 jr _default_int_handler
587 .rept 6
588 nop
589 .endr
590__eiintn14: /*(優å…
591ˆåº¦14) 0x01e0 */
592 jr _default_int_handler
593 .rept 6
594 nop
595 .endr
596__eiintn15: /*(優å…
597ˆåº¦15) 0x01f0 */
598 jr _default_int_handler
599 .rept 6
600 nop
601 .endr
602
603#endif /* __v850e3v5__ */
604
605.macro FE_EXCEPTION_ENTRY
606 .macrolocal _fe_exception_macro
607 .macrolocal fe_exception_utask
608 /* 割込み/例外のå…
609ˆé ­ã§å®Ÿè¡Œã™ã‚‹å‡¦ç† */
610 PRE_INT_EXC
611
612 ldsr r2, fewr /* エラーコードを保存 */
613 stsr fepsw, r2
614 shl PSW_SV, r2 /* r2 << PSW_SV により例外発生時のモード取得 */
615 mov r0, r2
616 bnc _fe_exception_macro /* 特権からの例外ならばスキップ */
617#ifdef NTC2ISR
618 /*
619 * NTC2ISRへの割込み
620 */
621 Lea _p_runisr, r2
622 ld.w 0[r2], r2
623 cmp r0, r2 /* p_runisrがあり,ユーザモードならば非信頼ISR */
624 be fe_exception_utask
625 st.w sp, ISRCB_usp[r2] /* uspを保存 */
626 ld.w ISRCB_p_isrinib[r2], r2
627 ld.w ISRINIB_sstk_bottom[r2], sp /* sspを復帰 */
628 ori 0x1000, r0, r2 /* r2 = 0x1000 */
629 br _fe_exception_macro
630FLABEL(fe_exception_utask)
631#endif /* NTC2ISR */
632 /*
633 * ユーザタスクからの例外
634 */
635 Lea _p_runtsk, r2
636 ld.w 0[r2], r2
637 st.w sp, TCB_usp[r2] /* uspをTCBに保存 */
638 ld.w TCB_p_tinib[r2], r2
639 ld.w TINIB_sstk_bottom[r2], sp /* sspを復帰 */
640 ori 0x1000, r0, r2 /* r2 = 0x1000 */
641FLABEL(_fe_exception_macro)
642.endm
643
644
645 .section .text_kernel
646 /*
647 * 例外エントリ(feretでリターンする例外用)
648 * ここで,CY = FEPSW.IMP,r2 = error code
649 * r2は例外エントリでスタックに保存済み
650 * r2の最上位ビットに,例外å…
651ƒã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãŒç‰¹æ¨©ã‹ã©ã†ã‹ã‚’保存する
652 */
653 .global _fe_exception_entry_cpu
654FLABEL(_fe_exception_entry_cpu)
655 FE_EXCEPTION_ENTRY
656 ori E_OS_PROTECTION_EXCEPTION, r2, r2
657 br fe_exception_0
658
659 .global _fe_exception_entry
660FLABEL(_fe_exception_entry_memory)
661 FE_EXCEPTION_ENTRY
662 ori E_OS_PROTECTION_MEMORY, r2, r2
663
664FLABEL(fe_exception_0)
665 /* スクラッチレジスタを保存 */
666 INT_EXC_SAVEREG fewr
667
668 /* 多重割込みのため,現在のFEPCとFEPSWを保存 */
669 stsr fepc, r6
670 sst.w r6, 4[ep]
671 stsr fepsw, r6
672 sst.w r6, 0[ep]
673
674 /*
675 * プロテクションフックはOS処理レベルで実行するためOS割込み禁止状æ…
676‹ã«ã™ã‚‹
677 * OS割込み禁止状æ…
678‹ã§ä¾‹å¤–が発生する可能性があるため,ネスト管理を行う.
679 * 例外は次の条件で発生する
680 * ・ISR1実行状æ…
681‹ã§ç™ºç”Ÿã—た場合
682 * ・ISR1実行状æ…
683‹ä»¥å¤–で発生した場合
684 * ・OS割込み解除状æ…
685‹ã§ç™ºç”Ÿã—た場合
686 * ・OS割込み禁止状æ…
687‹ã§ç™ºç”Ÿã—た場合
688 */
689
690 /*
691 * カテゴリ1の割込み以外で例外が発生したかの判断する
692 * カテゴリ1で例外が発生:fe_exception_1へジャンプ
693 */
694 GET_ISPR r6
695 Lea _pmr_isr1_mask, r7
696 ld.h 0[r7], r7
697 and r7, r6
698 cmp r0, r6
699 bne fe_exception_1
700
701 /*
702 * ISR1実行状æ…
703‹ä»¥å¤–で発生した場合
704 */
705 Lea _nested_lock_os_int_cnt, r12
706 ld.b 0[r12], r13
707 mov 1, r14
708 add r14, r13
709 st.b r13, 0[r12]
710 cmp 1, r13
711 bne fe_exception_1
712
713 /*
714 * OS割込み解除状æ…
715‹ã§ç™ºç”Ÿã—た場合
716 * OS割込み禁止状æ…
717‹ã¨ã™ã‚‹
718 */
719 Lea _pmr_isr2_mask, r7
720 ld.h 0[r7], r7
721 SET_PMR r7, r6 /* pmr_isr2_mask -> PMR */
722
723FLABEL(fe_exception_1)
724 /*
725 * 割込み発生時に変更されるので割込み解除前に取得
726 */
727 stsr feic, r19 /* 例外要因 */
728 stsr fepc, r18 /* 例外発生PC */
729
730 /*
731 * C1ISRを受け付けるため,NPbit クリア
732 */
733 stsr psw, r12
734 mov ~0x0080, r13
735 and r12, r13
736 ldsr r13, psw
737
738FLABEL(fe_exception_2)
739 /*
740 * カーネル起動していない場合に起きたCPU例外は,無限ループへ
741 */
742 Lea _kerflg, r12 /* kerflgがFALSEなら無限ループ */
743 ld.b 0[r12], r12
744 cmp r0, r12
745FLABEL(infinity_loop_fe)
746 be infinity_loop_fe
747
748 /*
749 * 多重割込みか判定
750 */
751 Lea _hook_nest_cnt, r12
752 ld.w 0[r12], r13
753 mov 1, r14 /* 割込み・例外のネスト回数のインクリメント */
754 add r14, r13
755 st.w r13, 0[r12]
756
757 mov sp, r9 /* sp をr9に退避 */
758
759 cmp 1, r13
760 bne fe_exception_3 /* _nested_lock_os_int_cnt > 1 -> fe_exception_3 */
761
762 /*
763 * C1ISR実行状æ…
764‹ã§ç™ºç”Ÿã—た場合はスタックポインタのå…
765¥ã‚Œæ›¿ãˆã—ない
766 */
767 GET_ISPR r6
768 Lea _pmr_isr1_mask, r7
769 ld.h 0[r7], r7
770 and r7, r6
771 cmp r0, r6
772 bne fe_exception_3
773
774 /* スタックポインタの保存とå…
775¥ã‚Œæ›¿ãˆ */
776 CHANGE_OS_STK r12
777
778FLABEL(fe_exception_3)
779 /* FEPSW.ID == 1の場合はå…
780¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
781‹ãªã®ã§è§£é™¤ã—ない */
782 stsr fepsw, r12
783 mov 0x20, r13
784 tst r12, r13
785 bne fe_exception_4
786 UNLOCK_ALL_INT
787
788FLABEL(fe_exception_4)
789#ifdef CFG_USE_PROTECTIONHOOK
790 /* v850_cpu_exp_*を退避するスペースを確保 */
791 addi -12, sp, sp
792
793 /* v850_cpu_exp_spの退避と設定 */
794 Lea _v850_cpu_exp_sp, r12
795 st.w r9, 0[r12]
796 st.w ep, 0[sp]
797 mov sp, ep
798
799 /* v850_cpu_exp_noの退避と設定 */
800 Lea _v850_cpu_exp_no, r12
801 ld.w 0[r12], r13
802 sst.w r13, 8[ep]
803 st.w r19, 0[r12] /* r19 例外要因 */
804
805 /* v850_cpu_exp_pcの退避と設定 */
806 Lea _v850_cpu_exp_pc, r12
807 ld.w 0[r12], r13
808 sst.w r13, 4[ep]
809 mov r18, r17 /* r18:fepc */
810 add -4, r17
811 st.w r17, 0[r12]
812
813#endif /* CFG_USE_PROTECTIONHOOK */
814
815 /*
816 * CPU例外が発生した場合,OSはE_OS_PROTECTION_EXCEPTIONをパラメータとして
817 * プロテクションフックを呼び出す
818 */
819 /* =begin modified for SC3 */
820 andi 0xefff, r2, r6 /* エラーコードを第1引数に(r6=r2 & ~0x1000) */
821 shr 12, r2 /* 例外の発生å…
822ƒãŒãƒ¦ãƒ¼ã‚¶ãƒ¢ãƒ¼ãƒ‰ãªã‚‰r2=1 */
823 xori 0x0001, r2, r2 /* r2 = r2==1? 0: 1 */
824 Lea _pre_protection_supervised, r12
825 st.b r2, 0[r12]
826 /* =end modified for SC3 */
827 jarl _call_protectionhk_main, r31
828
829#ifdef CFG_USE_PROTECTIONHOOK
830 mov sp, ep
831
832 /* v850_cpu_exp_noを復帰 */
833 Lea _v850_cpu_exp_no, r12
834 sld.w 8[ep], r13
835 st.w r13, 0[r12]
836
837 /* v850_cpu_exp_pcを復帰 */
838 Lea _v850_cpu_exp_pc, r12
839 sld.w 4[ep], r13
840 st.w r13, 0[r12]
841
842 /* v850_cpu_exp_sp退避 */
843 Lea _v850_cpu_exp_sp, r12
844 sld.w 0[ep], r13
845 st.w r13, 0[r12]
846
847 /* v850_cpu_exp_*を退避したスペースを戻す */
848 addi 12, sp, sp
849#endif /* CFG_USE_PROTECTIONHOOK */
850
851FLABEL(fe_ret_exc)
852 LOCK_ALL_INT
853
854 /*
855 * プロテクションフックはOS割込み禁止状æ…
856‹ã§å®Ÿè¡Œã™ã‚‹
857 */
858
859 /*
860 * 割込み・例外のネスト回数のデクリメント
861 */
862 Lea _hook_nest_cnt, r12
863 ld.w 0[r12], r13
864 mov -1, r14
865 add r14, r13
866 st.w r13, 0[r12]
867
868 /*
869 * OS割込み禁止状æ…
870‹ã®è§£é™¤
871 */
872 /*
873 * ISR1実行状æ…
874‹ã§ç™ºç”Ÿã—た場合は
875 * (1)スタックポインタのå…
876¥ã‚Œæ›¿ãˆã‚’しない
877 * (2)OS割込み禁止状æ…
878‹ã®è§£é™¤ã‚’しない
879 */
880 GET_ISPR r6
881 Lea _pmr_isr1_mask, r7
882 ld.h 0[r7], r7
883 and r7, r6
884 cmp r0, r6
885 bne ret_exc_2
886
887 /*
888 * ネスト回数が1以上なら割込みå…
889ƒãŒISRなため例外発生å…
890ƒã¸å¾©å¸°
891 * スタックポインタのå…
892¥ã‚Œæ›¿ãˆã—ない
893 */
894 cmp r0, r13
895 bne ret_exc_1
896
897 /*
898 * 戻りå…
899ˆãŒã‚¿ã‚¹ã‚¯ãªãŸã‚ã‚¹ã‚¿ãƒƒã‚¯ã‚’戻す
900 */
901 ld.w 0[sp], sp
902
903FLABEL(ret_exc_1)
904 /*
905 * ISR1実行状æ…
906‹ä»¥å¤–で発生した場合,OS割込み禁止状æ…
907‹ã®è§£é™¤
908 */
909 Lea _nested_lock_os_int_cnt, r12
910 ld.b 0[r12], r13
911 mov -1, r14
912 add r14, r13
913 st.b r13, 0[r12]
914 cmp r0, r13
915 bne ret_exc_2
916
917 /* OS割込みを解除 */
918 /* pmr_setting_tbl[current_iintpri] -> PMR */
919 Lea _current_iintpri, r12
920 ld.bu 0[r12], r12
921 shl 1, r12
922
923 Lea _pmr_setting_tbl, r13
924 add r12, r13
925 ld.h 0[r13], r13
926 SET_PMR r13, r12 /* set interrupt level */
927
928 /*
929 * 例外発生å…
930ƒã¸å¾©å¸°
931 */
932FLABEL(ret_exc_2)
933 /*
934 * レジスタを復帰
935 */
936 mov sp, ep
937 sld.w 4[ep], r10
938 ldsr r10, fepc
939 sld.w 0[ep], r10
940 ldsr r10, fepsw
941
942 /* スクラッチレジスタの復帰 */
943 INT_EXC_RESTOREREG fewr
944
945 stsr fepsw, r2 /* r2 = fepsw */
946 shl PSW_SV, r2 /* r2 << PSW_SV により例外発生時のモード取得 */
947 bnc return_from_fe_exception /* 特権からの例外ならばスキップ */
948#ifdef NTC2ISR
949 /*
950 * NTC2ISRへの割込み
951 */
952 Lea _p_runisr, r2
953 ld.w 0[r2], r2
954 cmp r0, r2 /* p_runisrがあり,ユーザモードならば非信頼ISR */
955 be fe_exception_to_utask
956 ld.w ISRCB_usp[r2], sp /* uspを復帰 */
957 br return_from_fe_exception
958#endif /* NTC2ISR */
959FLABEL(fe_exception_to_utask)
960 Lea _p_runtsk, r2
961 ld.w 0[r2], r2
962 ld.w TCB_usp[r2], sp /* uspを復帰 */
963FLABEL(return_from_fe_exception)
964 stsr fewr, r2
965 feret
966
967 /*
968 * 例外エントリ(eiretでリターンする例外用)
969 * ここで,CY = EIPSW.IMP,r2 = error code
970 * r2はOS側で予約する(割込み・例外の出å…
971¥å£ã®
972 * ワークレジスタとして使用する)ため,
973 * スタックに保存しない
974 */
975 .global _ei_exception_entry
976FLABEL(_ei_exception_entry)
977 /* 割込み/例外のå…
978ˆé ­ã§å®Ÿè¡Œã™ã‚‹å‡¦ç† */
979 PRE_INT_EXC
980
981 stsr eipsw, r2
982 shl PSW_SV, r2 /* r2 << PSW_SV により例外発生時のモード取得 */
983 mov r0, r2 /* mov命令ではステータスレジスタは変化しない */
984 bnc ei_exception_0 /* 特権からの例外ならばスキップ */
985#ifdef NTC2ISR
986 /*
987 * NTC2ISRへの割込み
988 */
989 Lea _p_runisr, r2
990 ld.w 0[r2], r2
991 cmp r0, r2 /* p_runisrがあり,ユーザモードならば非信頼ISR */
992 be ei_exception_utask
993 st.w sp, ISRCB_usp[r2] /* uspを保存 */
994 ld.w ISRCB_p_isrinib[r2], r2
995 ld.w ISRINIB_sstk_bottom[r2], sp /* sspを復帰 */
996 ori 0x1000, r0, r2 /* r2 = 0x1000 */
997 br ei_exception_0
998FLABEL(ei_exception_utask)
999#endif /* NTC2ISR */
1000 /*
1001 * ユーザタスクからの例外
1002 */
1003 Lea _p_runtsk, r2
1004 ld.w 0[r2], r2
1005 st.w sp, TCB_usp[r2] /* uspを保存 */
1006 ld.w TCB_p_tinib[r2], r2
1007 ld.w TINIB_sstk_bottom[r2], sp /* sspを復帰 */
1008 ori 0x1000, r0, r2 /* r2 = 0x1000 */
1009FLABEL(ei_exception_0)
1010 /*
1011 * EI例外による要因はE_OS_PROTECTION_EXCEPTIONのみである
1012 */
1013 ori E_OS_PROTECTION_EXCEPTION, r2, r2 /* r2 |= E_OS_PROTECTION_EXCEPTION */
1014
1015 /* スクラッチレジスタの保存 */
1016 INT_EXC_SAVEREG eiwr
1017
1018 /* 多重割込みのため,現在のEIPCとEIPSWを保存 */
1019 stsr eipc, r6
1020 sst.w r6, 4[ep]
1021 stsr eipsw, r6
1022 sst.w r6, 0[ep]
1023
1024 /*
1025 * プロテクションフックはOS処理レベルで実行するためOS割込み禁止状æ…
1026‹ã«ã™ã‚‹
1027 * OS割込み禁止状æ…
1028‹ã§ä¾‹å¤–が発生する可能性があるため,ネスト管理を行う.
1029 * 例外は次の条件で発生する
1030 * ・ISR1実行状æ…
1031‹ã§ç™ºç”Ÿã—た場合
1032 * ・ISR1実行状æ…
1033‹ä»¥å¤–で発生した場合
1034 * ・OS割込み解除状æ…
1035‹ã§ç™ºç”Ÿã—た場合
1036 * ・OS割込み禁止状æ…
1037‹ã§ç™ºç”Ÿã—た場合
1038 */
1039
1040 /*
1041 * カテゴリ1の割り込み以外で例外が発生したかの判断する
1042 * カテゴリ1で例外が発生:ei_exception_1へジャンプ
1043 */
1044 GET_ISPR r6
1045 Lea _pmr_isr1_mask, r7
1046 ld.h 0[r7], r7
1047 and r7, r6
1048 cmp r0, r6
1049 bne ei_exception_1
1050
1051 /*
1052 * ISR1実行状æ…
1053‹ä»¥å¤–で発生した場合
1054 */
1055 Lea _nested_lock_os_int_cnt, r12
1056 ld.b 0[r12], r13
1057 mov 1, r14
1058 add r14, r13
1059 st.b r13, 0[r12]
1060 cmp 1, r13
1061 bne ei_exception_1
1062
1063 /*
1064 * OS割込み解除状æ…
1065‹ã§ç™ºç”Ÿã—た場合
1066 * OS割込み禁止状æ…
1067‹ã¨ã™ã‚‹
1068 */
1069 Lea _pmr_isr2_mask, r7
1070 ld.h 0[r7], r7
1071 SET_PMR r7, r6 /* pmr_isr2_mask -> PMR */
1072
1073FLABEL(ei_exception_1)
1074 /*
1075 * 割込み発生時に変更されるので割込み解除前に取得
1076 */
1077 stsr eiic, r19 /* 例外要因 */
1078 stsr eipc, r18 /* 例外発生PC */
1079
1080
1081FLABEL(ei_exception_2)
1082 /*
1083 * カーネル起動していない場合に起きたCPU例外は,無限ループへ
1084 */
1085 Lea _kerflg, r12 /* kerflgがFALSEなら無限ループ */
1086 ld.b 0[r12], r12
1087 cmp r0, r12
1088FLABEL(infinity_loop_ei)
1089 be infinity_loop_ei
1090
1091 /*
1092 * 多重割込みか判定
1093 */
1094 Lea _hook_nest_cnt, r12
1095 ld.w 0[r12], r13
1096 mov 1, r14 /* 割込み・例外のネスト回数のインクリメント */
1097 add r14, r13
1098 st.w r13, 0[r12]
1099
1100 mov sp, r9 /* sp をr9に退避 */
1101
1102 cmp 1, r13
1103 bne ei_exception_3 /* _nested_lock_os_int_cnt > 1 -> ei_exception_3 */
1104
1105 /*
1106 * ISR1実行状æ…
1107‹ã§ç™ºç”Ÿã—た場合はスタックポインタのå…
1108¥ã‚Œæ›¿ãˆã—ない
1109 */
1110 GET_ISPR r6
1111 Lea _pmr_isr1_mask, r7
1112 ld.h 0[r7], r7
1113 and r7, r6
1114 cmp r0, r6
1115 bne ei_exception_3
1116
1117 /* スタックポインタの保存とå…
1118¥ã‚Œæ›¿ãˆ */
1119 CHANGE_OS_STK r12
1120
1121FLABEL(ei_exception_3)
1122 /* EIPSW.ID == 1の場合はここにこないため,条件判定は不要 */
1123 UNLOCK_ALL_INT
1124
1125#ifdef CFG_USE_PROTECTIONHOOK
1126 /* v850_cpu_exp_*を退避するスペースを確保 */
1127 addi -12, sp, sp
1128
1129 /* v850_cpu_exp_spの退避と設定 */
1130 Lea _v850_cpu_exp_sp, r12
1131 st.w r9, 0[r12]
1132 st.w ep, 0[sp]
1133 mov sp, ep
1134
1135 /* v850_cpu_exp_noの退避と設定 */
1136 Lea _v850_cpu_exp_no, r12
1137 ld.w 0[r12], r13
1138 sst.w r13, 8[ep]
1139 st.w r19, 0[r12] /* r19 例外要因 */
1140
1141 /* v850_cpu_exp_pcの退避と設定 */
1142 Lea _v850_cpu_exp_pc, r12
1143 ld.w 0[r12], r13
1144 sst.w r13, 4[ep]
1145 mov r18, r17 /* r18:fepc */
1146 add -4, r17
1147 st.w r17, 0[r12]
1148
1149#endif /* CFG_USE_PROTECTIONHOOK */
1150
1151 /*
1152 * CPU例外が発生した場合,OSはE_OS_PROTECTION_EXCEPTIONをパラメータとして
1153 * プロテクションフックを呼び出す
1154 */
1155 /* =begin modified for SC3 */
1156 andi 0xefff, r2, r6 /* エラーコードを第1引数に(r6=r2 & ~0x1000) */
1157 shr 12, r2 /* 例外の発生å…
1158ƒãŒç‰¹æ¨©ãƒ¢ãƒ¼ãƒ‰ãªã‚‰r2=1 */
1159 xori 0x0001, r2, r2 /* r2 = r2==1? 0: 1 */
1160 Lea _pre_protection_supervised, r12
1161 st.b r2, 0[r12]
1162 /* =end modified for SC3 */
1163 jarl _call_protectionhk_main, r31
1164
1165#ifdef CFG_USE_PROTECTIONHOOK
1166 mov sp, ep
1167
1168 /* v850_cpu_exp_noを復帰 */
1169 Lea _v850_cpu_exp_no, r12
1170 sld.w 8[ep], r13
1171 st.w r13, 0[r12]
1172
1173 /* v850_cpu_exp_pcを復帰 */
1174 Lea _v850_cpu_exp_pc, r12
1175 sld.w 4[ep], r13
1176 st.w r13, 0[r12]
1177
1178 /* v850_cpu_exp_sp退避 */
1179 Lea _v850_cpu_exp_sp, r12
1180 sld.w 0[ep], r13
1181 st.w r13, 0[r12]
1182
1183 /* v850_cpu_exp_*を退避したスペースを戻す */
1184 addi 12, sp, sp
1185#endif /* CFG_USE_PROTECTIONHOOK */
1186
1187FLABEL(ei_ret_exc)
1188 LOCK_ALL_INT
1189
1190 /*
1191 * プロテクションフックはOS割込み禁止状æ…
1192‹ã§å®Ÿè¡Œã™ã‚‹
1193 */
1194
1195 /*
1196 * 割込み・例外のネスト回数のデクリメント
1197 */
1198 Lea _hook_nest_cnt, r12
1199 ld.w 0[r12], r13
1200 mov -1, r14
1201 add r14, r13
1202 st.w r13, 0[r12]
1203
1204 /*
1205 * OS割込み禁止状æ…
1206‹ã®è§£é™¤
1207 */
1208 /*
1209 * ISR1実行状æ…
1210‹ã§ç™ºç”Ÿã—た場合は
1211 * (1)スタックポインタのå…
1212¥ã‚Œæ›¿ãˆã‚’しない
1213 * (2)OS割込み禁止状æ…
1214‹ã®è§£é™¤ã‚’しない
1215 */
1216 GET_ISPR r6
1217 Lea _pmr_isr1_mask, r7
1218 ld.h 0[r7], r7
1219 and r7, r6
1220 cmp r0, r6
1221 bne ei_ret_exc_2
1222
1223 /*
1224 * ネスト回数が1以上なら割込みå…
1225ƒãŒISRなため例外発生å…
1226ƒã¸å¾©å¸°
1227 * スタックポインタのå…
1228¥ã‚Œæ›¿ãˆã—ない
1229 */
1230 cmp r0, r13
1231 bne ei_ret_exc_1
1232
1233 /*
1234 * 戻りå…
1235ˆãŒã‚¿ã‚¹ã‚¯ãªãŸã‚ã‚¹ã‚¿ãƒƒã‚¯ã‚’戻す
1236 */
1237 ld.w 0[sp], sp
1238
1239FLABEL(ei_ret_exc_1)
1240 /*
1241 * ISR1実行状æ…
1242‹ä»¥å¤–で発生した場合,OS割込み禁止状æ…
1243‹ã®è§£é™¤
1244 */
1245 Lea _nested_lock_os_int_cnt, r12
1246 ld.b 0[r12], r13
1247 mov -1, r14
1248 add r14, r13
1249 st.b r13, 0[r12]
1250 cmp r0, r13
1251 bne ei_ret_exc_2
1252
1253 /* OS割込みを解除 */
1254 /* pmr_setting_tbl[current_iintpri] -> PMR */
1255 Lea _current_iintpri, r12
1256 ld.bu 0[r12], r12
1257 shl 1, r12
1258
1259 Lea _pmr_setting_tbl, r13
1260 add r12, r13
1261 ld.h 0[r13], r13
1262 SET_PMR r13, r12 /* set interrupt level */
1263
1264 /*
1265 * 例外発生å…
1266ƒã¸å¾©å¸°
1267 */
1268FLABEL(ei_ret_exc_2)
1269 /*
1270 * レジスタを復帰
1271 */
1272 mov sp, ep
1273 sld.w 4[ep], r10
1274 ldsr r10, eipc
1275 sld.w 0[ep], r10
1276 ldsr r10, eipsw
1277
1278 /* スクラッチレジスタの復帰 */
1279 INT_EXC_RESTOREREG eiwr
1280
1281 stsr eipsw, r2 /* r2 = eipsw */
1282 shl PSW_SV, r2 /* r2 << PSW_SV により例外発生時のモード取得 */
1283 bnc return_from_ei_exception /* 特権からの例外ならばスキップ */
1284#ifdef NTC2ISR
1285 /*
1286 * NTC2ISRへの割込み
1287 */
1288 Lea _p_runisr, r2
1289 ld.w 0[r2], r2
1290 cmp r0, r2 /* p_runisrがあり,ユーザモードならば非信頼ISR */
1291 be ei_exception_to_utask
1292 ld.w ISRCB_usp[r2], sp /* uspを復帰 */
1293 br return_from_ei_exception
1294#endif /* NTC2ISR */
1295FLABEL(ei_exception_to_utask)
1296 Lea _p_runtsk, r2
1297 ld.w 0[r2], r2
1298 ld.w TCB_usp[r2], sp /* uspを復帰 */
1299FLABEL(return_from_ei_exception)
1300 stsr eiwr, r2
1301 eiret
1302
1303 /*
1304 * カーネル起動していない場合に起きたCPU例外の無限ループ
1305 */
1306FLABEL(infinity_loop)
1307 br infinity_loop
1308
1309 /*
1310 * 割り込みエントリ
1311 * V850E2
1312 * ベクターテーブルから Os_Lcfg.c に生成される各割込みの割込みエントリ
1313 * からジャンプし,r2に割込み番号が保存された状æ…
1314‹ã§å®Ÿè¡Œã•ã‚Œã‚‹
1315 * V850E3V5
1316 * ベクターテーブルから直接実行されるため,スタックの確保やレジスタの保存は
1317 * 特に行われていない状æ…
1318‹ã§å®Ÿè¡Œã•ã‚Œã‚‹
1319 */
1320 .global _interrupt
1321FLABEL(_interrupt)
1322 /* 割込み/例外のå…
1323ˆé ­ã§å®Ÿè¡Œã™ã‚‹å‡¦ç† */
1324 PRE_INT_EXC
1325
1326#ifdef __v850e3v5__
1327 ldsr r2, eiwr
1328#endif /* __v850e3v5__ */
1329 /*
1330 * 残りのレジスタ退避, EPでのアクセスに切り替えて行う
1331 * ここで,CY = EIPSW.IMP,r2[31:16] = intno
1332 * r2はOS側で予約する(割込み・例外の出å…
1333¥å£ã®
1334 * ワークレジスタとして使用する)ため,
1335 * スタックに保存しない
1336 */
1337 stsr eipsw, r2
1338 shl PSW_SV, r2 /* r2 << PSW_SV により例外発生時のモード取得 */
1339 bnc interrupt_0 /* 特権からの割込みならばスキップ */
1340#ifdef NTC2ISR
1341 /*
1342 * NTC2ISRへの割込み
1343 */
1344 Lea _p_runisr, r2
1345 ld.w 0[r2], r2
1346 cmp r0, r2 /* p_runisrがあり,ユーザモードならば非信頼ISR */
1347 be interrupt_utask
1348 st.w sp, ISRCB_usp[r2] /* uspを保存 */
1349 ld.w ISRCB_p_isrinib[r2], r2
1350 ld.w ISRINIB_sstk_bottom[r2], sp /* sspを復帰 */
1351 br interrupt_0
1352FLABEL(interrupt_utask)
1353#endif /* NTC2ISR */
1354 /*
1355 * ユーザタスクへの割込み
1356 */
1357 Lea _p_runtsk, r2
1358 ld.w 0[r2], r2
1359 st.w sp, TCB_usp[r2] /* uspを保存 */
1360 ld.w TCB_p_tinib[r2], r2
1361 ld.w TINIB_sstk_bottom[r2], sp /* sspを復帰 */
1362FLABEL(interrupt_0)
1363#ifdef __v850e3v5__
1364 /* 割込み要因の特定 */
1365 stsr eiic, r2
1366 /* EIC割込みは0x1000 から */
1367 addi -0x1000, r2, r2
1368#endif /* __v850e3v5__ */
1369
1370 /* スクラッチレジスタの保存 */
1371 INT_EXC_SAVEREG eiwr
1372
1373 /* 多重割込みのため,現在のEIPCとEIPSWを保存 */
1374 stsr eipc, r6
1375 sst.w r6, 4[ep]
1376 stsr eipsw, r6
1377 sst.w r6, 0[ep]
1378
1379 mov r2, r12
1380
1381 /* 割込み優å…
1382ˆåº¦ã‚’取得(r11) */
1383 GET_ISPR r13
1384 sch1r r13, r11
1385 add -1,r11
1386
1387 /*
1388 * _current_iintpri の更新
1389 * 割り込み処理中はISPRが自動的に設定されているため,PMRは設定する必
1390要がない.
1391 */
1392 Lea _current_iintpri, r6
1393 ld.bu 0[r6], r19
1394 st.b r11,0[r6]
1395
1396#ifndef NTC2ISR
1397 /*
1398 * 多重割込みか判定
1399 */
1400 Lea _except_nest_cnt, r13
1401 ld.w 0[r13], r6
1402
1403 /*
1404 * 割込み・例外のネスト回数のインクリメント
1405 */
1406 add 1, r6
1407 st.w r6, 0[r13]
1408 cmp 1, r6
1409 bne interrupt_1 /* ネストしている場合はスタック切替無し */
1410
1411 /*
1412 * タスクに割込んだ場合
1413 * スタックポインタの保存とå…
1414¥ã‚Œæ›¿ãˆ
1415 */
1416 mov sp , r13
1417 Lea __ostkpt, sp
1418 ld.w 0[r3], r3
1419 add -4, sp
1420 st.w r13, 0[sp]
1421
1422FLABEL(interrupt_1)
1423#endif /* NTC2ISR */
1424 /*
1425 * 割込み発生時の割込み優å…
1426ˆåº¦ãƒžã‚¹ã‚¯ã‚’スタックに保存
1427 */
1428 add -4, sp
1429 st.w r19, 0[sp]
1430
1431#ifndef NTC2ISR
1432 UNLOCK_ALL_INT
1433#endif /* NTC2ISR */
1434
1435/* スタックモニタリングはとりあえず無視 */
1436#ifdef CFG_USE_STACKMONITORING
1437 /*
1438 * 割込み番号の保存
1439 * スタックオーバフローのプロテクションフックで破壊される可能性がある
1440 */
1441 push r12
1442 /*
1443 * タスクスタックのオーバフローチェック
1444 */
1445
1446 /*
1447 * 多重割込みの場合はタスクスタックのスタックモニタリングを行わない
1448 */
1449 cmp 1, r6
1450 bne int_nested
1451
1452 /*
1453 * スタックポインタチェック方式
1454 */
1455 Lea _p_runtsk, r6 /* 管理ブロックのå…
1456ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹å–å¾— */
1457 ld.w 0[r6], r6
1458 ld.w TCB_p_tinib[r6], r6 /* タスク初期化ブロックå…
1459ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹å–å¾— */
1460 /* =begin modified for SC3 */
1461 /* システムスタックモニタリング */
1462 ld.w TINIB_sstksz[r6], r7 /* タスクシステムスタックサイズ取得 */
1463 ld.w TINIB_sstk_bottom[r6], r6 /* タスクシステムスタック終端アドレス取得 */
1464 sub r7, r6
1465 mov r0, r9
1466 cmp r6, r13 /* スタックポインタ <= スタックのå…
1467ˆé ­ã®å ´åˆNG */
1468 Lea stack_monitoring_exit, lp
1469 /* =end modified for SC3 */
1470 bnh stack_monitoring_error_isr
1471
1472 /*
1473 * マジックナンバーチェック方式
1474 */
1475 ld.w 0[r6], r6
1476 mov STACK_MAGIC_NUMBER, r7
1477 /*
1478 * マジックナンバー未破壊なら,割込み処理に飛ぶ
1479 * タスクに割込んだ場合,割込みスタックをチェックしない
1480 */
1481 cmp r7, r6
1482 be stack_monitoring_exit
1483 /* =begin modified for SC3 */
1484 Lea stack_monitoring_exit, lp
1485 /* =end modified for SC3 */
1486 br stack_monitoring_error_isr
1487
1488 /*
1489 * 多重割込みの場合
1490 */
1491FLABEL(int_nested)
1492 /*
1493 * 割込みスタックのオーバフローチェック
1494 */
1495
1496 /*
1497 * スタック残量チェック方式
1498 */
1499 Lea _isr_p_isrcb_tbl, r7
1500 mov r12, r11
1501 shl 2, r11 /* 割込み番号を4倍してオフセットを生成 */
1502 add r11, r7
1503 ld.w 0[r7], r7 /* r7 = &isrcb_table[x] */
1504 /* =begin modified for SC3 */
1505 ld.w ISRCB_p_isrinib[r7], r7
1506 ld.w ISRINIB_p_intinib[r7], r7
1507 mov 1, r9
1508 /* =end modified for SC3 */
1509 ld.w INTINIB_remain_stksz[r7], r7 /* 割込み番号に対応したスタックサイズの取得 */
1510 Lea __ostk, r6 /* 割込みスタックのå…
1511ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹å–å¾— */
1512 ld.w 0[r6], r6
1513 add r6, r7 /* å…
1514ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼‹ISRの使用するスタックサイズ */
1515 cmp r7, sp /* スタックポインタ <= å…
1516ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼‹ISRの使用するスタックサイズの場合OK */
1517 /* =begin modified for SC3 */
1518 Lea stack_monitoring_exit, lp
1519 /* =end modified for SC3 */
1520 bnh stack_monitoring_error_isr
1521
1522 /*
1523 * マジックナンバーチェック方式
1524 */
1525 ld.w 0[r6], r6 /* このアドレスの示すå…
1526ˆã«ãƒžã‚¸ãƒƒã‚¯ãƒŠãƒ³ãƒãƒ¼ãŒå…
1527¥ã£ã¦ã„ã‚‹ */
1528 mov STACK_MAGIC_NUMBER, r7
1529 cmp r7, r6
1530 /* =begin modified for SC3 */
1531 Lea stack_monitoring_exit, lp
1532 /* =end modified for SC3 */
1533 bne stack_monitoring_error_isr
1534
1535FLABEL(stack_monitoring_exit)
1536 pop r12
1537#endif /* CFG_USE_STACKMONITORING */
1538
1539 /*
1540 * _callevel_stat 保存
1541 */
1542 Lea _callevel_stat, r6
1543 ld.h 0[r6], r7
1544 Push r7
1545
1546 /*
1547 * _callevel_stat 設定
1548 */
1549 mov TCL_ISR2, r8
1550 or r8, r7
1551 st.h r7, 0[r6]
1552
1553 /* =begin added for SC3 */
1554#ifndef NTC2ISR
1555 /*
1556 * run_trusted 保存
1557 */
1558 Lea _run_trusted, r6
1559 ld.b 0[r6], r7
1560 Push r7
1561
1562 /*
1563 * run_trusted 設定
1564 */
1565 mov TRUE, r8
1566 st.b r8, 0[r6]
1567#endif /* NTC2ISR */
1568
1569 /*
1570 * p_runosap 保存
1571 */
1572 Lea _p_runosap, r6
1573 ld.w 0[r6], r7
1574 Push r7
1575 /* =end added for SC3 */
1576
1577#ifndef NTC2ISR
1578 /*
1579 * p_runisr 保存
1580 */
1581 Lea _p_runisr, r6
1582 ld.w 0[r6], r7
1583 Push r7
1584#endif /* NTC2ISR */
1585
1586#ifdef NTC2ISR
1587 /* コンテキスト保存(スタック)はここまで */
1588isr_dispatch_entry:
1589 Lea _p_runisr, r6
1590 ld.w 0[r6], r7
1591 cmp r0, r7
1592 be isr_dispatch_task
1593 /* C2ISRに割り込んだ場合 */
1594 st.w sp, ISRCB_ssp[r7]
1595 /* queue_insert_next(&isr_ready_queue, p_runisr) */
1596 /*
1597 * r6 = &isr_ready_queue
1598 * r7 = p_runisr
1599 * r8 = &isr_ready_queue->p_next
1600 */
1601 Lea _isr_ready_queue, r6
1602 ld.w QUEUE_next[r6], r8
1603 st.w r8, ISRCB_next[r7] /* p_runisr->p_next = &isr_ready_queue->p_next */
1604 st.w r6, ISRCB_prev[r7] /* p_runisr->p_prev = &isr_ready_queue */
1605 st.w r7, QUEUE_prev[r8] /* &isr_ready_queue->p_next->p_prev = p_runisr */
1606 st.w r7, QUEUE_next[r6] /* &isr_ready_queue->p_next = p_runisr */
1607 br isr_dispatch2
1608isr_dispatch_task:
1609 Lea _p_runtsk, r6
1610 ld.w 0[r6], r7
1611 cmp r0, r7
1612 be isr_dispatch_idle
1613 /* TASKに割り込んだ場合 */
1614 st.w sp, TCB_ssp[r7]
1615 br isr_dispatch2
1616isr_dispatch_idle:
1617 /* IDLEに割り込んだ場合 */
1618 Lea _saved_ostkpt, r6
1619 ld.w 0[r6], r7
1620 Push r7
1621 st.w sp, 0[r6]
1622isr_dispatch2:
1623#endif /* NTC2ISR */
1624 /*
1625 * p_runisr 設定
1626 */
1627 Lea _isr_p_isrcb_tbl, r7
1628 shl 2, r12 /* 割込み番号を4倍してオフセットを生成 */
1629 add r12, r7
1630 Lea _p_runisr, r8
1631 ld.w 0[r7], r7
1632 st.w r7, 0[r8]
1633
1634 /*
1635 * 割込みハンドラのアドレスを読み込む
1636 */
1637 Lea _isr_tbl, r6
1638 add r12, r6
1639
1640 /* =begin modified for SC3 */
1641 /*
1642 * p_runosap 設定
1643 */
1644 cmp r7, r0 /* r7 = p_runisr == NULL ? */
1645 be int_handler_call /* p_runisr が NULL でなければスキップ */
1646 ld.w ISRCB_p_isrinib[r7], r7 /* ep = p_runisr->p_isrinib */
1647 ld.w ISRINIB_p_osapcb[r7], r26 /* r8 = p_runisr->p_isrinib->p_osapcb */
1648 Lea _p_runosap, ep
1649 sst.w r26, 0[ep] /* p_runosap = p_runisr->p_isrinib->p_osapcb */
1650#ifdef NTC2ISR
1651 ld.w OSAPCB_p_osapinib[r26], r29 /* ep = p_runisr->p_isrinib */
1652 ld.w OSAPINIB_osap_trusted[r29], r8 /* r8 = p_runisr->p_isrinib->p_osapcb */
1653 Lea _run_trusted, ep
1654 sst.b r8, 0[ep] /* run_trusted = trusted? */
1655 cmp r0, r8 /* 信頼ならばスキップ */
1656 bne int_handler_call
1657
1658 /* 非信頼ISR本体へ */
1659 /*
1660 * ユーザスタック領域
1661 */
1662 ld.w ISRINIB_start_ustk[r7], r27 /* å…
1663ˆé ­ç•ªåœ° */
1664 ld.w ISRINIB_limit_ustk[r7], r28 /* 保護属性とサイズ */
1665 ldsr r27, 0, 6 /* MPLA0 */
1666 ldsr r28, 1, 6 /* MPUA0 */
1667
1668 /*
1669 * 実行ドメインと保護ドメイン(MPUの設定)が同じならば,
1670 * ドメイン毎のコード領域・データ領域をMPUに設定し直す必
1671要はない
1672 */
1673 Lea _p_ctxosap, ep /* ep = &p_ctxosap */
1674 sld.w 0[ep], r27 /* r27 = p_ctxosap */
1675 cmp r27, r26 /* p_ctxosap == p_runosap ? */
1676 be nt_int_handler_call /* 同じならdispatcher_5へ */
1677 nop
1678 sst.w r26, 0[ep] /* p_ctxosap = p_runosap : 保護ドメインを切替え */
1679
1680 /*
1681 * reg1: p_osapinib
1682 * reg2: tmp1
1683 * reg3: tmp2
1684 * reg4: tmp3
1685 * reg5: tmp4
1686 * reg6: tmp5
1687 */
1688 DISPATCHER_MPU_SETTING r29, r24, r25, r26, r27, r28
1689FLABEL(nt_int_handler_call)
1690 ld.w ISRINIB_ustk_bottom[r7], sp /* r20 = ユーザスタックポインタの初期値 */
1691 /*
1692 * タスクが不正終了した場合は保護処理を行うよう
1693 * 戻りアドレスにexit_utaskを設定
1694 */
1695 Lea _exit_uisr, lp /* lp = _exit_utask */
1696 stsr psw, r10
1697 /* NPビットを立てて,ISPRが更新されないようにする */
1698 ori 0x60, r10, r11
1699 ldsr r11, psw
1700
1701 /*
1702 * 非特権モードで動作するよう準備
1703 * 保護機能有効(非信頼へ),割込み許可
1704 * PP,NPV,DMP,IMP = 1, ID = 0
1705 */
1706 movhi 0x4001, r0, r7
1707 ldsr r7, eipsw /* eipsw = psw */
1708 ld.w 0[r6], r6
1709 ldsr r6, eipc /* EIPC = pc */
1710 eiret
1711 /* =end modified for SC3 */
1712
1713#endif /* NTC2ISR */
1714
1715FLABEL(int_handler_call)
1716 /* =end modified for SC3 */
1717 /*
1718 * 割込みハンドラ呼び出し
1719 */
1720#ifdef NTC2ISR
1721 UNLOCK_ALL_INT
1722
1723 ld.w ISRINIB_sstk_bottom[r7], sp /* r20 = ユーザスタックポインタの初期値 */
1724#endif /* NTC2ISR */
1725 Lea end_int_handler, r31
1726 ld.w 0[r6], r6
1727 jmp [r6]
1728
1729 .globl _exit_and_dispatch_isr
1730 /*
1731 * スタックオーバフロー時の処理
1732 */
1733#ifdef CFG_USE_STACKMONITORING
1734 /*
1735 * スタックオーバフロー時プロテクションフックを呼び出し
1736 * スタックを更に壊さないため,割込みスタックの初期値を使用する
1737 * ISRの出å…
1738¥å£ã‹ã‚‰ç›¸å¯¾ã‚¸ãƒ£ãƒ³ãƒ—できるようにここに置く
1739 * stack_monitoring_errorへの踏み台
1740 */
1741FLABEL(stack_monitoring_error_isr)
1742 br stack_monitoring_error
1743#endif /* CFG_USE_STACKMONITORING */
1744
1745FLABEL(end_nt_int_handler)
1746 stsr eipsw, r12 /* eipsw = psw */
1747 movhi 0x0001, r0, r11
1748 ori 0xffff, r11, r11
1749 and r12, r11
1750 ldsr r11, eipsw /* eipsw = psw */
1751 Lea end_int_handler, r11
1752 ldsr r11, eipc
1753 eiret /* syscall状æ…
1754‹ã‚’解除 */
1755FLABEL(end_int_handler)
1756
1757#ifdef CFG_USE_STACKMONITORING
1758 /*
1759 * 割込みスタックのオーバフローチェック
1760 * 割込みから戻った時,スタックポインタも戻ったはずなので,
1761 * マジックナンバーチェック方式のみ実施
1762 */
1763
1764 /*
1765 * マジックナンバーチェック方式
1766 */
1767 Lea __ostk, r6 /* 割込みスタックのå…
1768ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹å–å¾— */
1769 ld.w 0[r6], r6
1770 ld.w 0[r6], r6 /* このアドレスの示すå…
1771ˆã«ãƒžã‚¸ãƒƒã‚¯ãƒŠãƒ³ãƒãƒ¼ãŒå…
1772¥ã£ã¦ã„ã‚‹ */
1773 /* =begin modified for SC3 */
1774 mov 1, r9
1775 mov STACK_MAGIC_NUMBER, r7
1776 cmp r7, r6
1777 Lea stack_monitoring_exit2, lp
1778 bne stack_monitoring_error_isr
1779
1780FLABEL(stack_monitoring_exit2)
1781 /* =end modified for SC3 */
1782#endif /* CFG_USE_STACKMONITORING */
1783
1784 /*
1785 * ISR2の不正終了チェック
1786 */
1787 jarl _exit_isr2, r31
1788
1789#ifdef NTC2ISR
1790FLABEL(_exit_and_dispatch_isr)
1791FLABEL(isr_dispatcher)
1792 LOCK_ALL_INT
1793
1794 Lea _isr_ready_queue, r6
1795 ld.w QUEUE_next[r6], r8
1796 cmp r6, r8 /* queue_empty(&isr_ready_queue)? */
1797 be isr_dispatch_to_task
1798 Lea _p_runisr, r7
1799 st.w r8, 0[r7]
1800 /* queue_delete_next(&isr_ready_queue) */
1801 /*
1802 * r6 = &isr_ready_queue
1803 * r8 = &isr_ready_queue->p_next = p_entry
1804 */
1805 ld.w ISRCB_next[r8], r7 /* r7 = p_entry->p_next */
1806 st.w r7, QUEUE_next[r6] /* &isr_ready_queue->p_next = r7 */
1807 st.w r6, ISRCB_prev[r7] /* p_entry->p_next->p_prev = &isr_ready_queue */
1808
1809 ld.w ISRCB_ssp[r8], sp
1810 ld.w ISRCB_p_isrinib[r8], r7
1811 ld.w ISRINIB_start_ustk[r7], r27 /* å…
1812ˆé ­ç•ªåœ° */
1813 ld.w ISRINIB_limit_ustk[r7], r28 /* 保護属性とサイズ */
1814 br isr_dispatch_r
1815isr_dispatch_to_task:
1816 Lea _p_runisr, r6
1817 st.w r0, 0[r6]
1818 Lea _p_runtsk, r6
1819 ld.w 0[r6], r7
1820 cmp r0, r7
1821 be isr_dispatch_to_idle
1822 /* TASKに割り込んだ場合 */
1823 ld.w TCB_ssp[r7], sp
1824 ld.w TCB_p_tinib[r7], r7
1825 ld.w TINIB_start_ustk[r7], r27 /* å…
1826ˆé ­ç•ªåœ° */
1827 ld.w TINIB_limit_ustk[r7], r28 /* 保護属性とサイズ */
1828 br isr_dispatch_r
1829isr_dispatch_to_idle:
1830 Lea _saved_ostkpt, r6
1831 ld.w 0[r6], sp
1832 Pop r7
1833 st.w r7, 0[r6]
1834FLABEL(isr_dispatch_r)
1835 /* コンテキスト復帰(スタック)はここから */
1836#endif /* NTC2ISR */
1837
1838#ifndef NTC2ISR
1839 /*
1840 * p_runisr の復帰
1841 */
1842 Lea _p_runisr, r7
1843 Pop r6
1844 st.w r6, 0[r7]
1845#endif /* NTC2ISR */
1846
1847 /* =begin modified for SC3 */
1848 /*
1849 * p_runosap 復帰
1850 */
1851 Lea _p_runosap, r7
1852 Pop r6
1853 st.w r6, 0[r7]
1854
1855#ifdef NTC2ISR
1856 ld.w OSAPCB_p_osapinib[r6], r29 /* ep = p_runisr->p_isrinib */
1857 ld.w OSAPINIB_osap_trusted[r29], r8 /* r8 = p_runisr->p_isrinib->p_osapcb */
1858 Lea _run_trusted, ep
1859 sst.b r8, 0[ep] /* run_trusted = trusted? */
1860 cmp r0, r8 /* 信頼ならばスキップ */
1861 bne isr_dispatch_r2
1862
1863 /*
1864 * ユーザスタック領域
1865 */
1866 ldsr r27, 0, 6 /* MPLA0 */
1867 ldsr r28, 1, 6 /* MPUA0 */
1868
1869 /*
1870 * 実行ドメインと保護ドメイン(MPUの設定)が同じならば,
1871 * ドメイン毎のコード領域・データ領域をMPUに設定し直す必
1872要はない
1873 */
1874 Lea _p_ctxosap, ep /* ep = &p_ctxosap */
1875 sld.w 0[ep], r27 /* r27 = p_ctxosap */
1876 cmp r27, r6 /* p_ctxosap == p_runosap ? */
1877 be isr_dispatch_r2 /* 同じならdispatcher_5へ */
1878 nop
1879 sst.w r6, 0[ep] /* p_ctxosap = p_runosap : 保護ドメインを切替え */
1880
1881 /*
1882 * reg1: p_osapinib
1883 * reg2: tmp1
1884 * reg3: tmp2
1885 * reg4: tmp3
1886 * reg5: tmp4
1887 * reg6: tmp5
1888 */
1889 DISPATCHER_MPU_SETTING r29, r24, r25, r26, r27, r28
1890FLABEL(isr_dispatch_r2)
1891#endif /* NTC2ISR */
1892
1893#ifndef NTC2ISR
1894 /*
1895 * run_trusted 復帰
1896 */
1897 Lea _run_trusted, r7
1898 Pop r6
1899 st.b r6, 0[r7]
1900#endif /* NTC2ISR */
1901 /* =end modified for SC3 */
1902
1903
1904 /*
1905 * _callevel_stat の復帰
1906 */
1907 Lea _callevel_stat, r7
1908 Pop r6
1909 st.h r6, 0[r7]
1910
1911/*
1912 * 割込みハンドラ出口処理
1913 */
1914FLABEL(ret_int)
1915 /*
1916 * _except_nest_cntの操作とスタック切り替えの間はOS割込み禁止にする
1917 * 必
1918要がある
1919 * このå…
1920ˆï¼Œå‰²è¾¼ã¿å…
1921ˆã¸ã®ãƒªã‚¿ãƒ¼ãƒ³ã‹ï¼Œé…
1922延ディスパッチに分岐する.
1923 * 割込みå…
1924ˆã¸ã®ãƒªã‚¿ãƒ¼ãƒ³ã«ã¯å…
1925¨å‰²è¾¼ã¿ãŒå¿…
1926要であり,遅
1927延ディスパッチ時には
1928 * ネスト管理のOS割込み禁止にする必
1929要があるため,ここでは一旦å…
1930¨å‰²è¾¼ã¿ç¦
1931 * 止とする
1932 */
1933
1934#ifndef NTC2ISR
1935 LOCK_ALL_INT
1936#endif /* NTC2ISR */
1937
1938 /*
1939 * 割込み発生時の割込み優å…
1940ˆåº¦ãƒžã‚¹ã‚¯ã‚’スタックから復帰
1941 */
1942 ld.w 0[sp], r19
1943 add 4, sp
1944 Lea _current_iintpri, r6
1945 st.b r19, 0[r6] /* current_iintpriを復帰 */
1946
1947#ifndef NTC2ISR
1948 /*
1949 * 割込み・例外のネスト回数のデクリメント
1950 */
1951 Lea _except_nest_cnt, r6
1952 ld.w 0[r6], r7
1953 add -1, r7
1954 st.w r7, 0[r6]
1955
1956 /*
1957 * ネスト回数が0なら,割込みå…
1958ƒãŒã‚¿ã‚¹ã‚¯
1959 */
1960 cmp r0, r7
1961 be ret_int_task
1962
1963 /*
1964 * ISR2割込みからのリターン時は割込みå…
1965ƒãŒ
1966 * ISR2であるためそのままリターン
1967 */
1968 br ret_int_1
1969
1970#else /* NTC2ISR */
1971 /*
1972 * ISRの強制終了に備え,割込み優å…
1973ˆåº¦ãƒžã‚¹ã‚¯ã‚’ISPRを一律クリアし,
1974 * PMRをセット
1975 */
1976 CLEAR_ISPR r10, r12
1977 OUTER_UNLOCK_OS_INT r10, r12
1978
1979 Lea _p_runisr, r7
1980 ld.w 0[r7], r7
1981 cmp r0, r7
1982 bne ret_int_1
1983
1984 Lea _p_runtsk, r7
1985 ld.w 0[r7], r7
1986 cmp r0, r7
1987 be ret_int_1
1988#endif /* NTC2ISR */
1989
1990 /*
1991 * 割込みå…
1992ƒãŒã‚¿ã‚¹ã‚¯ã®å ´åˆ
1993 */
1994FLABEL(ret_int_task)
1995#ifndef NTC2ISR
1996 ld.w 0[sp], sp /* スタックポインタを戻す */
1997#endif /* NTC2ISR */
1998
1999 /*
2000 * 割込み優å…
2001ˆåº¦ãƒžã‚¹ã‚¯ã‚’変えるAPIがないため,
2002 * ATK2では割込み優å…
2003ˆåº¦ãƒžã‚¹ã‚¯ã®å¾©å¸°å‡¦ç†ã¯ä¸è¦
2004 */
2005 /*
2006 * 割込みハンドラ実行時には,ISPRで優å…
2007ˆåº¦ãŒè‡ªå‹•çš„に上がるため,
2008 * PMRは変更していないが,割り込みハンドラ内
2009で x_nested_unlock_os_int() を
2010 * 呼び出すとPMRが書き換わる.ディスパッチが必
2011要でない場合は,ret_int_1で
2012 * PMRをå…
2013ƒã®å€¤ã«æˆ»ã™ï¼Žãƒ‡ã‚£ã‚¹ãƒ‘ッチが必
2014要な場合は,OS割り込み禁止とするため,
2015 * ここで,PMRを更新する必
2016要はない.
2017 */
2018
2019 /*
2020 * 戻りå…
2021ˆãŒã‚¿ã‚¹ã‚¯ã®å ´åˆï¼Œãƒ‡ã‚£ã‚¹ãƒ‘ッチの必
2022要があるかチェック
2023 */
2024 Lea _p_runtsk, r6
2025 ld.w 0[r6], r6
2026 Lea _p_schedtsk, r7
2027 ld.w 0[r7], r7
2028 cmp r6, r7
2029 be ret_int_1 /* ディスパッチの必
2030要がなければ割込みå…
2031ƒã¸æˆ»ã‚‹ */
2032
2033 /*
2034 * ここでは,戻りå…
2035ˆãŒã‚¿ã‚¹ã‚¯ã§ã‚り,スタックは,タスクスタックに
2036 * スクラッチレジスタのみが保存された状æ…
2037‹ã«ãªã£ã¦ã„る.また,
2038 * å…
2039¨å‰²è¾¼ã¿ã‚’禁止した状æ…
2040‹ã¨ãªã£ã¦ã„ã‚‹
2041 */
2042
2043#ifndef NTC2ISR
2044 /*
2045 * 優å…
2046ˆåº¦ãƒžã‚¹ã‚¯ã®ã‚¯ãƒªã‚¢
2047 * eiretを実行しないため,eiretによる割込みコントローラの優å…
2048ˆåº¦ãƒžã‚¹ã‚¯
2049 * (インサービスプライオリティ)のクリアが行われないため,代わりにISPC
2050 * を用いてクリアする.
2051 */
2052 CLEAR_ISPR r10, r12
2053#endif /* NTC2ISR */
2054
2055 /*
2056 * OS割込み禁止状æ…
2057‹ã«ç§»è¡Œã™ã‚‹
2058 *
2059 * この時点でOS割込み禁止状æ…
2060‹ã¨ã™ã‚‹ã®ã¯ï¼Œdispatcherを実行する際に
2061 * OS割込み禁止状æ…
2062‹ã«ãªã£ã¦ã„ã‚‹å¿…
2063要があるためである
2064 *
2065 * (モデル上の)割込み優å…
2066ˆåº¦ãƒžã‚¹ã‚¯ã¯0であるため,ISR1以外の割込みはå…
2067¨ã¦ç¦æ­¢ã™ã‚‹
2068 */
2069
2070 OUTER_LOCK_OS_INT r12, r13
2071 /* ret_int でå…
2072¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
2073‹ã¨ã—たため解除 */
2074 UNLOCK_ALL_INT
2075
2076 /*
2077 * コンテキストの退避
2078 */
2079#ifndef NTC2ISR
2080#ifndef TOPPERS_USE_PUSHSP
2081 addi -40, sp, sp
2082 mov sp, ep
2083 sst.w r20, 36[ep]
2084 sst.w r21, 32[ep]
2085 sst.w r22, 28[ep]
2086 sst.w r23, 24[ep]
2087 sst.w r24, 20[ep]
2088 sst.w r25, 16[ep]
2089 sst.w r26, 12[ep]
2090 sst.w r27, 8[ep]
2091 sst.w r28, 4[ep]
2092 sst.w r29, 0[ep]
2093#else /* TOPPERS_USE_PUSHSP */
2094 pushsp r20-r29
2095#endif /* TOPPERS_USE_PUSHSP */
2096#endif /* NTC2ISR */
2097
2098 /* スタックと次の起動番地を保存 */
2099 Lea _p_runtsk, ep
2100 sld.w 0[ep], ep
2101 /* =begin modified for SC3 */
2102 sst.w sp, TCB_ssp[ep]
2103 /* =end modified for SC3 */
2104 Lea ret_int_r, r6
2105 sst.w r6, TCB_pc[ep]
2106 br dispatcher
2107
2108 /*
2109 * 割込み・例外でコンテキスト保存した場合の復帰ルーチン
2110 */
2111FLABEL(ret_int_r)
2112 /*
2113 * コンテキストの復帰
2114 */
2115#ifndef NTC2ISR
2116#ifndef TOPPERS_USE_PUSHSP
2117 mov sp, ep
2118 sld.w 36[ep], r20
2119 sld.w 32[ep], r21
2120 sld.w 28[ep], r22
2121 sld.w 24[ep], r23
2122 sld.w 20[ep], r24
2123 sld.w 16[ep], r25
2124 sld.w 12[ep], r26
2125 sld.w 8[ep], r27
2126 sld.w 4[ep], r28
2127 sld.w 0[ep], r29
2128 addi 40, ep, sp
2129#else /* TOPPERS_USE_PUSHSP */
2130 popsp r20-r29
2131#endif /* TOPPERS_USE_PUSHSP */
2132#endif /* NTC2ISR */
2133
2134 LOCK_ALL_INT
2135
2136 OUTER_UNLOCK_OS_INT r12, r13
2137 /*
2138 * 割込みからの復帰ルーチン
2139 */
2140FLABEL(ret_int_1)
2141 /*
2142 * レジスタを復帰
2143 */
2144 mov sp, ep
2145#ifndef NTC2ISR
2146
2147 /*
2148 * 割込み優å…
2149ˆåº¦ãƒžã‚¹ã‚¯ã‚’変えるAPIがないため,
2150 * ATK2では割込み優å…
2151ˆåº¦ãƒžã‚¹ã‚¯ã®å¾©å¸°å‡¦ç†ã¯ä¸è¦
2152 */
2153 /*
2154 * PMRをå…
2155ƒã«æˆ»ã™ï¼Ž
2156 * 割込みハンドラ実行時には,ISPRで優å…
2157ˆåº¦ãŒè‡ªå‹•çš„に上がるため,
2158 * PMRは変更していないが,割り込みハンドラ内
2159で x_nested_unlock_os_int() を
2160 * 呼び出すとPMRが書き換わるためここでå…
2161ƒã®å€¤ã«æˆ»ã™ï¼Ž
2162 * OUTER_UNLOCK_OS_INT は nested_lock_os_int_cnt を0にするが,
2163 * ここでは既に0であるため問題ない.
2164 */
2165 OUTER_UNLOCK_OS_INT r1, r6
2166#endif /* NTC2ISR */
2167
2168 sld.w 4[ep], r10
2169 ldsr r10, eipc
2170 sld.w 0[ep], r10
2171 ldsr r10, eipsw
2172
2173 /* スクラッチレジスタを復帰 */
2174 INT_EXC_RESTOREREG eiwr
2175
2176 stsr eipsw, r2 /* r2 = eipsw */
2177 shl PSW_SV, r2 /* r2 << PSW_SV により例外発生時のモード取得 */
2178 bnc return_from_int /* 特権からの割込みならばスキップ */
2179#ifdef NTC2ISR
2180 /*
2181 * NTC2ISRへの割込み
2182 */
2183 Lea _p_runisr, r2
2184 ld.w 0[r2], r2
2185 cmp r0, r2 /* p_runisrがあり,ユーザモードならば非信頼ISR */
2186 be int_to_utask
2187 ld.w ISRCB_usp[r2], sp /* uspを復帰 */
2188 br return_from_int
2189#endif /* NTC2ISR */
2190FLABEL(int_to_utask)
2191 Lea _p_runtsk, r2
2192 ld.w 0[r2], r2
2193 ld.w TCB_usp[r2], sp /* uspを復帰 */
2194FLABEL(return_from_int)
2195 stsr eiwr, r2
2196 eiret
2197
2198/*
2199 * タスクディスパッチ
2200 */
2201 .global _dispatch
2202FLABEL(_dispatch)
2203 /*
2204 * このルーチンは,タスクコンテキスト・OS割込み禁止状æ…
2205‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ
2206 * 許可状æ…
2207‹ãƒ»ï¼ˆãƒ¢ãƒ‡ãƒ«ä¸Šã®ï¼‰å‰²è¾¼ã¿å„ªå…
2208ˆåº¦ãƒžã‚¹ã‚¯å…
2209¨è§£é™¤çŠ¶æ…
2210‹ã§å‘¼ã³å‡ºã•
2211 * れる
2212 */
2213#ifndef TOPPERS_USE_PUSHSP
2214 addi -48, sp, sp
2215 st.w ep, 0[sp]
2216 mov sp, ep
2217 sst.w r20, 44[ep]
2218 sst.w r21, 40[ep]
2219 sst.w r22, 36[ep]
2220 sst.w r23, 32[ep]
2221 sst.w r24, 28[ep]
2222 sst.w r25, 24[ep]
2223 sst.w r26, 20[ep]
2224 sst.w r27, 16[ep]
2225 sst.w r28, 12[ep]
2226 sst.w r29, 8[ep]
2227 sst.w r31, 4[ep]
2228#else /* TOPPERS_USE_PUSHSP */
2229 pushsp r20-r31
2230#endif /* TOPPERS_USE_PUSHSP */
2231 /* スタックと次の起動番地を保存 */
2232 Lea _p_runtsk, ep
2233 sld.w 0[ep], ep
2234 /* =begin modified for SC3 */
2235 sst.w sp, TCB_ssp[ep]
2236 /* =end modified for SC3 */
2237 Lea dispatch_r, r10
2238 sst.w r10, TCB_pc[ep]
2239#ifdef CFG_USE_STACKMONITORING
2240 /*
2241 * 実行中タスクのタスクスタックのオーバフローチェック
2242 */
2243 /*
2244 * スタックポインタチェック方式
2245 */
2246 Lea _p_runtsk, r6 /* 管理ブロックのå…
2247ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹å–å¾— */
2248 ld.w 0[r6], r6
2249 ld.w TCB_p_tinib[r6], r6 /* タスク初期化ブロックå…
2250ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹å–å¾— */
2251 /* =begin modified for SC3 */
2252 /* システムスタックモニタリング */
2253 ld.w TINIB_sstksz[r6], r7 /* タスクシステムスタックサイズ取得 */
2254 ld.w TINIB_sstk_bottom[r6], r6 /* タスクシステムスタック終端アドレス取得 */
2255 sub r7, r6
2256 mov 1, r9
2257 cmp r6, sp /* スタックポインタ <= スタックのå…
2258ˆé ­ã®å ´åˆNG */
2259 Lea dispatcher, lp
2260 /* =end modified for SC3 */
2261 bnh stack_monitoring_error
2262 /*
2263 * マジックナンバーチェック方式
2264 */
2265 ld.w 0[r6], r6
2266 mov STACK_MAGIC_NUMBER, r7
2267 cmp r7, r6
2268 /* =begin modified for SC3 */
2269 Lea dispatcher, lp
2270 /* =end modified for SC3 */
2271 bne stack_monitoring_error
2272#endif /* CFG_USE_STACKMONITORING */
2273 br dispatcher
2274
2275 /*
2276 * ディスパッチャの復帰ルーチン
2277 */
2278FLABEL(dispatch_r)
2279#ifndef TOPPERS_USE_PUSHSP
2280 mov sp, ep
2281 sld.w 44[ep], r20
2282 sld.w 40[ep], r21
2283 sld.w 36[ep], r22
2284 sld.w 32[ep], r23
2285 sld.w 28[ep], r24
2286 sld.w 24[ep], r25
2287 sld.w 20[ep], r26
2288 sld.w 16[ep], r27
2289 sld.w 12[ep], r28
2290 sld.w 8[ep], r29
2291 sld.w 4[ep], r31
2292 addi 48, ep, sp
2293 ld.w 0[sp], ep
2294#else /* TOPPERS_USE_PUSHSP */
2295 popsp r20-r31
2296#endif /* TOPPERS_USE_PUSHSP */
2297 jmp [lp]
2298
2299 /*
2300 * スタックオーバフロー時の処理
2301 */
2302#ifdef CFG_USE_STACKMONITORING
2303 /*
2304 * スタックオーバフロー時プロテクションフックを呼び出し
2305 * スタックを更に壊さないため,割込みスタックの初期値を使用する
2306 * r9 = ostkptの初期値に切り替えるか?
2307 */
2308FLABEL(stack_monitoring_error)
2309 /*
2310 * r9==0の場合でも,既に_ostkptを使っているので,
2311 * except_nest_cntをインクリメントしても問題はない
2312 */
2313 Lea _hook_nest_cnt, r12 /* _ostkptを使う場合はexcept_nest_cntをインクリメントする */
2314 ld.w 0[r12], r13
2315 add 1, r13
2316 st.w r13, 0[r12]
2317
2318 /* =begin modified for SC3 */
2319 cmp r0, r9
2320 be stack_monitoring_error_1
2321 /* =end modified for SC3 */
2322
2323 Lea __ostkpt, r12 /* スタックを更に壊さないため,割込みスタックの初期値を使用する */
2324 ld.w 0[r12], r12
2325 mov r12, sp
2326
2327 /* =begin modified for SC3 */
2328FLABEL(stack_monitoring_error_1)
2329 /*
2330 * プロテクションフックはOS割込み禁止状æ…
2331‹ã§å‘¼ã³å‡ºã™
2332 */
2333 NESTED_LOCK_OS_INT r12, r13
2334 /* =end modified for SC3 */
2335
2336 mov E_OS_STACKFAULT, r6 /* プロテクションフックの引数を設定 */
2337 /* =begin modified for SC3 */
2338 Lea _pre_protection_supervised, r12
2339 mov 0x01, r13
2340 st.b r13, 0[r12] /* pre_protection_supervised = 0x01 */
2341 jr _call_protectionhk_main /* プロテクションフックを呼び出し */
2342 /* ここには来ない */
2343FLABEL(stack_monitoring_error_loop)
2344 jr stack_monitoring_error_loop
2345 /* =end modified for SC3 */
2346#endif /* CFG_USE_STACKMONITORING */
2347
2348
2349/*
2350 * ディスパッチャの動作開始
2351 */
2352 .global _start_dispatch
2353FLABEL(_start_dispatch)
2354 /*
2355 * このルーチンは,カーネル起動時に,すべての割込みを禁止した状æ…
2356‹
2357 * (å…
2358¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
2359‹ã¨åŒç­‰ï¼‰ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žã¾ãŸï¼Œå‰²è¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ï¼ˆéž
2360 * タスクコンテキストと同等)で呼び出されることを想定している
2361 *
2362 * dispatcherは,OS割込み禁止状æ…
2363‹ã§å‘¼ã³å‡ºã™ï¼Ž
2364 */
2365 Lea __ostkpt, sp
2366 ld.w 0[sp], sp
2367
2368 /* OS割込み禁止状æ…
2369‹ */
2370 OUTER_LOCK_OS_INT r12, r13
2371 /* å…
2372¨å‰²è¾¼ã¿ç¦æ­¢è§£é™¤çŠ¶æ…
2373‹ã¸ */
2374 UNLOCK_ALL_INT
2375 br dispatcher_0
2376
2377 /* =begin modified for SC3 */
2378 .global _exit_and_dispatch_nohook
2379 /*
2380 * タスク強制終了の場合はPostTaskHookを呼出さない
2381 * その場合のエントリである
2382 */
2383 /* =end modified for SC3 */
2384
2385 /*
2386 * 現在のコンテキストを捨ててディスパッチ
2387 */
2388 .global _exit_and_dispatch
2389FLABEL(_exit_and_dispatch)
2390#ifdef CFG_USE_STACKMONITORING
2391 /*
2392 * 実行中のタスクスタックのオーバフローチェック
2393 */
2394 /*
2395 * スタックポインタチェック方式
2396 */
2397 Lea _p_runtsk, r6 /* 管理ブロックのå…
2398ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹å–å¾— */
2399 ld.w 0[r6], r6
2400 ld.w TCB_p_tinib[r6], r6 /* タスク初期化ブロックå…
2401ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹å–å¾— */
2402 /* =begin modified for SC3 */
2403 /* システムスタックモニタリング */
2404 ld.w TINIB_sstksz[r6], r7 /* タスクシステムスタックサイズ取得 */
2405 ld.w TINIB_sstk_bottom[r6], r6 /* タスクシステムスタック終端アドレス取得 */
2406 sub r7, r6
2407 mov 1, r9
2408 cmp r6, sp /* スタックポインタ <= スタックのå…
2409ˆé ­ã®å ´åˆNG */
2410 Lea dispatcher, lp
2411 /* =end modified for SC3 */
2412 bnh stack_monitoring_error
2413 /*
2414 * マジックナンバーチェック方式
2415 */
2416 ld.w 0[r6], r6
2417 mov STACK_MAGIC_NUMBER, r7
2418 cmp r7, r6
2419 /* =begin modified for SC3 */
2420 Lea dispatcher, lp
2421 /* =end modified for SC3 */
2422 bne stack_monitoring_error
2423#endif /* CFG_USE_STACKMONITORING */
2424 /* ディスパッチャ本体(dispatcher)へ */
2425
2426FLABEL(dispatcher)
2427 /*
2428 * PostTaskHookの呼び出し
2429 */
2430#ifdef CFG_USE_POSTTASKHOOK
2431FLABEL(posttaskhook_call)
2432 Lea _call_posttaskhook, r6
2433 jarl _stack_change_and_call_func_1, r31
2434#endif /* CFG_USE_POSTTASKHOOK */
2435
2436_exit_and_dispatch_nohook:
2437FLABEL(dispatcher_0)
2438 /*
2439 * このルーチンは,タスクコンテキスト・OS割込み禁止状æ…
2440‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ
2441 * 許可状æ…
2442‹ãƒ»ï¼ˆãƒ¢ãƒ‡ãƒ«ä¸Šã®ï¼‰å‰²è¾¼ã¿å„ªå…
2443ˆåº¦ãƒžã‚¹ã‚¯å…
2444¨è§£é™¤çŠ¶æ…
2445‹ã§å‘¼ã³å‡ºã•
2446 * れる.実行再開番地へもこの状æ…
2447‹ã®ã¾ã¾åˆ†å²ã™ã‚‹
2448 */
2449#ifdef LOG_DSP_ENTER
2450 Lea _p_runtsk, r21
2451 ld.w 0[r21], r21
2452 cmp r0, r21
2453 be dispatcher_0_1
2454 mov r21, r6 /* 引数に_p_runtskを指定 */
2455 jarl _log_dsp_enter, r31
2456FLABEL(dispatcher_0_1)
2457#endif /* LOG_DSP_ENTER */
2458
2459 Lea _callevel_stat, r21
2460#if 0
2461 ld.h 0[r21], r22
2462 mov TSYS_DISALLINT, r20
2463 and r22, r20
2464 be dispatcher_1
2465
2466 mov ~TSYS_DISALLINT, r20
2467 and r22, r20
2468#else /* 0 */
2469 mov TCL_TASK, r20
2470#endif /* 0 */
2471 st.h r20, 0[r21]
2472 UNLOCK_ALL_INT /* å…
2473¨å‰²è¾¼ã¿ç¦æ­¢è§£é™¤çŠ¶æ…
2474‹ã¸ */
2475
2476 /*
2477 * アイドルループ,フックルーチン,OS割込みのコンテキストを捨てる
2478 */
2479 Lea _saved_ostkpt, r20
2480 st.w r0, 0[r20]
2481FLABEL(dispatcher_1)
2482 Lea _p_runtsk, r21
2483 Lea _p_schedtsk, r20
2484 ld.w 0[r20], r22
2485 st.w r22, 0[r21]
2486 cmp r22, r0
2487 be dispatcher_3
2488
2489 mov r22, ep
2490 /* =begin modified for SC3 */
2491 sld.w TCB_ssp[ep], sp
2492 /* =end modified for SC3 */
2493
2494 /* =begin modified for SC3 */
2495 sld.w TCB_p_tinib[ep], ep
2496 mov ep, r25 /* r25 = p_tinib */
2497 sld.w TINIB_p_osapcb[ep], r26 /* r26 = p_osapcb */
2498 Lea _p_runosap, ep /* ep = &p_runosap */
2499 sst.w r26, 0[ep] /* p_runosap = p_osapcb */
2500 ld.w OSAPCB_p_osapinib[r26], r29 /* r29 = p_osapinib */
2501 ld.bu OSAPINIB_osap_trusted[r29], r24 /* r24 = trusted? */
2502 Lea _run_trusted, ep
2503 sst.b r24, 0[ep] /* run_trusted = trusted? */
2504 cmp r0, r24 /* 信頼ならばスキップ */
2505 bne dispatcher_5
2506
2507#ifdef __v850e2v3__
2508 ori 0x1001, r0, r27
2509 ldsr r27, bsel
2510 /*
2511 * ユーザスタック領域
2512 */
2513 mov r25, ep
2514 sld.w TINIB_start_ustk[ep], r27 /* å…
2515ˆé ­ç•ªåœ° */
2516 ori 0x01, r27, r27
2517 sld.w TINIB_limit_ustk[ep], r28 /* 保護属性とサイズ */
2518 ori 0x06, r28, r28
2519 ldsr r27, dpa0l
2520 ldsr r28, dpa0u
2521#else /* defined(__v850e3v5__) */
2522 /*
2523 * ユーザスタック領域
2524 */
2525 mov r25, ep
2526 sld.w TINIB_start_ustk[ep], r27 /* å…
2527ˆé ­ç•ªåœ° */
2528 sld.w TINIB_limit_ustk[ep], r28 /* 保護属性とサイズ */
2529 ldsr r27, 0, 6 /* MPLA0 */
2530 ldsr r28, 1, 6 /* MPUA0 */
2531
2532#endif /* __v850e2v3__ */
2533
2534 /*
2535 * 実行ドメインと保護ドメイン(MPUの設定)が同じならば,
2536 * ドメイン毎のコード領域・データ領域をMPUに設定し直す必
2537要はない
2538 */
2539 Lea _p_ctxosap, ep /* ep = &p_ctxosap */
2540 sld.w 0[ep], r27 /* r27 = p_ctxosap */
2541 cmp r27, r26 /* p_ctxosap == p_runosap ? */
2542 be dispatcher_5 /* 同じならdispatcher_5へ */
2543 nop
2544 sst.w r26, 0[ep] /* p_ctxosap = p_runosap : 保護ドメインを切替え */
2545#ifdef __v850e2v3__
2546 ldsr r26, vmtid /* メモリ保護違反タスク識別子をp_runosapとする */
2547 mov r29, ep /* ep = p_osapinib */
2548
2549 /*
2550 * 自保護ドメイン専用のrom領域
2551 */
2552 sld.w OSAPINIB_start_text[ep], r27 /* å…
2553ˆé ­ç•ªåœ° */
2554 sld.w OSAPINIB_limit_text[ep], r28 /* 保護属性とサイズ */
2555 ldsr r27, ipa0l
2556 ldsr r28, ipa0u
2557 /*
2558 * 自保護ドメイン専用のrosdata領域
2559 */
2560 sld.w OSAPINIB_start_rosdata[ep], r27 /* å…
2561ˆé ­ç•ªåœ° */
2562 sld.w OSAPINIB_limit_rosdata[ep], r28 /* 保護属性とサイズ */
2563 ldsr r27, ipa1l
2564 ldsr r28, ipa1u
2565 /*
2566 * 自保護ドメイン専用のRWX領域
2567 */
2568 sld.w OSAPINIB_start_ram[ep], r27 /* å…
2569ˆé ­ç•ªåœ° */
2570 sld.w OSAPINIB_limit_ram[ep], r28 /* 保護属性とサイズ */
2571 ldsr r27, dpa1l
2572 ldsr r28, dpa1u
2573 /*
2574 * 自保護ドメイン専用のRWX領域(sdata)
2575 */
2576 sld.w OSAPINIB_start_sram[ep], r27 /* å…
2577ˆé ­ç•ªåœ° */
2578 sld.w OSAPINIB_limit_sram[ep], r28 /* 保護属性とサイズ */
2579 ldsr r27, dpa2l
2580 ldsr r28, dpa2u
2581 /*
2582 * å…
2583±æœ‰ãƒªãƒ¼ãƒ‰/専用ライト領域の専用領域
2584 */
2585 sld.w OSAPINIB_start_srpw[ep], r27 /* å…
2586ˆé ­ç•ªåœ° */
2587 sld.w OSAPINIB_limit_srpw[ep], r28 /* 保護属性とサイズ */
2588 ldsr r27, dpa3l
2589 ldsr r28, dpa3u
2590 /*
2591 * å…
2592±æœ‰ãƒªãƒ¼ãƒ‰/専用ライト領域の専用領域(sdata)
2593 */
2594 sld.w OSAPINIB_start_ssrpw[ep], r27 /* å…
2595ˆé ­ç•ªåœ° */
2596 sld.w OSAPINIB_limit_ssrpw[ep], r28 /* 保護属性とサイズ */
2597 ldsr r27, dpa4l
2598 ldsr r28, dpa4u
2599
2600#else /* defined(__v850e3v5__) */
2601 /*
2602 * reg1: p_osapinib
2603 * reg2: tmp1
2604 * reg3: tmp2
2605 * reg4: tmp3
2606 * reg5: tmp4
2607 * reg6: tmp5
2608 */
2609 DISPATCHER_MPU_SETTING r29, r24, r25, r26, r27, r28
2610#endif /* __v850e2v3__ */
2611
2612FLABEL(dispatcher_5)
2613#ifdef __v850e2v3__
2614 ldsr r0, bsel /* bselを戻す */
2615#endif /* __v850e2v3__ */
2616 /* =end modified for SC3 */
2617
2618#ifdef LOG_DSP_LEAVE
2619 ld.w 0[r21], r6 /* 引数に_p_runtskを指定 */
2620 jarl _log_dsp_leave, r31
2621#endif /* LOG_DSP_LEAVE */
2622
2623#ifdef CFG_USE_PRETASKHOOK
2624FLABEL(pretaskhook_call)
2625 Lea _call_pretaskhook, r6
2626 jarl _stack_change_and_call_func_1, r31
2627#endif /* CFG_USE_PRETASKHOOK */
2628
2629FLABEL(dispatcher_2)
2630 Lea _p_runtsk, r20
2631 ld.w 0[r20], r22
2632 mov r22, ep
2633 sld.w TCB_pc[ep], r31
2634 jmp [r31]
2635
2636FLABEL(dispatcher_3)
2637 /*
2638 * OS割込み禁止状æ…
2639‹ã®è§£é™¤ã¨ï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆå®Ÿè¡ŒçŠ¶æ…
2640‹ã¸ã®
2641 * 準備をする
2642 *
2643 * ここで非タスクコンテキストに切り替える(sp=非タスクコンテキス
2644 * ト用スタックポインタ,except_nest_cnt=1)のは,OS割込み禁止解
2645 * 除後に発生する割込み処理にどのスタックを使うかという問題の解決
2646 * と,割込みハンドラ内
2647でのタスクディスパッチの防止という2つの意
2648 * 味がある
2649 */
2650 Lea __ostkpt, r20 /* 非タスクコンテキスト用のスタックの読み込みスタックポインタのå…
2651¥ã‚Œæ›¿ãˆ */
2652 ld.w 0[r20], r3
2653
2654#if 0
2655 Lea _except_nest_cnt, r20
2656 mov 1, r21
2657 st.w r21, 0[r20]
2658#endif
2659
2660 /*
2661 * OS割込み禁止解除状æ…
2662‹ã¸
2663 * 割込みを許可し,非タスクコンテキスト実行状æ…
2664‹ã¨ã—割込みを待
2665つ
2666 *
2667 * プロセッサを割込み待
2668ちに移行させる処理と,割込み許可とは,不可
2669 * 分に行なう必
2670要がある
2671 * これを不可分に行なわない場合,割込みを許可した直後に割込
2672 * みがå…
2673¥ã‚Šï¼Œãã®ä¸­ã§ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œå¯èƒ½çŠ¶æ…
2674‹ã«ãªã‚‹ã¨ï¼Œå®Ÿè¡Œã™ã¹ãã‚¿ã‚¹
2675 * クがあるにもかかわらずプロセッサが割込み待
2676ちになってしまう.
2677 * 不可分に行うため,diによりコアでの割り込みを禁止した状æ…
2678‹ã§ï¼Œ
2679 * INTCの割り込み優å…
2680ˆåº¦ãƒžã‚¹ã‚¯ã‚’下げてからhaltを呼び出す.
2681 * 割り込みが発生した場合は,haltから復帰して次のeiでベクタに
2682 * ジャンプする.
2683 *
2684 * 割込み待
2685ちの間は,p_runtskをNULL(=0)に設定しなければならない
2686 * このように設定しないと,割込みハンドラからGetTaskIDを呼び出
2687 * した際の動作が仕様に合致しなくなる
2688 */
2689
2690 di
2691 OUTER_UNLOCK_OS_INT r12, r13
2692
2693#if 0
2694 nop
2695 nop
2696 nop
2697 nop
2698#else
2699 halt
2700#endif
2701 ei
2702
2703 /*
2704 * OS割込み禁止状æ…
2705‹ã¸
2706 * (モデル上の)割込み優å…
2707ˆåº¦ãƒžã‚¹ã‚¯ã¯0であるため,ISR1以外の割込みはå…
2708¨ã¦ç¦æ­¢ã™ã‚‹
2709 * スタックは非タスクコンテキストのスタックを使用しているため,_except_nest_cntは,
2710 * '1'のままとする
2711 */
2712 OUTER_LOCK_OS_INT r12, r13
2713 br dispatcher_1
2714
2715
2716/*
2717 * タスク開始時処理
2718 *
2719 * dispatcherから呼び出される
2720 */
2721 /* =begin modified for SC3 */
2722 .global _start_stask_r
2723FLABEL(_start_stask_r)
2724 Lea _p_runtsk, ep /* ep = p_runtsk */
2725 sld.w 0[ep], ep
2726 /*
2727 * タスクが不正終了した場合は保護処理を行うよう
2728 * 戻りアドレスにexit_taskを設定
2729 */
2730 Lea __kernel_exit_task, r31
2731 mov r0, r6
2732 br _start_r
2733
2734 .global _start_utask_r
2735FLABEL(_start_utask_r)
2736#ifndef __v850e3v5__
2737 ldsr r0, bsel
2738#endif
2739 Lea _p_runtsk, ep /* ep = p_runtsk */
2740 sld.w 0[ep], ep
2741 clr1 0, TCB_priv_mode[ep] /* 特権モード実行を抜ける */
2742 sld.w TCB_p_tinib[ep], r20 /* ep = p_runtsk->p_tinib */
2743 ld.w TINIB_ustk_bottom[r20], r20 /* r20 = ユーザスタックポインタの初期値 */
2744 mov r20, sp
2745 /*
2746 * タスクが不正終了した場合は保護処理を行うよう
2747 * 戻りアドレスにexit_utaskを設定
2748 */
2749 Lea _exit_utask, lp /* lp = _exit_utask */
2750 stsr psw, r10
2751
2752 /*
2753 * å…
2754¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
2755‹ã¸
2756 * タスクコンテキストへのジャンプで解除される
2757 */
2758 di
2759
2760 /*
2761 * 非特権モードで動作するよう準備
2762 * 保護機能有効(非信頼へ),割込み許可
2763 * PP,NPV,DMP,IMP = 1, ID = 0
2764 */
2765#ifdef __v850e2v3__
2766 movhi 0x000f, r0, r7
2767#else /* defined(__v850e3v5__) */
2768 movhi 0x4000, r0, r7
2769#endif /* __v850e2v3__ */
2770 or r7, r10 /* psw |= (PP|NPV|DMP|IMP) */
2771 ldsr r10, eipsw /* eipsw = psw */
2772 mov 1, r6
2773
2774 .global _start_r
2775FLABEL(_start_r)
2776 ld.w TCB_p_tinib[ep], r22
2777#ifdef CFG_USE_STACKMONITORING
2778 /*
2779 * SC3ではタスク強制終了があるので,タスク起動毎にマジックナンバー
2780 * を初期化する
2781 */
2782 ld.w TINIB_sstk_bottom[r22], r21
2783 ld.w TINIB_sstksz[r22], r10
2784 sub r10, r21
2785 mov STACK_MAGIC_NUMBER, r10
2786 st.w r10, 0[r21]
2787#endif /* CFG_USE_STACKMONITORING */
2788
2789 /*
2790 * OS割込み禁止解除前に現在優å…
2791ˆåº¦(TCB.curpri)を実行優å…
2792ˆåº¦(TINIB.exepri)に
2793 * 変更(内
2794部リソースを獲得)
2795 */
2796 ld.b TINIB_exepri[r22], r21 /* TINIB.exepri -> TCB.curpri */
2797 st.b r21, TCB_curpri[ep]
2798
2799 /*
2800 * OS割込み禁止解除状æ…
2801‹ã¸
2802 * (モデル上の)割込み優å…
2803ˆåº¦ãƒžã‚¹ã‚¯ã¯0であるため,有効な割込みはå…
2804¨ã¦è¨±å¯ã™ã‚‹
2805 */
2806
2807 OUTER_UNLOCK_OS_INT r12, r13
2808
2809 ld.w TCB_p_tinib[ep], r22
2810 ld.w TINIB_task[r22], r10
2811 cmp r0, r6
2812 bne _start_r_1 /* r6 != 0 ならば _start_r_1 へ*/
2813 jmp [r10]
2814
2815FLABEL(_start_r_1)
2816 ldsr r10, eipc /* EIPC = pc */
2817 eiret
2818 /* =end modified for SC3 */
2819
2820 /*
2821 * ext_tskをsvc命令で呼び出す
2822 */
2823 .section .text_shared
2824 .align 4
2825 .globl _exit_utask
2826FLABEL(_exit_utask)
2827 mov TFN_EXIT_TASK, r11
2828 syscall NO_SVC
2829 nop
2830
2831#ifdef NTC2ISR
2832 .globl _exit_uisr
2833FLABEL(_exit_uisr)
2834 syscall 2
2835 nop
2836#endif /* NTC2ISR */
2837
2838 .section .text_kernel
2839 .global _stack_change_and_call_func_1
2840 .global _stack_change_and_call_func_2
2841FLABEL(_stack_change_and_call_func_1)
2842FLABEL(_stack_change_and_call_func_2)
2843
2844 Lea _hook_nest_cnt, r12
2845 ld.w 0[r12], r13
2846 add 1, r13
2847 st.w r13, 0[r12]
2848 cmp 1, r13
2849 bne _stack_change_and_call_func_1_1
2850
2851 /* スタックポインタの保存とå…
2852¥ã‚Œæ›¿ãˆ */
2853 CHANGE_OS_STK r12
2854
2855FLABEL(_stack_change_and_call_func_1_1)
2856 push lp
2857 Lea stack_change_and_call_func_r, lp /* 戻りアドレス */
2858 mov r6, r12
2859 mov r7, r6
2860 mov r8, r7
2861 jmp [r12]
2862
2863FLABEL(stack_change_and_call_func_r)
2864 pop lp
2865 Lea _hook_nest_cnt, r12
2866 ld.w 0[r12], r13
2867 add -1, r13
2868 st.w r13, 0[r12]
2869 cmp r0, r13
2870 bne stack_change_and_call_func_r_1
2871
2872 ld.w 0[sp], sp /* スタックポインタの復帰 */
2873FLABEL(stack_change_and_call_func_r_1)
2874 jmp [lp]
2875
2876
2877#ifdef ENABLE_RETURN_MAIN
2878/*
2879 * AKTSP用のmain()へのリターンコード
2880 */
2881 .global _return_main
2882FLABEL(_return_main)
2883 Lea __ostkpt, sp
2884 ld.w 0[sp],sp
2885 jarl _main, r31
2886#endif /* ENABLE_RETURN_MAIN */
2887
2888 /* =begin modified for SC3 */
2889/*
2890 * SYSCALLテーブル
2891 * syscall命令は、scbp + scbp[x] の番地にジャンプする
2892 */
2893 .globl _syscall_table
2894 .section .text_kernel
2895 .align 4
2896FLABEL(_syscall_table)
2897 .word (_syscall_error_handler - _syscall_table)
2898 .word (_svc_entry - _syscall_table)
2899#ifdef NTC2ISR
2900 .word (end_nt_int_handler - _syscall_table)
2901#endif /* NTC2ISR */
2902
2903 .globl _syscall_error_handler
2904 .globl _svc_entry
2905/*
2906 * SYSCALLエラーハンドラ
2907 */
2908FLABEL(_syscall_error_handler)
2909 br _syscall_error_handler
2910 nop
2911
2912/*
2913 * サービスコールの出å…
2914¥å£
2915 * PP,NPV,DMP,IMP = 0, ID,EP = 1
2916 * eipc = pc, eipsw = psw : eiする前に保存
2917 * r10 : 返り値
2918 * r11:関数コード
2919 * r6 - r9 : 引数(4つまで)
2920 * r20 : 第5引数
2921 * スクラッチレジスタ保存済み
2922 * lp保存済み
2923 */
2924FLABEL(_svc_entry)
2925 /*
2926 * 呼出しå…
2927ƒãŒç‰¹æ¨©ãƒ¢ãƒ¼ãƒ‰ã‹ï¼Ÿ
2928 * eipswをチェックする
2929 */
2930#ifndef __v850e3v5__
2931 ldsr r0, bsel
2932#endif
2933 stsr eipsw, r13
2934 shl PSW_SV, r13 /* r13 << PSW_SV により例外発生時のモード取得 */
2935 bnc svc_entry_2 /* 特権モードからの呼出しならばスキップ */
2936
2937#ifdef NTC2ISR
2938 /*
2939 * NTC2ISRへの割込み
2940 */
2941 Lea _p_runisr, r2
2942 ld.w 0[r2], r2
2943 cmp r0, r2 /* p_runisrがあり,ユーザモードならば非信頼ISR */
2944 be svc_entry_utask
2945 st.w sp, ISRCB_usp[r2] /* uspを保存 */
2946 ld.w ISRCB_p_isrinib[r2], r2
2947 ld.w ISRINIB_sstk_bottom[r2], sp /* sspを復帰 */
2948 br svc_entry_2
2949FLABEL(svc_entry_utask)
2950#endif /* NTC2ISR */
2951 /*
2952 * タスクコンテキストからの呼出しの場合
2953 */
2954 /*
2955 * ユーザスタックとシステムスタックをå…
2956¥ã‚Œæ›¿ãˆã‚‹
2957 * タスクの状æ…
2958‹ã‚’特権モード実行中に移行する
2959 * 戻りå…
2960ˆãŒéžç‰¹æ¨©ãƒ¢ãƒ¼ãƒ‰ã§éžä¿¡é ¼ãƒ•ãƒƒã‚¯å®Ÿè¡Œä¸­ã§ãªã‘れば,
2961 * タスク実行中であるはずなので,p_runtskがNULLかどうかの
2962 * チェックは必
2963要ないはず
2964 */
2965 Lea _p_runtsk, ep
2966 sld.w 0[ep], ep
2967 set1 0, TCB_priv_mode[ep] /* p_runtsk->priv_mode |= 0x01 */
2968 sst.w sp, TCB_usp[ep] /* uspを保存 */
2969 sld.w TCB_p_tinib[ep], ep
2970 sld.w TINIB_sstk_bottom[ep], sp /* sspを復帰 */
2971
2972FLABEL(svc_entry_2)
2973 /*
2974 * eipcとeipsw(syscall呼出しå…
2975ƒã®pcとpsw)を保存して
2976 * 割込みからリターン
2977 * +--------------+ <- new sp
2978 * | eipsw |
2979 * +--------------+
2980 * | eipc |
2981 * +--------------+ <- old sp
2982 */
2983 addi -8, sp, sp
2984 mov sp, ep
2985 stsr eipc, r12
2986 sst.w r12, 4[ep]
2987 stsr eipsw, r12
2988 sst.w r12, 0[ep]
2989 /*
2990 * eipswの保護関連ビットを0にする
2991 */
2992#ifdef __v850e2v3__
2993 movhi 0x000f, r0, r13
2994#else /* defined(__v850e3v5__) */
2995 movhi 0x4000, r0, r13
2996#endif /* __v850e2v3__ */
2997 not r13, r13
2998 and r13, r12
2999 ldsr r12, eipsw /* PP,NPV,DMP,IMP = 0 */
3000 Lea svc_entry_3, r12
3001 ldsr r12, eipc
3002 eiret
3003
3004FLABEL(svc_entry_3)
3005 /*
3006 * 機能コードのチェック
3007 */
3008 mov TMAX_SVCID, r12
3009 cmp r12, r11 /* 機能コードの上限チェック(TMAX_SVCID < r11) */
3010 bgt svc_entry_error /* 上限をオーバしているならばエラー */
3011
3012 /*
3013 * サービスコールのテーブルを引き,
3014 * サービスコールの本体を呼ぶ
3015 */
3016 Lea _svc_table, r12
3017 shl 2, r11 /* r11 *= 4 */
3018 add r11, r12 /* r12 = &svc_table[r11] */
3019 ld.w 0[r12], r12 /* テーブルを引く */
3020 Lea svc_entry_r, lp /* 戻り番地を設定 */
3021 jmp [r12] /* サービスコール処理ルーチンを呼ぶ */
3022 nop
3023
3024FLABEL(svc_entry_error)
3025 jarl _no_support_service, lp /* no_support_service を呼ぶ */
3026
3027FLABEL(svc_entry_r)
3028 /*
3029 * この時点でのpswをr11に保存する
3030 * å…
3031¨å‰²è¾¼ã¿ç¦æ­¢ã§æ›´æ–°ã—た時への対応
3032 */
3033 stsr psw, r11
3034
3035 /*
3036 * å…
3037¨å‰²è¾¼ã¿ç¦æ­¢ã‹ã¤EP状æ…
3038‹ã¸
3039 * ここでEP状æ…
3040‹ã¨ã™ã‚‹ã®ã¯ï¼ŒISRからシステムサービスが呼ばれた
3041 * 場合に,eiretによってISPRが更新されるのを防ぐためである
3042 */
3043 ori 0x60, r11, r12 /* psw |= EP|ID */
3044 ldsr r12, psw
3045
3046 /*
3047 * eipcとeipsw(syscall呼出しå…
3048ƒã®pcとpsw)を復帰
3049 * ここでは,割込み処理中でない(サービスコール呼出し前に
3050 * eiretを発行している)が,eiretを利用してリターンする
3051 * +--------------+ <- old sp
3052 * | eipc |
3053 * +--------------+
3054 * | eipsw |
3055 * +--------------+ <- new sp
3056 */
3057 mov sp, ep
3058 sld.w 4[ep], r15
3059 sld.w 0[ep], r16
3060 addi 8, sp, sp
3061
3062 /*
3063 * スタックを戻すかチェック
3064 */
3065 /*
3066 * 呼出しå…
3067ƒãŒç‰¹æ¨©ãƒ¢ãƒ¼ãƒ‰ã‹ï¼Ÿ
3068 * eipswをチェックする
3069 */
3070#ifdef __v850e2v3__
3071 ldsr r0, bsel
3072 movhi 0x000f, r0, r12
3073#else /* defined(__v850e3v5__) */
3074 movhi 0x4000, r0, r12
3075#endif /* __v850e2v3__ */
3076 tst r16, r12
3077 be svc_prv_r /* 特権モードからの呼出しならばスキップ */
3078
3079#ifdef NTC2ISR
3080 /*
3081 * NTC2ISRへの割込み
3082 */
3083 Lea _p_runisr, r2
3084 ld.w 0[r2], r2
3085 cmp r0, r2 /* p_runisrがあり,ユーザモードならば非信頼ISR */
3086 be svc_utask_r
3087 ld.w ISRCB_usp[r2], sp /* uspを復帰 */
3088 br svc_prv_r
3089FLABEL(svc_utask_r)
3090#endif /* NTC2ISR */
3091 Lea _p_runtsk, ep
3092 sld.w 0[ep], ep
3093 tst1 0, TCB_priv_mode[ep] /* uspを保存したか? */
3094 be svc_prv_r /* uspを保存していないならばスキップ */
3095
3096FLABEL(svc_usr_r)
3097 /*
3098 * 特権モード実行を抜ける
3099 * sstkとustkをå…
3100¥ã‚Œæ›¿ãˆã‚‹
3101 * 戻りå…
3102ˆãŒã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãªã‚‰ã°ï¼Œã‚¿ã‚¹ã‚¯å®Ÿè¡Œä¸­ã§ã‚るはず
3103 * なので,p_runtskがNULLかどうかのチェックは必
3104要ないはず
3105 */
3106 clr1 0, TCB_priv_mode[ep] /* p_runtsk->priv_mode &= ~0x01 */
3107 sld.w TCB_usp[ep], sp /* uspを復帰 */
3108
3109FLABEL(svc_prv_r)
3110 /*
3111 * システムサービスでセットされた割込み優å…
3112ˆåº¦ãƒžã‚¹ã‚¯ã‚’反映する
3113 */
3114 mov 0x20, r12
3115 and r12, r11 /* PSW.ID以外を0に */
3116 not r12, r12 /* r12 = ~0x20 */
3117 and r12, r16 /* eipsw &= ~0x20 */
3118 or r11, r16 /* eipsw |= r11 */
3119 ldsr r16, eipsw
3120 ldsr r15, eipc
3121 eiret /* 呼出しå…
3122ƒã¸ãƒªã‚¿ãƒ¼ãƒ³ */
3123 nop
3124
3125 /*
3126 * スタックチェック関数
3127 * å…
3128¥åŠ› r6 使用するスタック量
3129 * 使用するスタック量が残っていない場合はエラー
3130 */
3131 .global _trustedfunc_stack_check
3132FLABEL(_trustedfunc_stack_check)
3133 Lea _callevel_stat, ep
3134 sld.h 0[ep], r10
3135 addi TCL_ISR2, r0, r11
3136 tst r11, r10
3137 be trustedfunc_stack_check_1 /* TCL_TASKの場合はスキップ */
3138
3139#ifndef NTC2ISR
3140 /*
3141 * _ostkを使用中
3142 */
3143 Lea __ostk, ep
3144 sld.w 0[ep], r11
3145#else /* NTC2ISR */
3146 /*
3147 * ISRのシステムスタックを使用中
3148 */
3149 Lea _p_runisr, ep
3150 sld.w 0[ep], ep
3151 sld.w ISRCB_p_isrinib[ep], ep
3152 sld.w ISRINIB_sstk_bottom[ep], r11
3153 /*sld.w ISRINIB_sstksz[ep], r12*/
3154 /*TODO*/
3155 mov 1024, r12
3156 sub r12, r11
3157#endif /* NTC2ISR */
3158 br trustedfunc_stack_check_2
3159
3160FLABEL(trustedfunc_stack_check_1)
3161 /*
3162 * タスクのシステムスタックを使用中
3163 */
3164 Lea _p_runtsk, ep
3165 sld.w 0[ep], ep
3166 sld.w TCB_p_tinib[ep], ep
3167 sld.w TINIB_sstk_bottom[ep], r11
3168 sld.w TINIB_sstksz[ep], r12
3169 sub r12, r11
3170FLABEL(trustedfunc_stack_check_2)
3171 /*
3172 * スタックの残量をチェック
3173 * r11 = スタックのå…
3174ˆé ­
3175 */
3176 subr sp, r6 /* r6 = ssp - tf_stksz */
3177 bl trustedfunc_stack_check_3 /* ssp < tfstksz ならばエラー処理へ */
3178 cmp r11, r6 /* r11 < r6 ? */
3179 bnh trustedfunc_stack_check_3 /* そうでなければエラー処理へ */
3180 addi E_OK, r0, r10
3181 jmp [lp]
3182
3183FLABEL(trustedfunc_stack_check_3)
3184 addi E_OS_STACKINSUFFICIENT, r0, r10
3185 jmp [lp]
3186
3187 /* =end modified for SC3 */
3188
Note: See TracBrowser for help on using the repository browser.