1*ece92f85SJason Jin /**************************************************************************** 2*ece92f85SJason Jin * 3*ece92f85SJason Jin * Realmode X86 Emulator Library 4*ece92f85SJason Jin * 5*ece92f85SJason Jin * Copyright (C) 1991-2004 SciTech Software, Inc. 6*ece92f85SJason Jin * Copyright (C) David Mosberger-Tang 7*ece92f85SJason Jin * Copyright (C) 1999 Egbert Eich 8*ece92f85SJason Jin * 9*ece92f85SJason Jin * ======================================================================== 10*ece92f85SJason Jin * 11*ece92f85SJason Jin * Permission to use, copy, modify, distribute, and sell this software and 12*ece92f85SJason Jin * its documentation for any purpose is hereby granted without fee, 13*ece92f85SJason Jin * provided that the above copyright notice appear in all copies and that 14*ece92f85SJason Jin * both that copyright notice and this permission notice appear in 15*ece92f85SJason Jin * supporting documentation, and that the name of the authors not be used 16*ece92f85SJason Jin * in advertising or publicity pertaining to distribution of the software 17*ece92f85SJason Jin * without specific, written prior permission. The authors makes no 18*ece92f85SJason Jin * representations about the suitability of this software for any purpose. 19*ece92f85SJason Jin * It is provided "as is" without express or implied warranty. 20*ece92f85SJason Jin * 21*ece92f85SJason Jin * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 22*ece92f85SJason Jin * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 23*ece92f85SJason Jin * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR 24*ece92f85SJason Jin * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 25*ece92f85SJason Jin * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 26*ece92f85SJason Jin * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 27*ece92f85SJason Jin * PERFORMANCE OF THIS SOFTWARE. 28*ece92f85SJason Jin * 29*ece92f85SJason Jin * ======================================================================== 30*ece92f85SJason Jin * 31*ece92f85SJason Jin * Language: ANSI C 32*ece92f85SJason Jin * Environment: Any 33*ece92f85SJason Jin * Developer: Kendall Bennett 34*ece92f85SJason Jin * 35*ece92f85SJason Jin * Description: This file contains the code to handle debugging of the 36*ece92f85SJason Jin * emulator. 37*ece92f85SJason Jin * 38*ece92f85SJason Jin ****************************************************************************/ 39*ece92f85SJason Jin 40*ece92f85SJason Jin #include "x86emu/x86emui.h" 41*ece92f85SJason Jin #include <stdarg.h> 42*ece92f85SJason Jin 43*ece92f85SJason Jin /*----------------------------- Implementation ----------------------------*/ 44*ece92f85SJason Jin 45*ece92f85SJason Jin #ifdef DEBUG 46*ece92f85SJason Jin 47*ece92f85SJason Jin static void print_encoded_bytes(u16 s, u16 o); 48*ece92f85SJason Jin static void print_decoded_instruction(void); 49*ece92f85SJason Jin static int parse_line(char *s, int *ps, int *n); 50*ece92f85SJason Jin 51*ece92f85SJason Jin /* should look something like debug's output. */ 52*ece92f85SJason Jin void X86EMU_trace_regs(void) 53*ece92f85SJason Jin { 54*ece92f85SJason Jin if (DEBUG_TRACE()) { 55*ece92f85SJason Jin x86emu_dump_regs(); 56*ece92f85SJason Jin } 57*ece92f85SJason Jin if (DEBUG_DECODE() && !DEBUG_DECODE_NOPRINT()) { 58*ece92f85SJason Jin printk("%04x:%04x ", M.x86.saved_cs, M.x86.saved_ip); 59*ece92f85SJason Jin print_encoded_bytes(M.x86.saved_cs, M.x86.saved_ip); 60*ece92f85SJason Jin print_decoded_instruction(); 61*ece92f85SJason Jin } 62*ece92f85SJason Jin } 63*ece92f85SJason Jin 64*ece92f85SJason Jin void X86EMU_trace_xregs(void) 65*ece92f85SJason Jin { 66*ece92f85SJason Jin if (DEBUG_TRACE()) { 67*ece92f85SJason Jin x86emu_dump_xregs(); 68*ece92f85SJason Jin } 69*ece92f85SJason Jin } 70*ece92f85SJason Jin 71*ece92f85SJason Jin void x86emu_just_disassemble(void) 72*ece92f85SJason Jin { 73*ece92f85SJason Jin /* 74*ece92f85SJason Jin * This routine called if the flag DEBUG_DISASSEMBLE is set kind 75*ece92f85SJason Jin * of a hack! 76*ece92f85SJason Jin */ 77*ece92f85SJason Jin printk("%04x:%04x ", M.x86.saved_cs, M.x86.saved_ip); 78*ece92f85SJason Jin print_encoded_bytes(M.x86.saved_cs, M.x86.saved_ip); 79*ece92f85SJason Jin print_decoded_instruction(); 80*ece92f85SJason Jin } 81*ece92f85SJason Jin 82*ece92f85SJason Jin static void disassemble_forward(u16 seg, u16 off, int n) 83*ece92f85SJason Jin { 84*ece92f85SJason Jin X86EMU_sysEnv tregs; 85*ece92f85SJason Jin int i; 86*ece92f85SJason Jin u8 op1; 87*ece92f85SJason Jin /* 88*ece92f85SJason Jin * hack, hack, hack. What we do is use the exact machinery set up 89*ece92f85SJason Jin * for execution, except that now there is an additional state 90*ece92f85SJason Jin * flag associated with the "execution", and we are using a copy 91*ece92f85SJason Jin * of the register struct. All the major opcodes, once fully 92*ece92f85SJason Jin * decoded, have the following two steps: TRACE_REGS(r,m); 93*ece92f85SJason Jin * SINGLE_STEP(r,m); which disappear if DEBUG is not defined to 94*ece92f85SJason Jin * the preprocessor. The TRACE_REGS macro expands to: 95*ece92f85SJason Jin * 96*ece92f85SJason Jin * if (debug&DEBUG_DISASSEMBLE) 97*ece92f85SJason Jin * {just_disassemble(); goto EndOfInstruction;} 98*ece92f85SJason Jin * if (debug&DEBUG_TRACE) trace_regs(r,m); 99*ece92f85SJason Jin * 100*ece92f85SJason Jin * ...... and at the last line of the routine. 101*ece92f85SJason Jin * 102*ece92f85SJason Jin * EndOfInstruction: end_instr(); 103*ece92f85SJason Jin * 104*ece92f85SJason Jin * Up to the point where TRACE_REG is expanded, NO modifications 105*ece92f85SJason Jin * are done to any register EXCEPT the IP register, for fetch and 106*ece92f85SJason Jin * decoding purposes. 107*ece92f85SJason Jin * 108*ece92f85SJason Jin * This was done for an entirely different reason, but makes a 109*ece92f85SJason Jin * nice way to get the system to help debug codes. 110*ece92f85SJason Jin */ 111*ece92f85SJason Jin tregs = M; 112*ece92f85SJason Jin tregs.x86.R_IP = off; 113*ece92f85SJason Jin tregs.x86.R_CS = seg; 114*ece92f85SJason Jin 115*ece92f85SJason Jin /* reset the decoding buffers */ 116*ece92f85SJason Jin tregs.x86.enc_str_pos = 0; 117*ece92f85SJason Jin tregs.x86.enc_pos = 0; 118*ece92f85SJason Jin 119*ece92f85SJason Jin /* turn on the "disassemble only, no execute" flag */ 120*ece92f85SJason Jin tregs.x86.debug |= DEBUG_DISASSEMBLE_F; 121*ece92f85SJason Jin 122*ece92f85SJason Jin /* DUMP NEXT n instructions to screen in straight_line fashion */ 123*ece92f85SJason Jin /* 124*ece92f85SJason Jin * This looks like the regular instruction fetch stream, except 125*ece92f85SJason Jin * that when this occurs, each fetched opcode, upon seeing the 126*ece92f85SJason Jin * DEBUG_DISASSEMBLE flag set, exits immediately after decoding 127*ece92f85SJason Jin * the instruction. XXX --- CHECK THAT MEM IS NOT AFFECTED!!! 128*ece92f85SJason Jin * Note the use of a copy of the register structure... 129*ece92f85SJason Jin */ 130*ece92f85SJason Jin for (i = 0; i < n; i++) { 131*ece92f85SJason Jin op1 = (*sys_rdb) (((u32) M.x86.R_CS << 4) + (M.x86.R_IP++)); 132*ece92f85SJason Jin (x86emu_optab[op1]) (op1); 133*ece92f85SJason Jin } 134*ece92f85SJason Jin /* end major hack mode. */ 135*ece92f85SJason Jin } 136*ece92f85SJason Jin 137*ece92f85SJason Jin void x86emu_check_ip_access(void) 138*ece92f85SJason Jin { 139*ece92f85SJason Jin /* NULL as of now */ 140*ece92f85SJason Jin } 141*ece92f85SJason Jin 142*ece92f85SJason Jin void x86emu_check_sp_access(void) 143*ece92f85SJason Jin { 144*ece92f85SJason Jin } 145*ece92f85SJason Jin 146*ece92f85SJason Jin void x86emu_check_mem_access(u32 dummy) 147*ece92f85SJason Jin { 148*ece92f85SJason Jin /* check bounds, etc */ 149*ece92f85SJason Jin } 150*ece92f85SJason Jin 151*ece92f85SJason Jin void x86emu_check_data_access(uint dummy1, uint dummy2) 152*ece92f85SJason Jin { 153*ece92f85SJason Jin /* check bounds, etc */ 154*ece92f85SJason Jin } 155*ece92f85SJason Jin 156*ece92f85SJason Jin void x86emu_inc_decoded_inst_len(int x) 157*ece92f85SJason Jin { 158*ece92f85SJason Jin M.x86.enc_pos += x; 159*ece92f85SJason Jin } 160*ece92f85SJason Jin 161*ece92f85SJason Jin void x86emu_decode_printf(char *x) 162*ece92f85SJason Jin { 163*ece92f85SJason Jin sprintf(M.x86.decoded_buf + M.x86.enc_str_pos, "%s", x); 164*ece92f85SJason Jin M.x86.enc_str_pos += strlen(x); 165*ece92f85SJason Jin } 166*ece92f85SJason Jin 167*ece92f85SJason Jin void x86emu_decode_printf2(char *x, int y) 168*ece92f85SJason Jin { 169*ece92f85SJason Jin char temp[100]; 170*ece92f85SJason Jin sprintf(temp, x, y); 171*ece92f85SJason Jin sprintf(M.x86.decoded_buf + M.x86.enc_str_pos, "%s", temp); 172*ece92f85SJason Jin M.x86.enc_str_pos += strlen(temp); 173*ece92f85SJason Jin } 174*ece92f85SJason Jin 175*ece92f85SJason Jin void x86emu_end_instr(void) 176*ece92f85SJason Jin { 177*ece92f85SJason Jin M.x86.enc_str_pos = 0; 178*ece92f85SJason Jin M.x86.enc_pos = 0; 179*ece92f85SJason Jin } 180*ece92f85SJason Jin 181*ece92f85SJason Jin static void print_encoded_bytes(u16 s, u16 o) 182*ece92f85SJason Jin { 183*ece92f85SJason Jin int i; 184*ece92f85SJason Jin char buf1[64]; 185*ece92f85SJason Jin for (i = 0; i < M.x86.enc_pos; i++) { 186*ece92f85SJason Jin sprintf(buf1 + 2 * i, "%02x", fetch_data_byte_abs(s, o + i)); 187*ece92f85SJason Jin } 188*ece92f85SJason Jin printk("%-20s", buf1); 189*ece92f85SJason Jin } 190*ece92f85SJason Jin 191*ece92f85SJason Jin static void print_decoded_instruction(void) 192*ece92f85SJason Jin { 193*ece92f85SJason Jin printk("%s", M.x86.decoded_buf); 194*ece92f85SJason Jin } 195*ece92f85SJason Jin 196*ece92f85SJason Jin void x86emu_print_int_vect(u16 iv) 197*ece92f85SJason Jin { 198*ece92f85SJason Jin u16 seg, off; 199*ece92f85SJason Jin 200*ece92f85SJason Jin if (iv > 256) 201*ece92f85SJason Jin return; 202*ece92f85SJason Jin seg = fetch_data_word_abs(0, iv * 4); 203*ece92f85SJason Jin off = fetch_data_word_abs(0, iv * 4 + 2); 204*ece92f85SJason Jin printk("%04x:%04x ", seg, off); 205*ece92f85SJason Jin } 206*ece92f85SJason Jin 207*ece92f85SJason Jin void X86EMU_dump_memory(u16 seg, u16 off, u32 amt) 208*ece92f85SJason Jin { 209*ece92f85SJason Jin u32 start = off & 0xfffffff0; 210*ece92f85SJason Jin u32 end = (off + 16) & 0xfffffff0; 211*ece92f85SJason Jin u32 i; 212*ece92f85SJason Jin u32 current; 213*ece92f85SJason Jin 214*ece92f85SJason Jin current = start; 215*ece92f85SJason Jin while (end <= off + amt) { 216*ece92f85SJason Jin printk("%04x:%04x ", seg, start); 217*ece92f85SJason Jin for (i = start; i < off; i++) 218*ece92f85SJason Jin printk(" "); 219*ece92f85SJason Jin for (; i < end; i++) 220*ece92f85SJason Jin printk("%02x ", fetch_data_byte_abs(seg, i)); 221*ece92f85SJason Jin printk("\n"); 222*ece92f85SJason Jin start = end; 223*ece92f85SJason Jin end = start + 16; 224*ece92f85SJason Jin } 225*ece92f85SJason Jin } 226*ece92f85SJason Jin 227*ece92f85SJason Jin void x86emu_single_step(void) 228*ece92f85SJason Jin { 229*ece92f85SJason Jin char s[1024]; 230*ece92f85SJason Jin int ps[10]; 231*ece92f85SJason Jin int ntok; 232*ece92f85SJason Jin int cmd; 233*ece92f85SJason Jin int done; 234*ece92f85SJason Jin int segment; 235*ece92f85SJason Jin int offset; 236*ece92f85SJason Jin static int breakpoint; 237*ece92f85SJason Jin static int noDecode = 1; 238*ece92f85SJason Jin 239*ece92f85SJason Jin char *p; 240*ece92f85SJason Jin 241*ece92f85SJason Jin if (DEBUG_BREAK()) { 242*ece92f85SJason Jin if (M.x86.saved_ip != breakpoint) { 243*ece92f85SJason Jin return; 244*ece92f85SJason Jin } else { 245*ece92f85SJason Jin M.x86.debug &= ~DEBUG_DECODE_NOPRINT_F; 246*ece92f85SJason Jin M.x86.debug |= DEBUG_TRACE_F; 247*ece92f85SJason Jin M.x86.debug &= ~DEBUG_BREAK_F; 248*ece92f85SJason Jin print_decoded_instruction(); 249*ece92f85SJason Jin X86EMU_trace_regs(); 250*ece92f85SJason Jin } 251*ece92f85SJason Jin } 252*ece92f85SJason Jin done = 0; 253*ece92f85SJason Jin offset = M.x86.saved_ip; 254*ece92f85SJason Jin while (!done) { 255*ece92f85SJason Jin printk("-"); 256*ece92f85SJason Jin cmd = parse_line(s, ps, &ntok); 257*ece92f85SJason Jin switch (cmd) { 258*ece92f85SJason Jin case 'u': 259*ece92f85SJason Jin disassemble_forward(M.x86.saved_cs, (u16) offset, 10); 260*ece92f85SJason Jin break; 261*ece92f85SJason Jin case 'd': 262*ece92f85SJason Jin if (ntok == 2) { 263*ece92f85SJason Jin segment = M.x86.saved_cs; 264*ece92f85SJason Jin offset = ps[1]; 265*ece92f85SJason Jin X86EMU_dump_memory(segment, (u16) offset, 16); 266*ece92f85SJason Jin offset += 16; 267*ece92f85SJason Jin } else if (ntok == 3) { 268*ece92f85SJason Jin segment = ps[1]; 269*ece92f85SJason Jin offset = ps[2]; 270*ece92f85SJason Jin X86EMU_dump_memory(segment, (u16) offset, 16); 271*ece92f85SJason Jin offset += 16; 272*ece92f85SJason Jin } else { 273*ece92f85SJason Jin segment = M.x86.saved_cs; 274*ece92f85SJason Jin X86EMU_dump_memory(segment, (u16) offset, 16); 275*ece92f85SJason Jin offset += 16; 276*ece92f85SJason Jin } 277*ece92f85SJason Jin break; 278*ece92f85SJason Jin case 'c': 279*ece92f85SJason Jin M.x86.debug ^= DEBUG_TRACECALL_F; 280*ece92f85SJason Jin break; 281*ece92f85SJason Jin case 's': 282*ece92f85SJason Jin M.x86.debug ^= 283*ece92f85SJason Jin DEBUG_SVC_F | DEBUG_SYS_F | DEBUG_SYSINT_F; 284*ece92f85SJason Jin break; 285*ece92f85SJason Jin case 'r': 286*ece92f85SJason Jin X86EMU_trace_regs(); 287*ece92f85SJason Jin break; 288*ece92f85SJason Jin case 'x': 289*ece92f85SJason Jin X86EMU_trace_xregs(); 290*ece92f85SJason Jin break; 291*ece92f85SJason Jin case 'g': 292*ece92f85SJason Jin if (ntok == 2) { 293*ece92f85SJason Jin breakpoint = ps[1]; 294*ece92f85SJason Jin if (noDecode) { 295*ece92f85SJason Jin M.x86.debug |= DEBUG_DECODE_NOPRINT_F; 296*ece92f85SJason Jin } else { 297*ece92f85SJason Jin M.x86.debug &= ~DEBUG_DECODE_NOPRINT_F; 298*ece92f85SJason Jin } 299*ece92f85SJason Jin M.x86.debug &= ~DEBUG_TRACE_F; 300*ece92f85SJason Jin M.x86.debug |= DEBUG_BREAK_F; 301*ece92f85SJason Jin done = 1; 302*ece92f85SJason Jin } 303*ece92f85SJason Jin break; 304*ece92f85SJason Jin case 'q': 305*ece92f85SJason Jin M.x86.debug |= DEBUG_EXIT; 306*ece92f85SJason Jin return; 307*ece92f85SJason Jin case 'P': 308*ece92f85SJason Jin noDecode = (noDecode) ? 0 : 1; 309*ece92f85SJason Jin printk("Toggled decoding to %s\n", 310*ece92f85SJason Jin (noDecode) ? "FALSE" : "TRUE"); 311*ece92f85SJason Jin break; 312*ece92f85SJason Jin case 't': 313*ece92f85SJason Jin case 0: 314*ece92f85SJason Jin done = 1; 315*ece92f85SJason Jin break; 316*ece92f85SJason Jin } 317*ece92f85SJason Jin } 318*ece92f85SJason Jin } 319*ece92f85SJason Jin 320*ece92f85SJason Jin int X86EMU_trace_on(void) 321*ece92f85SJason Jin { 322*ece92f85SJason Jin return M.x86.debug |= DEBUG_STEP_F | DEBUG_DECODE_F | DEBUG_TRACE_F; 323*ece92f85SJason Jin } 324*ece92f85SJason Jin 325*ece92f85SJason Jin int X86EMU_trace_off(void) 326*ece92f85SJason Jin { 327*ece92f85SJason Jin return M.x86.debug &= ~(DEBUG_STEP_F | DEBUG_DECODE_F | DEBUG_TRACE_F); 328*ece92f85SJason Jin } 329*ece92f85SJason Jin 330*ece92f85SJason Jin static int parse_line(char *s, int *ps, int *n) 331*ece92f85SJason Jin { 332*ece92f85SJason Jin int cmd; 333*ece92f85SJason Jin 334*ece92f85SJason Jin *n = 0; 335*ece92f85SJason Jin while (*s == ' ' || *s == '\t') 336*ece92f85SJason Jin s++; 337*ece92f85SJason Jin ps[*n] = *s; 338*ece92f85SJason Jin switch (*s) { 339*ece92f85SJason Jin case '\n': 340*ece92f85SJason Jin *n += 1; 341*ece92f85SJason Jin return 0; 342*ece92f85SJason Jin default: 343*ece92f85SJason Jin cmd = *s; 344*ece92f85SJason Jin *n += 1; 345*ece92f85SJason Jin } 346*ece92f85SJason Jin 347*ece92f85SJason Jin while (1) { 348*ece92f85SJason Jin while (*s != ' ' && *s != '\t' && *s != '\n') 349*ece92f85SJason Jin s++; 350*ece92f85SJason Jin 351*ece92f85SJason Jin if (*s == '\n') 352*ece92f85SJason Jin return cmd; 353*ece92f85SJason Jin 354*ece92f85SJason Jin while (*s == ' ' || *s == '\t') 355*ece92f85SJason Jin s++; 356*ece92f85SJason Jin 357*ece92f85SJason Jin *n += 1; 358*ece92f85SJason Jin } 359*ece92f85SJason Jin } 360*ece92f85SJason Jin 361*ece92f85SJason Jin #endif /* DEBUG */ 362*ece92f85SJason Jin 363*ece92f85SJason Jin void x86emu_dump_regs(void) 364*ece92f85SJason Jin { 365*ece92f85SJason Jin printk("\tAX=%04x ", M.x86.R_AX); 366*ece92f85SJason Jin printk("BX=%04x ", M.x86.R_BX); 367*ece92f85SJason Jin printk("CX=%04x ", M.x86.R_CX); 368*ece92f85SJason Jin printk("DX=%04x ", M.x86.R_DX); 369*ece92f85SJason Jin printk("SP=%04x ", M.x86.R_SP); 370*ece92f85SJason Jin printk("BP=%04x ", M.x86.R_BP); 371*ece92f85SJason Jin printk("SI=%04x ", M.x86.R_SI); 372*ece92f85SJason Jin printk("DI=%04x\n", M.x86.R_DI); 373*ece92f85SJason Jin printk("\tDS=%04x ", M.x86.R_DS); 374*ece92f85SJason Jin printk("ES=%04x ", M.x86.R_ES); 375*ece92f85SJason Jin printk("SS=%04x ", M.x86.R_SS); 376*ece92f85SJason Jin printk("CS=%04x ", M.x86.R_CS); 377*ece92f85SJason Jin printk("IP=%04x ", M.x86.R_IP); 378*ece92f85SJason Jin if (ACCESS_FLAG(F_OF)) 379*ece92f85SJason Jin printk("OV "); /* CHECKED... */ 380*ece92f85SJason Jin else 381*ece92f85SJason Jin printk("NV "); 382*ece92f85SJason Jin if (ACCESS_FLAG(F_DF)) 383*ece92f85SJason Jin printk("DN "); 384*ece92f85SJason Jin else 385*ece92f85SJason Jin printk("UP "); 386*ece92f85SJason Jin if (ACCESS_FLAG(F_IF)) 387*ece92f85SJason Jin printk("EI "); 388*ece92f85SJason Jin else 389*ece92f85SJason Jin printk("DI "); 390*ece92f85SJason Jin if (ACCESS_FLAG(F_SF)) 391*ece92f85SJason Jin printk("NG "); 392*ece92f85SJason Jin else 393*ece92f85SJason Jin printk("PL "); 394*ece92f85SJason Jin if (ACCESS_FLAG(F_ZF)) 395*ece92f85SJason Jin printk("ZR "); 396*ece92f85SJason Jin else 397*ece92f85SJason Jin printk("NZ "); 398*ece92f85SJason Jin if (ACCESS_FLAG(F_AF)) 399*ece92f85SJason Jin printk("AC "); 400*ece92f85SJason Jin else 401*ece92f85SJason Jin printk("NA "); 402*ece92f85SJason Jin if (ACCESS_FLAG(F_PF)) 403*ece92f85SJason Jin printk("PE "); 404*ece92f85SJason Jin else 405*ece92f85SJason Jin printk("PO "); 406*ece92f85SJason Jin if (ACCESS_FLAG(F_CF)) 407*ece92f85SJason Jin printk("CY "); 408*ece92f85SJason Jin else 409*ece92f85SJason Jin printk("NC "); 410*ece92f85SJason Jin printk("\n"); 411*ece92f85SJason Jin } 412*ece92f85SJason Jin 413*ece92f85SJason Jin void x86emu_dump_xregs(void) 414*ece92f85SJason Jin { 415*ece92f85SJason Jin printk("\tEAX=%08x ", M.x86.R_EAX); 416*ece92f85SJason Jin printk("EBX=%08x ", M.x86.R_EBX); 417*ece92f85SJason Jin printk("ECX=%08x ", M.x86.R_ECX); 418*ece92f85SJason Jin printk("EDX=%08x \n", M.x86.R_EDX); 419*ece92f85SJason Jin printk("\tESP=%08x ", M.x86.R_ESP); 420*ece92f85SJason Jin printk("EBP=%08x ", M.x86.R_EBP); 421*ece92f85SJason Jin printk("ESI=%08x ", M.x86.R_ESI); 422*ece92f85SJason Jin printk("EDI=%08x\n", M.x86.R_EDI); 423*ece92f85SJason Jin printk("\tDS=%04x ", M.x86.R_DS); 424*ece92f85SJason Jin printk("ES=%04x ", M.x86.R_ES); 425*ece92f85SJason Jin printk("SS=%04x ", M.x86.R_SS); 426*ece92f85SJason Jin printk("CS=%04x ", M.x86.R_CS); 427*ece92f85SJason Jin printk("EIP=%08x\n\t", M.x86.R_EIP); 428*ece92f85SJason Jin if (ACCESS_FLAG(F_OF)) 429*ece92f85SJason Jin printk("OV "); /* CHECKED... */ 430*ece92f85SJason Jin else 431*ece92f85SJason Jin printk("NV "); 432*ece92f85SJason Jin if (ACCESS_FLAG(F_DF)) 433*ece92f85SJason Jin printk("DN "); 434*ece92f85SJason Jin else 435*ece92f85SJason Jin printk("UP "); 436*ece92f85SJason Jin if (ACCESS_FLAG(F_IF)) 437*ece92f85SJason Jin printk("EI "); 438*ece92f85SJason Jin else 439*ece92f85SJason Jin printk("DI "); 440*ece92f85SJason Jin if (ACCESS_FLAG(F_SF)) 441*ece92f85SJason Jin printk("NG "); 442*ece92f85SJason Jin else 443*ece92f85SJason Jin printk("PL "); 444*ece92f85SJason Jin if (ACCESS_FLAG(F_ZF)) 445*ece92f85SJason Jin printk("ZR "); 446*ece92f85SJason Jin else 447*ece92f85SJason Jin printk("NZ "); 448*ece92f85SJason Jin if (ACCESS_FLAG(F_AF)) 449*ece92f85SJason Jin printk("AC "); 450*ece92f85SJason Jin else 451*ece92f85SJason Jin printk("NA "); 452*ece92f85SJason Jin if (ACCESS_FLAG(F_PF)) 453*ece92f85SJason Jin printk("PE "); 454*ece92f85SJason Jin else 455*ece92f85SJason Jin printk("PO "); 456*ece92f85SJason Jin if (ACCESS_FLAG(F_CF)) 457*ece92f85SJason Jin printk("CY "); 458*ece92f85SJason Jin else 459*ece92f85SJason Jin printk("NC "); 460*ece92f85SJason Jin printk("\n"); 461*ece92f85SJason Jin } 462