/*
 * Debugger register handling
 *
 * Copyright 1995 Alexandre Julliard
 */

#include <stdio.h>
#include "debugger.h"

SIGCONTEXT *DEBUG_context;

/***********************************************************************
 *           DEBUG_SetRegister
 *
 * Set a register value.
 */
void DEBUG_SetRegister( enum debug_regs reg, int val )
{
    switch(reg)
    {
        case REG_EAX: EAX_reg(DEBUG_context) = val; break;
        case REG_EBX: EBX_reg(DEBUG_context) = val; break;
        case REG_ECX: ECX_reg(DEBUG_context) = val; break;
        case REG_EDX: EDX_reg(DEBUG_context) = val; break;
        case REG_ESI: ESI_reg(DEBUG_context) = val; break;
        case REG_EDI: EDI_reg(DEBUG_context) = val; break;
        case REG_EBP: EBP_reg(DEBUG_context) = val; break;
        case REG_EFL: EFL_reg(DEBUG_context) = val; break;
        case REG_EIP: EIP_reg(DEBUG_context) = val; break;
        case REG_ESP: ESP_reg(DEBUG_context) = val; break;
        case REG_AX:  AX_reg(DEBUG_context)  = val; break;
        case REG_BX:  BX_reg(DEBUG_context)  = val; break;
        case REG_CX:  CX_reg(DEBUG_context)  = val; break;
        case REG_DX:  DX_reg(DEBUG_context)  = val; break;
        case REG_SI:  SI_reg(DEBUG_context)  = val; break;
        case REG_DI:  DI_reg(DEBUG_context)  = val; break;
        case REG_BP:  BP_reg(DEBUG_context)  = val; break;
        case REG_FL:  FL_reg(DEBUG_context)  = val; break;
        case REG_IP:  IP_reg(DEBUG_context)  = val; break;
        case REG_SP:  SP_reg(DEBUG_context)  = val; break;
        case REG_CS:  CS_reg(DEBUG_context)  = val; break;
        case REG_DS:  DS_reg(DEBUG_context)  = val; break;
        case REG_ES:  ES_reg(DEBUG_context)  = val; break;
        case REG_SS:  SS_reg(DEBUG_context)  = val; break;
#ifdef FS_reg
        case REG_FS:  FS_reg(DEBUG_context)  = val; break;
#else
        case REG_FS:
            fprintf( stderr, "Register %fs not supported on this system\n" );
            break;
#endif
#ifdef GS_reg
        case REG_GS:  GS_reg(DEBUG_context)  = val; break;
#else
        case REG_GS:
            fprintf( stderr, "Register %gs not supported on this system\n" );
            break;
#endif
    }
}


/***********************************************************************
 *           DEBUG_GetRegister
 *
 * Get a register value.
 */
int DEBUG_GetRegister( enum debug_regs reg )
{
    switch(reg)
    {
        case REG_EAX: return EAX_reg(DEBUG_context);
        case REG_EBX: return EBX_reg(DEBUG_context);
        case REG_ECX: return ECX_reg(DEBUG_context);
        case REG_EDX: return EDX_reg(DEBUG_context);
        case REG_ESI: return ESI_reg(DEBUG_context);
        case REG_EDI: return EDI_reg(DEBUG_context);
        case REG_EBP: return EBP_reg(DEBUG_context);
        case REG_EFL: return EFL_reg(DEBUG_context);
        case REG_EIP: return EIP_reg(DEBUG_context);
        case REG_ESP: return ESP_reg(DEBUG_context);
        case REG_AX:  return AX_reg(DEBUG_context);
        case REG_BX:  return BX_reg(DEBUG_context);
        case REG_CX:  return CX_reg(DEBUG_context);
        case REG_DX:  return DX_reg(DEBUG_context);
        case REG_SI:  return SI_reg(DEBUG_context);
        case REG_DI:  return DI_reg(DEBUG_context);
        case REG_BP:  return BP_reg(DEBUG_context);
        case REG_FL:  return FL_reg(DEBUG_context);
        case REG_IP:  return IP_reg(DEBUG_context);
        case REG_SP:  return SP_reg(DEBUG_context);
        case REG_CS:  return CS_reg(DEBUG_context);
        case REG_DS:  return DS_reg(DEBUG_context);
        case REG_ES:  return ES_reg(DEBUG_context);
        case REG_SS:  return SS_reg(DEBUG_context);
#ifdef FS_reg
        case REG_FS:  return FS_reg(DEBUG_context);
#else
        case REG_FS:
            fprintf( stderr, "Register %fs not supported on this system\n" );
            return 0;
#endif
#ifdef GS_reg
        case REG_GS:  return GS_reg(DEBUG_context);
#else
        case REG_GS:
            fprintf( stderr, "Register %gs not supported on this system\n" );
            return 0;
#endif
    }
    return 0;  /* should not happen */
}



