x-heep
x-heep copied to clipboard
sw bug into power_gate_core_asm power manager HAL
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)
```