Mercurial > flash_v2
diff packages/hal/mn10300/am33/current/src/var_misc.c @ 115:6ed91473a1cd ecos-sw-2000-08-21
Merge from eCos master repository on 2000-08-21-22:40:54-BST
| author | jlarmour |
|---|---|
| date | Fri, 25 Aug 2000 17:32:38 +0000 |
| parents | 435cced73e2f |
| children | e0c0827131d1 |
line wrap: on
line diff
--- a/packages/hal/mn10300/am33/current/src/var_misc.c +++ b/packages/hal/mn10300/am33/current/src/var_misc.c @@ -32,7 +32,7 @@ //#####DESCRIPTIONBEGIN#### // // Author(s): nickg -// Contributors: nickg, jlarmour +// Contributors: nickg, jlarmour, dmoseley // Date: 1999-01-21 // Purpose: HAL miscellaneous functions // Description: This file contains miscellaneous functions provided by the @@ -94,6 +94,149 @@ void cyg_hal_dcache_store(CYG_ADDRWORD b } #endif +#ifdef CYGPKG_CYGMON +/*------------------------------------------------------------------------*/ +/* GDB Register functions. */ +#include <cyg/hal/var_arch.h> +#include <cyg/hal/hal_stub.h> + + +int msp_read = 0; + +extern int *_registers_valid; + +void am33_get_gdb_extra_registers(CYG_ADDRWORD *registers, HAL_SavedRegisters *regs) +{ + register CYG_ADDRWORD epsw; + asm volatile (" mov epsw, %0 " : "=r" (epsw) : ); + + registers[15] = regs->e0; + registers[16] = regs->e1; + registers[17] = regs->e2; + registers[18] = regs->e3; + registers[19] = regs->e4; + registers[20] = regs->e5; + registers[21] = regs->e6; + registers[22] = regs->e7; + + registers[26] = regs->mcrh; + registers[27] = regs->mcrl; + registers[28] = regs->mcvf; + + registers[14] = regs->mdrq; + + { + register CYG_ADDRWORD ssp, usp, msp; + asm volatile (" mov usp, %0 " : "=a" (usp) : ); + asm volatile (" mov ssp, %0 " : "=a" (ssp) : ); + if ((epsw & HAL_ARCH_AM33_PSW_ML) == HAL_ARCH_AM33_PSW_ML) + { + // We are running in Monitor mode. Go ahead and read the MSP. + asm volatile (" mov msp, %0 " : "=a" (msp) : ); + msp_read = 1; + } else { + msp = 0; + msp_read = 0; + } + + // Now we need to determine which sp was in effect when we hit this exception, + // since we want the register image to reflect the state at the time of the + // exception. + if ((regs->psw & HAL_ARCH_AM33_PSW_ML) == HAL_ARCH_AM33_PSW_ML) + { + msp = regs->sp; + } + else if ((regs->psw & HAL_ARCH_AM33_PSW_nSL) == 0) + { + ssp = regs->sp; + } + else + { + usp = regs->sp; + } + + registers[23] = ssp; + registers[24] = msp; + registers[25] = usp; + } + + +#ifdef CYGHWR_REGISTER_VALIDITY_CHECKING + { + int i; + + // Initially set all registers to valid + for (i = 0; i < NUMREGS; i++) + _registers_valid[i] = 1; + + if (msp_read == 0) + _registers_valid[MSP] = 0; + + if (fpu_regs_read == 0) + { + for (i = FP_START; i <= FP_END; i++) + _registers_valid[i] = 0; + } + } +#endif +} + +void am33_set_gdb_extra_registers(CYG_ADDRWORD *registers, HAL_SavedRegisters *regs) +{ + regs->e0 = registers[15]; + regs->e1 = registers[16]; + regs->e2 = registers[17]; + regs->e3 = registers[18]; + regs->e4 = registers[19]; + regs->e5 = registers[20]; + regs->e6 = registers[21]; + regs->e7 = registers[22]; + + regs->mcrh = registers[26]; + regs->mcrl = registers[27]; + regs->mcvf = registers[28]; + + regs->mdrq = registers[14]; + + { + register CYG_ADDRWORD ssp, usp, msp; + ssp = registers[23]; + msp = registers[24]; + usp = registers[25]; + if ((registers[11] & HAL_ARCH_AM33_PSW_ML) == HAL_ARCH_AM33_PSW_ML) + { + // We were running in monitor mode. + // Go ahead and manually restore ssp and usp. + // msp will be restored by the rti. + asm volatile (" mov %0, usp " : : "a" (usp)); + asm volatile (" mov %0, ssp " : : "a" (ssp)); + } + else if ((registers[11] & HAL_ARCH_AM33_PSW_nSL) == 0) + { + // We were running in system mode. + // Go ahead and manually restore msp and usp. + // ssp will be restored by the rti. + asm volatile (" mov %0, usp " : : "a" (usp)); + if (msp_read) + { + asm volatile (" mov %0, msp " : : "a" (msp)); + } + } + else + { + // We were running in user mode. + // Go ahead and manually restore msp and ssp. + // usp will be restored by the rti. + asm volatile (" mov %0, ssp " : : "a" (ssp)); + if (msp_read) + { + asm volatile (" mov %0, msp " : : "a" (msp)); + } + } + } + +} +#endif // CYGPKG_CYGMON /*------------------------------------------------------------------------*/ /* End of var_misc.c */
