VirtualBox

source: vbox/trunk/src/VBox/VMM/PGMDbg.cpp@ 4953

Last change on this file since 4953 was 4665, checked in by vboxsync, 17 years ago

Moved some of the odd address conversion routines to PGMR3Dbg just to get them out of the way.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 6.1 KB
Line 
1/* $Id: PGMDbg.cpp 4665 2007-09-10 13:41:18Z vboxsync $ */
2/** @file
3 * PGM - Page Manager and Monitor - Debugger & Debugging APIs.
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License as published by the Free Software Foundation,
13 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
14 * distribution. VirtualBox OSE is distributed in the hope that it will
15 * be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18/*******************************************************************************
19* Header Files *
20*******************************************************************************/
21#define LOG_GROUP LOG_GROUP_PGM
22#include <VBox/pgm.h>
23#include <VBox/stam.h>
24#include "PGMInternal.h"
25#include <VBox/vm.h>
26#include <iprt/assert.h>
27#include <iprt/asm.h>
28#include <VBox/log.h>
29#include <VBox/param.h>
30#include <VBox/err.h>
31
32
33
34/**
35 * Converts a HC pointer to a GC physical address.
36 *
37 * Only for the debugger.
38 *
39 * @returns VBox status code.
40 * @retval VINF_SUCCESS on success, *pGCPhys is set.
41 * @retval VERR_INVALID_POINTER if the pointer is not within the GC physical memory.
42 *
43 * @param pVM The VM handle.
44 * @param HCPtr The HC pointer to convert.
45 * @param pGCPhys Where to store the GC physical address on success.
46 */
47PGMR3DECL(int) PGMR3DbgHCPtr2GCPhys(PVM pVM, RTHCPTR HCPtr, PRTGCPHYS pGCPhys)
48{
49#ifdef NEW_PHYS_CODE
50 *pGCPhys = NIL_RTGCPHYS;
51 return VERR_NOT_IMPLEMENTED;
52
53#else
54 for (PPGMRAMRANGE pRam = CTXSUFF(pVM->pgm.s.pRamRanges);
55 pRam;
56 pRam = CTXSUFF(pRam->pNext))
57 {
58 if (pRam->fFlags & MM_RAM_FLAGS_DYNAMIC_ALLOC)
59 {
60 for (unsigned iChunk = 0; iChunk < (pRam->cb >> PGM_DYNAMIC_CHUNK_SHIFT); iChunk++)
61 {
62 if (CTXSUFF(pRam->pavHCChunk)[iChunk])
63 {
64 RTHCUINTPTR off = (RTHCUINTPTR)HCPtr - (RTHCUINTPTR)CTXSUFF(pRam->pavHCChunk)[iChunk];
65 if (off < PGM_DYNAMIC_CHUNK_SIZE)
66 {
67 *pGCPhys = pRam->GCPhys + iChunk*PGM_DYNAMIC_CHUNK_SIZE + off;
68 return VINF_SUCCESS;
69 }
70 }
71 }
72 }
73 else if (pRam->pvHC)
74 {
75 RTHCUINTPTR off = (RTHCUINTPTR)HCPtr - (RTHCUINTPTR)pRam->pvHC;
76 if (off < pRam->cb)
77 {
78 *pGCPhys = pRam->GCPhys + off;
79 return VINF_SUCCESS;
80 }
81 }
82 }
83 return VERR_INVALID_POINTER;
84#endif
85}
86
87
88/**
89 * Converts a HC pointer to a GC physical address.
90 *
91 * @returns VBox status code.
92 * @retval VINF_SUCCESS on success, *pHCPhys is set.
93 * @retval VERR_PGM_PHYS_PAGE_RESERVED it it's a valid GC physical page but has no physical backing.
94 * @retval VERR_INVALID_POINTER if the pointer is not within the GC physical memory.
95 *
96 * @param pVM The VM handle.
97 * @param HCPtr The HC pointer to convert.
98 * @param pHCPhys Where to store the HC physical address on success.
99 */
100PGMR3DECL(int) PGMR3DbgHCPtr2HCPhys(PVM pVM, RTHCPTR HCPtr, PRTHCPHYS pHCPhys)
101{
102#ifdef NEW_PHYS_CODE
103 *pHCPhys = NIL_RTHCPHYS;
104 return VERR_NOT_IMPLEMENTED;
105
106#else
107 for (PPGMRAMRANGE pRam = CTXSUFF(pVM->pgm.s.pRamRanges);
108 pRam;
109 pRam = CTXSUFF(pRam->pNext))
110 {
111 if (pRam->fFlags & MM_RAM_FLAGS_DYNAMIC_ALLOC)
112 {
113 for (unsigned iChunk = 0; iChunk < (pRam->cb >> PGM_DYNAMIC_CHUNK_SHIFT); iChunk++)
114 {
115 if (CTXSUFF(pRam->pavHCChunk)[iChunk])
116 {
117 RTHCUINTPTR off = (RTHCUINTPTR)HCPtr - (RTHCUINTPTR)CTXSUFF(pRam->pavHCChunk)[iChunk];
118 if (off < PGM_DYNAMIC_CHUNK_SIZE)
119 {
120 PPGMPAGE pPage = &pRam->aPages[off >> PAGE_SHIFT];
121 if (PGM_PAGE_IS_RESERVED(pPage))
122 return VERR_PGM_PHYS_PAGE_RESERVED;
123 *pHCPhys = PGM_PAGE_GET_HCPHYS(pPage)
124 | (off & PAGE_OFFSET_MASK);
125 return VINF_SUCCESS;
126 }
127 }
128 }
129 }
130 else if (pRam->pvHC)
131 {
132 RTHCUINTPTR off = (RTHCUINTPTR)HCPtr - (RTHCUINTPTR)pRam->pvHC;
133 if (off < pRam->cb)
134 {
135 PPGMPAGE pPage = &pRam->aPages[off >> PAGE_SHIFT];
136 if (PGM_PAGE_IS_RESERVED(pPage))
137 return VERR_PGM_PHYS_PAGE_RESERVED;
138 *pHCPhys = PGM_PAGE_GET_HCPHYS(pPage)
139 | (off & PAGE_OFFSET_MASK);
140 return VINF_SUCCESS;
141 }
142 }
143 }
144 return VERR_INVALID_POINTER;
145#endif
146}
147
148
149/**
150 * Converts a HC physical address to a GC physical address.
151 *
152 * Only for the debugger.
153 *
154 * @returns VBox status code
155 * @retval VINF_SUCCESS on success, *pGCPhys is set.
156 * @retval VERR_INVALID_POINTER if the HC physical address is not within the GC physical memory.
157 *
158 * @param pVM The VM handle.
159 * @param HCPhys The HC physical address to convert.
160 * @param pGCPhys Where to store the GC physical address on success.
161 */
162PGMR3DECL(int) PGMR3DbgHCPhys2GCPhys(PVM pVM, RTHCPHYS HCPhys, PRTGCPHYS pGCPhys)
163{
164 /*
165 * Validate and adjust the input a bit.
166 */
167 if (HCPhys == NIL_RTHCPHYS)
168 return VERR_INVALID_POINTER;
169 unsigned off = HCPhys & PAGE_OFFSET_MASK;
170 HCPhys &= X86_PTE_PAE_PG_MASK;
171 if (HCPhys == 0)
172 return VERR_INVALID_POINTER;
173
174 for (PPGMRAMRANGE pRam = CTXSUFF(pVM->pgm.s.pRamRanges);
175 pRam;
176 pRam = CTXSUFF(pRam->pNext))
177 {
178 uint32_t iPage = pRam->cb >> PAGE_SHIFT;
179 while (iPage-- > 0)
180 if ( PGM_PAGE_GET_HCPHYS(&pRam->aPages[iPage]) == HCPhys
181 && !PGM_PAGE_IS_RESERVED(&pRam->aPages[iPage]))
182 {
183 *pGCPhys = pRam->GCPhys + (iPage << PAGE_SHIFT) + off;
184 return VINF_SUCCESS;
185 }
186 }
187 return VERR_INVALID_POINTER;
188}
189
190
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette