1#ifndef QEMU_LOG_H 2#define QEMU_LOG_H 3 4/* The deprecated global variables: */ 5extern FILE *logfile; 6extern int loglevel; 7 8 9/* 10 * The new API: 11 * 12 */ 13 14/* Log settings checking macros: */ 15 16/* Returns true if qemu_log() will really write somewhere 17 */ 18#define qemu_log_enabled() (logfile != NULL) 19 20/* Returns true if a bit is set in the current loglevel mask 21 */ 22#define qemu_loglevel_mask(b) ((loglevel & (b)) != 0) 23 24 25/* Logging functions: */ 26 27/* main logging function 28 */ 29#define qemu_log(...) do { \ 30 if (logfile) \ 31 fprintf(logfile, ## __VA_ARGS__); \ 32 } while (0) 33 34/* vfprintf-like logging function 35 */ 36#define qemu_log_vprintf(fmt, va) do { \ 37 if (logfile) \ 38 vfprintf(logfile, fmt, va); \ 39 } while (0) 40 41/* log only if a bit is set on the current loglevel mask 42 */ 43#define qemu_log_mask(b, ...) do { \ 44 if (loglevel & (b)) \ 45 fprintf(logfile, ## __VA_ARGS__); \ 46 } while (0) 47 48 49 50 51/* Special cases: */ 52 53/* cpu_dump_state() logging functions: */ 54#define log_cpu_state(env, f) cpu_dump_state((env), logfile, fprintf, (f)); 55#define log_cpu_state_mask(b, env, f) do { \ 56 if (loglevel & (b)) log_cpu_state((env), (f)); \ 57 } while (0) 58 59/* disas() and target_disas() to logfile: */ 60#define log_target_disas(start, len, flags) \ 61 target_disas(logfile, (start), (len), (flags)) 62#define log_disas(start, len) \ 63 disas(logfile, (start), (len)) 64 65/* page_dump() output to the log file: */ 66#define log_page_dump() page_dump(logfile) 67 68 69 70/* Maintenance: */ 71 72/* fflush() the log file */ 73#define qemu_log_flush() fflush(logfile) 74 75/* Close the log file */ 76#define qemu_log_close() do { \ 77 fclose(logfile); \ 78 logfile = NULL; \ 79 } while (0) 80 81/* Set up a new log file */ 82#define qemu_log_set_file(f) do { \ 83 logfile = (f); \ 84 } while (0) 85 86/* Set up a new log file, only if none is set */ 87#define qemu_log_try_set_file(f) do { \ 88 if (!logfile) \ 89 logfile = (f); \ 90 } while (0) 91 92 93#endif 94