[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

gettimeofday seconds rollover problem?



Thomas Doerfler wrote:
> 
> Any comments on my sugestion?
> 

Add a barrier. I almost have a patch for the m68k target:

#define M68K_BARRIER() asm volatile ( "" : : : "memory" )

#if ( M68K_COLDFIRE_ARCH == 1 )
#define m68k_disable_interrupts( _level ) \
    do { register uint32_t   _tmpsr = 0x0700; \
         asm volatile ( "move.w %%sr,%0\n\t" \
  		       "or.l   %0,%1\n\t" \
  		       "move.w %1,%%sr" \
  		       : "=d" (_level), "=d"(_tmpsr) : "1"(_tmpsr) ); \
         M68K_BARRIER( ); \
    } while( 0 )
#else
#define m68k_disable_interrupts( _level ) \
    do { asm volatile ( "move.w  %%sr,%0\n\t" \
                        "or.w    #0x0700,%%sr"    \
                        : "=d" (_level));         \
        M68K_BARRIER( );                      \
    } while( 0 )
#endif

#define m68k_enable_interrupts( _level ) \
    do { asm volatile ( "move.w  %0,%%sr " : : "d" (_level)); \
         M68K_BARRIER( );                                     \

generates:

00000000 <gettimeofday>:
gettimeofday():
    0:   2f02            movel %d2,%sp at -
    2:   206f 0008       moveal %sp@(8),%a0
    6:   4a88            tstl %a0
    8:   6736            beqs 40 <gettimeofday+0x40>
    a:   203c 0000 0700  movel #1792,%d0
   10:   2200            movel %d0,%d1
   12:   40c0            movew %sr,%d0
   14:   8280            orl %d0,%d1
   16:   46c1            movew %d1,%sr
   18:   2239 0000 0000  movel 0 <gettimeofday>,%d1
   1e:   2439 0000 0000  movel 0 <gettimeofday>,%d2
   24:   46c0            movew %d0,%sr
   26:   0681 21da e500  addil #567993600,%d1
   2c:   2081            movel %d1,%a0@
   2e:   2039 0000 0000  movel 0 <gettimeofday>,%d0
   34:   4c02 0800       mulsl %d2,%d0
   38:   2140 0004       movel %d0,%a0@(4)
   3c:   4280            clrl %d0
   3e:   6010            bras 50 <gettimeofday+0x50>
   40:   4eb9 0000 0000  jsr 0 <gettimeofday>
   46:   2040            moveal %d0,%a0
   48:   20bc 0000 000e  movel #14,%a0@
   4e:   70ff            moveq #-1,%d0
   50:   241f            movel %sp at +,%d2
   52:   4e75            rts

This is build with RTEMS from CVS and gcc 4.0.2 and the latest binutils etc.

Regards
Chris