Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 1 | /**************************************************************************** |
| 2 | * |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 3 | * Realmode X86 Emulator Library |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 4 | * |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 5 | * Copyright (C) 1991-2004 SciTech Software, Inc. |
| 6 | * Copyright (C) David Mosberger-Tang |
| 7 | * Copyright (C) 1999 Egbert Eich |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 8 | * |
| 9 | * ======================================================================== |
| 10 | * |
| 11 | * Permission to use, copy, modify, distribute, and sell this software and |
| 12 | * its documentation for any purpose is hereby granted without fee, |
| 13 | * provided that the above copyright notice appear in all copies and that |
| 14 | * both that copyright notice and this permission notice appear in |
| 15 | * supporting documentation, and that the name of the authors not be used |
| 16 | * in advertising or publicity pertaining to distribution of the software |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 17 | * without specific, written prior permission. The authors makes no |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 18 | * representations about the suitability of this software for any purpose. |
| 19 | * It is provided "as is" without express or implied warranty. |
| 20 | * |
| 21 | * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
| 22 | * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO |
| 23 | * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR |
| 24 | * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF |
| 25 | * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR |
| 26 | * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
| 27 | * PERFORMANCE OF THIS SOFTWARE. |
| 28 | * |
| 29 | * ======================================================================== |
| 30 | * |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 31 | * Language: ANSI C |
| 32 | * Environment: Any |
| 33 | * Developer: Kendall Bennett |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 34 | * |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 35 | * Description: Header file for debug definitions. |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 36 | * |
| 37 | ****************************************************************************/ |
| 38 | |
| 39 | #ifndef __X86EMU_DEBUG_H |
| 40 | #define __X86EMU_DEBUG_H |
| 41 | |
| 42 | /*---------------------- Macros and type definitions ----------------------*/ |
| 43 | |
| 44 | /* checks to be enabled for "runtime" */ |
| 45 | |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 46 | #define CHECK_IP_FETCH_F 0x1 |
| 47 | #define CHECK_SP_ACCESS_F 0x2 |
| 48 | #define CHECK_MEM_ACCESS_F 0x4 /*using regular linear pointer */ |
| 49 | #define CHECK_DATA_ACCESS_F 0x8 /*using segment:offset */ |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 50 | |
Simon Glass | d8414fc | 2014-11-14 20:56:42 -0700 | [diff] [blame^] | 51 | #ifdef CONFIG_X86EMU_DEBUG |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 52 | # define CHECK_IP_FETCH() (M.x86.check & CHECK_IP_FETCH_F) |
| 53 | # define CHECK_SP_ACCESS() (M.x86.check & CHECK_SP_ACCESS_F) |
| 54 | # define CHECK_MEM_ACCESS() (M.x86.check & CHECK_MEM_ACCESS_F) |
| 55 | # define CHECK_DATA_ACCESS() (M.x86.check & CHECK_DATA_ACCESS_F) |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 56 | #else |
| 57 | # define CHECK_IP_FETCH() |
| 58 | # define CHECK_SP_ACCESS() |
| 59 | # define CHECK_MEM_ACCESS() |
| 60 | # define CHECK_DATA_ACCESS() |
| 61 | #endif |
| 62 | |
Simon Glass | d8414fc | 2014-11-14 20:56:42 -0700 | [diff] [blame^] | 63 | #ifdef CONFIG_X86EMU_DEBUG |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 64 | # define DEBUG_INSTRUMENT() (M.x86.debug & DEBUG_INSTRUMENT_F) |
| 65 | # define DEBUG_DECODE() (M.x86.debug & DEBUG_DECODE_F) |
| 66 | # define DEBUG_TRACE() (M.x86.debug & DEBUG_TRACE_F) |
| 67 | # define DEBUG_STEP() (M.x86.debug & DEBUG_STEP_F) |
| 68 | # define DEBUG_DISASSEMBLE() (M.x86.debug & DEBUG_DISASSEMBLE_F) |
| 69 | # define DEBUG_BREAK() (M.x86.debug & DEBUG_BREAK_F) |
| 70 | # define DEBUG_SVC() (M.x86.debug & DEBUG_SVC_F) |
| 71 | # define DEBUG_SAVE_IP_CS() (M.x86.debug & DEBUG_SAVE_CS_IP) |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 72 | |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 73 | # define DEBUG_FS() (M.x86.debug & DEBUG_FS_F) |
| 74 | # define DEBUG_PROC() (M.x86.debug & DEBUG_PROC_F) |
| 75 | # define DEBUG_SYSINT() (M.x86.debug & DEBUG_SYSINT_F) |
| 76 | # define DEBUG_TRACECALL() (M.x86.debug & DEBUG_TRACECALL_F) |
| 77 | # define DEBUG_TRACECALLREGS() (M.x86.debug & DEBUG_TRACECALL_REGS_F) |
| 78 | # define DEBUG_SYS() (M.x86.debug & DEBUG_SYS_F) |
| 79 | # define DEBUG_MEM_TRACE() (M.x86.debug & DEBUG_MEM_TRACE_F) |
| 80 | # define DEBUG_IO_TRACE() (M.x86.debug & DEBUG_IO_TRACE_F) |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 81 | # define DEBUG_DECODE_NOPRINT() (M.x86.debug & DEBUG_DECODE_NOPRINT_F) |
| 82 | #else |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 83 | # define DEBUG_INSTRUMENT() 0 |
| 84 | # define DEBUG_DECODE() 0 |
| 85 | # define DEBUG_TRACE() 0 |
| 86 | # define DEBUG_STEP() 0 |
| 87 | # define DEBUG_DISASSEMBLE() 0 |
| 88 | # define DEBUG_BREAK() 0 |
| 89 | # define DEBUG_SVC() 0 |
| 90 | # define DEBUG_SAVE_IP_CS() 0 |
| 91 | # define DEBUG_FS() 0 |
| 92 | # define DEBUG_PROC() 0 |
| 93 | # define DEBUG_SYSINT() 0 |
| 94 | # define DEBUG_TRACECALL() 0 |
| 95 | # define DEBUG_TRACECALLREGS() 0 |
| 96 | # define DEBUG_SYS() 0 |
| 97 | # define DEBUG_MEM_TRACE() 0 |
| 98 | # define DEBUG_IO_TRACE() 0 |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 99 | # define DEBUG_DECODE_NOPRINT() 0 |
| 100 | #endif |
| 101 | |
Simon Glass | d8414fc | 2014-11-14 20:56:42 -0700 | [diff] [blame^] | 102 | #ifdef CONFIG_X86EMU_DEBUG |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 103 | |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 104 | # define DECODE_PRINTF(x) if (DEBUG_DECODE()) \ |
| 105 | x86emu_decode_printf(x) |
| 106 | # define DECODE_PRINTF2(x,y) if (DEBUG_DECODE()) \ |
| 107 | x86emu_decode_printf2(x,y) |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 108 | |
| 109 | /* |
| 110 | * The following allow us to look at the bytes of an instruction. The |
| 111 | * first INCR_INSTRN_LEN, is called everytime bytes are consumed in |
| 112 | * the decoding process. The SAVE_IP_CS is called initially when the |
| 113 | * major opcode of the instruction is accessed. |
| 114 | */ |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 115 | #define INC_DECODED_INST_LEN(x) \ |
| 116 | if (DEBUG_DECODE()) \ |
| 117 | x86emu_inc_decoded_inst_len(x) |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 118 | |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 119 | #define SAVE_IP_CS(x,y) \ |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 120 | if (DEBUG_DECODE() | DEBUG_TRACECALL() | DEBUG_BREAK() \ |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 121 | | DEBUG_IO_TRACE() | DEBUG_SAVE_IP_CS()) { \ |
| 122 | M.x86.saved_cs = x; \ |
| 123 | M.x86.saved_ip = y; \ |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 124 | } |
| 125 | #else |
| 126 | # define INC_DECODED_INST_LEN(x) |
| 127 | # define DECODE_PRINTF(x) |
| 128 | # define DECODE_PRINTF2(x,y) |
| 129 | # define SAVE_IP_CS(x,y) |
| 130 | #endif |
| 131 | |
Simon Glass | d8414fc | 2014-11-14 20:56:42 -0700 | [diff] [blame^] | 132 | #ifdef CONFIG_X86EMU_DEBUG |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 133 | #define TRACE_REGS() \ |
| 134 | if (DEBUG_DISASSEMBLE()) { \ |
| 135 | x86emu_just_disassemble(); \ |
| 136 | goto EndOfTheInstructionProcedure; \ |
| 137 | } \ |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 138 | if (DEBUG_TRACE() || DEBUG_DECODE()) X86EMU_trace_regs() |
| 139 | #else |
| 140 | # define TRACE_REGS() |
| 141 | #endif |
| 142 | |
Simon Glass | d8414fc | 2014-11-14 20:56:42 -0700 | [diff] [blame^] | 143 | #ifdef CONFIG_X86EMU_DEBUG |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 144 | # define SINGLE_STEP() if (DEBUG_STEP()) x86emu_single_step() |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 145 | #else |
| 146 | # define SINGLE_STEP() |
| 147 | #endif |
| 148 | |
| 149 | #define TRACE_AND_STEP() \ |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 150 | TRACE_REGS(); \ |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 151 | SINGLE_STEP() |
| 152 | |
Simon Glass | d8414fc | 2014-11-14 20:56:42 -0700 | [diff] [blame^] | 153 | #ifdef CONFIG_X86EMU_DEBUG |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 154 | # define START_OF_INSTR() |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 155 | # define END_OF_INSTR() EndOfTheInstructionProcedure: x86emu_end_instr(); |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 156 | # define END_OF_INSTR_NO_TRACE() x86emu_end_instr(); |
| 157 | #else |
| 158 | # define START_OF_INSTR() |
| 159 | # define END_OF_INSTR() |
| 160 | # define END_OF_INSTR_NO_TRACE() |
| 161 | #endif |
| 162 | |
Simon Glass | d8414fc | 2014-11-14 20:56:42 -0700 | [diff] [blame^] | 163 | #ifdef CONFIG_X86EMU_DEBUG |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 164 | # define CALL_TRACE(u,v,w,x,s) \ |
| 165 | if (DEBUG_TRACECALLREGS()) \ |
| 166 | x86emu_dump_regs(); \ |
| 167 | if (DEBUG_TRACECALL()) \ |
| 168 | printk("%04x:%04x: CALL %s%04x:%04x\n", u , v, s, w, x); |
| 169 | # define RETURN_TRACE(n,u,v) \ |
| 170 | if (DEBUG_TRACECALLREGS()) \ |
| 171 | x86emu_dump_regs(); \ |
| 172 | if (DEBUG_TRACECALL()) \ |
| 173 | printk("%04x:%04x: %s\n",u,v,n); |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 174 | #else |
| 175 | # define CALL_TRACE(u,v,w,x,s) |
| 176 | # define RETURN_TRACE(n,u,v) |
| 177 | #endif |
| 178 | |
Simon Glass | d8414fc | 2014-11-14 20:56:42 -0700 | [diff] [blame^] | 179 | #ifdef CONFIG_X86EMU_DEBUG |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 180 | #define DB(x) x |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 181 | #else |
| 182 | #define DB(x) |
| 183 | #endif |
| 184 | |
| 185 | /*-------------------------- Function Prototypes --------------------------*/ |
| 186 | |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 187 | #ifdef __cplusplus |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 188 | extern "C" { /* Use "C" linkage when in C++ mode */ |
| 189 | #endif |
| 190 | |
| 191 | extern void x86emu_inc_decoded_inst_len(int x); |
| 192 | extern void x86emu_decode_printf(char *x); |
| 193 | extern void x86emu_decode_printf2(char *x, int y); |
| 194 | extern void x86emu_just_disassemble(void); |
| 195 | extern void x86emu_single_step(void); |
| 196 | extern void x86emu_end_instr(void); |
| 197 | extern void x86emu_dump_regs(void); |
| 198 | extern void x86emu_dump_xregs(void); |
| 199 | extern void x86emu_print_int_vect(u16 iv); |
| 200 | extern void x86emu_instrument_instruction(void); |
| 201 | extern void x86emu_check_ip_access(void); |
| 202 | extern void x86emu_check_sp_access(void); |
| 203 | extern void x86emu_check_mem_access(u32 p); |
| 204 | extern void x86emu_check_data_access(uint s, uint o); |
| 205 | |
Wolfgang Denk | 96bb2e0 | 2007-08-06 02:17:36 +0200 | [diff] [blame] | 206 | #ifdef __cplusplus |
| 207 | } /* End of "C" linkage for C++ */ |
Jason Jin | a63ce95 | 2007-07-06 08:34:56 +0800 | [diff] [blame] | 208 | #endif |
| 209 | #endif /* __X86EMU_DEBUG_H */ |