Changeset 374 for asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common
- Timestamp:
- Apr 5, 2019, 9:26:53 PM (5 years ago)
- Location:
- asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/Makefile.core
r352 r374 55 55 $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $< 56 56 57 LDFLAGS := -no stdlib$(LDFLAGS)57 LDFLAGS := -nodefaultlibs $(LDFLAGS) -
asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/arm.h
r352 r374 5 5 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 6 6 * Toyohashi Univ. of Technology, JAPAN 7 * Copyright (C) 2006-201 6by Embedded and Real-Time Systems Laboratory7 * Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory 8 8 * Graduate School of Information Science, Nagoya Univ., JAPAN 9 9 * … … 119 119 120 120 /* 121 * CP15のコプロセッサアクセス制御レジスタ(CPACR)の設定値 122 */ 123 #define CP15_CPACR_ASEDIS UINT_C(0x80000000) 124 #define CP15_CPACR_D32DIS UINT_C(0x40000000) 125 #define CP15_CPACR_CP11_FULLACCESS UINT_C(0x00c00000) 126 #define CP15_CPACR_CP10_FULLACCESS UINT_C(0x00300000) 127 128 /* 121 129 * CP15のフォールト状態レジスタの参照値 122 130 */ … … 444 452 445 453 #endif /* TOPPERS_MACRO_ONLY */ 454 455 /* 456 * 浮動小数点例外制御レジスタ(FPEXC)の設定値 457 */ 458 #define FPEXC_ENABLE UINT_C(0x40000000) 459 446 460 #endif /* TOPPERS_ARM_H */ -
asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/arm_insn.h
r352 r374 5 5 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 6 6 * Toyohashi Univ. of Technology, JAPAN 7 * Copyright (C) 2006-201 7by Embedded and Real-Time Systems Laboratory7 * Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory 8 8 * Graduate School of Information Science, Nagoya Univ., JAPAN 9 9 * … … 227 227 #define CP15_WRITE_ACTLR(reg) Asm("mcr p15, 0, %0, c1, c0, 1"::"r"(reg)) 228 228 229 /* コプロセッサアクセス制御レジスタ */ 230 #define CP15_READ_CPACR(reg) Asm("mrc p15, 0, %0, c1, c0, 2":"=r"(reg)) 231 #define CP15_WRITE_CPACR(reg) Asm("mcr p15, 0, %0, c1, c0, 2"::"r"(reg)) 232 229 233 /* 230 234 * CP15によるキャッシュ操作マクロ … … 421 425 422 426 #endif /* __TARGET_ARCH_ARM == 7 */ 427 428 /* 429 * 浮動小数点例外制御レジスタ(FPEXC)の現在値の読出し 430 */ 431 Inline uint32_t 432 current_fpexc(void) 433 { 434 uint32_t fpexc; 435 436 Asm("vmrs %0, fpexc" : "=r"(fpexc)); 437 return(fpexc); 438 } 439 440 /* 441 * 浮動小数点例外制御レジスタ(FPEXC)の現在値の変更 442 */ 443 Inline void 444 set_fpexc(uint32_t fpexc) 445 { 446 Asm("vmsr fpexc, %0" : : "r"(fpexc)); 447 } 448 423 449 #endif /* TOPPERS_ARM_INSN_H */ -
asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/core_check.trb
r352 r374 19 19 # 20 20 inhTable = SYMBOL("_kernel_inh_table") 21 offset = SYMBOL("__etext") - SYMBOL("__data_start__") 21 22 $cfgData[:DEF_INH].each do |key, params| 22 inthdr = PEEK(inhTable + params[:inhno] * $sizeof_FP, $sizeof_FP)23 inthdr = PEEK(inhTable + offset + params[:inhno] * $sizeof_FP, $sizeof_FP) 23 24 24 25 # 割込みハンドラの先頭番地のチェック[NGKI3056] -
asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/core_kernel.h
r352 r374 6 6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 7 7 * Toyohashi Univ. of Technology, JAPAN 8 * Copyright (C) 2004-201 6by Embedded and Real-Time Systems Laboratory8 * Copyright (C) 2004-2018 by Embedded and Real-Time Systems Laboratory 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * … … 51 51 #ifndef TOPPERS_CORE_KERNEL_H 52 52 #define TOPPERS_CORE_KERNEL_H 53 54 /* 55 * ターゲット定義のタスク属性 56 */ 57 #define TA_FPU UINT_C(0x08) /* FPUレジスタをコンテキストに含める */ 53 58 54 59 /* -
asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/core_kernel.trb
r352 r374 65 65 $kernelCfgC.comment_header("Interrupt Handler Table") 66 66 67 $kernelCfgC.add(" constFP _kernel_inh_table[TNUM_INHNO] = {")67 $kernelCfgC.add("FP _kernel_inh_table[TNUM_INHNO] = {") 68 68 $INHNO_VALID.each_with_index do |inhnoVal, index| 69 69 $kernelCfgC.add(",") if index > 0 -
asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/core_kernel_impl.c
r352 r374 170 170 171 171 /* 172 * FPUの初期化 173 */ 174 #ifdef USE_ARM_FPU 175 176 void 177 arm_fpu_initialize(void) 178 { 179 uint32_t reg; 180 181 /* 182 * CP10とCP11をアクセス可能に設定する. 183 */ 184 CP15_READ_CPACR(reg); 185 reg |= (CP15_CPACR_CP10_FULLACCESS | CP15_CPACR_CP11_FULLACCESS); 186 CP15_WRITE_CPACR(reg); 187 188 /* 189 * FPUをディスエーブルする. 190 */ 191 set_fpexc(current_fpexc() & ~FPEXC_ENABLE); 192 } 193 194 #endif /* USE_ARM_FPU */ 195 196 /* 172 197 * コア依存の初期化 173 198 */ … … 187 212 arm_mmu_initialize(); 188 213 #endif /* USE_ARM_MMU */ 214 215 /* 216 * FPUの初期化 217 */ 218 #ifdef USE_ARM_FPU 219 arm_fpu_initialize(); 220 #endif /* USE_ARM_FPU */ 189 221 190 222 /* -
asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/core_kernel_impl.h
r352 r374 55 55 56 56 /* 57 * ターゲット依存のタスク属性(エラーチェック用) 58 */ 59 #ifdef USE_ARM_FPU 60 #define TARGET_TSKATR (TA_FPU) 61 #endif /* USE_ARM_FPU */ 62 63 /* 57 64 * エラーチェック方法の指定 58 65 */ … … 324 331 * 割込みハンドラテーブル(kernel_cfg.c) 325 332 */ 326 extern constFP inh_table[TNUM_INHNO];333 extern FP inh_table[TNUM_INHNO]; 327 334 328 335 /* -
asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/core_offset.trb
r352 r374 17 17 GenerateDefine("TCB_sp", $offsetof_TCB_sp) 18 18 GenerateDefine("TCB_pc", $offsetof_TCB_pc) 19 GenerateDefine("TINIB_tskatr", $offsetof_TINIB_tskatr) 19 20 GenerateDefine("TINIB_exinf", $offsetof_TINIB_exinf) 20 21 GenerateDefine("TINIB_task", $offsetof_TINIB_task) -
asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/core_support.S
r352 r374 6 6 * Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory 7 7 * Toyohashi Univ. of Technology, JAPAN 8 * Copyright (C) 2006-201 7by Embedded and Real-Time Systems Laboratory8 * Copyright (C) 2006-2018 by Embedded and Real-Time Systems Laboratory 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * 11 * 上記著作権者は,以下の(1) ~(4)の条件を満たす場合に限り,本ソフトウェ11 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 12 12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 13 13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. … … 55 55 56 56 /* 57 * 使用する命令セットの定義 58 */ 59 #ifdef USE_ARM_FPU 60 .fpu vfpv3 61 #endif /* USE_ARM_FPU */ 62 63 /* 57 64 * 例外ベクタ 58 65 */ … … 101 108 * マスク全解除状態・ディスパッチ許可状態で呼び出される. 102 109 */ 103 push {r12,lr} /* 戻り番地を保存,r12はダミー */ 110 push {r12,lr} /* 戻り番地(lr)を保存 */ 111 /* r12はアラインメントのため */ 104 112 #ifdef TOPPERS_SUPPORT_OVRHDR 105 113 bl ovrtimer_stop 106 114 #endif /* TOPPERS_SUPPORT_OVRHDR */ 107 stmfd sp!, {r4-r11}/* 非スクラッチレジスタの保存 */115 push {r4-r11} /* 非スクラッチレジスタの保存 */ 108 116 ldr r0, =p_runtsk /* p_runtsk → r0 */ 109 117 ldr r0, [r0] 118 #ifdef USE_ARM_FPU 119 ldr r2, [r0,#TCB_p_tinib] /* p_runtsk->p_tinib → r2 */ 120 ldr r1, [r2,#TINIB_tskatr] /* p_runtsk->p_tinib->tskatr → r1 */ 121 tst r1, #TA_FPU 122 beq 1f 123 vpush {d8-d15} /* 非スクラッチFPUレジスタの保存 */ 124 1: 125 #endif /* USE_ARM_FPU */ 110 126 str sp, [r0,#TCB_sp] /* スタックポインタを保存 */ 111 127 adr r1, dispatch_r … … 114 130 115 131 ALABEL(dispatch_r) 116 ldmfd sp!, {r4-r11} /* 非スクラッチレジスタの復帰 */ 132 /* 133 * 【この時点のレジスタ状態】 134 * r4:p_runtsk(タスク切換え後) 135 */ 136 #ifdef USE_ARM_FPU 137 ldr r2, [r4,#TCB_p_tinib] /* p_runtsk->p_tinib → r2 */ 138 ldr r1, [r2,#TINIB_tskatr] /* p_runtsk->p_tinib->tskatr → r1 */ 139 tst r1, #TA_FPU 140 vmrs r0, fpexc 141 biceq r0, r0, #FPEXC_ENABLE 142 orrne r0, r0, #FPEXC_ENABLE 143 vmsr fpexc, r0 /* FPEXCを設定 */ 144 beq 1f 145 vpop {d8-d15} /* 非スクラッチFPUレジスタの復帰 */ 146 1: 147 #endif /* USE_ARM_FPU */ 148 pop {r4-r11} /* 非スクラッチレジスタの復帰 */ 117 149 #ifdef TOPPERS_SUPPORT_OVRHDR 118 150 bl ovrtimer_start … … 136 168 */ 137 169 170 /* 171 * 各種のデバイス(特に割込みコントローラ)の設定が完了するのを待つ. 172 */ 173 asm_data_sync_barrier r0 174 138 175 /* 139 176 * タスクコンテキストに切り換える. … … 232 269 ALABEL(call_exit_kernel) 233 270 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_INTLOCK) 234 ldr r0, =istkpt /* 非タスクコンテキスト のスタックへ*/271 ldr r0, =istkpt /* 非タスクコンテキスト用のスタックに */ 235 272 ldr sp, [r0] 273 ldr r0, =excpt_nest_count /* 例外ネストカウントを1に */ 274 mov r1, #1 275 str r1, [r0] 236 276 b exit_kernel 237 277 … … 243 283 AGLOBAL(start_r) 244 284 /* 245 * ディスパッチャ本体から呼び出されるため,p_runtskはr4に入っている. 285 * 【この時点のレジスタ状態】 286 * r4:p_runtsk(タスク切換え後) 246 287 */ 247 288 ALABEL(start_r) … … 253 294 ldr lr, =ext_tsk /* タスク本体からの戻り番地を設定 */ 254 295 ldr r2, [r4,#TCB_p_tinib] /* p_runtsk->p_tinib → r2 */ 296 #ifdef USE_ARM_FPU 297 ldr r1, [r2,#TINIB_tskatr] /* p_runtsk->p_tinib->tskatr → r1 */ 298 tst r1, #TA_FPU 299 vmrs r0, fpexc 300 biceq r0, r0, #FPEXC_ENABLE 301 orrne r0, r0, #FPEXC_ENABLE 302 vmsr fpexc, r0 /* FPEXCを設定 */ 303 #endif /* USE_ARM_FPU */ 255 304 ldr r0, [r2,#TINIB_exinf] /* exinfをパラメータに */ 256 305 ldr r1, [r2,#TINIB_task] /* タスク起動番地にジャンプ */ … … 270 319 #if __TARGET_ARCH_ARM < 6 271 320 /* 272 * スーパバイザモードに切り換え,スクラッチレジスタ を保存する.321 * スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する. 273 322 */ 274 323 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_IRQ_BIT) 275 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 276 277 /* 278 * IRQモードに戻して,戻り番地とspsr(戻り先のcpsr)を取得する. 324 push {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 325 326 /* 327 * IRQモードに戻して,戻り番地(lr−4)と戻り先のcpsr(spsr)を取 328 * 得する. 279 329 */ 280 330 msr cpsr_c, #(CPSR_IRQ_MODE AOR CPSR_IRQ_BIT) … … 283 333 284 334 /* 285 * スーパバイザモードに切り換え,戻り番地と spsrを保存する.335 * スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する. 286 336 */ 287 337 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_IRQ_BIT) 288 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 289 push {r1} /* spsrをスタックに保存 */338 str r2, [sp,#0x20] /* 戻り番地をスタックに保存(pcの場所)*/ 339 push {r1} /* 戻り先のcpsrをスタックに保存 */ 290 340 #else /* __TARGET_ARCH_ARM < 6 */ 291 341 /* 292 * 戻り 先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに293 * 保存する.342 * 戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ 343 * クに保存する. 294 344 */ 295 345 sub lr, lr, #4 /* 戻り番地の算出 */ … … 297 347 298 348 /* 299 * スーパバイザモードに切り換え,スクラッチレジスタ を保存する.349 * スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する. 300 350 */ 301 351 cps #CPSR_SVC_MODE 302 stmfd sp!,{r0-r5,r12,lr}352 push {r0-r5,r12,lr} 303 353 #endif /* __TARGET_ARCH_ARM < 6 */ 304 354 … … 308 358 and r1, sp, #4 309 359 sub sp, sp, r1 310 push {r0,r1} /* r0はスペース確保のため*/311 360 push {r0,r1} /* スタックポインタの調整値を保存 */ 361 /* r0はスペース確保のため */ 312 362 /* 313 363 * 例外ネストカウントをインクリメントする.割込みが非タスクコンテキ … … 328 378 #endif /* TOPPERS_SUPPORT_OVRHDR */ 329 379 380 #ifdef USE_ARM_FPU 381 /* 382 * FPUをディスエーブルする. 383 */ 384 vmrs r0, fpexc 385 str r0, [sp] /* FPEXCを保存(r0の場所)*/ 386 bic r0, r0, #FPEXC_ENABLE 387 vmsr fpexc, r0 /* FPEXCを設定 */ 388 #endif /* USE_ARM_FPU */ 389 330 390 /* 331 391 * 非タスクコンテキスト用のスタックに切り換える. … … 339 399 /* 340 400 * 割込みコントローラを操作し,割込み番号を取得する. 401 * 402 * irc_begin_intは,スタックトップ(r0の場所)に,irc_end_intで用 403 * いる情報を保存する. 341 404 */ 342 405 bl irc_begin_int … … 420 483 mov sp, r3 421 484 485 #ifdef USE_ARM_FPU 486 /* 487 * FPUを元に戻す. 488 */ 489 ldr r0, [sp] /* FPEXCを復帰 */ 490 vmsr fpexc, r0 491 #endif /* USE_ARM_FPU */ 492 422 493 /* 423 494 * p_runtskがNULLか判定する. … … 433 504 pop {r0,r1} /* スタックポインタの調整を元に戻す */ 434 505 add sp, sp, r1 435 add sp, sp, #40 /* スクラッチレジスタ を捨てる */506 add sp, sp, #40 /* スクラッチレジスタ等を捨てる */ 436 507 b dispatcher_0 437 508 … … 440 511 */ 441 512 ALABEL(irq_handler_3) 513 /* 514 * 【この時点のレジスタ状態】 515 * r0:p_runtsk 516 */ 442 517 ldr r1, =p_schedtsk /* p_schedtsk → r1 */ 443 518 ldr r1, [r1] … … 448 523 * コンテキストを保存する. 449 524 */ 450 stmfd sp!, {r6-r11} /* 非スクラッチレジスタの保存 */ 525 push {r6-r11} /* 残りのレジスタの保存 */ 526 #ifdef USE_ARM_FPU 527 ldr r2, [r0,#TCB_p_tinib] /* p_runtsk->p_tinib → r2 */ 528 ldr r1, [r2,#TINIB_tskatr] /* p_runtsk->p_tinib->tskatr → r1 */ 529 tst r1, #TA_FPU 530 beq 1f /* TA_FPU属性でない場合は分岐 */ 531 #ifdef USE_ARM_FPU_D32 532 vpush {d16-d31} 533 #endif /* USE_ARM_FPU_D32 */ 534 vpush {d0-d15} /* 全FPUレジスタの保存 */ 535 vmrs r1, fpscr 536 push {r1,r2} /* FPSCRの保存 */ 537 1: /* r2はアラインメントのため */ 538 #endif /* USE_ARM_FPU */ 451 539 str sp, [r0,#TCB_sp] /* スタックポインタを保存 */ 452 540 adr r1, ret_int_r /* 実行再開番地を保存 */ … … 457 545 /* 458 546 * コンテキストを復帰する. 459 */ 460 ldmfd sp!, {r6-r11} /* 非スクラッチレジスタの復帰 */ 547 * 548 * 【この時点のレジスタ状態】 549 * r4:p_runtsk(タスク切換え後) 550 */ 551 #ifdef USE_ARM_FPU 552 ldr r2, [r4,#TCB_p_tinib] /* p_runtsk->p_tinib → r2 */ 553 ldr r1, [r2,#TINIB_tskatr] /* p_runtsk->p_tinib->tskatr → r1 */ 554 tst r1, #TA_FPU 555 vmrs r0, fpexc 556 biceq r0, r0, #FPEXC_ENABLE 557 orrne r0, r0, #FPEXC_ENABLE 558 vmsr fpexc, r0 /* FPEXCを設定 */ 559 beq 1f /* TA_FPU属性でない場合は分岐 */ 560 pop {r1,r2} /* FPSCRの復帰 */ 561 vmsr fpscr, r1 562 vpop {d0-d15} /* 全FPUレジスタの復帰 */ 563 #ifdef USE_ARM_FPU_D32 564 vpop {d16-d31} 565 #endif /* USE_ARM_FPU_D32 */ 566 1: 567 #endif /* USE_ARM_FPU */ 568 pop {r6-r11} /* 残りのレジスタの復帰 */ 461 569 462 570 ALABEL(irq_handler_4) … … 469 577 470 578 /* 471 * 割込み /CPU例外処理からのリターン579 * 割込み処理からのリターン 472 580 * 473 * 割込み /CPU例外処理からのリターンにより,CPUロック解除状態に遷474 * 移するようにする必要があるが,ARMはCPSRのビットによってCPUロッ475 * ク状態を表しているため,CPSRを元に戻してリターンすればよい.581 * 割込み処理からのリターンにより,CPUロック解除状態に遷移するよ 582 * うにする必要があるが,ARMはCPSRのビットによってCPUロック状態を 583 * 表しているため,CPSRを元に戻してリターンすればよい. 476 584 */ 477 585 ALABEL(irq_handler_5) … … 480 588 481 589 #if __TARGET_ARCH_ARM < 6 482 ldmfd sp!, {r0}/* 戻り先のcpsrをspsrに設定 */590 pop {r0} /* 戻り先のcpsrをspsrに設定 */ 483 591 msr spsr_cxsf, r0 484 592 ldmfd sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */ 485 593 /* ^付きなので,spsr → cpsr */ 486 594 #else /* __TARGET_ARCH_ARM < 6 */ 487 ldmfd sp!, {r0-r5,r12,lr}595 pop {r0-r5,r12,lr} /* スクラッチレジスタ+αの復帰 */ 488 596 rfefd sp! 489 597 #endif /* __TARGET_ARCH_ARM < 6 */ … … 509 617 /* 510 618 * IビットとFビットをセットし,スーパバイザモードに切り換え,スク 511 * ラッチレジスタ を保存する.619 * ラッチレジスタ+αを保存する. 512 620 */ 513 621 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 514 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 515 516 /* 517 * 未定義モードに戻して,戻り番地とspsrを取得する. 622 push {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 623 624 /* 625 * 未定義モードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を取 626 * 得する. 518 627 */ 519 628 msr cpsr_c, #(CPSR_UND_MODE AOR CPSR_FIQ_IRQ_BIT) … … 522 631 523 632 /* 524 * スーパバイザモードに切り換え,戻り番地と spsrを保存する.633 * スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する. 525 634 */ 526 635 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 527 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 528 push {r1} /* spsrをスタックに保存 */636 str r2, [sp,#0x20] /* 戻り番地をスタックに保存(pcの場所)*/ 637 push {r1} /* 戻り先のcpsrをスタックに保存 */ 529 638 #else /* __TARGET_ARCH_ARM < 6 */ 530 639 /* 531 * 戻り 先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに532 * 保存する.640 * 戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ 641 * クに保存する. 533 642 */ 534 643 srsfd #CPSR_SVC_MODE! 535 644 536 645 /* 537 * スーパバイザモードに切り換え,スクラッチレジスタ を保存する.646 * スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する. 538 647 */ 539 648 cps #CPSR_SVC_MODE 540 stmfd sp!,{r0-r5,r12,lr}649 push {r0-r5,r12,lr} 541 650 #endif /* __TARGET_ARCH_ARM < 6 */ 542 651 mov r4, #EXCNO_UNDEF … … 550 659 ATEXT 551 660 AALIGN(2) 552 AWEAK(svc_handler)553 661 AGLOBAL(svc_handler) 554 662 ALABEL(svc_handler) … … 558 666 #if __TARGET_ARCH_ARM < 6 559 667 /* 560 * IビットとFビットをセットし,スクラッチレジスタを保存する. 668 * IビットとFビットをセットし,戻り番地(lr),スクラッチレジスタ 669 * +α,戻り先のcpsr(spsr)を保存する(lrは二重に保存される). 561 670 */ 562 671 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 563 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 564 565 /* 566 * 戻り番地とspsrを取得する. 567 */ 568 mov r2, lr 672 push {lr} 673 push {r0-r5,r12,lr} 569 674 mrs r1, spsr 570 571 /* 572 * 戻り番地とspsrを保存する. 573 */ 574 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 */ 575 push {r1} /* spsrをスタックに保存 */ 675 push {r1} 576 676 #else /* __TARGET_ARCH_ARM < 6 */ 577 677 /* 578 * 戻り 先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに579 * 保存する.678 * 戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ 679 * クに保存する. 580 680 */ 581 681 srsfd #CPSR_SVC_MODE! 582 682 583 683 /* 584 * スーパバイザモードで,スクラッチレジスタを保存する. 585 */ 586 cps #CPSR_SVC_MODE /* 不要と思われる */ 587 stmfd sp!, {r0-r5,r12,lr} 684 * スーパバイザモードで,スクラッチレジスタ+αを保存する. 685 */ 686 push {r0-r5,r12,lr} 588 687 #endif /* __TARGET_ARCH_ARM < 6 */ 589 688 mov r4, #EXCNO_SVC … … 605 704 /* 606 705 * IビットとFビットをセットし,スーパバイザモードに切り換え,スク 607 * ラッチレジスタ を保存する.706 * ラッチレジスタ+αを保存する. 608 707 */ 609 708 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 610 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 611 612 /* 613 * アボートモードに戻して,戻り番地とspsrを取得する. 709 push {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 710 711 /* 712 * アボートモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を 713 * 取得する. 614 714 */ 615 715 msr cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT) … … 618 718 619 719 /* 620 * スーパバイザモードに切り換え,戻り番地と spsrを保存する.720 * スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する. 621 721 */ 622 722 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 623 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 624 push {r1} /* spsrをスタックに保存 */723 str r2, [sp,#0x20] /* 戻り番地をスタックに保存(pcの場所)*/ 724 push {r1} /* 戻り先のcpsrをスタックに保存 */ 625 725 #else /* __TARGET_ARCH_ARM < 6 */ 626 726 /* 627 * 戻り 先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに628 * 保存する.727 * 戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ 728 * クに保存する. 629 729 */ 630 730 srsfd #CPSR_SVC_MODE! 631 731 632 732 /* 633 * スーパバイザモードに切り換え,スクラッチレジスタ を保存する.733 * スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する. 634 734 */ 635 735 cps #CPSR_SVC_MODE 636 stmfd sp!,{r0-r5,r12,lr}736 push {r0-r5,r12,lr} 637 737 #endif /* __TARGET_ARCH_ARM < 6 */ 638 738 mov r4, #EXCNO_PABORT … … 666 766 /* 667 767 * IビットとFビットをセットし,スーパバイザモードに切り換え,スク 668 * ラッチレジスタ を保存する.768 * ラッチレジスタ+αを保存する. 669 769 */ 670 770 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 671 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 672 673 /* 674 * アボートモードに戻して,戻り番地とspsrを取得する. 771 push {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 772 773 /* 774 * アボートモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を 775 * 取得する. 675 776 */ 676 777 msr cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT) … … 679 780 680 781 /* 681 * スーパバイザモードに切り換え,戻り番地と spsrを保存する.782 * スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する. 682 783 */ 683 784 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 684 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 685 push {r1} /* spsrをスタックに保存 */785 str r2, [sp,#0x20] /* 戻り番地をスタックに保存(pcの場所)*/ 786 push {r1} /* 戻り先のcpsrをスタックに保存 */ 686 787 #else /* __TARGET_ARCH_ARM < 6 */ 687 788 /* 688 * 戻り 先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに689 * 保存する.789 * 戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ 790 * クに保存する. 690 791 */ 691 792 srsfd #CPSR_SVC_MODE! 692 793 693 794 /* 694 * スーパバイザモードに切り換え,スクラッチレジスタ を保存する.795 * スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する. 695 796 */ 696 797 cps #CPSR_SVC_MODE 697 stmfd sp!,{r0-r5,r12,lr}798 push {r0-r5,r12,lr} 698 799 #endif /* __TARGET_ARCH_ARM < 6 */ 699 800 mov r4, #EXCNO_DABORT … … 708 809 /* 709 810 * IビットとFビットをセットし,スーパバイザモードに切り換え,スタッ 710 * クポインタを初期化し,スクラッチレジスタ を保存する.811 * クポインタを初期化し,スクラッチレジスタ+αを保存する. 711 812 */ 712 813 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 713 814 ldr sp, =istkpt 714 815 ldr sp, [sp] 715 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 716 717 /* 718 * アボートモードに戻して,戻り番地とspsrを取得する. 816 push {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 817 818 /* 819 * アボートモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を 820 * 取得する. 719 821 */ 720 822 msr cpsr_c, #(CPSR_ABT_MODE AOR CPSR_FIQ_IRQ_BIT) … … 723 825 724 826 /* 725 * スーパバイザモードに切り換え,戻り番地と spsrを保存する.827 * スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する. 726 828 */ 727 829 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 728 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 729 push {r1} /* spsrをスタックに保存 */830 str r2, [sp,#0x20] /* 戻り番地をスタックに保存(pcの場所)*/ 831 push {r1} /* 戻り先のcpsrをスタックに保存 */ 730 832 #else /* __TARGET_ARCH_ARM < 6 */ 731 833 /* … … 738 840 739 841 /* 740 * アボートモードに戻して,戻り 先(lr)とspsr(cpsr_svc)をスーパ741 * バイザモードのスタックに保存する.842 * アボートモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を 843 * スーパバイザモードのスタックに保存する. 742 844 */ 743 845 cps #CPSR_ABT_MODE … … 745 847 746 848 /* 747 * スーパバイザモードに切り換え,スクラッチレジスタ を保存する.849 * スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する. 748 850 */ 749 851 cps #CPSR_SVC_MODE 750 stmfd sp!,{r0-r5,r12,lr}852 push {r0-r5,r12,lr} 751 853 #endif /* __TARGET_ARCH_ARM < 6 */ 752 854 … … 776 878 /* 777 879 * IビットとFビットをセットし,スーパバイザモードに切り換え,スク 778 * ラッチレジスタ を保存する.880 * ラッチレジスタ+αを保存する. 779 881 */ 780 882 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 781 stmfd sp!, {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 782 783 /* 784 * FIQモードに戻して,戻り番地とspsrを取得する. 883 push {r0-r5,r12,lr,pc} /* pcはスペース確保のため */ 884 885 /* 886 * FIQモードに戻して,戻り番地(lr)と戻り先のcpsr(spsr)を取得 887 * する. 785 888 */ 786 889 msr cpsr_c, #(CPSR_FIQ_MODE AOR CPSR_FIQ_IRQ_BIT) … … 789 892 790 893 /* 791 * スーパバイザモードに切り換え,戻り番地と spsrを保存する.894 * スーパバイザモードに切り換え,戻り番地と戻り先のcpsrを保存する. 792 895 */ 793 896 msr cpsr_c, #(CPSR_SVC_MODE AOR CPSR_FIQ_IRQ_BIT) 794 str r2, [sp,#0x20] /* 戻り番地をスタックに保存 795 push {r1} /* spsrをスタックに保存 */897 str r2, [sp,#0x20] /* 戻り番地をスタックに保存(pcの場所)*/ 898 push {r1} /* 戻り先のcpsrをスタックに保存 */ 796 899 #else /* __TARGET_ARCH_ARM < 6 */ 797 900 /* 798 * 戻り 先(lr)とspsr(cpsr_svc)をスーパバイザモードのスタックに799 * 保存する.901 * 戻り番地(lr)と戻り先のcpsr(spsr)をスーパバイザモードのスタッ 902 * クに保存する. 800 903 */ 801 904 srsfd #CPSR_SVC_MODE! 802 905 803 906 /* 804 * スーパバイザモードに切り換え,スクラッチレジスタ を保存する.907 * スーパバイザモードに切り換え,スクラッチレジスタ+αを保存する. 805 908 */ 806 909 cps #CPSR_SVC_MODE 807 stmfd sp!,{r0-r5,r12,lr}910 push {r0-r5,r12,lr} 808 911 #endif /* __TARGET_ARCH_ARM < 6 */ 809 912 mov r4, #EXCNO_FIQ … … 815 918 /* 816 919 * CPU例外ハンドラ出入口処理の共通部分 817 *818 * 【この時点のレジスタ状態】819 * r4:CPU例外ハンドラ番号820 920 */ 821 921 ALABEL(exc_handler_1) 822 922 /* 923 * 【この時点のレジスタ状態】 924 * r4:CPU例外ハンドラ番号 925 * 823 926 * CPU例外が発生した状況の判断に用いるために,CPU例外発生前の割 824 927 * 込み優先度マスクと例外ネストカウントをスタックに保存する. … … 836 939 and r1, sp, #4 837 940 sub sp, sp, r1 838 push {r0,r1} /* r0はスペース確保のため*/839 941 push {r0,r1} /* スタックポインタの調整値を保存 */ 942 /* r0はスペース確保のため */ 840 943 /* 841 944 * カーネル管理外のCPU例外か判定する … … 873 976 #endif /* TOPPERS_SUPPORT_OVRHDR */ 874 977 978 #ifdef USE_ARM_FPU 979 /* 980 * FPUをディスエーブルする. 981 */ 982 vmrs r0, fpexc 983 str r0, [sp] /* FPEXCを保存(r0の場所)*/ 984 bic r0, r0, #FPEXC_ENABLE 985 vmsr fpexc, r0 /* FPEXCを設定 */ 986 #endif /* USE_ARM_FPU */ 987 875 988 /* 876 989 * 非タスクコンテキスト用のスタックに切り換える. … … 890 1003 /* 891 1004 * (必要なら)割込みコントローラを操作する. 1005 * 1006 * irc_begin_excは,スタックトップ(r0の場所)に,irc_end_excで用 1007 * いる情報を保存する. 892 1008 */ 893 1009 bl irc_begin_exc … … 970 1086 mov sp, r3 971 1087 1088 #ifdef USE_ARM_FPU 1089 /* 1090 * FPUを元に戻す. 1091 */ 1092 ldr r0, [sp] /* FPEXCを復帰 */ 1093 vmsr fpexc, r0 1094 #endif /* USE_ARM_FPU */ 1095 972 1096 /* 973 1097 * p_runtskがNULLか判定する. … … 990 1114 */ 991 1115 ALABEL(exc_handler_3) 1116 /* 1117 * 【この時点のレジスタ状態】 1118 * r0:p_runtsk 1119 */ 992 1120 ldr r1, =p_schedtsk /* p_schedtsk → r1 */ 993 1121 ldr r1, [r1] … … 998 1126 * コンテキストを保存する. 999 1127 */ 1000 stmfd sp!, {r6-r11} /* 非スクラッチレジスタの保存 */ 1128 push {r6-r11} /* 残りのレジスタの保存 */ 1129 #ifdef USE_ARM_FPU 1130 ldr r2, [r0,#TCB_p_tinib] /* p_runtsk->p_tinib → r2 */ 1131 ldr r1, [r2,#TINIB_tskatr] /* p_runtsk->p_tinib->tskatr → r1 */ 1132 tst r1, #TA_FPU 1133 beq 1f /* TA_FPU属性でない場合は分岐 */ 1134 #ifdef USE_ARM_FPU_D32 1135 vpush {d16-d31} 1136 #endif /* USE_ARM_FPU_D32 */ 1137 vpush {d0-d15} /* 全FPUレジスタの保存 */ 1138 vmrs r1, fpscr 1139 push {r1,r2} /* FPSCRの保存 */ 1140 1: /* r2はアラインメントのため */ 1141 #endif /* USE_ARM_FPU */ 1001 1142 str sp, [r0,#TCB_sp] /* スタックポインタを保存 */ 1002 1143 adr r1, ret_exc_r /* 実行再開番地を保存 */ … … 1007 1148 /* 1008 1149 * コンテキストを復帰する. 1009 */ 1010 ldmfd sp!, {r6-r11} /* 非スクラッチレジスタの復帰 */ 1150 * 1151 * 【この時点のレジスタ状態】 1152 * r4:p_runtsk(タスク切換え後) 1153 */ 1154 #ifdef USE_ARM_FPU 1155 ldr r2, [r4,#TCB_p_tinib] /* p_runtsk->p_tinib → r2 */ 1156 ldr r1, [r2,#TINIB_tskatr] /* p_runtsk->p_tinib->tskatr → r1 */ 1157 tst r1, #TA_FPU 1158 vmrs r0, fpexc 1159 biceq r0, r0, #FPEXC_ENABLE 1160 orrne r0, r0, #FPEXC_ENABLE 1161 vmsr fpexc, r0 /* FPEXCを設定 */ 1162 beq 1f /* TA_FPU属性でない場合は分岐 */ 1163 pop {r1,r2} /* FPSCRの復帰 */ 1164 vmsr fpscr, r1 1165 vpop {d0-d15} /* 全FPUレジスタの復帰 */ 1166 #ifdef USE_ARM_FPU_D32 1167 vpop {d16-d31} 1168 #endif /* USE_ARM_FPU_D32 */ 1169 1: 1170 #endif /* USE_ARM_FPU */ 1171 pop {r6-r11} /* 残りのレジスタの復帰 */ 1011 1172 1012 1173 ALABEL(exc_handler_4) … … 1031 1192 1032 1193 #if __TARGET_ARCH_ARM < 6 1033 ldmfd sp!, {r0}/* 戻り先のcpsrをspsrに設定 */1194 pop {r0} /* 戻り先のcpsrをspsrに設定 */ 1034 1195 msr spsr_cxsf, r0 1035 1196 ldmfd sp!, {r0-r5,r12,lr,pc}^ /* コンテキストの復帰 */ 1036 1197 /* ^付きなので,spsr → cpsr */ 1037 1198 #else /* __TARGET_ARCH_ARM < 6 */ 1038 ldmfd sp!, {r0-r5,r12,lr}1199 pop {r0-r5,r12,lr} /* スクラッチレジスタ+αの復帰 */ 1039 1200 rfefd sp! 1040 1201 #endif /* __TARGET_ARCH_ARM < 6 */ … … 1061 1222 bne nk_exc_handler_2 /* ならnk_exc_handler_2に分岐 */ 1062 1223 1224 #ifdef USE_ARM_FPU 1225 /* 1226 * FPUをディスエーブルする. 1227 */ 1228 vmrs r0, fpexc 1229 str r0, [sp] /* FPEXCを保存(r0の場所)*/ 1230 bic r0, r0, #FPEXC_ENABLE 1231 vmsr fpexc, r0 /* FPEXCを設定 */ 1232 #endif /* USE_ARM_FPU */ 1233 1063 1234 /* 1064 1235 * 非タスクコンテキスト用のスタックに切り換える. … … 1068 1239 ldr sp, [r2] 1069 1240 push {r0,r3} /* 切換え前のスタックポインタを保存 */ 1070 /* r0は スペース確保のため */1241 /* r0はアラインメントのため */ 1071 1242 ALABEL(nk_exc_handler_2) 1072 1243 /* … … 1101 1272 pop {r0,r3} 1102 1273 mov sp, r3 1274 1275 #ifdef USE_ARM_FPU 1276 /* 1277 * FPUを元に戻す. 1278 */ 1279 ldr r0, [sp] /* FPEXCを復帰 */ 1280 vmsr fpexc, r0 1281 #endif /* USE_ARM_FPU */ 1103 1282 b exc_handler_5 1104 1283 1105 1284 /* 1106 1285 * ステータスレジスタの操作関数
Note:
See TracChangeset
for help on using the changeset viewer.