1912d8a9bSFrançois Tigeot /*
21dedbd3bSFrançois Tigeot * Copyright (c) 2015-2019 François Tigeot <ftigeot@wolfpond.org>
3912d8a9bSFrançois Tigeot * All rights reserved.
4912d8a9bSFrançois Tigeot *
5912d8a9bSFrançois Tigeot * Redistribution and use in source and binary forms, with or without
6912d8a9bSFrançois Tigeot * modification, are permitted provided that the following conditions
7912d8a9bSFrançois Tigeot * are met:
8912d8a9bSFrançois Tigeot * 1. Redistributions of source code must retain the above copyright
9912d8a9bSFrançois Tigeot * notice unmodified, this list of conditions, and the following
10912d8a9bSFrançois Tigeot * disclaimer.
11912d8a9bSFrançois Tigeot * 2. Redistributions in binary form must reproduce the above copyright
12912d8a9bSFrançois Tigeot * notice, this list of conditions and the following disclaimer in the
13912d8a9bSFrançois Tigeot * documentation and/or other materials provided with the distribution.
14912d8a9bSFrançois Tigeot *
15912d8a9bSFrançois Tigeot * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16912d8a9bSFrançois Tigeot * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17912d8a9bSFrançois Tigeot * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18912d8a9bSFrançois Tigeot * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19912d8a9bSFrançois Tigeot * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20912d8a9bSFrançois Tigeot * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21912d8a9bSFrançois Tigeot * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22912d8a9bSFrançois Tigeot * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23912d8a9bSFrançois Tigeot * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24912d8a9bSFrançois Tigeot * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25912d8a9bSFrançois Tigeot */
26912d8a9bSFrançois Tigeot
27912d8a9bSFrançois Tigeot #ifndef _LINUX_PRINTK_H_
28912d8a9bSFrançois Tigeot #define _LINUX_PRINTK_H_
29912d8a9bSFrançois Tigeot
309286b91eSSascha Wildner #include <sys/stdarg.h>
31d6aa1cc5SFrançois Tigeot #include <linux/init.h>
32d998b496SFrançois Tigeot #include <linux/cache.h>
33d998b496SFrançois Tigeot
34742b09c6Szrj #include <sys/types.h>
35742b09c6Szrj #include <sys/systm.h>
36742b09c6Szrj
378621f407SFrançois Tigeot struct va_format {
388621f407SFrançois Tigeot const char *fmt;
399286b91eSSascha Wildner va_list *va;
408621f407SFrançois Tigeot };
418621f407SFrançois Tigeot
421dedbd3bSFrançois Tigeot #define printk(...) kprintf(__VA_ARGS__)
43742b09c6Szrj
44742b09c6Szrj #define KERN_CONT ""
45742b09c6Szrj #define KERN_EMERG "<0>"
46742b09c6Szrj #define KERN_ALERT "<1>"
47742b09c6Szrj #define KERN_CRIT "<2>"
48742b09c6Szrj #define KERN_ERR "<3>"
49742b09c6Szrj #define KERN_WARNING "<4>"
50742b09c6Szrj #define KERN_NOTICE "<5>"
51742b09c6Szrj #define KERN_INFO "<6>"
52742b09c6Szrj #define KERN_DEBUG "<7>"
53742b09c6Szrj
54742b09c6Szrj #ifndef pr_fmt
55742b09c6Szrj #define pr_fmt(fmt) fmt
56742b09c6Szrj #endif
57742b09c6Szrj
58742b09c6Szrj #define pr_emerg(fmt, ...) \
59742b09c6Szrj printk(KERN_EMERG pr_fmt(fmt), ##__VA_ARGS__)
60742b09c6Szrj #define pr_alert(fmt, ...) \
61742b09c6Szrj printk(KERN_ALERT pr_fmt(fmt), ##__VA_ARGS__)
62742b09c6Szrj #define pr_crit(fmt, ...) \
63742b09c6Szrj printk(KERN_CRIT pr_fmt(fmt), ##__VA_ARGS__)
64742b09c6Szrj #define pr_err(fmt, ...) \
65742b09c6Szrj printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
66742b09c6Szrj #define pr_warning(fmt, ...) \
67742b09c6Szrj printk(KERN_WARNING pr_fmt(fmt), ##__VA_ARGS__)
68742b09c6Szrj #define pr_warn pr_warning
69742b09c6Szrj #define pr_notice(fmt, ...) \
70742b09c6Szrj printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
71742b09c6Szrj #define pr_info(fmt, ...) \
72742b09c6Szrj printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
73742b09c6Szrj #define pr_cont(fmt, ...) \
74742b09c6Szrj printk(KERN_CONT fmt, ##__VA_ARGS__)
75742b09c6Szrj
76742b09c6Szrj /* pr_devel() should produce zero code unless DEBUG is defined */
77742b09c6Szrj #ifdef DEBUG
78742b09c6Szrj #define pr_devel(fmt, ...) \
79742b09c6Szrj printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
80742b09c6Szrj #else
81742b09c6Szrj #define pr_devel(fmt, ...) \
82742b09c6Szrj ({ if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); 0; })
83742b09c6Szrj #endif
84742b09c6Szrj
85a89cc4a5SPeeter Must #define pr_debug(fmt, ...) \
86a89cc4a5SPeeter Must printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
87742b09c6Szrj
88742b09c6Szrj /*
89742b09c6Szrj * Print a one-time message (analogous to WARN_ONCE() et al):
90742b09c6Szrj */
91742b09c6Szrj #define printk_once(x...) \
92742b09c6Szrj ({ \
93742b09c6Szrj static bool __print_once; \
94742b09c6Szrj \
95742b09c6Szrj if (!__print_once) { \
96742b09c6Szrj __print_once = true; \
97742b09c6Szrj printk(x); \
98742b09c6Szrj } \
99742b09c6Szrj })
100742b09c6Szrj
101912d8a9bSFrançois Tigeot #define pr_info_once(fmt, ...) do { \
102912d8a9bSFrançois Tigeot static bool __printed_once; \
103912d8a9bSFrançois Tigeot \
104912d8a9bSFrançois Tigeot if (!__printed_once) { \
105912d8a9bSFrançois Tigeot __printed_once = true; \
106912d8a9bSFrançois Tigeot kprintf(fmt, ##__VA_ARGS__); \
107912d8a9bSFrançois Tigeot } \
108912d8a9bSFrançois Tigeot } while (0)
109912d8a9bSFrançois Tigeot
1102e2ba5b7SFrançois Tigeot enum {
1112e2ba5b7SFrançois Tigeot DUMP_PREFIX_NONE,
1122e2ba5b7SFrançois Tigeot DUMP_PREFIX_ADDRESS,
1132e2ba5b7SFrançois Tigeot DUMP_PREFIX_OFFSET
1142e2ba5b7SFrançois Tigeot };
1152e2ba5b7SFrançois Tigeot
116dd6db6f0SSascha Wildner static inline void
print_hex_dump(const char * level,const char * prefix_str,int prefix_type,int rowsize,int groupsize,const void * buf,size_t len,bool ascii)117dd6db6f0SSascha Wildner print_hex_dump(const char *level, const char *prefix_str, int prefix_type,
118dd6db6f0SSascha Wildner int rowsize, int groupsize, const void *buf, size_t len, bool ascii)
119dd6db6f0SSascha Wildner {
120dd6db6f0SSascha Wildner int flags;
121dd6db6f0SSascha Wildner
122dd6db6f0SSascha Wildner flags = rowsize;
123dd6db6f0SSascha Wildner if (prefix_type != DUMP_PREFIX_OFFSET)
124dd6db6f0SSascha Wildner flags |= HD_OMIT_COUNT;
125dd6db6f0SSascha Wildner if (!ascii)
126dd6db6f0SSascha Wildner flags |= HD_OMIT_CHARS;
127dd6db6f0SSascha Wildner
128dd6db6f0SSascha Wildner hexdump(buf, len, prefix_str, flags);
129dd6db6f0SSascha Wildner }
130dd6db6f0SSascha Wildner
131*78973132SSergey Zigachev #define printk_ratelimit() 1
132*78973132SSergey Zigachev
133912d8a9bSFrançois Tigeot #endif /* _LINUX_PRINTK_H_ */
134