Mercurial > flash_v2
diff packages/infra/current/src/simple.cxx @ 0:3111d98ba7b3 ecos-v1_1-release
Initial commit of eCos version 1.1
| author | jlarmour |
|---|---|
| date | Tue, 11 May 1999 11:16:07 +0000 |
| parents | |
| children | 443894e2e912 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/packages/infra/current/src/simple.cxx @@ -0,0 +1,441 @@ +//========================================================================== +// +// simple.cxx +// +// Simple, non formatting trace and assert functions +// +//========================================================================== +//####COPYRIGHTBEGIN#### +// +// ------------------------------------------- +// The contents of this file are subject to the Cygnus eCos Public License +// Version 1.0 (the "License"); you may not use this file except in +// compliance with the License. You may obtain a copy of the License at +// http://sourceware.cygnus.com/ecos +// +// Software distributed under the License is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations under +// the License. +// +// The Original Code is eCos - Embedded Cygnus Operating System, released +// September 30, 1998. +// +// The Initial Developer of the Original Code is Cygnus. Portions created +// by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved. +// ------------------------------------------- +// +//####COPYRIGHTEND#### +//========================================================================== +//#####DESCRIPTIONBEGIN#### +// +// Author(s): nickg +// Contributors: nickg +// Date: 1997-12-04 +// Purpose: Simple Trace and assert functions +// Description: The functions in this file are simple implementations +// of the standard trace and assert functions. These do not +// do any printf style formatting, simply printing the string +// and arguments directly. +// +//####DESCRIPTIONEND#### +// +//========================================================================== + +#include <pkgconf/system.h> +#include <pkgconf/infra.h> + +#ifdef CYGDBG_INFRA_DEBUG_TRACE_ASSERT_SIMPLE + +#include <cyg/infra/cyg_type.h> // base types +#include <cyg/infra/cyg_trac.h> // tracing macros +#include <cyg/infra/cyg_ass.h> // assertion macros + +#include <pkgconf/hal.h> // HAL configury +#include <cyg/infra/diag.h> // HAL polled output +#include <cyg/hal/hal_arch.h> // architectural stuff for... +#include <cyg/hal/hal_intr.h> // interrupt control + +#ifdef CYGPKG_KERNEL +#include <pkgconf/kernel.h> // kernel configury +#include <cyg/kernel/thread.hxx> // thread id to print +#include <cyg/kernel/sched.hxx> // ancillaries for above +#include <cyg/kernel/thread.inl> // ancillaries for above +#endif + +// ------------------------------------------------------------------------- +// Local Configuration: hack me! + +#define CYG_NO_FILENAME 1 +#define CYG_NO_THREADID 0 +#define CYG_NO_LINENUM 0 +#define CYG_NO_FUNCNAME 0 +#define CYG_DIAG_PRINTF 1 + +#ifndef CYGPKG_KERNEL +# undef CYG_NO_THREADID +# define CYG_NO_THREADID 1 +#endif +// ------------------------------------------------------------------------- +// Functions to trim file names and function names down to printable lengths +// (these are shared between trace and assert functions) + +static char *trim_file(char *file) +{ +#if !CYG_NO_FILENAME + if ( NULL == file ) + file = "<nofile>"; + + char *f = file; + + while( *f ) f++; + + while( *f != '/' && f != file ) f--; + + return f==file?f:(f+1); +#else + return ""; +#endif +} + +static char *trim_func(char *func) +{ +#if !CYG_NO_FUNCNAME + + static char fbuf[100]; + int i; + + if ( NULL == func ) + func = "<nofunc>"; + + for( i = 0; func[i] && func[i] != '(' ; i++ ) + fbuf[i] = func[i]; + + fbuf[i++] = '('; + fbuf[i++] = ')'; + fbuf[i++] = 0; + + while( i > 0 && fbuf[i] != ' ' ) i--; + if( i > 0 ) i++; + + return &fbuf[i]; +#else + return ""; +#endif +} + +void write_lnum( cyg_uint32 lnum) +{ +#if !CYG_NO_LINENUM + diag_write_char('['); + diag_write_dec(lnum); + diag_write_char(']'); +#endif +} + +void write_thread_id() +{ +#if !CYG_NO_THREADID + Cyg_Thread *t = Cyg_Thread::self(); + cyg_uint16 tid = 0xFFFF; + + if( t != NULL ) tid = t->get_unique_id(); + + diag_write_char('<'); + diag_write_hex(tid); + diag_write_char('>'); +#endif +} + + +// ------------------------------------------------------------------------- +// Trace functions: + +#ifdef CYGDBG_USE_TRACING + +externC void +cyg_tracenomsg( char *psz_func, char *psz_file, cyg_uint32 linenum ) +{ + cyg_uint32 old_ints; + + HAL_DISABLE_INTERRUPTS(old_ints); + DIAG_DEVICE_START_SYNC(); + + diag_write_string("TRACE: "); + write_thread_id(); + diag_write_string(trim_file(psz_file)); + write_lnum(linenum); + diag_write_string(trim_func(psz_func)); + diag_write_char('\n'); + + DIAG_DEVICE_END_SYNC(); + HAL_RESTORE_INTERRUPTS(old_ints); + +}; + +// provide every other one of these as a space/caller bloat compromise. + +externC void +cyg_tracemsg( cyg_uint32 what, + char *psz_func, char *psz_file, cyg_uint32 linenum, + char *psz_msg ) +{ + cyg_uint32 old_ints; + + HAL_DISABLE_INTERRUPTS(old_ints); + DIAG_DEVICE_START_SYNC(); + + if ( NULL == psz_msg ) + psz_msg = "<nomsg>"; + + diag_write_string("TRACE: "); + write_thread_id(); + diag_write_string(trim_file(psz_file)); + write_lnum(linenum); + diag_write_string(trim_func(psz_func)); + diag_write_char(' '); + diag_write_string(psz_msg); + diag_write_char('\n'); + + DIAG_DEVICE_END_SYNC(); + HAL_RESTORE_INTERRUPTS(old_ints); + +}; + +externC void +cyg_tracemsg2( cyg_uint32 what, + char *psz_func, char *psz_file, cyg_uint32 linenum, + char *psz_msg, + CYG_ADDRWORD arg0, CYG_ADDRWORD arg1 ) +{ + cyg_uint32 old_ints; + + HAL_DISABLE_INTERRUPTS(old_ints); + DIAG_DEVICE_START_SYNC(); + + if ( NULL == psz_msg ) + psz_msg = "<nomsg>"; + + diag_write_string("TRACE: "); + write_thread_id(); + diag_write_string(trim_file(psz_file)); + write_lnum(linenum); + diag_write_string(trim_func(psz_func)); + diag_write_char(' '); +#if CYG_DIAG_PRINTF + diag_printf( psz_msg, arg0, arg1 ); +#else + diag_write_string(psz_msg); + diag_write_char(' '); + diag_write_hex(arg0); + diag_write_char(' '); + diag_write_hex(arg1); +#endif + diag_write_char('\n'); + DIAG_DEVICE_END_SYNC(); + HAL_RESTORE_INTERRUPTS(old_ints); +}; + +externC void +cyg_tracemsg4( cyg_uint32 what, + char *psz_func, char *psz_file, cyg_uint32 linenum, + char *psz_msg, + CYG_ADDRWORD arg0, CYG_ADDRWORD arg1, + CYG_ADDRWORD arg2, CYG_ADDRWORD arg3 ) +{ + cyg_uint32 old_ints; + + HAL_DISABLE_INTERRUPTS(old_ints); + DIAG_DEVICE_START_SYNC(); + + if ( NULL == psz_msg ) + psz_msg = "<nomsg>"; + + diag_write_string("TRACE: "); + write_thread_id(); + diag_write_string(trim_file(psz_file)); + write_lnum(linenum); + diag_write_string(trim_func(psz_func)); + diag_write_char(' '); +#if CYG_DIAG_PRINTF + diag_printf( psz_msg, arg0, arg1, arg2, arg3 ); +#else + diag_write_string(psz_msg); + diag_write_char(' '); + diag_write_hex(arg0); + diag_write_char(' '); + diag_write_hex(arg1); + diag_write_char(' '); + diag_write_hex(arg2); + diag_write_char(' '); + diag_write_hex(arg3); +#endif + diag_write_char('\n'); + + DIAG_DEVICE_END_SYNC(); + HAL_RESTORE_INTERRUPTS(old_ints); +}; + +externC void +cyg_tracemsg6( cyg_uint32 what, + char *psz_func, char *psz_file, cyg_uint32 linenum, + char *psz_msg, + CYG_ADDRWORD arg0, CYG_ADDRWORD arg1, + CYG_ADDRWORD arg2, CYG_ADDRWORD arg3, + CYG_ADDRWORD arg4, CYG_ADDRWORD arg5 ) +{ + cyg_uint32 old_ints; + + HAL_DISABLE_INTERRUPTS(old_ints); + DIAG_DEVICE_START_SYNC(); + + if ( NULL == psz_msg ) + psz_msg = "<nomsg>"; + + diag_write_string("TRACE: "); + write_thread_id(); + diag_write_string(trim_file(psz_file)); + write_lnum(linenum); + diag_write_string(trim_func(psz_func)); + diag_write_char(' '); +#if CYG_DIAG_PRINTF + diag_printf( psz_msg, arg0, arg1, arg2, arg3, arg4, arg5 ); +#else + diag_write_string(psz_msg); + diag_write_char(' '); + diag_write_hex(arg0); + diag_write_char(' '); + diag_write_hex(arg1); + diag_write_char(' '); + diag_write_hex(arg2); + diag_write_char(' '); + diag_write_hex(arg3); + diag_write_char(' '); + diag_write_hex(arg4); + diag_write_char(' '); + diag_write_hex(arg5); +#endif + diag_write_char('\n'); + + DIAG_DEVICE_END_SYNC(); + HAL_RESTORE_INTERRUPTS(old_ints); +}; + +externC void +cyg_tracemsg8( cyg_uint32 what, + char *psz_func, char *psz_file, cyg_uint32 linenum, + char *psz_msg, + CYG_ADDRWORD arg0, CYG_ADDRWORD arg1, + CYG_ADDRWORD arg2, CYG_ADDRWORD arg3, + CYG_ADDRWORD arg4, CYG_ADDRWORD arg5, + CYG_ADDRWORD arg6, CYG_ADDRWORD arg7 ) +{ + cyg_uint32 old_ints; + + HAL_DISABLE_INTERRUPTS(old_ints); + DIAG_DEVICE_START_SYNC(); + + if ( NULL == psz_msg ) + psz_msg = "<nomsg>"; + + diag_write_string("TRACE: "); + write_thread_id(); + diag_write_string(trim_file(psz_file)); + write_lnum(linenum); + diag_write_string(trim_func(psz_func)); + diag_write_char(' '); +#if CYG_DIAG_PRINTF + diag_printf( psz_msg, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 ); +#else + diag_write_string(psz_msg); + diag_write_char(' '); + diag_write_hex(arg0); + diag_write_char(' '); + diag_write_hex(arg1); + diag_write_char(' '); + diag_write_hex(arg2); + diag_write_char(' '); + diag_write_hex(arg3); + diag_write_char(' '); + diag_write_hex(arg4); + diag_write_char(' '); + diag_write_hex(arg5); + diag_write_char(' '); + diag_write_hex(arg6); + diag_write_char(' '); + diag_write_hex(arg7); +#endif + diag_write_char('\n'); + + DIAG_DEVICE_END_SYNC(); + HAL_RESTORE_INTERRUPTS(old_ints); +}; + +#endif // CYGDBG_USE_TRACING + +// ------------------------------------------------------------------------- +// Assert functions: + +#ifdef CYGDBG_USE_ASSERTS + +externC void +cyg_assert_fail( char *psz_func, char *psz_file, cyg_uint32 linenum, + char *psz_msg ) +{ + cyg_uint32 old_ints; + + HAL_DISABLE_INTERRUPTS(old_ints); + DIAG_DEVICE_START_SYNC(); + + diag_write_string("ASSERT FAIL: "); + write_thread_id(); + diag_write_string(trim_file(psz_file)); + write_lnum(linenum); + diag_write_string(trim_func(psz_func)); + diag_write_char(' '); + diag_write_string(psz_msg); + diag_write_char('\n'); + + for(;;); + +// DIAG_DEVICE_END_SYNC(); +// HAL_RESTORE_INTERRUPTS(old_ints); +}; + +extern "C" +{ +extern unsigned long CYG_LABEL_NAME(stext); +extern unsigned long CYG_LABEL_NAME(etext); + +unsigned long stext_addr = (unsigned long)&CYG_LABEL_NAME(stext); +unsigned long etext_addr = (unsigned long)&CYG_LABEL_NAME(etext); +}; + +externC cyg_bool cyg_check_data_ptr(void *ptr) +{ + unsigned long p = (unsigned long)ptr; + + if( p == 0 ) return false; + + if( p > stext_addr && p < etext_addr ) return false; + + return true; +} + +externC cyg_bool cyg_check_func_ptr(void (*ptr)(void)) +{ + unsigned long p = (unsigned long)ptr; + + if( p == 0 ) return false; + + if( p < stext_addr && p > etext_addr ) return false; + + return true; +} + +#endif // CYGDBG_USE_ASSERTS + +#endif // CYGDBG_INFRA_DEBUG_TRACE_ASSERT_SIMPLE + +// ------------------------------------------------------------------------- +// EOF simple.cxx
