- Timestamp:
- Jan 11, 2012, 7:07:48 PM (11 years ago)
- Location:
- asp_nios2/trunk/arch/nios2_gcc
- Files:
-
- 2 added
- 1 deleted
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
asp_nios2/trunk/arch/nios2_gcc/Makefile.prc
r1 r14 14 14 15 15 # 16 # プロセッサ依存部ディレクトリ名の定義 17 # 18 PRCDIR = $(SRCDIR)/arch/$(PRC)_$(TOOL) 19 20 # 16 21 # コンパイルオプション 17 22 # … … 24 29 # カーネルに関する定義 25 30 # 26 KERNEL_DIR := $(KERNEL_DIR) $( SRCDIR)/arch/$(PRC)_$(TOOL)31 KERNEL_DIR := $(KERNEL_DIR) $(PRCDIR) 27 32 KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) prc_support.o 28 33 KERNEL_COBJS := $(KERNEL_COBJS) prc_config.o avalon_timer.o … … 54 59 # 55 60 kernel_cfg.timestamp: $(SRCDIR)/arch/$(PRC)_$(TOOL)/prc.tf 61 $(OBJFILE): $(PRCDIR)/prc_check.tf 62 63 # 64 # コンフィギュレータ関係の変数の定義 65 # 66 CFG_TABS := $(CFG_TABS) --cfg1-def-table $(PRCDIR)/prc_def.csv 67 68 # 69 # オフセットファイル生成のための定義 70 # 71 OFFSET_TF = $(PRCDIR)/prc_offset.tf -
asp_nios2/trunk/arch/nios2_gcc/prc.tf
r1 r14 29 29 $ 30 30 $INHNO_DEFINH_VALID = INHNO_VALID$ 31 32 $33 $ チェック方法の指定34 $35 $CHECK_STKSZ_ALIGN = 4$36 31 37 32 $ -
asp_nios2/trunk/arch/nios2_gcc/prc_cfg1_out.h
r1 r14 9 9 void sta_ker(void){} 10 10 STK_T *const _kernel_istkpt = 0x00; 11 12 /* 13 * オフセットファイルを生成するための定義 14 */ 15 const uint8_t MAGIC_1 = 0x12; 16 const uint16_t MAGIC_2 = 0x1234; 17 const uint32_t MAGIC_4 = 0x12345678; 18 19 const TCB TCB_enatex = { 20 { NULL, NULL }, /* task_queue */ 21 NULL, /* p_tinib */ 22 0U, /* tstat */ 23 #ifdef TOPPERS_SUPPORT_MUTEX 24 0U, /* bpriority */ 25 #endif /* TOPPERS_SUPPORT_MUTEX */ 26 0U, /* priority */ 27 false, /* acqeue */ 28 false, /* wupque */ 29 true, /* enatex */ 30 0U, /* texprn */ 31 NULL, /* p_winifo */ 32 #ifdef TOPPERS_SUPPORT_MUTEX 33 { NULL, NULL }, /* mutex_queue */ 34 #endif /* TOPPERS_SUPPORT_MUTEX */ 35 { NULL, NULL } /* tskctxb */ 36 }; -
asp_nios2/trunk/arch/nios2_gcc/prc_check.tf
r1 r14 4 4 5 5 $ 6 $ `FbNû@Ìwè7 $8 $CHECK_FUNC_ALIGN = 4$9 $CHECK_FUNC_NONNULL = 1$10 $CHECK_STACK_ALIGN = 4$11 $CHECK_STACK_NONNULL = 1$12 $CHECK_MPF_ALIGN = 4$13 $CHECK_MPF_NONNULL = 1$14 15 $16 6 $ Wev[gt@CÌCN[h 17 7 $ -
asp_nios2/trunk/arch/nios2_gcc/prc_config.h
r1 r14 4 4 * Advanced Standard Profile Kernel 5 5 * 6 * Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory6 * Copyright (C) 2008-2011 by Embedded and Real-Time Systems Laboratory 7 7 * Graduate School of Information Science, Nagoya Univ., JAPAN 8 8 * … … 53 53 54 54 /* 55 * エラーチェック方法の指定 56 */ 57 #define CHECK_STKSZ_ALIGN 8 /* スタックサイズのアライン単位 */ 58 #define CHECK_FUNC_ALIGN 4 /* 関数のアライン単位 */ 59 #define CHECK_FUNC_NONNULL /* 関数の非NULLチェック */ 60 #define CHECK_STACK_ALIGN 4 /* スタック領域のアライン単位 */ 61 #define CHECK_STACK_NONNULL /* スタック領域の非NULLチェック */ 62 #define CHECK_MPF_ALIGN 4 /* 固定長メモリプール領域のアライン単位 */ 63 #define CHECK_MPF_NONNULL /* 固定長メモリプール領域の非NULLチェック */ 64 #define CHECK_MB_ALIGN 4 /* 管理領域のアライン単位 */ 65 66 /* 55 67 * 例外の個数 56 68 */ … … 461 473 462 474 /* 463 * CPU例外の発生した時のコンテキストと割込み/CPUロック状態の参照464 *465 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ466 * ンテキストであり,割込みロック状態でなく,CPUロック状態でない時に467 * true,そうでない時にfalseを返す(CPU例外がカーネル管理外の割込み処468 * 理中で発生した場合にもfalseを返す).469 *470 */471 Inline bool_t472 exc_sense_unlock(void *p_excinf)473 {474 return(!exc_sense_context(p_excinf)475 && !exc_sense_lock(p_excinf)476 && !exc_sense_int_lock(p_excinf));477 }478 479 /*480 475 * プロセッサ依存の初期化 481 476 */ … … 539 534 void *sp; /* スタックポインタ */ 540 535 FP pc; /* プログラムカウンタ */ 541 } CTXB;536 } TSKCTXB; 542 537 543 538 /* -
asp_nios2/trunk/arch/nios2_gcc/prc_kernel.h
r1 r14 54 54 * サポートする機能の定義 55 55 */ 56 #define TOPPERS_ SUPPORT_DIS_INT /* dis_intをサポートする */57 #define TOPPERS_ SUPPORT_ENA_INT /* ena_intをサポートする */58 #define TOPPERS_ SUPPORT_GET_UTM /* get_utmをサポートする */56 #define TOPPERS_TARGET_SUPPORT_DIS_INT /* dis_intをサポートする */ 57 #define TOPPERS_TARGET_SUPPORT_ENA_INT /* ena_intをサポートする */ 58 #define TOPPERS_TARGET_SUPPORT_GET_UTM /* get_utmをサポートする */ 59 59 60 60 /* -
asp_nios2/trunk/arch/nios2_gcc/prc_rename.def
r1 r14 9 9 exch_tbl 10 10 int_bitmap_search_table 11 default_exc_handler 12 default_int_handler 11 13 12 14 prc_initialize -
asp_nios2/trunk/arch/nios2_gcc/prc_rename.h
r1 r14 16 16 #define exch_tbl _kernel_exch_tbl 17 17 #define int_bitmap_search_table _kernel_int_bitmap_search_table 18 #define default_exc_handler _kernel_default_exc_handler 19 #define default_int_handler _kernel_default_int_handler 18 20 19 21 #define prc_initialize _kernel_prc_initialize … … 42 44 #define _exch_tbl __kernel_exch_tbl 43 45 #define _int_bitmap_search_table __kernel_int_bitmap_search_table 46 #define _default_exc_handler __kernel_default_exc_handler 47 #define _default_int_handler __kernel_default_int_handler 44 48 45 49 #define _prc_initialize __kernel_prc_initialize -
asp_nios2/trunk/arch/nios2_gcc/prc_support.S
r1 r14 4 4 * Advanced Standard Profile Kernel 5 5 * 6 * Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory6 * Copyright (C) 2008-2011 by Embedded and Real-Time Systems Laboratory 7 7 * Graduate School of Information Science, Nagoya Univ., JAPAN 8 8 * … … 56 56 57 57 /* 58 * 標準外の例外を用いる 59 */ 60 #define USE_EXTRA_EXCEPTION 61 62 /* 58 63 * スタック操作 : プッシュ 59 64 */ … … 93 98 interrupt: 94 99 addi ea, ea, -4 /* 戻り番地をデクリメント */ 100 95 101 /* 96 102 * コンテキストの保存 … … 117 123 stw ra, 68(sp) 118 124 stw ea, 72(sp) 119 120 /*121 * 多重割込みか判定122 */123 ldw r3, %gprel(except_nest_count)(gp) /* ネスト回数のチェック */124 bltu zero, r3, nest_int125 126 /*127 * スタックポインタの入れ替え128 */129 ldw r2, %gprel(_kernel_istkpt)(gp)130 addi r2, r2, -4131 stw sp, 0(r2) /* スタックポインタの保存 */132 mov sp, r2 /* スタックポインタの入れ替え */133 134 nest_int:135 /*136 * 割込み・例外のネスト回数のインクリメント137 */138 addi r3, r3, 1139 stw r3, %gprel(except_nest_count)(gp)140 125 141 126 /* … … 179 164 180 165 /* 166 * 多重割込みか判定 167 */ 168 ldw r3, %gprel(except_nest_count)(gp) /* ネスト回数のチェック */ 169 bltu zero, r3, nest_int 170 171 /* 172 * スタックポインタの入れ替え 173 */ 174 ldw r2, %gprel(_kernel_istkpt)(gp) 175 addi r2, r2, -4 176 stw sp, 0(r2) /* スタックポインタの保存 */ 177 mov sp, r2 /* スタックポインタの入れ替え */ 178 179 nest_int: 180 /* 181 * 割込み・例外のネスト回数のインクリメント 182 */ 183 addi r3, r3, 1 184 stw r3, %gprel(except_nest_count)(gp) 185 186 /* 181 187 * 割込み要因の割込み優先度を求め(モデル上の)割込み優先度マスクをセット 182 188 * する.またその際,ハンドラ実行前の(モデル上の)割込み優先度マスクを … … 245 251 and r3, r3, r4 246 252 wrctl status, r3 247 test1:248 253 249 254 /* … … 355 360 356 361 /* 357 * 多重割込みか判定 362 * カーネル管理外のCPU例外か判定する 363 * 364 * カーネル管理外のCPU例外は,カーネル実行中,全割込みロック状態, 365 * CPUロック状態,カーネル管理外の割込みハンドラ実行中に発生した 366 * CPU例外である. 367 * Nios2の場合は,PIEが'0'の場合が相当する. 368 */ 369 rdctl r3, estatus 370 andi r3, r3, STATUS_PIE 371 beq r3, zero, kernel_unc_exception 372 373 /* 374 * 例外発生元のコンテキストを判定 358 375 */ 359 376 ldw r3, %gprel(except_nest_count)(gp) /* ネスト回数のチェック */ … … 361 378 362 379 /* 363 * スタックポインタの入れ替え380 * 発生元がタスクの場合はスタックポインタの入れ替え 364 381 */ 365 382 ldw r2, %gprel(_kernel_istkpt)(gp) … … 376 393 377 394 /* 378 * CPU例外 番号の取得(4倍されている)395 * CPU例外ハンドラ番号の取得(4倍されている) 379 396 */ 380 397 #ifdef USE_EXTRA_EXCEPTION … … 420 437 421 438 /* 422 * 例外発生時CPUロック状態でなければCPUロック解除状態とする 423 */ 424 rdctl r3, estatus 425 andi r3, r3, STATUS_PIE 426 beq r3, zero, call_exc_handler 439 * CPUロック解除状態とする 440 */ 427 441 rdctl r3, status 428 442 ori r3, r3, STATUS_PIE … … 431 445 call_exc_handler: 432 446 #ifdef LOG_EXC_ENTER 433 Push r6 /* CPU例外 番号保存*/447 Push r6 /* CPU例外ハンドラ番号保存 */ 434 448 Push r5 /* CPU例外ハンドラアドレス保存 */ 435 449 Push r4 /* CPU例外フレームの先頭番地保存 */ 436 mov r4, r6 /* CPU例外 番号を引数に*/450 mov r4, r6 /* CPU例外ハンドラ番号を引数に */ 437 451 call log_exc_enter 438 452 Pop r4 /* CPU例外フレームの先頭番地復帰 */ … … 446 460 447 461 #ifdef LOG_EXC_LEAVE 448 Pop r4 /* CPU例外 番号復帰*/462 Pop r4 /* CPU例外ハンドラ番号復帰 */ 449 463 call log_exc_leave 450 464 #endif /* LOG_EXC_LEAVE */ … … 550 564 beq r6, zero, ret_int_4 /* enatex が false ならリターン */ 551 565 ldw r7, TCB_texptn(r4) /* r7 <- texptn, texptnが0でなければ */ 552 beq zero, r7, ret_int_4 566 beq zero, r7, ret_int_4 567 ldw r7, %gprel(ipmflg)(gp) /* r7 <- ipmflg */ 568 beq zero, r7, ret_int_4 /* ipmflgがfalseであればリターン */ 553 569 call call_texrtn /* タスク例外ルーチンの呼び出し */ 554 570 … … 577 593 eret 578 594 595 /* 596 * カーネル管理外のCPU例外の出入口処理 597 */ 598 kernel_unc_exception: 599 /* 600 * 例外発生元のコンテキストを判定 601 */ 602 ldw r3, %gprel(except_nest_count)(gp) /* ネスト回数のチェック */ 603 bltu zero, r3, nest_int_exc 604 605 /* 606 * 発生元がタスクの場合はスタックポインタの入れ替え 607 */ 608 ldw r2, %gprel(_kernel_istkpt)(gp) 609 addi r2, r2, -4 610 stw sp, 0(r2) /* スタックポインタの保存 */ 611 mov sp, r2 /* スタックポインタの入れ替え */ 612 613 nest_int_kernel_unc_exc: 614 /* 615 * 割込み・例外のネスト回数のインクリメント 616 */ 617 addi r4, r3, 1 618 stw r4, %gprel(except_nest_count)(gp) 619 620 /* 621 * CPU例外ハンドラ番号の取得(4倍されている) 622 */ 623 #ifdef USE_EXTRA_EXCEPTION 624 rdctl r5, exception 625 #else 626 mov r5, zero 627 #endif /* USE_EXTRA_EXCEPTION */ 628 srli r6, r5, 2 629 630 /* 631 * 割込み発生前の割込み優先度マスクをスタックに保存 632 */ 633 ldbu r2, %gprel(iipm)(gp) 634 Push r2 635 636 /* 637 * 例外フレームの作成 オフセット 638 * 例外番号 0 639 * ESTATUS(et) 4 640 * 割込み・例外ネストカウント(r3) 8 641 * 戻りアドレス 12 642 * 割込み優先度マスク(iipm) 16 643 */ 644 addi sp, sp, -20 645 stw r6, 0(sp) 646 stw et, 4(sp) 647 stw r3, 8(sp) 648 stw ea, 12(sp) 649 stw r2, 16(sp) 650 651 /* 652 * 例外フレームの先頭番地をCPU例外ハンドラの引数に設定(r4) 653 */ 654 mov r4, sp 655 656 /* 657 * 例外ハンドラアドレスの取得 658 */ 659 movhi r2, %hiadj(exch_tbl) 660 addi r2, r2, %lo(exch_tbl) 661 add r2, r2, r5 662 ldw r5, 0(r2) 663 664 /* 665 * CPU例外ハンドラ呼び出し 666 */ 667 callr r5 668 669 /* 670 * 割込み禁止 671 */ 672 rdctl r3, status 673 movi r4, ~STATUS_PIE 674 and r3, r3, r4 675 wrctl status, r3 676 677 /* 678 * 例外フレームを捨てる 679 */ 680 addi sp, sp, 20 681 682 /* 683 * (モデル上の)割込み優先度マスクを元に戻す 684 */ 685 Pop r3 /* 割込み前の(モデル上の)割込み優先度マスクを取得 */ 686 stb r3, %gprel(iipm)(gp) /* (モデル上の)割込み優先度マスクをセット */ 687 slli r3, r3, 2 /* 割込み優先度マスクを4倍してオフセットを生成 */ 688 movhi r2, %hiadj(iipm_mask_tbl) /* 割込み優先度マスクに対応した割込み禁止パターンを取得 */ 689 addi r2, r2, %lo(iipm_mask_tbl) 690 add r2, r2, r3 691 ldw r5, 0(r2) 692 ldw r8, %gprel(idf)(gp) /* 各割込みの割込み要求禁止フラグの状態を取得 */ 693 nor r8, r8, r5 /* 両者のORの否定を生成 */ 694 wrctl ienable, r8 /* 指定した割り込みのみ許可 */ 695 696 /* 697 * 割込み・例外のネスト回数のデクリメント 698 */ 699 ldw r3, %gprel(except_nest_count)(gp) 700 addi r3, r3, -1 701 stw r3, %gprel(except_nest_count)(gp) 702 703 bltu zero, r3, ret_int_1_kernel_unc_exc /* ネスト回数が1以上ならスタックポインタを変更しない */ 704 705 ldw r2, 0(sp) /* スタックポインタを戻す */ 706 mov sp, r2 707 708 ret_int_1_kernel_unc_exc: 709 ldw et, 0(sp) /* レジスタの復帰 */ 710 wrctl estatus, et 711 ldw at, 4(sp) 712 ldw r2, 8(sp) 713 ldw r3, 12(sp) 714 ldw r4, 16(sp) 715 ldw r5, 20(sp) 716 ldw r6, 24(sp) 717 ldw r7, 28(sp) 718 ldw r8, 32(sp) 719 ldw r9, 36(sp) 720 ldw r10, 40(sp) 721 ldw r11, 44(sp) 722 ldw r12, 48(sp) 723 ldw r13, 52(sp) 724 ldw r14, 56(sp) 725 ldw r15, 60(sp) 726 ldw fp, 64(sp) 727 ldw ra, 68(sp) 728 ldw ea, 72(sp) 729 addi sp, sp, 76 730 eret 579 731 580 732 /* … … 631 783 beq r6, zero, dispatch_r_1 /* enatex が false ならリターン */ 632 784 ldw r7, TCB_texptn(r4) /* r7 <- texptn, texptnが0でなければ */ 633 beq r7, zero, dispatch_r_1 785 beq r7, zero, dispatch_r_1 786 ldw r7, %gprel(ipmflg)(gp) /* r7 <- ipmflg */ 787 beq zero, r7, dispatch_r_1 /* ipmflgがfalseであればリターン */ 634 788 call call_texrtn /* タスク例外ルーチンの呼び出し */ 635 789 … … 767 921 ldw r4, TINIB_exinf(r3) /* r4 <- 引数(exinf) */ 768 922 ldw r2, TINIB_task(r3) /* r2 <- タスクの実行番地 */ 769 addi sp, sp, 8770 923 movhi ra, %hiadj(ext_tsk) 771 924 addi ra, ra, %lo(ext_tsk) -
asp_nios2/trunk/arch/nios2_gcc/prc_unrename.h
r1 r14 17 17 #undef exch_tbl 18 18 #undef int_bitmap_search_table 19 #undef default_exc_handler 20 #undef default_int_handler 19 21 20 22 #undef prc_initialize … … 43 45 #undef _exch_tbl 44 46 #undef _int_bitmap_search_table 47 #undef _default_exc_handler 48 #undef _default_int_handler 45 49 46 50 #undef _prc_initialize
Note:
See TracChangeset
for help on using the changeset viewer.