summaryrefslogtreecommitdiff
path: root/src/oracle/runtime_ref.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/oracle/runtime_ref.c')
-rw-r--r--src/oracle/runtime_ref.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/oracle/runtime_ref.c b/src/oracle/runtime_ref.c
new file mode 100644
index 0000000..659661b
--- /dev/null
+++ b/src/oracle/runtime_ref.c
@@ -0,0 +1,19 @@
+/* The few libc symbols ESP-IDF's LL code reaches for, supplied so the reference can link into a
+ * freestanding image.
+ *
+ * There is exactly one so far, and it is reached by design rather than by accident:
+ * `_uart_ll_set_baudrate` (uart_ll.h:532-535) calls `abort()` when handed an LP_UART instance,
+ * because that path needs `lp_uart_ll_set_baudrate` instead. The differential harness only ever
+ * passes HP UART instances, so this is unreachable in practice - but the linker does not know that,
+ * and a missing `abort` fails the build with a symbol name that explains nothing about why.
+ *
+ * Spinning rather than resetting is deliberate: if a reference implementation ever does call this,
+ * the board stops with its last console line intact, which is the difference between a diagnosable
+ * failure and a reboot loop.
+ */
+
+__attribute__((noreturn)) void abort(void)
+{
+ for (;;) {
+ }
+}