avr-libc-dev
[Top][All Lists]
Advanced

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

[avr-libc-dev] [bug #43828] wdt.h: Wrong inline assembler arguments


From: Georg-Johann Lay
Subject: [avr-libc-dev] [bug #43828] wdt.h: Wrong inline assembler arguments
Date: Mon, 15 Dec 2014 19:25:35 +0000
User-agent: Mozilla/5.0 (X11; Linux i686; rv:31.0) Gecko/20100101 Firefox/31.0

URL:
  <http://savannah.nongnu.org/bugs/?43828>

                 Summary: wdt.h: Wrong inline assembler arguments
                 Project: AVR C Runtime Library
            Submitted by: gjlayde
            Submitted on: Mo 15 Dez 2014 19:25:34 GMT
                Category: Header
                Severity: 3 - Normal
                Priority: 5 - Normal
              Item Group: Header files
                  Status: None
        Percent Complete: 0%
             Assigned to: None
        Originator Email: 
             Open/Closed: Open
         Discussion Lock: Any
                 Release: 1.8.0
           Fixed Release: None

    _______________________________________________________

Details:

wdt.h comes with wrong inline assembler arguments.  Let me give an example
(2014-12-15 SVN trunk r2641):



#define wdt_enable(timeout) \
do { \
uint8_t temp = 0; \
__asm__ __volatile__ (         \
    "in __tmp_reg__, %[rampd]"              "\n\t" \
    "out %[rampd], __zero_reg__"            "\n\t" \
    "out %[ccp_reg], %[ioreg_cen_mask]"     "\n\t" \
    "sts %[wdt_reg], %[wdt_enable_timeout]" "\n\t" \
    "1:lds %[tmp], %[wdt_status_reg]"       "\n\t" \
    "sbrc  %[tmp], %[wdt_syncbusy_bit]"     "\n\t" \
    "rjmp 1b"                               "\n\t" \
    "out %[rampd], __tmp_reg__"             "\n\t" \
    : "=r" (temp) \
    : [rampd]              "M" (_SFR_MEM_ADDR(RAMPD)),      \
      [ccp_reg]            "I" (_SFR_MEM_ADDR(CCP)),        \
      [ioreg_cen_mask]     "r" ((uint8_t)CCP_IOREG_gc),     \
      [wdt_reg]            "M" (_SFR_MEM_ADDR(WDT_CTRL)),   \
      [wdt_enable_timeout] "r" ((uint8_t)(WDT_CEN_bm | WDT_ENABLE_bm |
timeout)), \
      [wdt_status_reg]     "M" (_SFR_MEM_ADDR(WDT_STATUS)), \
      [wdt_syncbusy_bit]   "I" (WDT_SYNCBUSY_bm),           \
      [tmp]                "r" (temp)                       \
    : "r0" \
); \
} while(0)


Operand %[tmp] (%8) is changed but not indicated as so by means of constraint
modifiers.

Notice that the compiler may allocate different registers to %0 and %8. 
Hence, the fix is to refer to %0 instead of to %[tmp] resp. moving %[tmp] to
the first operand.  Also notice that %8 is unused and can be dropped.  temp is
loaded with 0 but respective content of %[tmp] is discarded by LDS.

The other asm in wdt.h (or maybe even more headers or source files) might
suffer from the same or similar flaws.





    _______________________________________________________

Reply to this item at:

  <http://savannah.nongnu.org/bugs/?43828>

_______________________________________________
  Nachricht gesendet von/durch Savannah
  http://savannah.nongnu.org/




reply via email to

[Prev in Thread] Current Thread [Next in Thread]