1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#include <klibc/stdio.hpp>
#include <klibc/string.hpp>
#include <utils/flanterm.hpp>
#include <cstdint>
#include <cstddef>
#include <cstdarg>
#define NANOPRINTF_USE_FIELD_WIDTH_FORMAT_SPECIFIERS 1
#define NANOPRINTF_USE_PRECISION_FORMAT_SPECIFIERS 1
#define NANOPRINTF_USE_LARGE_FORMAT_SPECIFIERS 1
#define NANOPRINTF_USE_SMALL_FORMAT_SPECIFIERS 1
#define NANOPRINTF_USE_FLOAT_FORMAT_SPECIFIERS 0
#define NANOPRINTF_USE_BINARY_FORMAT_SPECIFIERS 1
#define NANOPRINTF_USE_WRITEBACK_FORMAT_SPECIFIERS 0
#define NANOPRINTF_IMPLEMENTATION
#include <nanoprintf.h>
#include <cstdint>
#include <cstddef>
#if defined(__x86_64__)
#include <arch/x86_64/drivers/serial.hpp>
#endif
#include <generic/lock/spinlock.hpp>
locks::spinlock print_lock;
int klibc::_snprintf(char *buffer, std::size_t bufsz, char const *fmt, va_list vlist) {
int const rv = npf_vsnprintf(buffer, bufsz, fmt, vlist);
return rv;
}
void klibc::printf(const char* fmt, ...) {
print_lock.lock();
va_list val;
va_start(val, fmt);
char buffer[4096];
memset(buffer,0,4096);
int len = _snprintf(buffer,4096,fmt,val);
utils::flanterm::write(buffer,len);
#if defined(__x86_64__)
x86_64::serial::write_data(buffer,len);
#endif
va_end(val);
print_lock.unlock();
}
|