diff --git a/Src/orbuculum.c b/Src/orbuculum.c index 8d48b6e..d2ae84e 100644 --- a/Src/orbuculum.c +++ b/Src/orbuculum.c @@ -562,12 +562,12 @@ void _handleException( struct ITMDecoder *i, struct ITMPacket *p ) if ( exceptionNumber < 16 ) { /* This is a system based exception */ - opLen = snprintf( outputString, MAX_STRING_LENGTH, "%d,%ld,%s,%s" EOL, HWEVENT_EXCEPTION, eventdifftS, exEvent[eventType & 0x03], exNames[exceptionNumber & 0x0F] ); + opLen = snprintf( outputString, MAX_STRING_LENGTH, "%d,%lld,%s,%s" EOL, HWEVENT_EXCEPTION, eventdifftS, exEvent[eventType & 0x03], exNames[exceptionNumber & 0x0F] ); } else { /* This is a CPU defined exception */ - opLen = snprintf( outputString, MAX_STRING_LENGTH, "%d,%ld,%s,External,%d" EOL, HWEVENT_EXCEPTION, eventdifftS, exEvent[eventType & 0x03], exceptionNumber - 16 ); + opLen = snprintf( outputString, MAX_STRING_LENGTH, "%d,%lld,%s,External,%d" EOL, HWEVENT_EXCEPTION, eventdifftS, exEvent[eventType & 0x03], exceptionNumber - 16 ); } write( _r.c[HW_CHANNEL].handle, outputString, opLen ); @@ -589,7 +589,7 @@ void _handleDWTEvent( struct ITMDecoder *i, struct ITMPacket *p ) { if ( event & ( 1 << i ) ) { - opLen = snprintf( outputString, MAX_STRING_LENGTH, "%d,%ld,%s" EOL, HWEVENT_DWT, eventdifftS, evName[event] ); + opLen = snprintf( outputString, MAX_STRING_LENGTH, "%d,%lld,%s" EOL, HWEVENT_DWT, eventdifftS, evName[event] ); write( _r.c[HW_CHANNEL].handle, outputString, opLen ); } } @@ -610,12 +610,12 @@ void _handlePCSample( struct ITMDecoder *i, struct ITMPacket *p ) if ( p->len == 1 ) { /* This is a sleep packet */ - opLen = snprintf( outputString, ( MAX_STRING_LENGTH - 1 ), "%d,%ld,**SLEEP**" EOL, HWEVENT_PCSample, eventdifftS ); + opLen = snprintf( outputString, ( MAX_STRING_LENGTH - 1 ), "%d,%lld,**SLEEP**" EOL, HWEVENT_PCSample, eventdifftS ); } else { uint32_t pc = ( p->d[3] << 24 ) | ( p->d[2] << 16 ) | ( p->d[1] << 8 ) | ( p->d[0] ); - opLen = snprintf( outputString, ( MAX_STRING_LENGTH - 1 ), "%d,%ld,0x%08x" EOL, HWEVENT_PCSample, eventdifftS, pc ); + opLen = snprintf( outputString, ( MAX_STRING_LENGTH - 1 ), "%d,%lld,0x%08x" EOL, HWEVENT_PCSample, eventdifftS, pc ); } write( _r.c[HW_CHANNEL].handle, outputString, opLen ); @@ -651,7 +651,7 @@ void _handleDataRWWP( struct ITMDecoder *i, struct ITMPacket *p ) break; } - opLen = snprintf( outputString, MAX_STRING_LENGTH, "%d,%ld,%d,%s,0x%x" EOL, HWEVENT_RWWT, eventdifftS, comp, isWrite ? "Write" : "Read", data ); + opLen = snprintf( outputString, MAX_STRING_LENGTH, "%d,%lld,%d,%s,0x%x" EOL, HWEVENT_RWWT, eventdifftS, comp, isWrite ? "Write" : "Read", data ); write( _r.c[HW_CHANNEL].handle, outputString, opLen ); } // ==================================================================================================== @@ -669,7 +669,7 @@ void _handleDataAccessWP( struct ITMDecoder *i, struct ITMPacket *p ) uint64_t eventdifftS = ts - _r.lastHWExceptionTS; _r.lastHWExceptionTS = ts; - opLen = snprintf( outputString, MAX_STRING_LENGTH, "%d,%ld,%d,0x%08x" EOL, HWEVENT_AWP, eventdifftS, comp, data ); + opLen = snprintf( outputString, MAX_STRING_LENGTH, "%d,%lld,%d,0x%08x" EOL, HWEVENT_AWP, eventdifftS, comp, data ); write( _r.c[HW_CHANNEL].handle, outputString, opLen ); } // ==================================================================================================== @@ -686,7 +686,7 @@ void _handleDataOffsetWP( struct ITMDecoder *i, struct ITMPacket *p ) uint64_t eventdifftS = ts - _r.lastHWExceptionTS; _r.lastHWExceptionTS = ts; - opLen = snprintf( outputString, MAX_STRING_LENGTH, "%d,%ld,%d,0x%04x" EOL, HWEVENT_OFS, eventdifftS, comp, offset ); + opLen = snprintf( outputString, MAX_STRING_LENGTH, "%d,%lld,%d,0x%04x" EOL, HWEVENT_OFS, eventdifftS, comp, offset ); write( _r.c[HW_CHANNEL].handle, outputString, opLen ); } // ==================================================================================================== @@ -1342,14 +1342,14 @@ int seggerFeeder( void ) int serialFeeder( void ) { - int f; + int f, flags; unsigned char cbw[TRANSFER_SIZE]; ssize_t t; struct termios settings; while ( 1 ) { - while ( ( f = open( options.port, O_RDONLY ) ) < 0 ) + while ( ( f = open( options.port, O_RDONLY | O_NONBLOCK ) ) < 0 ) { genericsReport( V_WARN, "Can't open serial port" EOL ); usleep( 500000 ); @@ -1385,6 +1385,20 @@ int serialFeeder( void ) tcflush( f, TCOFLUSH ); + if ( (flags = fcntl( f, F_GETFL, NULL )) < 0 ) + { + genericsReport( V_ERROR, "F_GETFL failed" EOL ); + exit( -3 ); + } + + flags &= ~O_NONBLOCK; + + if ( (flags = fcntl( f, F_SETFL, flags )) < 0 ) + { + genericsReport( V_ERROR, "F_SETFL failed" EOL ); + exit( -3 ); + } + while ( ( t = read( f, cbw, TRANSFER_SIZE ) ) > 0 ) { _sendToClients( t, cbw );