#include #include #include #include static struct console* registered = nullptr; static struct spinlock console_lock; void console_write(const char* buf, size_t len) { spin_lock(&console_lock); for (struct console* con = registered; con; con = con->next) con->write(con, buf, len); spin_unlock(&console_lock); } bool console_register(struct console* con) { if (!con->init(con)) return false; spin_lock(&console_lock); con->next = registered; registered = con; spin_unlock(&console_lock); log("console: Registered console \"%s\"\n", con->name); return true; } void console_unregister(struct console* con) { spin_lock(&console_lock); for (struct console** link = ®istered; *link; link = &(*link)->next) { if (*link == con) { *link = con->next; break; } } spin_unlock(&console_lock); } [[__init]] static void console_stage_init(struct boot_info*) { kprintf("\ec"); } INIT_TASK(console_stage, "core.console", console_stage_init);