Mercurial > ecos-v2_0-branch
diff packages/hal/mips/jmr3904/current/src/plf_misc.c @ 10:d3fbcdfa1b2f ecos-sw-1999-05-29
Merge from eCos master repository on 1999-05-29-00:13:11-BST
| author | jlarmour |
|---|---|
| date | Fri, 28 May 1999 16:43:09 +0000 |
| parents | d376b777e2ce |
| children | 7253dcc42a09 |
line wrap: on
line diff
--- a/packages/hal/mips/jmr3904/current/src/plf_misc.c +++ b/packages/hal/mips/jmr3904/current/src/plf_misc.c @@ -87,18 +87,13 @@ void hal_platform_init(void) #endif -#if 0 -#if defined(CYG_HAL_USE_ROM_MONITOR) && \ - !defined(CYGDBG_INFRA_DIAG_USE_DEVICE) && \ - defined(CYG_HAL_TX39_JMR3904) - +#if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) { - static void hal_init_ctrlc_intr(void); - hal_init_ctrlc_intr(); + void hal_ctrlc_isr_init(void); + hal_ctrlc_isr_init(); } #endif -#endif #if defined(CYGFUN_HAL_COMMON_KERNEL_SUPPORT) && \ defined(CYG_HAL_USE_ROM_MONITOR) && \ @@ -124,38 +119,46 @@ cyg_bool cyg_hal_is_break(char *buf, int void cyg_hal_user_break( CYG_ADDRWORD *regs ) { -#if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) +#if defined(CYG_HAL_USE_ROM_MONITOR) && defined(CYG_HAL_USE_ROM_MONITOR_CYGMON) + // The following code should be at the very start of this function so + // that it can access the RA register before it is saved and reused. + register CYG_WORD32 ra; + asm volatile ( "move %0,$31;" : "=r" (ra) ); +#endif + +#if defined(CYG_HAL_USE_ROM_MONITOR) && defined(CYG_HAL_USE_ROM_MONITOR_CYGMON) - // Ctrl-C: breakpoint. - extern void breakpoint(void); - breakpoint(); - -#elif defined(CYG_HAL_USE_ROM_MONITOR) && defined(CYG_HAL_USE_ROM_MONITOR_GDB_STUBS) + { + typedef void install_bpt_fn(void *epc); + CYG_WORD32 pc; + HAL_SavedRegisters *sreg = (HAL_SavedRegisters *)regs; + install_bpt_fn *ibp = (install_bpt_fn *)hal_vsr_table[35]; - // Ctrl-C: breakpoint. - typedef void bpt_fn(void); - bpt_fn *bfn = ((bpt_fn **)0x80000100)[61]; - bfn(); + if( regs == NULL ) pc = ra; + else pc = sreg->pc; + + if( ibp != NULL ) ibp((void *)pc); + } + +#elif defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) -#elif defined(CYG_HAL_USE_ROM_MONITOR) && defined(CYG_HAL_USE_ROM_MONITOR_CYGMON) + { + extern void breakpoint(void); + breakpoint(); + } + +#else - // Ctrl-C: breakpoint. - typedef void install_bpt_fn(void *epc); - HAL_SavedRegisters *sreg = (HAL_SavedRegisters *)regs; - install_bpt_fn *ibp = (install_bpt_fn *)hal_vsr_table[35]; - if( ibp != NULL ) ibp((void *)sreg->pc); + HAL_BREAKPOINT(breakinst); #endif } /*------------------------------------------------------------------------*/ -/* This code installs an interrupt handler to capture Ctrl-C. */ +/* Control C ISR support */ -#if 0 -#if defined(CYG_HAL_USE_ROM_MONITOR) && \ - !defined(CYGDBG_INFRA_DIAG_USE_DEVICE) && \ - defined(CYG_HAL_TX39_JMR3904) +#if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) #define DIAG_BASE 0xfffff300 #define DIAG_SLCR (DIAG_BASE+0x00) @@ -171,11 +174,27 @@ void cyg_hal_user_break( CYG_ADDRWORD *r #define BRG_T2 0x0100 #define BRG_T4 0x0200 #define BRG_T5 0x0300 + +struct Hal_SavedRegisters *hal_saved_interrupt_state; + +void hal_ctrlc_isr_init(void) +{ + CYG_WORD16 dicr; -static cyg_uint32 hal_ctrlc_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data, CYG_ADDRWORD regs) + HAL_READ_UINT16( DIAG_SLDICR , dicr ); + dicr = 0x0001; + HAL_WRITE_UINT16( DIAG_SLDICR , dicr ); + + HAL_INTERRUPT_SET_LEVEL( CYGHWR_HAL_GDB_PORT_VECTOR, 1 ); + HAL_INTERRUPT_UNMASK( CYGHWR_HAL_GDB_PORT_VECTOR ); +} + +cyg_uint32 hal_ctrlc_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data) { char c; CYG_WORD16 disr; + + HAL_INTERRUPT_ACKNOWLEDGE( CYGHWR_HAL_GDB_PORT_VECTOR ); HAL_READ_UINT16( DIAG_SLDISR , disr ); @@ -189,28 +208,12 @@ static cyg_uint32 hal_ctrlc_isr(CYG_ADDR HAL_WRITE_UINT16( DIAG_SLDISR , disr ); if( cyg_hal_is_break( &c , 1 ) ) - cyg_hal_user_break( regs ); + cyg_hal_user_break( (CYG_ADDRWORD *)hal_saved_interrupt_state ); } return 0; } - -static void hal_init_ctrlc_intr(void) -{ - CYG_WORD16 dicr; - - HAL_INTERRUPT_ATTACH( CYGNUM_HAL_INTERRUPT_SIO_0, hal_ctrlc_isr, NULL, - NULL ); - - HAL_INTERRUPT_UNMASK( CYGNUM_HAL_INTERRUPT_SIO_0 ); - - HAL_READ_UINT16( DIAG_SLDICR , dicr ); - dicr = 0x0001; - HAL_WRITE_UINT16( DIAG_SLDICR , dicr ); -} - -#endif #endif /*------------------------------------------------------------------------*/
