/****************************************************************************
*
*                       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 "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 (*s == ' ' || *s == '\t')
		s++;
	ps[*n] = *s;
	switch (*s) {
	case '\n':
		*n += 1;
		return 0;
	default:
		cmd = *s;
		*n += 1;
	}

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

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

		while (*s == ' ' || *s == '\t')
			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");
}
