Statistics
| Branch: | Revision:

root / qemu-log.h @ 76cad711

History | View | Annotate | Download (3.3 kB)

1
#ifndef QEMU_LOG_H
2
#define QEMU_LOG_H
3

    
4
#include <stdarg.h>
5
#ifdef NEED_CPU_H
6
#include "disas/disas.h"
7
#endif
8

    
9
/* Private global variables, don't use */
10
extern FILE *qemu_logfile;
11
extern int qemu_loglevel;
12

    
13
/* 
14
 * The new API:
15
 *
16
 */
17

    
18
/* Log settings checking macros: */
19

    
20
/* Returns true if qemu_log() will really write somewhere
21
 */
22
static inline bool qemu_log_enabled(void)
23
{
24
    return qemu_logfile != NULL;
25
}
26

    
27
#define CPU_LOG_TB_OUT_ASM (1 << 0)
28
#define CPU_LOG_TB_IN_ASM  (1 << 1)
29
#define CPU_LOG_TB_OP      (1 << 2)
30
#define CPU_LOG_TB_OP_OPT  (1 << 3)
31
#define CPU_LOG_INT        (1 << 4)
32
#define CPU_LOG_EXEC       (1 << 5)
33
#define CPU_LOG_PCALL      (1 << 6)
34
#define CPU_LOG_IOPORT     (1 << 7)
35
#define CPU_LOG_TB_CPU     (1 << 8)
36
#define CPU_LOG_RESET      (1 << 9)
37
#define LOG_UNIMP          (1 << 10)
38
#define LOG_GUEST_ERROR    (1 << 11)
39

    
40
/* Returns true if a bit is set in the current loglevel mask
41
 */
42
static inline bool qemu_loglevel_mask(int mask)
43
{
44
    return (qemu_loglevel & mask) != 0;
45
}
46

    
47
/* Logging functions: */
48

    
49
/* main logging function
50
 */
51
void GCC_FMT_ATTR(1, 2) qemu_log(const char *fmt, ...);
52

    
53
/* vfprintf-like logging function
54
 */
55
static inline void GCC_FMT_ATTR(1, 0)
56
qemu_log_vprintf(const char *fmt, va_list va)
57
{
58
    if (qemu_logfile) {
59
        vfprintf(qemu_logfile, fmt, va);
60
    }
61
}
62

    
63
/* log only if a bit is set on the current loglevel mask
64
 */
65
void GCC_FMT_ATTR(2, 3) qemu_log_mask(int mask, const char *fmt, ...);
66

    
67

    
68
/* Special cases: */
69

    
70
#ifdef NEED_CPU_H
71
/* cpu_dump_state() logging functions: */
72
static inline void log_cpu_state(CPUArchState *env1, int flags)
73
{
74
    if (qemu_log_enabled()) {
75
        cpu_dump_state(env1, qemu_logfile, fprintf, flags);
76
    }
77
}
78

    
79
static inline void log_cpu_state_mask(int mask, CPUArchState *env1, int flags)
80
{
81
    if (qemu_loglevel & mask) {
82
        log_cpu_state(env1, flags);
83
    }
84
}
85

    
86
/* disas() and target_disas() to qemu_logfile: */
87
static inline void log_target_disas(CPUArchState *env, target_ulong start,
88
                                    target_ulong len, int flags)
89
{
90
    target_disas(qemu_logfile, env, start, len, flags);
91
}
92

    
93
static inline void log_disas(void *code, unsigned long size)
94
{
95
    disas(qemu_logfile, code, size);
96
}
97

    
98
#if defined(CONFIG_USER_ONLY)
99
/* page_dump() output to the log file: */
100
static inline void log_page_dump(void)
101
{
102
    page_dump(qemu_logfile);
103
}
104
#endif
105
#endif
106

    
107

    
108
/* Maintenance: */
109

    
110
/* fflush() the log file */
111
static inline void qemu_log_flush(void)
112
{
113
    fflush(qemu_logfile);
114
}
115

    
116
/* Close the log file */
117
static inline void qemu_log_close(void)
118
{
119
    fclose(qemu_logfile);
120
    qemu_logfile = NULL;
121
}
122

    
123
/* Set up a new log file */
124
static inline void qemu_log_set_file(FILE *f)
125
{
126
    qemu_logfile = f;
127
}
128

    
129
/* Set up a new log file, only if none is set */
130
static inline void qemu_log_try_set_file(FILE *f)
131
{
132
    if (!qemu_logfile) {
133
        qemu_logfile = f;
134
    }
135
}
136

    
137
/* define log items */
138
typedef struct CPULogItem {
139
    int mask;
140
    const char *name;
141
    const char *help;
142
} CPULogItem;
143

    
144
extern const CPULogItem cpu_log_items[];
145

    
146
void qemu_set_log(int log_flags, bool use_own_buffers);
147

    
148
static inline void cpu_set_log(int log_flags)
149
{
150
#ifdef CONFIG_USER_ONLY
151
    qemu_set_log(log_flags, true);
152
#else
153
    qemu_set_log(log_flags, false);
154
#endif
155
}
156

    
157
void cpu_set_log_filename(const char *filename);
158
int cpu_str_to_log_mask(const char *str);
159

    
160
#endif