/***********************************************************************
 *           DEBUG_InfoRegisters
 *
 * Display registers information. 
 */
void DEBUG_InfoRegisters(void)
{
    fprintf(stderr,"Register dump:\n");

    /* First get the segment registers out of the way */
    fprintf( stderr," CS:%04x SS:%04x DS:%04x ES:%04x",
             CS_reg(DEBUG_context), SS_reg(DEBUG_context),
             DS_reg(DEBUG_context), ES_reg(DEBUG_context) );
#ifdef FS_reg
    fprintf( stderr, " FS:%04x", FS_reg(DEBUG_context) );
#endif
#ifdef GS_reg
    fprintf( stderr, " GS:%04x", GS_reg(DEBUG_context) );
#endif
    if (dbg_mode == 16)
    {
        fprintf( stderr,"\n IP:%04x SP:%04x BP:%04x FLAGS:%04x\n",
                 IP_reg(DEBUG_context), SP_reg(DEBUG_context),
                 BP_reg(DEBUG_context), FL_reg(DEBUG_context) );
	fprintf( stderr," AX:%04x BX:%04x CX:%04x DX:%04x SI:%04x DI:%04x\n",
                 AX_reg(DEBUG_context), BX_reg(DEBUG_context),
                 CX_reg(DEBUG_context), DX_reg(DEBUG_context),
                 SI_reg(DEBUG_context), DI_reg(DEBUG_context) );
    }
    else  /* 32-bit mode */
    {
        fprintf( stderr, "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx\n", 
                 EIP_reg(DEBUG_context), ESP_reg(DEBUG_context),
                 EBP_reg(DEBUG_context), EFL_reg(DEBUG_context) );
	fprintf( stderr, " EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n", 
		 EAX_reg(DEBUG_context), EBX_reg(DEBUG_context),
                 ECX_reg(DEBUG_context), EDX_reg(DEBUG_context) );
	fprintf( stderr, " ESI:%08lx EDI:%08lx\n",
                 ESI_reg(DEBUG_context), EDI_reg(DEBUG_context) );
    }
}


/***********************************************************************
 *           DEBUG_ValidateRegisters
 *
 * Make sure all registers have a correct value for returning from
 * the signal handler.
 */
BOOL32 DEBUG_ValidateRegisters(void)
{
/* Check that a selector is a valid ring-3 LDT selector, or a NULL selector */
#define CHECK_SEG(seg,name) \
    if (((seg) & ~3) && \
        ((((seg) & 7) != 7) || IS_LDT_ENTRY_FREE(SELECTOR_TO_ENTRY(seg)))) \
    { \
        fprintf( stderr, "*** Invalid value for %s register: %04x\n", \
                 (name), (seg) ); \
        return FALSE; \
    }

    if (CS_reg(DEBUG_context) != WINE_CODE_SELECTOR)
        CHECK_SEG( CS_reg(DEBUG_context), "CS" );
    if (SS_reg(DEBUG_context) != WINE_DATA_SELECTOR)
        CHECK_SEG( SS_reg(DEBUG_context), "SS" );
    if (DS_reg(DEBUG_context) != WINE_DATA_SELECTOR)
        CHECK_SEG( DS_reg(DEBUG_context), "DS" );
    if (ES_reg(DEBUG_context) != WINE_DATA_SELECTOR)
        CHECK_SEG( ES_reg(DEBUG_context), "ES" );
#ifdef FS_reg
    if (FS_reg(DEBUG_context) != WINE_DATA_SELECTOR)
        CHECK_SEG( FS_reg(DEBUG_context), "FS" );
#endif
#ifdef GS_reg
    if (GS_reg(DEBUG_context) != WINE_DATA_SELECTOR)
        CHECK_SEG( GS_reg(DEBUG_context), "GS" );
#endif

    /* Check that CS and SS are not NULL */

    if (!(CS_reg(DEBUG_context) & ~3))
    {
        fprintf( stderr, "*** Invalid value for CS register: %04x\n",
                 CS_reg(DEBUG_context) );
        return FALSE;
    }
    if (!(SS_reg(DEBUG_context) & ~3))
    {
        fprintf( stderr, "*** Invalid value for SS register: %04x\n",
                 SS_reg(DEBUG_context) );
        return FALSE;
    }
    return TRUE;
#undef CHECK_SEG
}
