/****************************************************************************
*
*                       Realmode X86 Emulator Library
*
*               Copyright (C) 1991-2004 SciTech Software, Inc.
*                    Copyright (C) David Mosberger-Tang
*                      Copyright (C) 1999 Egbert Eich
*
*  ========================================================================
*
*  Permission to use, copy, modify, distribute, and sell this software and
*  its documentation for any purpose is hereby granted without fee,
*  provided that the above copyright notice appear in all copies and that
*  both that copyright notice and this permission notice appear in
*  supporting documentation, and that the name of the authors not be used
*  in advertising or publicity pertaining to distribution of the software
*  without specific, written prior permission.  The authors makes no
*  representations about the suitability of this software for any purpose.
*  It is provided "as is" without express or implied warranty.
*
*  THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
*  INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
*  EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
*  CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
*  USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
*  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
*  PERFORMANCE OF THIS SOFTWARE.
*
*  ========================================================================
*
* Language:     ANSI C
* Environment:  Any
* Developer:    Kendall Bennett
*
* Description:  This file contains the code to handle debugging of the
*               emulator.
*
****************************************************************************/

#include <stdarg.h>
#include <common.h>
#include <linux/ctype.h>
#include "x86emu/x86emui.h"

/*----------------------------- Implementation ----------------------------*/

#ifdef DEBUG

static void print_encoded_bytes(u16 s, u16 o);
static void print_decoded_instruction(void);
static int x86emu_parse_line(char *s, int *ps, int *n);

/* should look something like debug's output. */
void X86EMU_trace_regs(void)
{
	if (DEBUG_TRACE()) {
		x86emu_dump_regs();
	}
	if (DEBUG_DECODE() && !DEBUG_DECODE_NOPRINT()) {
		printk("%04x:%04x ", M.x86.saved_cs, M.x86.saved_ip);
		print_encoded_bytes(M.x86.saved_cs, M.x86.saved_ip);
		print_decoded_instruction();
	}
}

void X86EMU_trace_xregs(void)
{
	if (DEBUG_TRACE()) {
		x86emu_dump_xregs();
	}
}

void x86emu_just_disassemble(void)
{
	/*
	 * This routine called if the flag DEBUG_DISASSEMBLE is set kind
	 * of a hack!
	 */
	printk("%04x:%04x ", M.x86.saved_cs, M.x86.saved_ip);
	print_encoded_bytes(M.x86.saved_cs, M.x86.saved_ip);
	print_decoded_instruction();
}

static void disassemble_forward(u16 seg, u16 off, int n)
{
	X86EMU_sysEnv tregs;
	int i;
	u8 op1;
	/*
	 * hack, hack, hack.  What we do is use the exact machinery set up
	 * for execution, except that now there is an additional state
	 * flag associated with the "execution", and we are using a copy
	 * of the register struct.  All the major opcodes, once fully
	 * decoded, have the following two steps: TRACE_REGS(r,m);
	 * SINGLE_STEP(r,m); which disappear if DEBUG is not defined to
	 * the preprocessor.  The TRACE_REGS macro expands to:
	 *
	 * if (debug&DEBUG_DISASSEMBLE)
	 *     {just_disassemble(); goto EndOfInstruction;}
	 *     if (debug&DEBUG_TRACE) trace_regs(r,m);
	 *
	 * ......  and at the last line of the routine.
	 *
	 * EndOfInstruction: end_instr();
	 *
	 * Up to the point where TRACE_REG is expanded, NO modifications
	 * are done to any register EXCEPT the IP register, for fetch and
	 * decoding purposes.
	 *
	 * This was done for an entirely different reason, but makes a
	 * nice way to get the system to help debug codes.
	 */
	tregs = M;
	tregs.x86.R_IP = off;
	tregs.x86.R_CS = seg;

	/* reset the decoding buffers */
	tregs.x86.enc_str_pos = 0;
	tregs.x86.enc_pos = 0;

	/* turn on the "disassemble only, no execute" flag */
	tregs.x86.debug |= DEBUG_DISASSEMBLE_F;

	/* DUMP NEXT n instructions to screen in straight_line fashion */
	/*
	 * This looks like the regular instruction fetch stream, except
	 * that when this occurs, each fetched opcode, upon seeing the
	 * DEBUG_DISASSEMBLE flag set, exits immediately after decoding
	 * the instruction.  XXX --- CHECK THAT MEM IS NOT AFFECTED!!!
	 * Note the use of a copy of the register structure...
	 */
	for (i = 0; i < n; i++) {
		op1 = (*sys_rdb) (((u32) M.x86.R_CS << 4) + (M.x86.R_IP++));
		(x86emu_optab[op1]) (op1);
	}
	/* end major hack mode. */
}

