bug in gen5200/tod/pcf8563.c

Wolfram Wadepohl Wolfram.Wadepohl at ek-automation.com
Mon May 14 05:53:36 UTC 2007


Ingolf Steinbach schrieb:
> On 2007-05-11, Wolfram Wadepohl <Wolfram.Wadepohl at ek-automation.com> wrote:
> 
>> The macro
>> #define From_BCD( _x ) ((((_x) >> 4) * 10) + ((_x) & 0x0F))
>> produces wrong code in pcf8563_get_time().
> 
> 
> Without looking at the source, I'd guess the reason is that this is quite
> a dangerous macro (it evaluates the _x argument twice). If this macro is
> invoked with an argument which directly references a (volatile) register,
> it might see two different values when evaluating _x.

Sure this macro isn't pretty. The argument is a local variable, which in 
this case, is held in a register. I think the compiler must take care, that 
the register is preserverd for multiple evaluations:

pcf8563_get_time(int minor, rtems_time_of_day *time)
{
	(...)
	uint8_t  info[10];
	uint32_t v1, v2;

	(...)
	v1 = info[PCF8563_HOUR_ADR-PCF8563_SECOND_ADR] & PCF8563_HOUR_MASK;
	/* i. e. v1 = info[2] & 0x3F; */
	time->hour = From_BCD(v1);
	(...)
}

For the other parts minutes, seconds there is pretty similiar c code, 
working perfectly. Only this fragment fail.

Disasembler code is available but i'm nat capable to interpret PPC assembly 
language:

          165|    v1 = info[PCF8563_DAY_ADR-PCF8563_SECOND_ADR] & 
PCF8563_DAY_MASK;
  SF:000C6840|8961000B            lbz       r11,0x0B(r1)   ; r11,11(r1)
          166|    time->day = From_BCD(v1);
  SF:000C6844|5569E7BE            extrwi    r9,r11,0x2,0x1A; 
r9,r11,CTRL_PRECHARGE,26
  SF:000C6848|1D29000A            mulli     r9,r9,0x0A     ; r9,r9,10
  SF:000C684C|556B073E            clrlwi    r11,r11,0x1C   ; r11,r11,GP_18
  SF:000C6850|7D295A14            add       r9,r9,r11
  SF:000C6854|913E0008            stw       r9,0x8(r30)    ; r9,CS0STP(r30)
             |
          168|    v1 = info[PCF8563_HOUR_ADR-PCF8563_SECOND_ADR] & 
PCF8563_HOUR_MASK;
  SF:000C6858|8801000A            lbz       r0,0x0A(r1)    ; r0,10(r1)
          169|    time->hour = From_BCD(v1);
_SF:000C685C|5400077A            rlwinm    r0,r0,0x0,0x1D,0x1D;_r0,r0,0,29,29
  SF:000C6860|901E000C            stw       r0,0x0C(r30)   ; r0,CS1STR(r30)
             |


Defining From_BCD() as an inline function works perfectly.

-- 
Schöne Grüße aus Reutlingen

Wolfram Wadepohl
Forschung & Entwicklung

E&K AUTOMATION
Indumat GmbH & Co. KG
Siemensstraße 3
72766 Reutlingen
Deutschland

Tel.  +49 7121 514-289
Fax   +49 7121 514-299
eMail Wolfram.Wadepohl at ek-automation.com
       W.Wadepohl at ieee.org
WWW   http://www.ek-automation.com
       http://www.indumat.de

Diese Nachricht ist keine geschäftliche Mitteilung i. S. des EHUG.

Bitte senden Sie mir keine Word- oder PowerPoint- (tm Microsoft) Anhänge.
Senden Sie mir einfachen Text, HTML oder PDF.
Siehe http://www.gnu.org/philosophy/no-word-attachments.de.html

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3210 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.rtems.org/pipermail/users/attachments/20070514/c8ed9321/attachment.bin>


More information about the users mailing list