📄 hal_stub.c
字号:
ptr = __mem2hex((char *)&extend_val, ptr, REGSIZE(SP) - sizeof(addr), 0);
}
ptr = __mem2hex((char *)&addr, ptr, sizeof(addr), 0);
*ptr++ = ';';
HAL_STUB_ARCH_T_PACKET_EXTRAS(ptr);
*ptr++ = 0;
}
//-----------------------------------------------------------------------------
// Cache functions.
// Perform the specified operation on the instruction cache.
// Returns 1 if the cache is enabled, 0 otherwise.
int
__instruction_cache (cache_control_t request)
{
int state = 1;
switch (request) {
case CACHE_ENABLE:
HAL_ICACHE_ENABLE();
break;
case CACHE_DISABLE:
HAL_ICACHE_DISABLE();
state = 0;
break;
case CACHE_FLUSH:
HAL_ICACHE_SYNC();
break;
case CACHE_NOOP:
/* fall through */
default:
break;
}
#ifdef HAL_ICACHE_IS_ENABLED
HAL_ICACHE_IS_ENABLED(state);
#endif
return state;
}
// Perform the specified operation on the data cache.
// Returns 1 if the cache is enabled, 0 otherwise.
int
__data_cache (cache_control_t request)
{
int state = 1;
switch (request) {
case CACHE_ENABLE:
HAL_DCACHE_ENABLE();
break;
case CACHE_DISABLE:
HAL_DCACHE_DISABLE();
state = 0;
break;
case CACHE_FLUSH:
HAL_DCACHE_SYNC();
break;
case CACHE_NOOP:
/* fall through */
default:
break;
}
#ifdef HAL_DCACHE_IS_ENABLED
HAL_DCACHE_IS_ENABLED(state);
#endif
return state;
}
//-----------------------------------------------------------------------------
// Memory accessor functions.
// The __mem_fault_handler pointer is volatile since it is only
// set/cleared by the function below - which does not rely on any
// other functions, so the compiler may decide to not bother updating
// the pointer at all. If any of the memory accesses cause an
// exception, the pointer must be set to ensure the exception handler
// can make use of it.
void* volatile __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
__set_mem_fault_trap. */
static volatile target_register_t memCount;
static void
__do_copy_mem (unsigned char* src, unsigned char* dst)
{
unsigned long *long_dst;
unsigned long *long_src;
unsigned short *short_dst;
unsigned short *short_src;
// Zero memCount is not really an error, but the goto is necessary to
// keep some compilers from reordering stuff across the 'err' label.
if (memCount == 0) goto err;
__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++ = *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++ = *short_src++;
memCount -= sizeof(short);
dst = (unsigned char *)short_dst;
src = (unsigned char *)short_src;
} else {
*dst++ = *src++;
memCount--;
}
}
__mem_fault = 0;
err:
__mem_fault_handler = (void *)0;
}
/*
* __read_mem_safe:
* Get contents of target memory, abort on error.
*/
int
__read_mem_safe (void *dst, void *src, int count)
{
if( !CYG_HAL_STUB_PERMIT_DATA_READ( src, count ) )
return 0;
memCount = count;
__do_copy_mem((unsigned char*) src, (unsigned char*) dst);
return count - memCount; // return number of bytes successfully read
}
/*
* __write_mem_safe:
* Set contents of target memory, abort on error.
*/
int
__write_mem_safe (void *src, void *dst, int count)
{
if( !CYG_HAL_STUB_PERMIT_DATA_READ( dst, count ) )
return 0;
memCount = count;
__do_copy_mem((unsigned char*) src, (unsigned char*) dst);
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;
// Zero memCount is not really an error, but the goto is necessary to
// keep some compilers from reordering stuff across the 'err' label.
if (memCount == 0) goto err;
__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;
// Zero memCount is not really an error, but the goto is necessary to
// keep some compilers from reordering stuff across the 'err' label.
if (memCount == 0) goto err;
__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)
{
if( !CYG_HAL_STUB_PERMIT_CODE_READ( src, count ) )
return 0;
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)
{
if( !CYG_HAL_STUB_PERMIT_CODE_WRITE( dst, count ) )
return 0;
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
__process_target_query(char * pkt, char * out, int maxOut)
{ return 0 ; }
int
__process_target_set(char * pkt, char * out, int maxout)
{ return 0 ; }
int
__process_target_packet(char * pkt, char * out, int maxout)
{ return 0 ; }
// GDB string output, making sure interrupts are disabled.
// This function gets used by some diag output functions.
void
hal_output_gdb_string(target_register_t str, int string_len)
{
unsigned long __state;
HAL_DISABLE_INTERRUPTS(__state);
__output_gdb_string(str, string_len);
HAL_RESTORE_INTERRUPTS(__state);
}
#endif // CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -