1#pragma once
2#include <colors.h>
3#include <compiler/core.h>
4#include <sch/irql.h>
5#include <stdarg.h>
6#include <stdbool.h>
7#include <stddef.h>
8#include <sync/spinlock.h>
9#include <tsa.h>
10
11struct printf_cursor;
12struct limine_framebuffer;
13
14void printf(const char *format, ...) cc_printf_like(1, 2) cc_nonnull(1);
15void vprintf(struct printf_cursor *csr, const char *format, va_list args)
16 cc_printf_like(2, 0) cc_nonnull(2);
17void serial_init(void);
18void serial_write(const char *str cc_pass_object_size(0), size_t len)
19 cc_access(read_only, 1, 2) cc_nonnull(1)
20 ct_precond(len <= __builtin_object_size(str, 0));
21bool serial_try_getc(char *out) cc_nonnull(1) cc_warn_unused_result;
22
23extern struct spinlock k_printf_lock;
24
25void printf_init(struct limine_framebuffer *fb) cc_nonnull(1);
26void printf_unlocked(const char *format, ...) cc_printf_like(1, 2)
27cc_nonnull(1);
28void printf_unlock(enum irql i) TSA_RELEASES_SPIN(&k_printf_lock);
29enum irql printf_lock(void) TSA_ACQUIRES_SPIN(&k_printf_lock);
30