# HG changeset patch # User asl # Date 1081283569 0 # Node ID 10851723ceff49541cfdcb8e95e8622c9391c175 # Parent 2789038a5ebb0e12d46488296eaabe0cb385051e * src/context.S fix broken ccr from context save. * src/redboot_linux_exec.c fix build error of undefined "CYGDAT_REDBOOT_H8300_LINUX_COMMAND_START" * src/sci.c delete waste code. * src/vectors.S add CYGSEM_HAL_SAVE_STUB_VECTOR. saved parent gdb-stub breakpoint vector. * cdl/hal_h8300.cdl add CYGSEM_HAL_SAVE_STUB_VECTOR move CYGSEM_HAL_H8300_VECTOR_HOOK from target cdl's * src/vector.S add runtime vector setup. add trace exception pc adjust. diff --git a/packages/hal/h8300/arch/current/ChangeLog b/packages/hal/h8300/arch/current/ChangeLog --- a/packages/hal/h8300/arch/current/ChangeLog +++ b/packages/hal/h8300/arch/current/ChangeLog @@ -1,3 +1,28 @@ +2004-03-18 Yoshinori Sato + + * src/context.S + fix broken ccr from context save. + * src/redboot_linux_exec.c + fix build error of undefined "CYGDAT_REDBOOT_H8300_LINUX_COMMAND_START" + * src/sci.c + delete waste code. + +2004-02-24 Yoshinori Sato + + * src/vectors.S + add CYGSEM_HAL_SAVE_STUB_VECTOR. + saved parent gdb-stub breakpoint vector. + * cdl/hal_h8300.cdl + add CYGSEM_HAL_SAVE_STUB_VECTOR + move CYGSEM_HAL_H8300_VECTOR_HOOK from target cdl's + +2003-12-04 Yoshinori Sato + + * src/vector.S + add runtime vector setup. + add trace exception pc adjust. + + 2003-07-10 Nick Garnett * : Added Yoshinori Sato's changes, see following diff --git a/packages/hal/h8300/arch/current/cdl/hal_h8300.cdl b/packages/hal/h8300/arch/current/cdl/hal_h8300.cdl --- a/packages/hal/h8300/arch/current/cdl/hal_h8300.cdl +++ b/packages/hal/h8300/arch/current/cdl/hal_h8300.cdl @@ -111,22 +111,6 @@ cdl_package CYGPKG_HAL_H8300 { description " This option uClinux kernel entry address of default." } - - cdl_option CYGDAT_REDBOOT_H8300_LINUX_COMMAND_START { - display "Default kernel command line start address" - flavor data - default_value 0x5ffe00 - description " - This option uClinux kernel command line start address of default." - } - - cdl_option CYGDAT_REDBOOT_H8300_LINUX_BOOT_COMMAND_LINE { - display "Default command line" - flavor data - default_value { "console=/dev/ttyS1" } - description " - This option uClinux kernel startup command line of default." - } } } cdl_option CYGNUM_HAL_H8300_SCI_BAUD_RATE { @@ -135,4 +119,21 @@ cdl_package CYGPKG_HAL_H8300 { legal_values { 4800 9600 14400 19200 38400 57600 115200 } default_value { 38400 } } + cdl_option CYGSEM_HAL_H8300_VECTOR_HOOK { + display "Interrupt Vector Hook" + flavor bool + default_value 1 + parent CYGPKG_HAL_ROM_MONITOR + description " + Interrupt Vector Table Hooking Support" + } + cdl_option CYGSEM_HAL_H8300_SAVE_STUB_VECTOR { + display "Save gdb-stub breakpoint vector" + flavor bool + default_value 0 + parent CYGPKG_HAL_ROM_MONITOR + description " + Do not change vector of the breakpoint exception that + gdb-stub uses" + } } diff --git a/packages/hal/h8300/arch/current/include/h8300_stub.h b/packages/hal/h8300/arch/current/include/h8300_stub.h --- a/packages/hal/h8300/arch/current/include/h8300_stub.h +++ b/packages/hal/h8300/arch/current/include/h8300_stub.h @@ -75,7 +75,7 @@ enum regnames { enum regnames { ER6,ER5,ER4,ER3,ER2,ER1,ER0, - SP, EXR,CCR,PC + SP, CCR,PC ,EXR }; #endif diff --git a/packages/hal/h8300/arch/current/include/hal_arch.h b/packages/hal/h8300/arch/current/include/hal_arch.h --- a/packages/hal/h8300/arch/current/include/hal_arch.h +++ b/packages/hal/h8300/arch/current/include/hal_arch.h @@ -92,8 +92,8 @@ externC cyg_uint32 hal_msbit_index(cyg_u #define HAL_THREAD_INIT_CONTEXT( _sp_, _thread_, _entry_, _id_ ) \ { \ register HAL_SavedRegisters *_regs_; \ - _regs_ = (HAL_SavedRegisters *)(((CYG_ADDRWORD)(_sp_)&~15) - \ - sizeof(HAL_SavedRegisters)*2); \ + _regs_ = (HAL_SavedRegisters *)(((CYG_ADDRWORD)(_sp_)) - \ + sizeof(HAL_SavedRegisters)); \ HAL_THREAD_INIT_CONTEXT_EXTRA(_regs_, _id_); \ _regs_->er0 = (CYG_WORD)(_thread_); \ _regs_->er1 = (_id_)|0xddd1; \ @@ -199,7 +199,7 @@ asm volatile (" .globl " __HAL_BREAKPOI (_regs_)->er4 = _regval_[4]; \ (_regs_)->er5 = _regval_[5]; \ (_regs_)->er6 = _regval_[6]; \ - \ + (_regs_)->sp = _regval_[7]; \ (_regs_)->ccr = _regval_[8]; \ (_regs_)->pc = (_regval_[9] & 0xffffff); \ \ diff --git a/packages/hal/h8300/arch/current/src/context.S b/packages/hal/h8300/arch/current/src/context.S --- a/packages/hal/h8300/arch/current/src/context.S +++ b/packages/hal/h8300/arch/current/src/context.S @@ -68,11 +68,14 @@ #------------------------------------------------------------------------------ # hal_thread_switch_context # Switch thread contexts -# D0 = address of sp of next thread to execute -# D1 = address of sp save location of current thread +# er0 = address of sp of next thread to execute +# er1 = address of sp save location of current thread .global CYG_LABEL_DEFN(hal_thread_switch_context) CYG_LABEL_DEFN(hal_thread_switch_context): + mov.w @sp,r2 ; save ccr + stc ccr,r2h + mov.w r2,@sp hal_cpu_save_context mov.l sp,@er1 diff --git a/packages/hal/h8300/arch/current/src/redboot_linux_exec.c b/packages/hal/h8300/arch/current/src/redboot_linux_exec.c --- a/packages/hal/h8300/arch/current/src/redboot_linux_exec.c +++ b/packages/hal/h8300/arch/current/src/redboot_linux_exec.c @@ -58,14 +58,7 @@ #define xstr(s) str(s) #define str(s...) #s -static void do_exec(int argc, char *argv[]); -RedBoot_cmd("exec", - "Execute an image", - "[-b ] [-c \"kernel command line\"]\n" - " []", - do_exec - ); - +#if defined(CYGDAT_REDBOOT_H8300_LINUX_COMMAND_START) static void do_exec(int argc, char *argv[]) { @@ -80,9 +73,9 @@ do_exec(int argc, char *argv[]) int oldints; init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM, - (void **)&command_addr, &command_addr_set, "command line address"); + &command_addr, &command_addr_set, "command line address"); init_opts(&opts[1], 'c', true, OPTION_ARG_TYPE_STR, - (void **)&cmd_line, &command_line_set, "kernel command line"); + &cmd_line, &command_line_set, "kernel command line"); if (!scan_opts(argc, argv, 1, opts, 2, (void *)&entry, OPTION_ARG_TYPE_NUM, "entry address")) @@ -105,3 +98,75 @@ do_exec(int argc, char *argv[]) asm ("jmp @%0" : : "r" (entry)); } + +RedBoot_cmd("exec", + "Execute an image", + "[-b ] [-c \"kernel command line\"]\n" + " []", + do_exec + ); +#endif + +static void +do_set_mem(int argc, char *argv[]) +{ + struct option_info opts[5]; + unsigned long base, data; + bool base_set, data_set,len_set = 0; + static char _size = 1; + bool set_32bit, set_16bit, set_8bit; + + init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM, + &base, (bool *)&base_set, "base address"); + init_opts(&opts[1], 'd', true, OPTION_ARG_TYPE_NUM, + &data, (bool *)&data_set, "write_data"); + init_opts(&opts[2], '4', false, OPTION_ARG_TYPE_FLG, + &set_32bit, (bool *)0, "dump 32 bit units"); + init_opts(&opts[3], '2', false, OPTION_ARG_TYPE_FLG, + &set_16bit, (bool *)0, "dump 16 bit units"); + init_opts(&opts[4], '1', false, OPTION_ARG_TYPE_FLG, + &set_8bit, (bool *)0, "dump 8 bit units"); + if (!scan_opts(argc, argv, 1, opts, 5, 0, 0, "")) { + return; + } + if (!base_set) { + diag_printf("illigal base\n"); + return ; + } + + if (!data_set) { + diag_printf("illigal data\n"); + return ; + } + + if (set_32bit) { + _size = 4; + } else if (set_16bit) { + _size = 2; + } else if (set_8bit) { + _size = 1; + } + + if (!len_set) { + _size = 4; + } + diag_printf("%d %x = %x\n",_size,base,data); + switch( _size ) { + case 1: + *(unsigned char *)base=data; + break; + case 2: + *(unsigned short *)base=data; + break; + case 4: + *(unsigned long *)base=data; + break; + } +} + +RedBoot_cmd("set", + "Set Memory", + "-b address -[1|2|4] -d data", + do_set_mem + ); + diff --git a/packages/hal/h8300/arch/current/src/sci.c b/packages/hal/h8300/arch/current/src/sci.c --- a/packages/hal/h8300/arch/current/src/sci.c +++ b/packages/hal/h8300/arch/current/src/sci.c @@ -109,7 +109,6 @@ cyg_hal_plf_sci_getc_nonblock(void* __ch // Clear buffer full flag. HAL_WRITE_UINT8(base+_REG_SCSSR, sr & ~CYGARC_REG_SCSSR_RDRF); - return true; } @@ -210,17 +209,11 @@ cyg_hal_plf_sci_control(void *__ch_data, case __COMMCTL_IRQ_ENABLE: irq_state = 1; HAL_INTERRUPT_UNMASK(chan->isr_vector); - HAL_READ_UINT8(chan->base+_REG_SCSCR, scr); - scr |= CYGARC_REG_SCSCR_RIE; - HAL_WRITE_UINT8(chan->base+_REG_SCSCR, scr); break; case __COMMCTL_IRQ_DISABLE: ret = irq_state; irq_state = 0; - HAL_INTERRUPT_UNMASK(chan->isr_vector); - HAL_READ_UINT8(chan->base+_REG_SCSCR, scr); - scr &= ~CYGARC_REG_SCSCR_RIE; - HAL_WRITE_UINT8(chan->base+_REG_SCSCR, scr); + HAL_INTERRUPT_MASK(chan->isr_vector); break; case __COMMCTL_DBG_ISR_VECTOR: ret = chan->isr_vector; diff --git a/packages/hal/h8300/arch/current/src/vectors.S b/packages/hal/h8300/arch/current/src/vectors.S --- a/packages/hal/h8300/arch/current/src/vectors.S +++ b/packages/hal/h8300/arch/current/src/vectors.S @@ -98,17 +98,16 @@ ## Macros for Stack handling when running Cygmon .macro hal_cygmon_switch_app_stack - # +#ifdef CYGPKG_HAL_H8300_H8300H ; Switch to interrupt stack to handle exception - # ; First, save some scratch registers - mov.l er0,@er0_save - mov.l er1,@er1_save + mov.l er0,@-sp + mov.l er1,@-sp ; Copy the exception frame mov.l #__cygmon_interrupt_stack,er0 - mov.l @sp,er1 + mov.l @(8:16,sp),er1 mov.l er1,@-er0 ; Save the pre-exception sp in the register image @@ -116,30 +115,86 @@ ; Actually switch the stack mov.l er0,sp + + mov.l @sp,er0 + adds #4,er0 + adds #4,er0 + mov.l er0,@sp ; Now, restore the scratch registers - mov.l @er0_save,er0 - mov.l @er1_save,er1 + mov.l @(-4:16,er0),er1 + mov.l @(-8:16,er0),er0 +#endif +#ifdef CYGPKG_HAL_H8300_H8S + ; Switch to interrupt stack to handle exception + + ; First, save some scratch registers + stm.l er0-er1,@-sp + + ; Copy the exception frame + mov.l #__cygmon_interrupt_stack,er0 + mov.l @(10,sp:16),er1 + mov.l er1,@-er0 + mov.w @(10,sp:16),r1 + mov.w r1,@-er0 + + ; Save the pre-exception sp in the register image + mov.l sp,@-er0 + + ; Actually switch the stack + mov.l er0,sp + + mov.l @sp,er0 + adds #4,er0 + adds #4,er0 + mov.l er0,@sp + + ; Now, restore the scratch registers + mov.l @(-4:16,er0),er1 + mov.l @(-8:16,er0),er0 +#endif .endm .macro hal_cygmon_restore_app_stack // For cygmon we are switching stacks immediately on exception. // We must wait until the very end before restoring the original stack. +#ifdef CYGPKG_HAL_H8300_H8300H ; Save some scratch registers - mov.l er0,@er0_save - mov.l er1,@er1_save + subs #4,sp + mov.l er0,@-sp + mov.l er1,@-sp ; We need to restore the application stack pointer, but we also ; need to restore the exception frame. - mov.l @sp+,er0 - mov.l @sp+,er1 - mov.l er0,@er1 - mov.l er1,sp // Restore the frame-adjusted SP + mov.l @(12:16,sp),er0 + mov.l @(16:16,sp),er1 + mov.l er1,@er0 + mov.l er0,@(8:16,sp) ; Restore the scratch registers - mov.l @er0_save,er0 - mov.l @er1_save,er1 + mov.l @sp+,er1 + mov.l @sp+,er0 + mov.l @sp+,sp // Restore the frame-adjusted SP +#endif +#ifdef CYGPKG_HAL_H8300_H8S + ; Save some scratch registers + subs #4,sp + stm.l er0-er1,@-sp + + ; We need to restore the application stack pointer, but we also + ; need to restore the exception frame. + mov.l @(12:16,sp),er0 + mov.w @(16:16,sp),r1 + mov.w r1,@er0 + mov.l @(18:16,sp),er1 + mov.l er1,@er0 + mov.l er0,@(8:16,sp) + + ; Restore the scratch registers + ldm.l @sp+,er0-er1 + mov.l @sp+,sp // Restore the frame-adjusted SP +#endif .endm #endif // CYGPKG_CYGMON @@ -155,271 +210,29 @@ .globl reset_vector reset_vector: - ; Reset vector .long CYG_LABEL_DEFN(_start) .long CYG_LABEL_DEFN(_start) - .space 3*4 - .long __interrupt5 - .long __interrupt6 - .long __interrupt7 - .long __interrupt8 - .long __interrupt9 - .long __interrupt10 - .long __interrupt11 - .long __interrupt12 - .long __interrupt13 - .long __interrupt14 - .long __interrupt15 - .long __interrupt16 - .long __interrupt17 - .long __interrupt18 - .long __interrupt19 - .long __interrupt20 - .long __interrupt21 - .long __interrupt22 - .long __interrupt23 - .long __interrupt24 - .long __interrupt25 - .long __interrupt26 - .long __interrupt27 - .long __interrupt28 - .long __interrupt29 - .long __interrupt30 - .long __interrupt31 - .long __interrupt32 - .long __interrupt33 - .long __interrupt34 - .long __interrupt35 - .long __interrupt36 - .long __interrupt37 - .long __interrupt38 - .long __interrupt39 - .long __interrupt40 - .long __interrupt41 - .long __interrupt42 - .long __interrupt43 - .long __interrupt44 - .long __interrupt45 - .long __interrupt46 - .long __interrupt47 - .long __interrupt48 - .long __interrupt49 - .long __interrupt50 - .long __interrupt51 - .long __interrupt52 - .long __interrupt53 - .long __interrupt54 - .long __interrupt55 - .long __interrupt56 - .long __interrupt57 - .long __interrupt58 - .long __interrupt59 - .long __interrupt60 - .long __interrupt61 - .long __interrupt62 - .long __interrupt63 - -#ifdef CYGPKG_HAL_H8300_H8S - .long __interrupt64 - .long __interrupt65 - .long __interrupt66 - .long __interrupt67 - .long __interrupt68 - .long __interrupt69 - .long __interrupt70 - .long __interrupt71 - .long __interrupt72 - .long __interrupt73 - .long __interrupt74 - .long __interrupt75 - .long __interrupt76 - .long __interrupt77 - .long __interrupt78 - .long __interrupt79 - .long __interrupt80 - .long __interrupt81 - .long __interrupt82 - .long __interrupt83 - .long __interrupt84 - .long __interrupt85 - .long __interrupt86 - .long __interrupt87 - .long __interrupt88 - .long __interrupt89 - .long __interrupt90 - .long __interrupt91 - .long __interrupt92 - .long __interrupt93 - .long __interrupt94 - .long __interrupt95 - .long __interrupt96 - .long __interrupt97 - .long __interrupt98 - .long __interrupt99 - .long __interrupt100 - .long __interrupt101 - .long __interrupt102 - .long __interrupt103 - .long __interrupt104 - .long __interrupt105 - .long __interrupt106 - .long __interrupt107 - .long __interrupt108 - .long __interrupt109 - .long __interrupt110 - .long __interrupt111 - .long __interrupt112 - .long __interrupt113 - .long __interrupt114 - .long __interrupt115 - .long __interrupt116 - .long __interrupt117 - .long __interrupt118 - .long __interrupt119 - .long __interrupt120 - .long __interrupt121 - .long __interrupt122 - .long __interrupt123 - .long __interrupt124 - .long __interrupt125 - .long __interrupt126 - .long __interrupt127 -#endif +vector = 2 + .rept CYG_ISR_TABLE_SIZE-2 + .long interrupt_redirect_table+vector*4 +vector = vector + 1 + .endr #endif -#define INTERRUPT_ENTRY(no) \ -__interrupt##no: \ - jsr @interrupt_entry - +#if !defined(CYGSEM_HAL_H8300_VECTOR_HOOK) .section .int_hook_table,"ax" - .space 5*4 -__interrupt_table: -INTERRUPT_ENTRY(5) -INTERRUPT_ENTRY(6) -INTERRUPT_ENTRY(7) -INTERRUPT_ENTRY(8) -INTERRUPT_ENTRY(9) -INTERRUPT_ENTRY(10) -INTERRUPT_ENTRY(11) -INTERRUPT_ENTRY(12) -INTERRUPT_ENTRY(13) -INTERRUPT_ENTRY(14) -INTERRUPT_ENTRY(15) -INTERRUPT_ENTRY(16) -INTERRUPT_ENTRY(17) -INTERRUPT_ENTRY(18) -INTERRUPT_ENTRY(19) -INTERRUPT_ENTRY(20) -INTERRUPT_ENTRY(21) -INTERRUPT_ENTRY(22) -INTERRUPT_ENTRY(23) -INTERRUPT_ENTRY(24) -INTERRUPT_ENTRY(25) -INTERRUPT_ENTRY(26) -INTERRUPT_ENTRY(27) -INTERRUPT_ENTRY(28) -INTERRUPT_ENTRY(29) -INTERRUPT_ENTRY(30) -INTERRUPT_ENTRY(31) -INTERRUPT_ENTRY(32) -INTERRUPT_ENTRY(33) -INTERRUPT_ENTRY(34) -INTERRUPT_ENTRY(35) -INTERRUPT_ENTRY(36) -INTERRUPT_ENTRY(37) -INTERRUPT_ENTRY(38) -INTERRUPT_ENTRY(39) -INTERRUPT_ENTRY(40) -INTERRUPT_ENTRY(41) -INTERRUPT_ENTRY(42) -INTERRUPT_ENTRY(43) -INTERRUPT_ENTRY(44) -INTERRUPT_ENTRY(45) -INTERRUPT_ENTRY(46) -INTERRUPT_ENTRY(47) -INTERRUPT_ENTRY(48) -INTERRUPT_ENTRY(49) -INTERRUPT_ENTRY(50) -INTERRUPT_ENTRY(51) -INTERRUPT_ENTRY(52) -INTERRUPT_ENTRY(53) -INTERRUPT_ENTRY(54) -INTERRUPT_ENTRY(55) -INTERRUPT_ENTRY(56) -INTERRUPT_ENTRY(57) -INTERRUPT_ENTRY(58) -INTERRUPT_ENTRY(59) -INTERRUPT_ENTRY(60) -INTERRUPT_ENTRY(61) -INTERRUPT_ENTRY(62) -INTERRUPT_ENTRY(63) -#ifdef CYGPKG_HAL_H8300_H8S -INTERRUPT_ENTRY(64) -INTERRUPT_ENTRY(65) -INTERRUPT_ENTRY(66) -INTERRUPT_ENTRY(67) -INTERRUPT_ENTRY(68) -INTERRUPT_ENTRY(69) -INTERRUPT_ENTRY(70) -INTERRUPT_ENTRY(71) -INTERRUPT_ENTRY(72) -INTERRUPT_ENTRY(73) -INTERRUPT_ENTRY(74) -INTERRUPT_ENTRY(75) -INTERRUPT_ENTRY(76) -INTERRUPT_ENTRY(77) -INTERRUPT_ENTRY(78) -INTERRUPT_ENTRY(79) -INTERRUPT_ENTRY(80) -INTERRUPT_ENTRY(81) -INTERRUPT_ENTRY(82) -INTERRUPT_ENTRY(83) -INTERRUPT_ENTRY(84) -INTERRUPT_ENTRY(85) -INTERRUPT_ENTRY(86) -INTERRUPT_ENTRY(87) -INTERRUPT_ENTRY(88) -INTERRUPT_ENTRY(89) -INTERRUPT_ENTRY(90) -INTERRUPT_ENTRY(91) -INTERRUPT_ENTRY(92) -INTERRUPT_ENTRY(93) -INTERRUPT_ENTRY(94) -INTERRUPT_ENTRY(95) -INTERRUPT_ENTRY(96) -INTERRUPT_ENTRY(97) -INTERRUPT_ENTRY(98) -INTERRUPT_ENTRY(99) -INTERRUPT_ENTRY(100) -INTERRUPT_ENTRY(101) -INTERRUPT_ENTRY(102) -INTERRUPT_ENTRY(103) -INTERRUPT_ENTRY(104) -INTERRUPT_ENTRY(105) -INTERRUPT_ENTRY(106) -INTERRUPT_ENTRY(107) -INTERRUPT_ENTRY(108) -INTERRUPT_ENTRY(109) -INTERRUPT_ENTRY(110) -INTERRUPT_ENTRY(111) -INTERRUPT_ENTRY(112) -INTERRUPT_ENTRY(113) -INTERRUPT_ENTRY(114) -INTERRUPT_ENTRY(115) -INTERRUPT_ENTRY(116) -INTERRUPT_ENTRY(117) -INTERRUPT_ENTRY(118) -INTERRUPT_ENTRY(119) -INTERRUPT_ENTRY(120) -INTERRUPT_ENTRY(121) -INTERRUPT_ENTRY(122) -INTERRUPT_ENTRY(123) -INTERRUPT_ENTRY(124) -INTERRUPT_ENTRY(125) -INTERRUPT_ENTRY(126) -INTERRUPT_ENTRY(127) +interrupt_redirect_table: +vector = 0 + .rept CYG_ISR_TABLE_SIZE + jsr @interrupt_entry +vector = vector + 1 + .endr +#else + .section .int_hook_table,"x" +interrupt_redirect_table: + .space 4*CYG_ISR_TABLE_SIZE #endif - + ##----------------------------------------------------------------------------- ## Startup code @@ -449,42 +262,74 @@ CYG_LABEL_DEFN(_start): mov.l #CYG_LABEL_DEFN(__ram_data_start),er6 mov.l #CYG_LABEL_DEFN(__ram_data_end),er4 sub.l er6,er4 + shlr2 er4 1: - eepmov.w - dec.w #1,e4 - cmp.w #-1,e4 - bhi 1b + mov.l @er5+,er0 + mov.l er0,@er6 + adds #4,er6 + dec.l #1,er4 + bne 1b #endif #if defined(CYGSEM_HAL_H8300_VECTOR_HOOK) ; Setup Interrupt Vector (virtual) - mov.l #CYG_LABEL_DEFN(__rom_int_hook_table),er5 - mov.l #CYG_LABEL_DEFN(__int_hook_start),er6 - mov.l #CYG_LABEL_DEFN(__int_hook_end),er4 - sub.l er6,er4 -1: - eepmov.w - dec.w #1,e4 - cmp.w #-1,e4 - bhi 1b + + ;; check rom table + mov.l #8*4,er0 + mov.l @er0+,er1 + adds #4,er1 + mov.b #3,r3l +1: + mov.l @er0+,er2 + cmp.l er1,er2 + bne 3f + adds #4,er1 + dec.b r3l + bne 1b + ;; calculate vector address + mov.l @8*4,er0 + and.w #0xff,e0 + sub.l #8*4,er0 + ;; build ram vector + mov.l er0,@__interrupt_table + mov.l #0x5e000000+interrupt_entry,er1 + mov.l #save_vector_table,er3 + mov.b #0,r2l +2: + ;; check saved vector + mov.b @er3+,r2h + cmp.b r2l,r2h + beq 5f + subs #1,er3 + mov.l er1,@er0 +5: + adds #4,er0 + inc.b r2l + cmp.b #CYG_ISR_TABLE_SIZE,r2l + bcs 2b + bra 4f +3: + bra 3b +4: + +#else + mov.l #interrupt_redirect_table,er0 + mov.l er0,@__interrupt_table #endif ; Clear BSS mov.l #CYG_LABEL_DEFN(__bss_start),er5 - mov.l er5,er6 - adds #1,er6 mov.l #CYG_LABEL_DEFN(__bss_end),er4 sub.l #CYG_LABEL_DEFN(__bss_start),er4 - - mov.b #0,r0l - mov.b r0l,@er5 -1: - eepmov.w - dec.w #1,e4 - cmp.w #-1,e4 - bhi 1b - + shlr2 er4 + sub.l er0,er0 +1: + mov.l er0,@er5 + adds #4,er5 + dec.l #1,er4 + bne 1b + ; Call variant and platform HAL ; initialization routines. @@ -520,14 +365,26 @@ 1: 9: bra 9b ; Loop if we return +save_vector_table: +#if defined(CYGSEM_HAL_H8300_SAVE_STUB_VECTOR) + .byte 5,11 +#if defined(CYGPKG_HAL_H8300_SAVED_VECTORS) + h8300_save_vectors +#endif +#endif + .byte 0 ; end maker + .align 2 + interrupt_entry: mov.l er0,@-sp - mov.l @(4,sp),er0 - sub.l #__interrupt_table,er0 - shlr.l er0 - shlr.l er0 - add.w #5-1,r0 + mov.l @(4:16,sp),er0 ; interrupt vector offset + mov.l er1,@-sp + mov.l @__interrupt_table,er1 + sub.l er1,er0 + shlr2 er0 + dec.l #1,er0 mov.l er0,@CYG_LABEL_DEFN(_intvector) + mov.l @sp+,er1 mov.l @sp+,er0 adds #4,sp #ifdef CYGPKG_CYGMON @@ -711,6 +568,9 @@ CYG_LABEL_DEFN(_intvector): .global __lastpc __lastpc: .long 0 +__interrupt_table: + .long 0 + .text ##----------------------------------------------------------------------------- ## Execute pending DSRs on the interrupt stack with interrupts enabled. @@ -724,14 +584,6 @@ CYG_LABEL_DEFN(hal_interrupt_stack_call_ h8300_var_call_pending_DSR #endif -#ifdef CYGPKG_CYGMON - .section .bss -er0_save: - .long 0 -er1_save: - .long 0 -#endif - ##----------------------------------------------------------------------------- ## Default TRAP VSR @@ -742,12 +594,12 @@ CYG_LABEL_DEFN(__default_trap_vsr): #ifdef CYG_HAL_DIAG_EXCPT_END hal_diag_excpt_start #endif - mov.l @(32,sp),er0 - subs #2,er0 - mov.l er0,@(32,sp) + mov.l @CYG_LABEL_DEFN(_intvector),er1 + cmp.l #11,er1 ; Adjust trap entry address + bne 1f + h8300_trap_adjust_pc +1: mov.l sp,er0 - mov.l @CYG_LABEL_DEFN(_intvector),er1 - jsr @CYG_LABEL_DEFN(cyg_hal_exception_handler) #ifdef CYG_HAL_DIAG_EXCPT_END