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