Printing to the screen from threads doesn't work, because that involves a switch to real mode for using int10h services.
Add a string buffer and hwerr_printf() helper functions to store error messages. Print the buffer later, after device initialization, from main thread in case it is not empty.
Signed-off-by: Gerd Hoffmann kraxel@redhat.com --- src/output.h | 5 +++++ src/output.c | 17 +++++++++++++++++ src/post.c | 4 ++++ 3 files changed, 26 insertions(+)
diff --git a/src/output.h b/src/output.h index 14288cf505d8..4548d2d4abc2 100644 --- a/src/output.h +++ b/src/output.h @@ -16,6 +16,11 @@ char * znprintf(size_t size, const char *fmt, ...) __attribute__ ((format (printf, 2, 3))); void __dprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); + +extern char hwerror_str[512]; +void hwerr_printf(const char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); + struct bregs; void __debug_enter(struct bregs *regs, const char *fname); void __debug_isr(const char *fname); diff --git a/src/output.c b/src/output.c index 0184444c8f21..8c9d6b8fb1e0 100644 --- a/src/output.c +++ b/src/output.c @@ -419,6 +419,23 @@ snprintf(char *str, size_t size, const char *fmt, ...) return end - str; }
+char hwerror_str[512]; +struct snprintfinfo hwerror_info = { + .info = { putc_str }, + .str = hwerror_str, + .end = hwerror_str + sizeof(hwerror_str) - 1, +}; + +void +hwerr_printf(const char *fmt, ...) +{ + ASSERT32FLAT(); + va_list args; + va_start(args, fmt); + bvprintf(&hwerror_info.info, fmt, args); + va_end(args); +} + // Build a formatted string - malloc'ing the memory. char * znprintf(size_t size, const char *fmt, ...) diff --git a/src/post.c b/src/post.c index f93106a1c9c9..3e85da43060f 100644 --- a/src/post.c +++ b/src/post.c @@ -216,6 +216,10 @@ maininit(void) device_hardware_setup(); wait_threads(); } + if (hwerror_str[0]) + printf("\n" + "hardware setup errors:\n" + "%s", hwerror_str);
// Run option roms optionrom_setup();