x-heep icon indicating copy to clipboard operation
x-heep copied to clipboard

sw bug into power_gate_core_asm power manager HAL

Open davideschiavone opened this issue 1 year ago • 1 comments

In function power_gate_core_asm, after the wfi

https://github.com/esl-epfl/x-heep/blob/main/sw/device/lib/drivers/power_manager/power_manager.c#L100

the __power_manager_start is correctly loaded again into the register as the core is returning from reset state after power gating.

However, the compiler does not know that the registers lost their original content, and relies on the gp register to re-load into a0 the __power_manager_start symbol from the linker.

This is wrong as now the gp register does not contain the value that the compiler expects.

One solution could be splitting the functions into 2

00000dce <wakeup>:
     dce:   20040537            lui a0,0x20040
     dd2:   00052823            sw  zero,16(a0) # 20040010 <_sp+0x20032510>
     dd6:   00052023            sw  zero,0(a0)
     dda:   00052223            sw  zero,4(a0)
        [power_manager_power_gate_core_reg_offset] "i" (POWER_MANAGER_POWER_GATE_CORE_REG_OFFSET), \
        [power_manager_wakeup_state_reg_offset] "i" (POWER_MANAGER_WAKEUP_STATE_REG_OFFSET), \
        [power_manager_restore_address_reg_offset] "i" (POWER_MANAGER_RESTORE_ADDRESS_REG_OFFSET) : "a0", "a1" \
    );

    asm volatile (
     dde:   90418513            addi    a0,gp,-1788 # c904 <__power_manager_start>
     de2:   00052083            lw  ra,0(a0)
     de6:   00452103            lw  sp,4(a0)
     dea:   00852183            lw  gp,8(a0)
     dee:   00c52203            lw  tp,12(a0)
     df2:   01052283            lw  t0,16(a0)
     df6:   01452303            lw  t1,20(a0)
     ```

davideschiavone avatar Feb 13 '24 11:02 davideschiavone