summaryrefslogtreecommitdiffstats
path: root/src/recompiler/qemu-log.h
blob: 64d375b4f5a09fd126a8815a8a9728e7d04966bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#ifndef QEMU_LOG_H
#define QEMU_LOG_H

/* The deprecated global variables: */
extern FILE *logfile;
extern int loglevel;


/*
 * The new API:
 *
 */

/* Log settings checking macros: */

/* Returns true if qemu_log() will really write somewhere
 */
#ifndef VBOX
#define qemu_log_enabled() (logfile != NULL)
#else
# define qemu_log_enabled() LogIsEnabled()
#endif

/* Returns true if a bit is set in the current loglevel mask
 */
#define qemu_loglevel_mask(b) ((loglevel & (b)) != 0)


/* Logging functions: */

/* main logging function
 */
#ifndef VBOX
#define qemu_log(...) do {                 \
        if (logfile)                       \
            fprintf(logfile, ## __VA_ARGS__); \
    } while (0)
#else
# define qemu_log(...) Log((__VA_ARGS__))
#endif

/* vfprintf-like logging function
 */
#ifndef VBOX
#define qemu_log_vprintf(fmt, va) do {     \
        if (logfile)                       \
            vfprintf(logfile, fmt, va);    \
    } while (0)
#else
# define qemu_log_vprintf(fmt, va) do { \
        if (LogIsEnabled()) \
            RTLogLoggerExV(RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, fmt, va); \
    } while (0)
#endif

/* log only if a bit is set on the current loglevel mask
 */
#ifndef VBOX
#define qemu_log_mask(b, ...) do {         \
        if (loglevel & (b))                \
            fprintf(logfile, ## __VA_ARGS__); \
    } while (0)
#else
# define qemu_log_mask(b, ...) do { \
        if (loglevel & (b)) \
            Log((__VA_ARGS__)); \
    } while (0)
#endif




/* Special cases: */

/* cpu_dump_state() logging functions: */
#ifndef VBOX
#define log_cpu_state(env, f) cpu_dump_state((env), logfile, fprintf, (f));
#else
#define log_cpu_state(env, f) cpu_dump_state((env), NULL, NULL, (f));
#endif
#define log_cpu_state_mask(b, env, f) do {           \
      if (loglevel & (b)) log_cpu_state((env), (f)); \
  } while (0)

/* disas() and target_disas() to logfile: */
#define log_target_disas(start, len, flags) \
        target_disas(logfile, (start), (len), (flags))
#define log_disas(start, len) \
        disas(logfile, (start), (len))

/* page_dump() output to the log file: */
#define log_page_dump() page_dump(logfile)



/* Maintenance: */

/* fflush() the log file */
#ifndef VBOX
#define qemu_log_flush() fflush(logfile)
#else
# define qemu_log_flush()           RTLogFlush(NULL)
#endif

/* Close the log file */
#ifndef VBOX
#define qemu_log_close() do { \
        fclose(logfile);      \
        logfile = NULL;       \
    } while (0)
#else
# define qemu_log_close()           do { } while (0)
#endif

/* Set up a new log file */
#ifndef VBOX
#define qemu_log_set_file(f) do { \
        logfile = (f);            \
    } while (0)
#else
# define qemu_log_set_file(f)       do { } while (0)
#endif

/* Set up a new log file, only if none is set */
#ifndef VBOX
#define qemu_log_try_set_file(f) do { \
        if (!logfile)                 \
            logfile = (f);            \
    } while (0)
#else
#define qemu_log_try_set_file(f)    do { } while (0)
#endif


#endif