void x86emu_check_ip_access(void)
{
	/* NULL as of now */
}

void x86emu_check_sp_access(void)
{
}

void x86emu_check_mem_access(u32 dummy)
{
	/*  check bounds, etc */
}

void x86emu_check_data_access(uint dummy1, uint dummy2)
{
	/*  check bounds, etc */
}

void x86emu_inc_decoded_inst_len(int x)
{
	M.x86.enc_pos += x;
}

void x86emu_decode_printf(char *x)
{
	sprintf(M.x86.decoded_buf + M.x86.enc_str_pos, "%s", x);
	M.x86.enc_str_pos += strlen(x);
}

void x86emu_decode_printf2(char *x, int y)
{
	char temp[100];
	sprintf(temp, x, y);
	sprintf(M.x86.decoded_buf + M.x86.enc_str_pos, "%s", temp);
	M.x86.enc_str_pos += strlen(temp);
}

void x86emu_end_instr(void)
{
	M.x86.enc_str_pos = 0;
	M.x86.enc_pos = 0;
}

static void print_encoded_bytes(u16 s, u16 o)
{
	int i;
	char buf1[64];
	for (i = 0; i < M.x86.enc_pos; i++) {
		sprintf(buf1 + 2 * i, "%02x", fetch_data_byte_abs(s, o + i));
	}
	printk("%-20s", buf1);
}

static void print_decoded_instruction(void)
{
	printk("%s", M.x86.decoded_buf);
}

void x86emu_print_int_vect(u16 iv)
{
	u16 seg, off;

	if (iv > 256)
		return;
	seg = fetch_data_word_abs(0, iv * 4);
	off = fetch_data_word_abs(0, iv * 4 + 2);
	printk("%04x:%04x ", seg, off);
}

void X86EMU_dump_memory(u16 seg, u16 off, u32 amt)
{
	u32 start = off & 0xfffffff0;
	u32 end = (off + 16) & 0xfffffff0;
	u32 i;
	u32 current;

	current = start;
	while (end <= off + amt) {
		printk("%04x:%04x ", seg, start);
		for (i = start; i < off; i++)
			printk("   ");
		for (; i < end; i++)
			printk("%02x ", fetch_data_byte_abs(seg, i));
		printk("\n");
		start = end;
		end = start + 16;
	}
}

void x86emu_single_step(void)
{
	char s[1024];
	int ps[10];
	int ntok;
	int cmd;
	int done;
	int segment;
	int offset;
	static int breakpoint;
	static int noDecode = 1;

	char *p;

	if (DEBUG_BREAK()) {
		if (M.x86.saved_ip != breakpoint) {
			return;
		} else {
			M.x86.debug &= ~DEBUG_DECODE_NOPRINT_F;
			M.x86.debug |= DEBUG_TRACE_F;
			M.x86.debug &= ~DEBUG_BREAK_F;
			print_decoded_instruction();
			X86EMU_trace_regs();
		}
	}
	done = 0;
	offset = M.x86.saved_ip;
	while (!done) {
		printk("-");
		cmd = x86emu_parse_line(s, ps, &ntok);
		switch (cmd) {
		case 'u':
			disassemble_forward(M.x86.saved_cs, (u16) offset, 10);
			break;
		case 'd':
			if (ntok == 2) {
				segment = M.x86.saved_cs;
				offset = ps[1];
				X86EMU_dump_memory(segment, (u16) offset, 16);
				offset += 16;
			} else if (ntok == 3) {
				segment = ps[1];
				offset = ps[2];
				X86EMU_dump_memory(segment, (u16) offset, 16);
				offset += 16;
			} else {
				segment = M.x86.saved_cs;
				X86EMU_dump_memory(segment, (u16) offset, 16);
				offset += 16;
			}
			break;
		case 'c':
			M.x86.debug ^= DEBUG_TRACECALL_F;
			break;
		case 's':
			M.x86.debug ^=
			    DEBUG_SVC_F | DEBUG_SYS_F | DEBUG_SYSINT_F;
			break;
		case 'r':
			X86EMU_trace_regs();
			break;
		case 'x':
			X86EMU_trace_xregs();
			break;
		case 'g':
			if (ntok == 2) {
				breakpoint = ps[1];
				if (noDecode) {
					M.x86.debug |= DEBUG_DECODE_NOPRINT_F;
				} else {
					M.x86.debug &= ~DEBUG_DECODE_NOPRINT_F;
				}
				M.x86.debug &= ~DEBUG_TRACE_F;
				M.x86.debug |= DEBUG_BREAK_F;
				done = 1;
			}
			break;
		case 'q':
			M.x86.debug |= DEBUG_EXIT;
			return;
		case 'P':
			noDecode = (noDecode) ? 0 : 1;
			printk("Toggled decoding to %s\n",
			       (noDecode) ? "false" : "true");
			break;
		case 't':
		case 0:
			done = 1;
			break;
		}
	}
}

