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