ZXFoundation™ 26h2
Loading...
Searching...
No Matches
core.cxxm
1/// SPDX-License-Identifier: Apache-2.0
2/// @file zxfoundation/sys/printk.cxxm
3/// @brief Kernel logging framework.
4
5export module zxfoundation.sys.printk.core;
6import zxfoundation.base.types;
7import zxfoundation.sys.printk.types;
8import zxfoundation.sys.printk.format;
9import lib.format;
10import std;
11
12export {
13
14namespace zxfoundation::sys::printk {
15
16 auto set_min_level(log_level level) noexcept -> void;
17
18 auto get_current_level() noexcept -> log_level;
19
20 auto handle_min_level(std::string_view val) noexcept -> bool;
21
22 auto init() noexcept -> void;
23
24 auto register_backend(const printk_backend& backend) noexcept -> void;
25
26 auto read_logs(std::span<u8> dest, bool consume) noexcept -> usize;
27
28 auto log_size() noexcept -> usize;
29
30 /// @brief Commit a pre-formatted message to all active backends and the ring-buffer.
31 /// @param[in] buf Pre-formatted message buffer (NUL-terminated).
32 /// @param[in] offset Number of valid bytes in buf (not counting NUL).
33 /// @param[in] cpu Logical CPU ID of the calling processor.
34 auto printk_commit(const char* buf, usize offset) noexcept -> void;
35
36 template <typename... Args>
37 auto printk(log_level level, std::string_view fmt, Args&&... args) noexcept -> void {
38 if (static_cast<u8>(level) > static_cast<u8>(get_current_level()))
39 return;
40
41 char buf[PRINTK_LINE_MAX]{};
42 usize offset = prepare_header(level, buf, PRINTK_LINE_MAX);
43
44 offset += lib::format::format_to(
45 {buf + offset, PRINTK_LINE_MAX - offset},
46 fmt,
47 std::forward<Args>(args)...);
48
49 if (offset < (PRINTK_LINE_MAX - 1) && (offset == 0 || buf[offset-1] != '\n')) {
50 buf[offset++] = '\n';
51 }
52 buf[offset] = '\0';
53
54 printk_commit(buf, offset);
55 }
56
57 template <typename... Args> auto pemerg(std::string_view fmt, Args&&... args) noexcept -> void { printk(log_level::EMERG, fmt, std::forward<Args>(args)...); }
58 template <typename... Args> auto palert(std::string_view fmt, Args&&... args) noexcept -> void { printk(log_level::ALERT, fmt, std::forward<Args>(args)...); }
59 template <typename... Args> auto pcrit(std::string_view fmt, Args&&... args) noexcept -> void { printk(log_level::CRIT, fmt, std::forward<Args>(args)...); }
60 template <typename... Args> auto perr(std::string_view fmt, Args&&... args) noexcept -> void { printk(log_level::ERROR, fmt, std::forward<Args>(args)...); }
61 template <typename... Args> auto pwarn(std::string_view fmt, Args&&... args) noexcept -> void { printk(log_level::WARN, fmt, std::forward<Args>(args)...); }
62 template <typename... Args> auto pnotice(std::string_view fmt, Args&&... args) noexcept -> void { printk(log_level::NOTICE, fmt, std::forward<Args>(args)...); }
63 template <typename... Args> auto pinfo(std::string_view fmt, Args&&... args) noexcept -> void { printk(log_level::INFO, fmt, std::forward<Args>(args)...); }
64 template <typename... Args> auto pverbose(std::string_view fmt, Args&&... args) noexcept -> void { printk(log_level::VERBOSE, fmt, std::forward<Args>(args)...); }
65
66} // namespace zxfoundation::sys::printk
67
68} // end export