Kernel: Add kernelearlyputstr and use it in dbgln in very-early boot

This variant of dbgputstr does not lock the global log lock, as it is
called before the current or any other processor was initialized,
meaning that:
A) The $gs base was not setup yet, so we cannot enter into critical
   sections, and as a result we cannot use SpinLocks
B) No other processors may try to print at the same time anyway
This commit is contained in:
Idan Horowitz 2021-09-10 21:46:54 +03:00
parent 18d2a74e62
commit 6348b63476
3 changed files with 20 additions and 0 deletions

View file

@ -817,6 +817,14 @@ void vdbgln(StringView fmtstr, TypeErasedFormatParams& params)
const auto string = builder.string_view();
#ifdef __serenity__
# ifdef KERNEL
if (!Kernel::Processor::is_initialized()) {
kernelearlyputstr(string.characters_without_null_termination(), string.length());
return;
}
# endif
#endif
dbgputstr(string.characters_without_null_termination(), string.length());
}

View file

@ -188,3 +188,14 @@ extern "C" void kernelcriticalputstr(const char* characters, size_t length)
for (size_t i = 0; i < length; ++i)
critical_console_out(characters[i]);
}
extern "C" void kernelearlyputstr(const char* characters, size_t length)
{
if (!characters)
return;
// NOTE: We do not lock the log lock here, as this function is called before this or any other processor was initialized, meaning:
// A) The $gs base was not setup yet, so we cannot enter into critical sections, and as a result we cannot use SpinLocks
// B) No other processors may try to print at the same time anyway
for (size_t i = 0; i < length; ++i)
internal_dbgputch(characters[i]);
}

View file

@ -14,6 +14,7 @@ void dbgputch(char);
void dbgputstr(const char*, size_t);
void kernelputstr(const char*, size_t);
void kernelcriticalputstr(const char*, size_t);
void kernelearlyputstr(const char*, size_t);
int snprintf(char* buf, size_t, const char* fmt, ...) __attribute__((format(printf, 3, 4)));
void set_serial_debug(bool on_or_off);
int get_serial_debug();