Mercurial > nand-ecoscentric
diff packages/hal/common/current/src/hal_stub.c @ 112:02ea4320376c ecos-sw-2000-07-21
Merge from eCos master repository on 2000-07-21-21:01:39-BST
| author | jlarmour |
|---|---|
| date | Fri, 21 Jul 2000 21:34:11 +0000 |
| parents | 84e4bde58b26 |
| children | 6ed91473a1cd |
line wrap: on
line diff
--- a/packages/hal/common/current/src/hal_stub.c +++ b/packages/hal/common/current/src/hal_stub.c @@ -63,6 +63,11 @@ #include <cyg/hal/dbg-threads-api.h> // dbg_currthread_id #endif +#ifdef USE_LONG_NAMES_FOR_ENUM_REGNAMES +#define PC REG_PC +#define SP REG_SP +#endif + //----------------------------------------------------------------------------- // Extra eCos data. @@ -579,10 +584,6 @@ unsigned long } #endif -// FIXME: Add support for multiple breakpoints (libstub/bplist-dynamic.c) -int __set_breakpoint (target_register_t addr) { return 0; } -int __remove_breakpoint (target_register_t addr) { return 0; } - //----------------------------------------------------------------------------- // Write the 'T' packet in BUFFER. SIGVAL is the signal the program received. void @@ -590,9 +591,6 @@ void { target_register_t addr; char *ptr = buf; - target_register_t sp; - - sp = (target_register_t) get_register (SP); *ptr++ = 'T'; *ptr++ = __tohex (sigval >> 4); @@ -636,13 +634,54 @@ void *ptr++ = __tohex (PC); *ptr++ = ':'; addr = get_register (PC); +#ifdef CYGARC_REGSIZE_DIFFERS_FROM_TARGET_REGISTER_T + ptr = __mem2hex((char *)&addr, ptr, sizeof(addr), 0); + if (sizeof(addr) < REGSIZE(PC)) + { + // GDB is expecting REGSIZE(PC) number of bytes. + // We only have sizeof(addr) number. Let's fill + // the appropriate number of bytes intelligently. + target_register_t extend_val = 0; +#ifdef CYGARC_SIGN_EXTEND_REGISTERS + { + unsigned long bits_in_addr = (sizeof(addr) << 3); // ie Size in bytes * 8 + target_register_t sign_bit_mask = (1 << (bits_in_addr - 1)); + if ((addr & sign_bit_mask) == sign_bit_mask) + extend_val = ~0; + } +#endif + ptr = __mem2hex((char *)&extend_val, ptr, REGSIZE(PC) - sizeof(addr), 0); + } +#else ptr = __mem2hex((char *)&addr, ptr, REGSIZE(PC), 0); +#endif *ptr++ = ';'; *ptr++ = __tohex (SP >> 4); *ptr++ = __tohex (SP); *ptr++ = ':'; - ptr = __mem2hex((char *)&sp, ptr, REGSIZE(SP), 0); + addr = (target_register_t) get_register (SP); +#ifdef CYGARC_REGSIZE_DIFFERS_FROM_TARGET_REGISTER_T + ptr = __mem2hex((char *)&addr, ptr, sizeof(addr), 0); + if (sizeof(addr) < REGSIZE(SP)) + { + // GDB is expecting REGSIZE(SP) number of bytes. + // We only have sizeof(addr) number. Let's fill + // the appropriate number of bytes intelligently. + target_register_t extend_val = 0; +#ifdef CYGARC_SIGN_EXTEND_REGISTERS + { + unsigned long bits_in_addr = (sizeof(addr) << 3); // ie Size in bytes * 8 + target_register_t sign_bit_mask = (1 << (bits_in_addr - 1)); + if ((addr & sign_bit_mask) == sign_bit_mask) + extend_val = ~0; + } +#endif + ptr = __mem2hex((char *)&extend_val, ptr, REGSIZE(SP) - sizeof(addr), 0); + } +#else + ptr = __mem2hex((char *)&addr, ptr, REGSIZE(SP), 0); +#endif *ptr++ = ';'; *ptr++ = 0; @@ -716,7 +755,7 @@ int //----------------------------------------------------------------------------- // Memory accessor functions. -void *__mem_fault_handler = (void *)0; +volatile void *__mem_fault_handler = (void *)0; /* These are the "arguments" to __do_read_mem and __do_write_mem, which are passed as globals to avoid squeezing them thru
