Mercurial > flash_v2
diff packages/hal/common/current/src/hal_stub.c @ 156:b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
| author | jlarmour |
|---|---|
| date | Fri, 06 Apr 2001 17:20:13 +0000 |
| parents | e2d866e32dac |
| children | 2395031e7a66 |
line wrap: on
line diff
--- a/packages/hal/common/current/src/hal_stub.c +++ b/packages/hal/common/current/src/hal_stub.c @@ -108,6 +108,11 @@ int *_registers_valid = registers_valid; static volatile __PFI __interruptible_control; #endif +// Some architectures need extras regs reported in T packet +#ifndef HAL_STUB_ARCH_T_PACKET_EXTRAS +#define HAL_STUB_ARCH_T_PACKET_EXTRAS(x) +#endif + //----------------------------------------------------------------------------- // Register access @@ -358,6 +363,10 @@ handle_exception_cleanup( void ) int i; for (i = 0; i < (sizeof(registers)/sizeof(registers[0])); i++) orig_registers[i] = registers[i]; + _registers = &orig_registers[0]; + if (__is_breakpoint_function ()) + __skipinst (); + _registers = ®isters[0]; orig_registers_set = 1; } @@ -473,9 +482,9 @@ void __reset (void) { #ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT - __call_if_reset_t __rom_reset = CYGACC_CALL_IF_RESET_GET(); + __call_if_reset_t *__rom_reset = CYGACC_CALL_IF_RESET_GET(); if (__rom_reset) - __rom_reset(); + (*__rom_reset)(); #else HAL_PLATFORM_RESET(); #endif @@ -519,34 +528,34 @@ void #ifdef CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT // Include thread ID if thread manipulation is required. { - int id; - - *ptr++ = 't'; - *ptr++ = 'h'; - *ptr++ = 'r'; - *ptr++ = 'e'; - *ptr++ = 'a'; - *ptr++ = 'd'; - *ptr++ = ':'; + int id = dbg_currthread_id (); + + if (id != 0) { + *ptr++ = 't'; + *ptr++ = 'h'; + *ptr++ = 'r'; + *ptr++ = 'e'; + *ptr++ = 'a'; + *ptr++ = 'd'; + *ptr++ = ':'; -#if (CYG_BYTEORDER == CYG_MSBFIRST) - id = dbg_currthread_id (); -#else - // FIXME: Temporary workaround for PR 18903. Thread ID must be - // big-endian in the T packet. - { - unsigned char* bep = (unsigned char*)&id; - int be_id; +#if (CYG_BYTEORDER == CYG_LSBFIRST) + // FIXME: Temporary workaround for PR 18903. Thread ID must be + // big-endian in the T packet. + { + unsigned char* bep = (unsigned char*)&id; + int be_id; - be_id = dbg_currthread_id (); - *bep++ = (be_id >> 24) & 0xff ; - *bep++ = (be_id >> 16) & 0xff ; - *bep++ = (be_id >> 8) & 0xff ; - *bep++ = (be_id & 0xff) ; - } + be_id = id; + *bep++ = (be_id >> 24) & 0xff ; + *bep++ = (be_id >> 16) & 0xff ; + *bep++ = (be_id >> 8) & 0xff ; + *bep++ = (be_id & 0xff) ; + } #endif - ptr = __mem2hex((char *)&id, ptr, sizeof(id), 0); - *ptr++ = ';'; + ptr = __mem2hex((char *)&id, ptr, sizeof(id), 0); + *ptr++ = ';'; + } } #endif @@ -617,6 +626,8 @@ void } ptr = __mem2hex((char *)&addr, ptr, sizeof(addr), 0); *ptr++ = ';'; + + HAL_STUB_ARCH_T_PACKET_EXTRAS(ptr); *ptr++ = 0; } @@ -780,6 +791,134 @@ int return count - memCount; // return number of bytes successfully written } +#ifdef TARGET_HAS_HARVARD_MEMORY +static void +__do_copy_from_progmem (unsigned char* src, unsigned char* dst) +{ + unsigned long *long_dst; + unsigned long *long_src; + unsigned short *short_dst; + unsigned short *short_src; + + __mem_fault = 1; /* Defaults to 'fail'. Is cleared */ + /* when the copy loop completes. */ + __mem_fault_handler = &&err; + + // See if it's safe to do multi-byte, aligned operations + while (memCount) { + if ((memCount >= sizeof(long)) && + (((target_register_t)dst & (sizeof(long)-1)) == 0) && + (((target_register_t)src & (sizeof(long)-1)) == 0)) { + + long_dst = (unsigned long *)dst; + long_src = (unsigned long *)src; + + *long_dst++ = __read_prog_uint32(long_src++); + memCount -= sizeof(long); + + dst = (unsigned char *)long_dst; + src = (unsigned char *)long_src; + } else if ((memCount >= sizeof(short)) && + (((target_register_t)dst & (sizeof(short)-1)) == 0) && + (((target_register_t)src & (sizeof(short)-1)) == 0)) { + + short_dst = (unsigned short *)dst; + short_src = (unsigned short *)src; + + *short_dst++ = __read_prog_uint16(short_src++); + memCount -= sizeof(short); + + dst = (unsigned char *)short_dst; + src = (unsigned char *)short_src; + } else { + *dst++ = __read_prog_uint8(src++); + memCount--; + } + } + + __mem_fault = 0; + + err: + __mem_fault_handler = (void *)0; +} + +static void +__do_copy_to_progmem (unsigned char* src, unsigned char* dst) +{ + unsigned long *long_dst; + unsigned long *long_src; + unsigned short *short_dst; + unsigned short *short_src; + + __mem_fault = 1; /* Defaults to 'fail'. Is cleared */ + /* when the copy loop completes. */ + __mem_fault_handler = &&err; + + // See if it's safe to do multi-byte, aligned operations + while (memCount) { + if ((memCount >= sizeof(long)) && + (((target_register_t)dst & (sizeof(long)-1)) == 0) && + (((target_register_t)src & (sizeof(long)-1)) == 0)) { + + long_dst = (unsigned long *)dst; + long_src = (unsigned long *)src; + + __write_prog_uint32(long_dst++, *long_src++); + memCount -= sizeof(long); + + dst = (unsigned char *)long_dst; + src = (unsigned char *)long_src; + } else if ((memCount >= sizeof(short)) && + (((target_register_t)dst & (sizeof(short)-1)) == 0) && + (((target_register_t)src & (sizeof(short)-1)) == 0)) { + + short_dst = (unsigned short *)dst; + short_src = (unsigned short *)src; + + __write_prog_uint16(short_dst++, *short_src++); + memCount -= sizeof(short); + + dst = (unsigned char *)short_dst; + src = (unsigned char *)short_src; + } else { + __write_prog_uint8(dst++, *src++); + memCount--; + } + } + + __mem_fault = 0; + + err: + __mem_fault_handler = (void *)0; +} + +/* + * __read_progmem_safe: + * Get contents of target memory, abort on error. + */ + +int +__read_progmem_safe (void *dst, void *src, int count) +{ + memCount = count; + __do_copy_from_progmem((unsigned char*) src, (unsigned char*) dst); + return count - memCount; // return number of bytes successfully read +} + +/* + * __write_progmem_safe: + * Set contents of target memory, abort on error. + */ + +int +__write_progmem_safe (void *src, void *dst, int count) +{ + memCount = count; + __do_copy_to_progmem((unsigned char*) src, (unsigned char*) dst); + return count - memCount; // return number of bytes successfully written +} +#endif + //----------------------------------------------------------------------------- // Target extras?! int
