Mercurial > ecos
changeset 1573:11fd727a3147
* include/variant.inc
fix exr handling.
* src/h8300_h8s.ld
fix typo.
* src/h8s_stub.c
rewrite. use CPU trace support.
* include/variant.inc
single step exception support.
* include/var_arch.h
add EXR read/write support.
| author | asl |
|---|---|
| date | Tue, 06 Apr 2004 20:39:25 +0000 |
| parents | 9be7d4ed9ac1 |
| children | 033147136958 |
| files | packages/hal/h8300/h8s/current/ChangeLog packages/hal/h8300/h8s/current/include/var_arch.h packages/hal/h8300/h8s/current/include/variant.inc packages/hal/h8300/h8s/current/src/h8300_h8s.ld packages/hal/h8300/h8s/current/src/h8s_stub.c packages/hal/h8300/h8s/current/src/var_misc.c |
| diffstat | 6 files changed, 63 insertions(+), 163 deletions(-) [+] |
line wrap: on
line diff
--- a/packages/hal/h8300/h8s/current/ChangeLog +++ b/packages/hal/h8300/h8s/current/ChangeLog @@ -1,3 +1,19 @@ +2004-03-18 Yoshinori Sato <ysato@users.sourceforge.jp> + + * include/variant.inc + fix exr handling. + +2003-12-08 Yoshinori Sato <ysato@users.sourceforge.jp> + + * src/h8300_h8s.ld + fix typo. + * src/h8s_stub.c + rewrite. use CPU trace support. + * include/variant.inc + single step exception support. + * include/var_arch.h + add EXR read/write support. + 2003-03-09 Yoshinori Sato <ysato@users.sourceforge.jp> * New package.
--- a/packages/hal/h8300/h8s/current/include/var_arch.h +++ b/packages/hal/h8300/h8s/current/include/var_arch.h @@ -83,6 +83,15 @@ typedef struct HAL_SavedRegisters CYG_WORD32 pc; } HAL_SavedRegisters; +#define HAL_THREAD_INIT_CONTEXT_EXTRA(_regs_, _id_) \ + {_regs_->exr = 0;} + +#define HAL_GET_GDB_EXTRA_REGISTERS(_regval_,_regs_) \ + {_regval_[10] = (_regs_)->exr;} + +#define HAL_SET_GDB_EXTRA_REGISTERS( _regs_,_regval_) \ + {(_regs_)->exr = _regval_[10];} + // Internal peripheral registers #include <cyg/hal/mod_regs_adc.h> #include <cyg/hal/mod_regs_bsc.h> @@ -95,12 +104,6 @@ typedef struct HAL_SavedRegisters #include <cyg/hal/mod_regs_ppg.h> #include <cyg/hal/mod_regs_wdt.h> -//-------------------------------------------------------------------------- - -#ifndef HAL_THREAD_INIT_CONTEXT_EXTRA -#define HAL_THREAD_INIT_CONTEXT_EXTRA(_regs_, _id_) \ - (_regs_)->exr = 0; -#endif //-------------------------------------------------------------------------- #endif // CYGONCE_HAL_VAR_ARCH_H
--- a/packages/hal/h8300/h8s/current/include/variant.inc +++ b/packages/hal/h8300/h8s/current/include/variant.inc @@ -72,14 +72,14 @@ # CPU state save and restore macros .macro hal_cpu_save_all - subs #4,sp ; reserve space - subs #2,sp + subs #2,sp ; reserve space + subs #4,sp mov.l sp,@-sp stm er0-er3,@-sp stm er4-er6,@-sp sub.w e0,e0 mov.w e0,@(4*9:16,sp) ; clear exr high word - mov.l @(4*10:16,sp),r0 + mov.w @(4*10:16,sp),r0 sub.l er1,er1 mov.b r0h,r1l mov.l er1,@(4*8:16,sp) ; copy ccr @@ -88,18 +88,21 @@ .endm .macro hal_cpu_load_all - mov.w @(4*8+2:16,sp),r0 - mov.w @(4*10:16,sp),r1 - mov.b r0l,r1h - mov.w r1,@(4*10:16,sp) ; set ccr + mov.w @(4*8+2:16,sp),r1 ; load ccr + mov.w @(4*10:16,sp),r0 ; load pc+ccr high word + mov.b r1l,r0h ; replace ccr byte + mov.w r0,@(4*10:16,sp) ; restore pc+ccr high word + mov.w @(4*9+2:16,sp),r0 + mov.b r0l,r0h + mov.w r0,@(4*9+2:16,sp) ; extend exr ldm @sp+,er4-er6 ldm @sp+,er0-er3 add.l #10,sp .endm .macro hal_cpu_save_context - sub.w r2,r2 stc exr,r2l + mov.b r2l,r2h mov.w r2,@-sp hal_cpu_save_all .endm @@ -161,6 +164,12 @@ mov.b r0h,exr .endm + .macro h8300_trap_adjust_pc + mov.l @(40:16,sp),er0 + subs #2,er0 + mov.l er0,@(40:16,sp) + .endm + ##----------------------------------------------------------------------------- # Default interrupt decoding macros.
--- a/packages/hal/h8300/h8s/current/src/h8300_h8s.ld +++ b/packages/hal/h8300/h8s/current/src/h8300_h8s.ld @@ -93,7 +93,7 @@ GROUP(libtarget.a libgcc.a) { FORCE_OUTPUT; *(.gcc_except_table) } \ > _region_ -#if defined(CYGHWR_HAL_H8300_VECTOR_ADDRESS) +#if defined(CYGSEM_HAL_H8300_VECTOR_HOOK) #define SECTION_int_hook_table(_region_, _vma_, _lma_) \ .int_hook_table CYGHWR_HAL_H8300_VECTOR_ADDRESS : _lma_ \ { CYG_LABEL_DEFN(__int_hook_start) = ABSOLUTE (.); \ @@ -130,7 +130,7 @@ GROUP(libtarget.a libgcc.a) #define SECTION_bss(_region_, _vma_, _lma_) \ .bss _vma_ : _lma_ \ { CYG_LABEL_DEFN(__bss_start) = ABSOLUTE (.); \ - *(.scommon) *(.dynbss) *(.bss) *(COMMON) \ + *(.scommon) *(.dynbss) *(.bss.*) *(COMMON) \ CYG_LABEL_DEFN(__bss_end) = ABSOLUTE (.); } \ > _region_
--- a/packages/hal/h8300/h8s/current/src/h8s_stub.c +++ b/packages/hal/h8300/h8s/current/src/h8s_stub.c @@ -65,41 +65,14 @@ #include <cyg/hal/dbg-threads-api.h> // dbg_currthread_id #endif -/*---------------------------------------------------------------------- - * Asynchronous interrupt support - */ - -typedef unsigned short t_inst; - -static struct -{ - t_inst *targetAddr; - t_inst savedInstr; -} asyncBuffer; - -/* Called to asynchronously interrupt a running program. - Must be passed address of instruction interrupted. - This is typically called in response to a debug port - receive interrupt. -*/ - -void -install_async_breakpoint(void *pc) -{ - asyncBuffer.targetAddr = pc; - asyncBuffer.savedInstr = *(t_inst *)pc; - *(t_inst *)pc = (t_inst)HAL_BREAKINST; - __instruction_cache(CACHE_FLUSH); - __data_cache(CACHE_FLUSH); -} - /*--------------------------------------------------------------------*/ /* Given a trap value TRAP, return the corresponding signal. */ int __computeSignal (unsigned int trap_number) { switch (trap_number) { - case 11: + case CYGNUM_HAL_VECTOR_TRACE: + case CYGNUM_HAL_VECTOR_TRAP3: return SIGTRAP; default: return SIGINT; @@ -128,126 +101,27 @@ void set_pc (target_register_t pc) /*---------------------------------------------------------------------- - * Single-step support. Lifted from CygMon. + * Single-step support. */ -#define NUM_SS_BPTS 2 -static target_register_t break_mem [NUM_SS_BPTS] = {0, 0}; -static unsigned short break_mem_data [NUM_SS_BPTS]; - -/* Set a single-step breakpoint at ADDR. Up to two such breakpoints - can be set; WHICH specifies which one to set (0 or 1). */ - -static void -set_single_bp (int which, unsigned char *addr) -{ - if (break_mem[which] == 0) { - break_mem[which] = (target_register_t) addr; - break_mem_data[which] = *(unsigned short *)addr; - *(unsigned short *)addr = HAL_BREAKINST; - } -} - /* Clear any single-step breakpoint(s) that may have been set. */ void __clear_single_step (void) { - int x; - for (x = 0; x < NUM_SS_BPTS; x++) - { - unsigned short* addr = (unsigned short *)break_mem[x]; - if (addr) { - *addr = break_mem_data[x]; - break_mem[x] = 0; - } - } + int exr; + exr = get_register(EXR); + exr &= 0x7f; /* clear T flag */ + put_register(EXR,exr); } /* Set breakpoint(s) to simulate a single step from the current PC. */ -const static unsigned char opcode_length0[]={ - 0x04,0x02,0x04,0x02,0x04,0x02,0x04,0x02, /* 0x58 */ - 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, /* 0x60 */ - 0x02,0x02,0x11,0x11,0x02,0x02,0x04,0x04, /* 0x68 */ - 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, /* 0x70 */ - 0x08,0x04,0x06,0x04,0x04,0x04,0x04,0x04 /* 0x78 */ -}; - -const static unsigned char opcode_length1[]={ - 0x10,0x00,0x00,0x00,0x11,0x00,0x00,0x00, - 0x02,0x00,0x00,0x00,0x04,0x04,0x00,0x04 -}; - -static int insn_length(unsigned char *pc) -{ - if (*pc != 0x01 && (*pc < 0x58 || *pc>=0x80)) - return 2; - else - switch (*pc) { - case 0x01: - switch (*(pc+1) & 0xf0) { - case 0x00: - if (*(pc+2)== 0x78) { - return 10; - } else if (*(pc+2)== 0x6b) { - return (*(pc+3) & 0x20)?8:6; - } else { - return (*(pc+2) & 0x02)?6:4; - } - case 0x40: - return (*(pc+2) & 0x02)?8:6; - default: - return opcode_length1[*(pc+1)>>4]; - } - case 0x6a: - case 0x6b: - return (*(pc+1) & 0x20)?6:4; - default: - return opcode_length0[*pc-0x58]; - } -} - void __single_step (void) { - unsigned int pc = get_register (PC); - unsigned int next; - unsigned int opcode; - - opcode = *(unsigned short *)pc; - next = pc + insn_length((unsigned char *)pc); - if (opcode == 0x5470) { - /* rts */ - unsigned long *sp; - sp = (unsigned long *)get_register(SP); - next = *(sp+2) & 0x00ffffff; - } else if (((opcode & 0xf000) == 0x4000) || ((opcode & 0xff00) == 0x5500)) { - /* b**:8 */ - char dsp; - dsp = (opcode & 0xff); - set_single_bp(1,(unsigned char *)(pc+2+dsp)); - } else if (((opcode & 0xff00) == 0x5800) || ((opcode & 0xff00) == 0x5c00)) { - /* b**:16 */ - short dsp; - dsp = *(short *)(pc+2); - set_single_bp(1,(unsigned char *)(pc+4+dsp)); - } else if ((opcode & 0xfb00) != 0x5800) { - /* jmp / jsr */ - int regs; - const short reg_tbl[]={ER0,ER1,ER2,ER3,ER4,ER5,ER6,SP}; - switch(opcode & 0xfb00) { - case 0x5900: - regs = (opcode & 0x0070) >> 8; - next = get_register(reg_tbl[regs]); - break; - case 0x5a00: - next = *(unsigned long *)(pc) & 0x00ffffff; - break; - case 0x5b00: - next = *(unsigned long *)(opcode & 0xff); - break; - } - } - set_single_bp(0,(unsigned char *)next); + int exr; + exr = get_register(EXR); + exr |= 0x80; /* set T flag */ + put_register(EXR,exr); } void __install_breakpoints (void) @@ -274,13 +148,11 @@ int /* Skip the current instruction. */ +/* only TRAPA instruction */ void __skipinst (void) { - unsigned long pc = get_register (PC); - - pc+=insn_length((unsigned char *)pc); - put_register (PC, (target_register_t) pc); + put_register (PC, get_register(PC) + 2); } #endif // CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
--- a/packages/hal/h8300/h8s/current/src/var_misc.c +++ b/packages/hal/h8300/h8s/current/src/var_misc.c @@ -196,13 +196,13 @@ void hal_interrupt_mask(int vector) { CYG_BYTE ier; - const struct int_regs *regs=&interrupt_registers[vector-12]; + const struct int_regs *regs=&interrupt_registers[vector-CYGNUM_HAL_INTERRUPT_EXTERNAL_0]; if (vector == CYGNUM_HAL_INTERRUPT_WDT) { HAL_READ_UINT8(CYGARC_TCSR,ier); ier &= ~0x20; HAL_WRITE_UINT16(CYGARC_TCSR,0xa500 | ier); } else { - if ((vector > 16) && regs->ier) { + if ((vector >= CYGNUM_HAL_INTERRUPT_EXTERNAL_0) && regs->ier) { HAL_READ_UINT8(regs->ier,ier); ier &= ~(regs->mask); HAL_WRITE_UINT8(regs->ier,ier); @@ -216,13 +216,13 @@ void hal_interrupt_unmask(int vector) { CYG_BYTE ier; - const struct int_regs *regs=&interrupt_registers[vector-12]; + const struct int_regs *regs=&interrupt_registers[vector-CYGNUM_HAL_INTERRUPT_EXTERNAL_0]; if (vector == CYGNUM_HAL_INTERRUPT_WDT) { HAL_READ_UINT8(CYGARC_TCSR,ier); ier |= 0x20; HAL_WRITE_UINT16(CYGARC_TCSR,0xa500 | ier); } else { - if ((vector > 16) && regs->ier) { + if ((vector >= CYGNUM_HAL_INTERRUPT_EXTERNAL_0) && regs->ier) { HAL_READ_UINT8(regs->ier,ier); ier |= regs->mask; HAL_WRITE_UINT8(regs->ier,ier); @@ -236,7 +236,7 @@ void hal_interrupt_acknowledge(int vector) { CYG_BYTE isr; - const struct int_regs *regs=&interrupt_registers[vector-12]; + const struct int_regs *regs=&interrupt_registers[vector-CYGNUM_HAL_INTERRUPT_EXTERNAL_0]; if (vector >= CYGNUM_HAL_INTERRUPT_DEND0A && vector <= CYGNUM_HAL_INTERRUPT_DEND1B) return; @@ -245,7 +245,7 @@ hal_interrupt_acknowledge(int vector) isr &= ~0x80; HAL_WRITE_UINT16(CYGARC_TCSR,0xa500 | isr); } else { - if ((vector > 16) && regs->isr) { + if ((vector >= CYGNUM_HAL_INTERRUPT_EXTERNAL_0) && regs->isr) { HAL_READ_UINT8(regs->isr,isr); isr &= ~(regs->status); HAL_WRITE_UINT8(regs->isr,isr);
