source: atk2-sc3-1.4.0-ntisr/arch/v850_ccrh/prc_support.asm

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

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

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