• Josh Poimboeuf's avatar
    rtc: ds1685: actually spin forever in poweroff error path · 361c6ed6
    Josh Poimboeuf authored
    objtool reports the following warnings:
    
      drivers/rtc/rtc-ds1685.o: warning: objtool: ds1685_rtc_work_queue()+0x0: duplicate frame pointer save
      drivers/rtc/rtc-ds1685.o: warning: objtool: ds1685_rtc_work_queue()+0x3: duplicate frame pointer setup
      drivers/rtc/rtc-ds1685.o: warning: objtool: ds1685_rtc_work_queue()+0x0: frame pointer state mismatch
    
    The warning message needs to be improved, but what it really means in
    this case is that ds1685_rtc_poweroff() has a possible code path where
    it can actually fall through to the next function in the object code,
    ds1685_rtc_work_queue().
    
    The bug is caused by the use of the unreachable() macro in a place which
    is actually reachable.  That causes gcc to assume that the printk()
    immediately before the unreachable() macro never returns, when in fact
    it does.  So gcc places the printk() at the very end of the function's
    object code.  When the printk() returns, the next function starts
    executing.
    
    The surrounding comment and printk message state that the code should
    spin forever, which explains the unreachable() statement.  However the
    actual spin code is missing.
    Reported-by: default avatarkbuild test robot <fenggu[email protected]>
    Signed-off-by: default avatarJosh Poimboeuf <[email protected]>
    Signed-off-by: default avatarAlexandre Belloni <[email protected]>
    361c6ed6
rtc-ds1685.c 63.8 KB