static unsigned log_count = 0;
+static const uint8_t log_level_color[_LOG_MAX] = {
+ [LOG_EMERG] = EFI_LIGHTRED,
+ [LOG_ALERT] = EFI_LIGHTRED,
+ [LOG_CRIT] = EFI_LIGHTRED,
+ [LOG_ERR] = EFI_LIGHTRED,
+ [LOG_WARNING] = EFI_YELLOW,
+ [LOG_NOTICE] = EFI_WHITE,
+ [LOG_INFO] = EFI_WHITE,
+ [LOG_DEBUG] = EFI_LIGHTGRAY,
+};
+
void freeze(void) {
for (;;)
BS->Stall(60 * 1000 * 1000);
freeze();
}
-EFI_STATUS log_internal(EFI_STATUS status, uint8_t text_color, const char *format, ...) {
+EFI_STATUS log_internal(EFI_STATUS status, LogLevel log_level, const char *format, ...) {
assert(format);
+ assert(log_level >= 0 && log_level < _LOG_MAX);
int32_t attr = ST->ConOut->Mode->Attribute;
if (ST->ConOut->Mode->CursorColumn > 0)
ST->ConOut->OutputString(ST->ConOut, (char16_t *) u"\r\n");
- ST->ConOut->SetAttribute(ST->ConOut, EFI_TEXT_ATTR(text_color, EFI_BLACK));
+ ST->ConOut->SetAttribute(ST->ConOut, EFI_TEXT_ATTR(log_level_color[log_level], EFI_BLACK));
va_list ap;
va_start(ap, format);
# define __stack_chk_guard_init()
#endif
+typedef enum LogLevel {
+ LOG_EMERG,
+ LOG_ALERT,
+ LOG_CRIT,
+ LOG_ERR,
+ LOG_WARNING,
+ LOG_NOTICE,
+ LOG_INFO,
+ LOG_DEBUG,
+ _LOG_MAX,
+ _LOG_INVALID = -1,
+} LogLevel;
+
_noreturn_ void freeze(void);
void log_wait(void);
-_gnu_printf_(3, 4) EFI_STATUS log_internal(EFI_STATUS status, uint8_t text_color, const char *format, ...);
-#define log_full(status, text_color, format, ...) \
- log_internal(status, text_color, "%s:%i@%s: " format, __FILE__, __LINE__, __func__, ##__VA_ARGS__)
-#define log_debug(...) log_full(EFI_SUCCESS, EFI_LIGHTGRAY, __VA_ARGS__)
-#define log_info(...) log_full(EFI_SUCCESS, EFI_WHITE, __VA_ARGS__)
-#define log_warning_status(status, ...) log_full(status, EFI_YELLOW, __VA_ARGS__)
-#define log_error_status(status, ...) log_full(status, EFI_LIGHTRED, __VA_ARGS__)
-#define log_error(...) log_full(EFI_INVALID_PARAMETER, EFI_LIGHTRED, __VA_ARGS__)
-#define log_oom() log_full(EFI_OUT_OF_RESOURCES, EFI_LIGHTRED, "Out of memory.")
+_gnu_printf_(3, 4) EFI_STATUS log_internal(EFI_STATUS status, LogLevel log_level, const char *format, ...);
+
+#define log_full(status, log_level, format, ...) \
+ log_internal(status, log_level, "%s:%i@%s: " format, __FILE__, __LINE__, __func__, ##__VA_ARGS__)
+
+#define log_debug(...) log_full(EFI_SUCCESS, LOG_DEBUG, __VA_ARGS__)
+#define log_info(...) log_full(EFI_SUCCESS, LOG_INFO, __VA_ARGS__)
+#define log_notice(...) log_full(EFI_SUCCESS, LOG_NOTICE, __VA_ARGS__)
+#define log_warning(...) log_full(EFI_SUCCESS, LOG_WARNING, __VA_ARGS__)
+#define log_error(...) log_full(EFI_SUCCESS, LOG_ERR, __VA_ARGS__)
+#define log_emergency(...) log_full(EFI_SUCCESS, LOG_EMERG, __VA_ARGS__)
+
+#define log_debug_status(status, ...) log_full(status, LOG_DEBUG, __VA_ARGS__)
+#define log_info_status(status, ...) log_full(status, LOG_INFO, __VA_ARGS__)
+#define log_notice_status(status, ...) log_full(status, LOG_NOTICE, __VA_ARGS__)
+#define log_warning_status(status, ...) log_full(status, LOG_WARNING, __VA_ARGS__)
+#define log_error_status(status, ...) log_full(status, LOG_ERR, __VA_ARGS__)
+#define log_emergency_status(status, ...) log_full(status, LOG_EMERG, __VA_ARGS__)
+
+#define log_oom() log_full(EFI_OUT_OF_RESOURCES, LOG_ERR, "Out of memory.")
/* Debugging helper — please keep this around, even if not used */
#define log_hexdump(prefix, data, size) \