int X86EMU_trace_on(void)
{
	return M.x86.debug |= DEBUG_STEP_F | DEBUG_DECODE_F | DEBUG_TRACE_F;
}

int X86EMU_trace_off(void)
{
	return M.x86.debug &= ~(DEBUG_STEP_F | DEBUG_DECODE_F | DEBUG_TRACE_F);
}

static int x86emu_parse_line(char *s, int *ps, int *n)
{
	int cmd;

	*n = 0;
	while (isblank(*s))
		s++;
	ps[*n] = *s;
	switch (*s) {
	case '\n':
		*n += 1;
		return 0;
	default:
		cmd = *s;
		*n += 1;
	}

	while (1) {
		while (!isblank(*s) && *s != '\n')
			s++;

		if (*s == '\n')
			return cmd;

		while (isblank(*s))
			s++;

		*n += 1;
	}
}

#endif				/* DEBUG */

void x86emu_dump_regs(void)
{
	printk("\tAX=%04x  ", M.x86.R_AX);
	printk("BX=%04x  ", M.x86.R_BX);
	printk("CX=%04x  ", M.x86.R_CX);
	printk("DX=%04x  ", M.x86.R_DX);
	printk("SP=%04x  ", M.x86.R_SP);
	printk("BP=%04x  ", M.x86.R_BP);
	printk("SI=%04x  ", M.x86.R_SI);
	printk("DI=%04x\n", M.x86.R_DI);
	printk("\tDS=%04x  ", M.x86.R_DS);
	printk("ES=%04x  ", M.x86.R_ES);
	printk("SS=%04x  ", M.x86.R_SS);
	printk("CS=%04x  ", M.x86.R_CS);
	printk("IP=%04x   ", M.x86.R_IP);
	if (ACCESS_FLAG(F_OF))
		printk("OV ");	/* CHECKED... */
	else
		printk("NV ");
	if (ACCESS_FLAG(F_DF))
		printk("DN ");
	else
		printk("UP ");
	if (ACCESS_FLAG(F_IF))
		printk("EI ");
	else
		printk("DI ");
	if (ACCESS_FLAG(F_SF))
		printk("NG ");
	else
		printk("PL ");
	if (ACCESS_FLAG(F_ZF))
		printk("ZR ");
	else
		printk("NZ ");
	if (ACCESS_FLAG(F_AF))
		printk("AC ");
	else
		printk("NA ");
	if (ACCESS_FLAG(F_PF))
		printk("PE ");
	else
		printk("PO ");
	if (ACCESS_FLAG(F_CF))
		printk("CY ");
	else
		printk("NC ");
	printk("\n");
}

void x86emu_dump_xregs(void)
{
	printk("\tEAX=%08x  ", M.x86.R_EAX);
	printk("EBX=%08x  ", M.x86.R_EBX);
	printk("ECX=%08x  ", M.x86.R_ECX);
	printk("EDX=%08x  \n", M.x86.R_EDX);
	printk("\tESP=%08x  ", M.x86.R_ESP);
	printk("EBP=%08x  ", M.x86.R_EBP);
	printk("ESI=%08x  ", M.x86.R_ESI);
	printk("EDI=%08x\n", M.x86.R_EDI);
	printk("\tDS=%04x  ", M.x86.R_DS);
	printk("ES=%04x  ", M.x86.R_ES);
	printk("SS=%04x  ", M.x86.R_SS);
	printk("CS=%04x  ", M.x86.R_CS);
	printk("EIP=%08x\n\t", M.x86.R_EIP);
	if (ACCESS_FLAG(F_OF))
		printk("OV ");	/* CHECKED... */
	else
		printk("NV ");
	if (ACCESS_FLAG(F_DF))
		printk("DN ");
	else
		printk("UP ");
	if (ACCESS_FLAG(F_IF))
		printk("EI ");
	else
		printk("DI ");
	if (ACCESS_FLAG(F_SF))
		printk("NG ");
	else
		printk("PL ");
	if (ACCESS_FLAG(F_ZF))
		printk("ZR ");
	else
		printk("NZ ");
	if (ACCESS_FLAG(F_AF))
		printk("AC ");
	else
		printk("NA ");
	if (ACCESS_FLAG(F_PF))
		printk("PE ");
	else
		printk("PO ");
	if (ACCESS_FLAG(F_CF))
		printk("CY ");
	else
		printk("NC ");
	printk("\n");
}
