summaryrefslogtreecommitdiff
path: root/ports/litex
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2020-09-24 11:20:32 -0500
committerJeff Epler <jepler@gmail.com>2020-09-28 18:55:56 -0500
commit726dcdb60aa84b5070e5484a19e896abdaffeb93 (patch)
tree24cb3b01a1805353dd8a27335faad09a917df60a /ports/litex
parent6bfcb01ee79d49f470a1a8ca5e693ba92fadf307 (diff)
Add some NORETURN attributes
I have a function where it should be impossible to reach the end, so I put in a safe-mode reset at the bottom: ``` int find_unused_slot(void) { // precondition: you already verified that a slot was available for (int i=0; i<NUM_SLOTS; i++) { if( slot_free(i)) { return i; } } safe_mode_reset(MICROPY_FATAL_ERROR); } ``` However, the compiler still gave a diagnostic, because safe_mode_reset was not declared NORETURN. So I started by teaching the compiler that reset_into_safe_mode never returned. This leads at least one level deeper due to reset_cpu needing to be a NORETURN function. Each port is a little different in this area. I also marked reset_to_bootloader as NORETURN. Additional notes: * stm32's reset_to_bootloader was not implemented, but now does a bare reset. Most stm32s are not fitted with uf2 bootloaders anyway. * ditto cxd56 * esp32s2 did not implement reset_cpu at all. I used esp_restart(). (not tested) * litex did not implement reset_cpu at all. I used reboot_ctrl_write. But notably this is what reset_to_bootloader already did, so one or the other must be incorrect (not tested). reboot_ctrl_write cannot be declared NORETURN, as it returns unless the special value 0xac is written), so a new unreachable forever-loop is added. * cxd56's reset is via a boardctl() call which can't generically be declared NORETURN, so a new unreacahble "for(;;)" forever-loop is added. * In several places, NVIC_SystemReset is redeclared with NORETURN applied. This is accepted just fine by gcc. I chose this as preferable to editing the multiple copies of CMSIS headers where it is normally declared. * the stub safe_mode reset simply aborts. This is used in mpy-cross.
Diffstat (limited to 'ports/litex')
-rw-r--r--ports/litex/supervisor/port.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/ports/litex/supervisor/port.c b/ports/litex/supervisor/port.c
index 3125072e6..e55eb49f0 100644
--- a/ports/litex/supervisor/port.c
+++ b/ports/litex/supervisor/port.c
@@ -85,9 +85,17 @@ void reset_port(void) {
void reset_to_bootloader(void) {
reboot_ctrl_write(0xac);
+ for(;;) {}
}
void reset_cpu(void) {
+ // "You can reset Fomu by writing a special value to the CSR_REBOOT_CTRL
+ // register at 0xe0006000L. All writes to this register must start with
+ // 0xac, to ensure random values aren’t written. We can reboot Fomu by
+ // simply writing this value" --
+ // https://workshop.fomu.im/en/latest/riscv.html
+ reboot_ctrl_write(0xac);
+ for(;;) {}
}
supervisor_allocation* port_fixed_stack(void) {