summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulius Werner <jwerner@chromium.org>2019-12-03 23:29:26 -0800
committerPatrick Georgi <pgeorgi@google.com>2019-12-05 17:58:10 +0000
commit51359d6c843b95fe09f1f7b63cb97f7cda06ac3c (patch)
treef5bba103398af605ce15435f012f9331c8cf5b7d
parent2e0bca011af0518f7335a700ea04082611b3ddad (diff)
downloadcoreboot-51359d6c843b95fe09f1f7b63cb97f7cda06ac3c.tar.xz
arm64: Print a char to UART early in exception handler
Over time our printk() seems to acquire more and more features... which is nice, but it also makes it a little less robust when something goes wrong. If the wrong global is trampled by some buffer overflow, it suddenly doesn't print anymore. It would be nice to have at least some way to tell that we triggered a real exception in that case. With this patch, arm64 exceptions will print a '!' straight to the UART before trying any of the more fancy printk() stuff. It's not much but it should tell the difference between an exception and a hang and hopefully help someone dig in the right direction sooner. This violates loglevels (which is part of the point), but presumably when you have a fatal exception you shouldn't care about that anymore. Change-Id: I3b08ab86beaee55263786011caa5588d93bbc720 Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/37465 Reviewed-by: Hung-Te Lin <hungte@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r--src/arch/arm64/armv8/exception.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/arch/arm64/armv8/exception.c b/src/arch/arm64/armv8/exception.c
index 13f456da26..4d566aa415 100644
--- a/src/arch/arm64/armv8/exception.c
+++ b/src/arch/arm64/armv8/exception.c
@@ -34,6 +34,7 @@
#include <arch/exception.h>
#include <arch/transition.h>
#include <console/console.h>
+#include <console/uart.h>
#include <arch/lib_helpers.h>
uint8_t exception_stack[2*KiB] __attribute__((aligned(16)));
@@ -131,8 +132,13 @@ int exception_handler_unregister(uint64_t vid, struct exception_handler *h)
static void print_exception_info(struct exc_state *state, uint64_t idx)
{
- if (idx < NUM_EXC_VIDS)
- printk(BIOS_DEBUG, "exception %s\n", exception_names[idx]);
+ /* Poor man's sign of life in case printk() is shot. */
+ __uart_tx_byte('\r');
+ __uart_tx_byte('\n');
+ __uart_tx_byte('!');
+
+ printk(BIOS_DEBUG, "\nexception %s\n",
+ idx < NUM_EXC_VIDS ? exception_names[idx] : "_unknown");
print_regs(state);
/* Few words below SP in case we need state from a returned function. */