pico-sdk/test/panic_function_test/panic_function_test.c
graham sanderson 771ac20b11 Fix PICO_PANIC_FUNCTION= imelementations
- stack should remain properly aligned
- risc-v was actually completely broken for user defined handlers because GCC was auto-pushing vaargs for naked function even with no stack frame
- new implementation supports full call stacks in gdb for Arm or RISC-V when hitting breakpoint in panic function
- new config defines make it explicit that gdb full stgack trace comes at the cost of corrupting stack based vaargs 4th is corrupted on Arm, later on RiSC-V (7 maybe?)
2026-03-13 16:51:15 -05:00

78 lines
2.2 KiB
C

#include <stdio.h>
#include <stdarg.h>
#include "pico/stdlib.h"
#define MAGIC1 ((const char *)0x87654321)
#define MAGIC2 0x97654321
#define MAGIC3 3.14159265358979323846
#define MAGIC4 123
#define MAGIC5 456
#define MAGIC6 789
#define MAGIC7 0xabc
#define PICO_PANIC_FUNCTION_IS_EMPTY (__CONCAT(PICO_PANIC_FUNCTION, 1))
void __printflike(1, 0) handle_panic(const char *magic1, ...)
{
printf("checking first arg...\n");
if (magic1 != MAGIC1) {
printf("magic1 (%08x) != 0x%08x\n", magic1, MAGIC1);
return;
}
va_list args;
va_start(args, magic1);
printf("checking early vaargs...\n");
int magic2 = va_arg(args, int);
if (magic2 != MAGIC2) {
printf("magic2 (%08x) != 0x%08x\n", magic2, MAGIC2);
return;
}
double magic3 = va_arg(args, double);
if (magic3 != MAGIC3) {
printf("magic3 (%f) != 0x%f\n", magic3, MAGIC3);
return;
}
#if PICO_PANIC_FUNCTION_WITH_ALL_VAARGS
printf("checking remaining vaargs...\n");
int magic4 = va_arg(args, int);
if (magic4 != MAGIC4) {
printf("magic4 (%08x) != 0x%08x\n", magic4, MAGIC4);
return;
}
int magic5 = va_arg(args, int);
if (magic5 != MAGIC5) {
printf("magic5 (%08x) != 0x%08x\n", magic5, MAGIC5);
return;
}
int magic6 = va_arg(args, int);
if (magic6 != MAGIC6) {
printf("magic6 (%08x) != 0x%08x\n", magic6, MAGIC6);
return;
}
int magic7 = va_arg(args, int);
if (magic7 != MAGIC7) {
printf("magic7 (%08x) != 0x%08x\n", magic7, MAGIC7);
return;
}
#endif
va_end(args);
puts("PASSED");
}
void main() {
stdio_init_all();
#ifndef PICO_PANIC_FUNCTION
printf("Using default panic function...\n");
panic("PASSED"); // should be printed
#else
#if PICO_PANIC_FUNCTION_IS_EMPTY
printf("Using empty (bkpt only) panic function...\n");
printf("PASSED\n"); // we should breakpoint next
panic(MAGIC1, MAGIC2, MAGIC3, MAGIC4, MAGIC5, MAGIC6, MAGIC7);
#endif
printf("Using custom panic function '" __XSTRING(PICO_PANIC_FUNCTION) "'...\n");
panic(MAGIC1, MAGIC2, MAGIC3, MAGIC4, MAGIC5, MAGIC6, MAGIC7);
#endif
printf("FAILED: expected panic not to return");
}