#include #include #include #include static void intr_null(struct intr_data *) { } extern void (*volatile _intr)(struct intr_data *); void intr_set(void (*fn)(struct intr_data *)) { _intr = fn ? fn : intr_null; } /* does haystack begin with needle? */ static bool strprefix(const char *haystack, const char *needle) { for (;; haystack++, needle++) { if (*needle == '\0') return true; /* note that *haystack == '\0' implies *needle != *haystack */ if (*needle != *haystack) return false; } } __attribute__((visibility("hidden"))) extern char __executable_start[]; void intr_default(struct intr_data *d) { if (strprefix(d->msg, "sys: ")) { fprintf(stderr, "%s: %s (base %p)\n", getprogname(), d->msg, __executable_start); } exit(1); }