1 | #ifndef QEMU_LOG_H |
2 | #define QEMU_LOG_H |
3 | |
4 | /* A small part of this API is split into its own header */ |
5 | #include "qemu/log-for-trace.h" |
6 | |
7 | /* Private global variable, don't use */ |
8 | extern FILE *qemu_logfile; |
9 | |
10 | /* |
11 | * The new API: |
12 | * |
13 | */ |
14 | |
15 | /* Log settings checking macros: */ |
16 | |
17 | /* Returns true if qemu_log() will really write somewhere |
18 | */ |
19 | static inline bool qemu_log_enabled(void) |
20 | { |
21 | return qemu_logfile != NULL; |
22 | } |
23 | |
24 | /* Returns true if qemu_log() will write somewhere else than stderr |
25 | */ |
26 | static inline bool qemu_log_separate(void) |
27 | { |
28 | return qemu_logfile != NULL && qemu_logfile != stderr; |
29 | } |
30 | |
31 | #define CPU_LOG_TB_OUT_ASM (1 << 0) |
32 | #define CPU_LOG_TB_IN_ASM (1 << 1) |
33 | #define CPU_LOG_TB_OP (1 << 2) |
34 | #define CPU_LOG_TB_OP_OPT (1 << 3) |
35 | #define CPU_LOG_INT (1 << 4) |
36 | #define CPU_LOG_EXEC (1 << 5) |
37 | #define CPU_LOG_PCALL (1 << 6) |
38 | #define CPU_LOG_TB_CPU (1 << 8) |
39 | #define CPU_LOG_RESET (1 << 9) |
40 | #define LOG_UNIMP (1 << 10) |
41 | #define LOG_GUEST_ERROR (1 << 11) |
42 | #define CPU_LOG_MMU (1 << 12) |
43 | #define CPU_LOG_TB_NOCHAIN (1 << 13) |
44 | #define CPU_LOG_PAGE (1 << 14) |
45 | /* LOG_TRACE (1 << 15) is defined in log-for-trace.h */ |
46 | #define CPU_LOG_TB_OP_IND (1 << 16) |
47 | #define CPU_LOG_TB_FPU (1 << 17) |
48 | |
49 | /* Lock output for a series of related logs. Since this is not needed |
50 | * for a single qemu_log / qemu_log_mask / qemu_log_mask_and_addr, we |
51 | * assume that qemu_loglevel_mask has already been tested, and that |
52 | * qemu_loglevel is never set when qemu_logfile is unset. |
53 | */ |
54 | |
55 | static inline void qemu_log_lock(void) |
56 | { |
57 | qemu_flockfile(qemu_logfile); |
58 | } |
59 | |
60 | static inline void qemu_log_unlock(void) |
61 | { |
62 | qemu_funlockfile(qemu_logfile); |
63 | } |
64 | |
65 | /* Logging functions: */ |
66 | |
67 | /* vfprintf-like logging function |
68 | */ |
69 | static inline void GCC_FMT_ATTR(1, 0) |
70 | qemu_log_vprintf(const char *fmt, va_list va) |
71 | { |
72 | if (qemu_logfile) { |
73 | vfprintf(qemu_logfile, fmt, va); |
74 | } |
75 | } |
76 | |
77 | /* log only if a bit is set on the current loglevel mask: |
78 | * @mask: bit to check in the mask |
79 | * @fmt: printf-style format string |
80 | * @args: optional arguments for format string |
81 | */ |
82 | #define qemu_log_mask(MASK, FMT, ...) \ |
83 | do { \ |
84 | if (unlikely(qemu_loglevel_mask(MASK))) { \ |
85 | qemu_log(FMT, ## __VA_ARGS__); \ |
86 | } \ |
87 | } while (0) |
88 | |
89 | /* log only if a bit is set on the current loglevel mask |
90 | * and we are in the address range we care about: |
91 | * @mask: bit to check in the mask |
92 | * @addr: address to check in dfilter |
93 | * @fmt: printf-style format string |
94 | * @args: optional arguments for format string |
95 | */ |
96 | #define qemu_log_mask_and_addr(MASK, ADDR, FMT, ...) \ |
97 | do { \ |
98 | if (unlikely(qemu_loglevel_mask(MASK)) && \ |
99 | qemu_log_in_addr_range(ADDR)) { \ |
100 | qemu_log(FMT, ## __VA_ARGS__); \ |
101 | } \ |
102 | } while (0) |
103 | |
104 | /* Maintenance: */ |
105 | |
106 | /* define log items */ |
107 | typedef struct QEMULogItem { |
108 | int mask; |
109 | const char *name; |
110 | const char *help; |
111 | } QEMULogItem; |
112 | |
113 | extern const QEMULogItem qemu_log_items[]; |
114 | |
115 | void qemu_set_log(int log_flags); |
116 | void qemu_log_needs_buffers(void); |
117 | void qemu_set_log_filename(const char *filename, Error **errp); |
118 | void qemu_set_dfilter_ranges(const char *ranges, Error **errp); |
119 | bool qemu_log_in_addr_range(uint64_t addr); |
120 | int qemu_str_to_log_mask(const char *str); |
121 | |
122 | /* Print a usage message listing all the valid logging categories |
123 | * to the specified FILE*. |
124 | */ |
125 | void qemu_print_log_usage(FILE *f); |
126 | |
127 | /* fflush() the log file */ |
128 | void qemu_log_flush(void); |
129 | /* Close the log file */ |
130 | void qemu_log_close(void); |
131 | |
132 | #endif |
133 | |