DBGFAddr.cpp revision 61028bf0d1927cff20200e587be6f306aa331fe2
1832N/A/* $Id$ */
1832N/A/** @file
1832N/A * VMM DBGF - Debugger Facility, Mixed Address Methods.
1832N/A */
1832N/A
1832N/A/*
1832N/A * Copyright (C) 2006-2007 innotek GmbH
1832N/A *
1832N/A * This file is part of VirtualBox Open Source Edition (OSE), as
1832N/A * available from http://www.virtualbox.org. This file is free software;
1832N/A * you can redistribute it and/or modify it under the terms of the GNU
1832N/A * General Public License as published by the Free Software Foundation,
1832N/A * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
1832N/A * distribution. VirtualBox OSE is distributed in the hope that it will
1832N/A * be useful, but WITHOUT ANY WARRANTY of any kind.
1832N/A */
1832N/A
1832N/A
1832N/A/*******************************************************************************
1832N/A* Header Files *
1832N/A*******************************************************************************/
1832N/A#define LOG_GROUP LOG_GROUP_DBGF
1832N/A#include <VBox/dbgf.h>
1832N/A#include <VBox/selm.h>
1832N/A#include "DBGFInternal.h"
1832N/A#include <VBox/vm.h>
1832N/A#include <VBox/mm.h>
1832N/A#include <VBox/err.h>
1832N/A#include <VBox/log.h>
1832N/A
1832N/A
1832N/A
1832N/A/**
1832N/A * Checks if an address is in the HMA or not.
1832N/A * @returns true if it's inside the HMA.
1832N/A * @returns flase if it's not inside the HMA.
1832N/A * @param pVM The VM handle.
1832N/A * @param FlatPtr The address in question.
1832N/A */
1832N/ADECLINLINE(bool) dbgfR3IsHMA(PVM pVM, RTGCUINTPTR FlatPtr)
1832N/A{
1832N/A return MMHyperIsInsideArea(pVM, FlatPtr);
1832N/A}
1832N/A
1832N/A
1832N/A/**
1832N/A * Creates a mixed address from a Sel:off pair.
1832N/A *
1832N/A * @returns VBox status code.
1832N/A * @param pVM The VM handle.
1832N/A * @param pAddress Where to store the mixed address.
1832N/A * @param Sel The selector part.
1832N/A * @param off The offset part.
1832N/A */
1832N/ADBGFR3DECL(int) DBGFR3AddrFromSelOff(PVM pVM, PDBGFADDRESS pAddress, RTSEL Sel, RTUINTPTR off)
1832N/A{
1832N/A pAddress->Sel = Sel;
1832N/A pAddress->off = off;
1832N/A if (Sel != DBGF_SEL_FLAT)
1832N/A {
1832N/A SELMSELINFO SelInfo;
1832N/A int rc = SELMR3GetSelectorInfo(pVM, Sel, &SelInfo);
1832N/A if (VBOX_FAILURE(rc))
1832N/A return rc;
1832N/A
1832N/A /* check limit. */
1832N/A if (SELMSelInfoIsExpandDown(&SelInfo))
1832N/A {
1832N/A if ( !SelInfo.Raw.Gen.u1Granularity
1832N/A && off > UINT32_C(0xffff))
1832N/A return VERR_OUT_OF_SELECTOR_BOUNDS;
1832N/A if (off <= SelInfo.cbLimit)
1832N/A return VERR_OUT_OF_SELECTOR_BOUNDS;
1832N/A }
1832N/A else if (off > SelInfo.cbLimit)
1832N/A return VERR_OUT_OF_SELECTOR_BOUNDS;
1832N/A
2624N/A pAddress->FlatPtr = SelInfo.GCPtrBase + off;
1832N/A /** @todo fix this flat selector test! */
1832N/A if ( !SelInfo.GCPtrBase
1832N/A && SelInfo.Raw.Gen.u1Granularity
1832N/A && SelInfo.Raw.Gen.u1DefBig)
1832N/A pAddress->fFlags = DBGFADDRESS_FLAGS_FLAT;
1832N/A else if (SelInfo.cbLimit <= UINT32_C(0xffff))
1832N/A pAddress->fFlags = DBGFADDRESS_FLAGS_FAR16;
1832N/A else if (SelInfo.cbLimit <= UINT32_C(0xffffffff))
1832N/A pAddress->fFlags = DBGFADDRESS_FLAGS_FAR32;
1832N/A else
1832N/A pAddress->fFlags = DBGFADDRESS_FLAGS_FAR64;
1832N/A }
1832N/A else
1832N/A {
1832N/A pAddress->FlatPtr = off;
1832N/A pAddress->fFlags = DBGFADDRESS_FLAGS_FLAT;
1832N/A }
1832N/A pAddress->fFlags |= DBGFADDRESS_FLAGS_VALID;
1832N/A if (dbgfR3IsHMA(pVM, pAddress->FlatPtr))
1832N/A pAddress->fFlags |= DBGFADDRESS_FLAGS_HMA;
1832N/A
2624N/A return VINF_SUCCESS;
1832N/A}
1832N/A
1832N/A
1832N/A/**
1832N/A * Creates a mixed address from a flat address.
1832N/A *
1832N/A * @param pVM The VM handle.
1832N/A * @param pAddress Where to store the mixed address.
1832N/A * @param FlatPtr The flat pointer.
1832N/A */
1832N/ADBGFR3DECL(void) DBGFR3AddrFromFlat(PVM pVM, PDBGFADDRESS pAddress, RTGCUINTPTR FlatPtr)
1832N/A{
1832N/A pAddress->Sel = DBGF_SEL_FLAT;
1832N/A pAddress->off = FlatPtr;
1832N/A pAddress->FlatPtr = FlatPtr;
1832N/A pAddress->fFlags = DBGFADDRESS_FLAGS_FLAT | DBGFADDRESS_FLAGS_VALID;
1832N/A if (dbgfR3IsHMA(pVM, pAddress->FlatPtr))
1832N/A pAddress->fFlags |= DBGFADDRESS_FLAGS_HMA;
1832N/A}
1832N/A
/**
* Creates a mixed address from a guest physical address.
*
* @param pVM The VM handle.
* @param pAddress Where to store the mixed address.
* @param PhysAddr The guest physical address.
*/
DBGFR3DECL(void) DBGFR3AddrFromPhys(PVM pVM, PDBGFADDRESS pAddress, RTGCPHYS PhysAddr)
{
pAddress->Sel = DBGF_SEL_FLAT;
pAddress->off = PhysAddr;
pAddress->FlatPtr = PhysAddr;
pAddress->fFlags = DBGFADDRESS_FLAGS_PHYS | DBGFADDRESS_FLAGS_VALID;
}
/**
* Checks if the specified address is valid (checks the structure pointer too).
*
* @returns true if valid.
* @returns false if invalid.
* @param pVM The VM handle.
* @param pAddress The address to validate.
*/
DBGFR3DECL(bool) DBGFR3AddrIsValid(PVM pVM, PCDBGFADDRESS pAddress)
{
if (!VALID_PTR(pAddress))
return false;
if (!DBGFADDRESS_IS_VALID(pAddress))
return false;
/* more? */
return true;
}