1 /* 2 Hatari - log.h 3 4 This file is distributed under the GNU General Public License, version 2 5 or at your option any later version. Read the file gpl.txt for details. 6 */ 7 #ifndef HATARI_LOG_H 8 #define HATARI_LOG_H 9 10 #include <stdbool.h> 11 #include <SDL_types.h> 12 13 14 /* Exception debugging 15 * ------------------- 16 */ 17 18 /* CPU exception flags 19 * is catching needed also for: traps 0, 3-12, 15? (MonST catches them) 20 */ 21 #define EXCEPT_BUS (1<<0) 22 #define EXCEPT_ADDRESS (1<<1) 23 #define EXCEPT_ILLEGAL (1<<2) 24 #define EXCEPT_ZERODIV (1<<3) 25 #define EXCEPT_CHK (1<<4) 26 #define EXCEPT_TRAPV (1<<5) 27 #define EXCEPT_PRIVILEGE (1<<6) 28 #define EXCEPT_TRACE (1<<7) 29 #define EXCEPT_NOHANDLER (1<<8) 30 31 /* DSP exception flags */ 32 #define EXCEPT_DSP (1<<9) 33 34 /* whether to enable exception debugging on autostart */ 35 #define EXCEPT_AUTOSTART (1<<10) 36 37 /* general flags */ 38 #define EXCEPT_NONE (0) 39 #define EXCEPT_ALL (~EXCEPT_AUTOSTART) 40 41 /* defaults are same as with earlier -D option */ 42 #define DEFAULT_EXCEPTIONS (EXCEPT_BUS|EXCEPT_ADDRESS|EXCEPT_DSP) 43 44 extern int ExceptionDebugMask; 45 extern const char* Log_SetExceptionDebugMask(const char *OptionsStr); 46 47 48 /* Logging 49 * ------- 50 * Is always enabled as it's information that can be useful 51 * to the Hatari users 52 */ 53 typedef enum 54 { 55 /* these present user with a dialog and log the issue */ 56 LOG_FATAL, /* Hatari can't continue unless user resolves issue */ 57 LOG_ERROR, /* something user did directly failed (e.g. save) */ 58 /* these just log the issue */ 59 LOG_WARN, /* something failed, but it's less serious */ 60 LOG_INFO, /* user action success (e.g. TOS file load) */ 61 LOG_TODO, /* functionality not yet being emulated */ 62 LOG_DEBUG, /* information about internal Hatari working */ 63 LOG_NONE /* invalid LOG level */ 64 } LOGTYPE; 65 66 #define LOG_NAMES {"FATAL", "ERROR", "WARN ", "INFO ", "TODO ", "DEBUG"} 67 68 69 #ifndef __GNUC__ 70 /* assuming attributes work only for GCC */ 71 #define __attribute__(foo) 72 #endif 73 74 extern void Log_Default(void); 75 extern void Log_SetLevels(void); 76 extern int Log_Init(void); 77 extern int Log_SetAlertLevel(int level); 78 extern void Log_UnInit(void); 79 extern void Log_Printf(LOGTYPE nType, const char *psFormat, ...) 80 __attribute__ ((format (printf, 2, 3))); 81 extern void Log_AlertDlg(LOGTYPE nType, const char *psFormat, ...) 82 __attribute__ ((format (printf, 2, 3))); 83 extern LOGTYPE Log_ParseOptions(const char *OptionStr); 84 extern const char* Log_SetTraceOptions(const char *OptionsStr); 85 extern char *Log_MatchTrace(const char *text, int state); 86 87 #ifndef __GNUC__ 88 #undef __attribute__ 89 #endif 90 91 92 93 /* Tracing 94 * ------- 95 * Tracing outputs information about what happens in the emulated 96 * system and slows down the emulation. As it's intended mainly 97 * just for the Hatari developers, tracing support is compiled in 98 * by default. 99 * 100 * Tracing can be enabled by defining ENABLE_TRACING 101 * in the top level config.h 102 */ 103 #include "config.h" 104 105 /* Up to 64 levels when using Uint64 for HatariTraceFlags */ 106 #define TRACE_VIDEO_SYNC (1<<0) 107 #define TRACE_VIDEO_RES (1<<1) 108 #define TRACE_VIDEO_COLOR (1<<2) 109 #define TRACE_VIDEO_BORDER_V (1<<3) 110 #define TRACE_VIDEO_BORDER_H (1<<4) 111 #define TRACE_VIDEO_ADDR (1<<5) 112 #define TRACE_VIDEO_VBL (1<<6) 113 #define TRACE_VIDEO_HBL (1<<7) 114 #define TRACE_VIDEO_STE (1<<8) 115 116 #define TRACE_MFP_EXCEPTION (1<<9) 117 #define TRACE_MFP_START (1<<10) 118 #define TRACE_MFP_READ (1<<11) 119 #define TRACE_MFP_WRITE (1<<12) 120 121 #define TRACE_PSG_READ (1<<13) 122 #define TRACE_PSG_WRITE (1<<14) 123 124 #define TRACE_CPU_PAIRING (1<<15) 125 #define TRACE_CPU_DISASM (1<<16) 126 #define TRACE_CPU_EXCEPTION (1<<17) 127 #define TRACE_CPU_REGS (1<<18) 128 129 #define TRACE_INT (1<<19) 130 131 #define TRACE_FDC (1<<20) 132 133 #define TRACE_ACIA (1<<21) 134 135 #define TRACE_IKBD_CMDS (1<<22) 136 #define TRACE_IKBD_ACIA (1<<23) 137 #define TRACE_IKBD_EXEC (1<<24) 138 139 #define TRACE_BLITTER (1<<25) 140 141 #define TRACE_OS_BIOS (1<<26) 142 #define TRACE_OS_XBIOS (1<<27) 143 #define TRACE_OS_GEMDOS (1<<28) 144 #define TRACE_OS_VDI (1<<29) 145 #define TRACE_OS_AES (1<<30) 146 147 #define TRACE_IOMEM_RD (1ll<<31) 148 #define TRACE_IOMEM_WR (1ll<<32) 149 150 #define TRACE_DMASND (1ll<<33) 151 152 #define TRACE_CROSSBAR (1ll<<34) 153 #define TRACE_VIDEL (1ll<<35) 154 155 #define TRACE_DSP_HOST_INTERFACE (1ll<<36) 156 #define TRACE_DSP_HOST_COMMAND (1ll<<37) 157 #define TRACE_DSP_HOST_SSI (1ll<<38) 158 #define TRACE_DSP_DISASM (1ll<<39) 159 #define TRACE_DSP_DISASM_REG (1ll<<40) 160 #define TRACE_DSP_DISASM_MEM (1ll<<41) 161 #define TRACE_DSP_STATE (1ll<<42) 162 #define TRACE_DSP_INTERRUPT (1ll<<43) 163 164 #define TRACE_DSP_SYMBOLS (1ll<<44) 165 #define TRACE_CPU_SYMBOLS (1ll<<45) 166 167 #define TRACE_NVRAM (1ll<<46) 168 169 #define TRACE_SCSI_CMD (1ll<<47) 170 171 #define TRACE_NATFEATS (1ll<<48) 172 173 #define TRACE_KEYMAP (1ll<<49) 174 175 #define TRACE_MIDI (1ll<<50) 176 177 #define TRACE_IDE (1ll<<51) 178 179 #define TRACE_OS_BASE (1ll<<52) 180 181 #define TRACE_SCSIDRV (1ll<<53) 182 183 #define TRACE_MEM (1ll<<54) 184 185 #define TRACE_NONE (0) 186 #define TRACE_ALL (~0) 187 188 189 #define TRACE_VIDEO_ALL ( TRACE_VIDEO_SYNC | TRACE_VIDEO_RES | TRACE_VIDEO_COLOR \ 190 | TRACE_VIDEO_BORDER_V | TRACE_VIDEO_BORDER_H | TRACE_VIDEO_ADDR \ 191 | TRACE_VIDEO_VBL | TRACE_VIDEO_HBL | TRACE_VIDEO_STE ) 192 193 #define TRACE_MFP_ALL ( TRACE_MFP_EXCEPTION | TRACE_MFP_START | TRACE_MFP_READ | TRACE_MFP_WRITE ) 194 195 #define TRACE_PSG_ALL ( TRACE_PSG_READ | TRACE_PSG_WRITE ) 196 197 #define TRACE_CPU_ALL ( TRACE_CPU_PAIRING | TRACE_CPU_DISASM | TRACE_CPU_EXCEPTION ) 198 199 #define TRACE_IKBD_ALL ( TRACE_IKBD_CMDS | TRACE_IKBD_ACIA | TRACE_IKBD_EXEC ) 200 201 #define TRACE_OS_ALL ( TRACE_OS_BASE | TRACE_OS_BIOS | TRACE_OS_XBIOS | TRACE_OS_GEMDOS | TRACE_OS_AES | TRACE_OS_VDI ) 202 203 #define TRACE_IOMEM_ALL ( TRACE_IOMEM_RD | TRACE_IOMEM_WR ) 204 205 #define TRACE_DSP_ALL ( TRACE_DSP_HOST_INTERFACE | TRACE_DSP_HOST_COMMAND | TRACE_DSP_HOST_SSI | TRACE_DSP_DISASM \ 206 | TRACE_DSP_DISASM_REG | TRACE_DSP_DISASM_MEM | TRACE_DSP_STATE | TRACE_DSP_INTERRUPT ) 207 208 extern FILE *TraceFile; 209 extern Uint64 LogTraceFlags; 210 211 #if ENABLE_TRACING 212 213 #define LOG_TRACE(level, ...) \ 214 if (unlikely(LogTraceFlags & (level))) { fprintf(TraceFile, __VA_ARGS__); fflush(TraceFile); } 215 216 #define LOG_TRACE_LEVEL( level ) (unlikely(LogTraceFlags & (level))) 217 218 #else /* ENABLE_TRACING */ 219 220 #define LOG_TRACE(level, ...) {} 221 222 #define LOG_TRACE_LEVEL( level ) (0) 223 224 #endif /* ENABLE_TRACING */ 225 226 /* Always defined in full to avoid compiler warnings about unused variables. 227 * In code it's used in such a way that it will be optimized away when tracing 228 * is disabled. 229 */ 230 #define LOG_TRACE_PRINT(...) fprintf(TraceFile , __VA_ARGS__) 231 232 233 #endif /* HATARI_LOG_H */ 234