1
/* $Id: PGMGst.h 35333 2010-12-27 12:10:56Z vboxsync $ */
3
* VBox - Page Manager / Monitor, Guest Paging Template.
7
* Copyright (C) 2006-2007 Oracle Corporation
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 (GPL) as published by the Free Software
13
* Foundation, in version 2 as it comes in the "COPYING" file of the
14
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
19
/*******************************************************************************
20
* Internal Functions *
21
*******************************************************************************/
24
PGM_GST_DECL(int, InitData)(PVM pVM, PPGMMODEDATA pModeData, bool fResolveGCAndR0);
25
PGM_GST_DECL(int, Enter)(PVMCPU pVCpu, RTGCPHYS GCPhysCR3);
26
PGM_GST_DECL(int, Relocate)(PVMCPU pVCpu, RTGCPTR offDelta);
27
PGM_GST_DECL(int, Exit)(PVMCPU pVCpu);
30
PGM_GST_DECL(int, GetPage)(PVMCPU pVCpu, RTGCPTR GCPtr, uint64_t *pfFlags, PRTGCPHYS pGCPhys);
31
PGM_GST_DECL(int, ModifyPage)(PVMCPU pVCpu, RTGCPTR GCPtr, size_t cb, uint64_t fFlags, uint64_t fMask);
32
PGM_GST_DECL(int, GetPDE)(PVMCPU pVCpu, RTGCPTR GCPtr, PX86PDEPAE pPDE);
37
* Initializes the guest bit of the paging mode data.
39
* @returns VBox status code.
40
* @param pVM The VM handle.
41
* @param fResolveGCAndR0 Indicate whether or not GC and Ring-0 symbols can be resolved now.
42
* This is used early in the init process to avoid trouble with PDM
43
* not being initialized yet.
45
PGM_GST_DECL(int, InitData)(PVM pVM, PPGMMODEDATA pModeData, bool fResolveGCAndR0)
47
Assert(pModeData->uGstType == PGM_GST_TYPE);
50
pModeData->pfnR3GstRelocate = PGM_GST_NAME(Relocate);
51
pModeData->pfnR3GstExit = PGM_GST_NAME(Exit);
52
pModeData->pfnR3GstGetPDE = PGM_GST_NAME(GetPDE);
53
pModeData->pfnR3GstGetPage = PGM_GST_NAME(GetPage);
54
pModeData->pfnR3GstModifyPage = PGM_GST_NAME(ModifyPage);
60
#if PGM_SHW_TYPE != PGM_TYPE_AMD64 /* No AMD64 for traditional virtualization, only VT-x and AMD-V. */
62
rc = PDMR3LdrGetSymbolRC(pVM, NULL, PGM_GST_NAME_RC_STR(GetPage), &pModeData->pfnRCGstGetPage);
63
AssertMsgRCReturn(rc, ("%s -> rc=%Rrc\n", PGM_GST_NAME_RC_STR(GetPage), rc), rc);
64
rc = PDMR3LdrGetSymbolRC(pVM, NULL, PGM_GST_NAME_RC_STR(ModifyPage), &pModeData->pfnRCGstModifyPage);
65
AssertMsgRCReturn(rc, ("%s -> rc=%Rrc\n", PGM_GST_NAME_RC_STR(ModifyPage), rc), rc);
66
rc = PDMR3LdrGetSymbolRC(pVM, NULL, PGM_GST_NAME_RC_STR(GetPDE), &pModeData->pfnRCGstGetPDE);
67
AssertMsgRCReturn(rc, ("%s -> rc=%Rrc\n", PGM_GST_NAME_RC_STR(GetPDE), rc), rc);
68
#endif /* Not AMD64 shadow paging. */
71
rc = PDMR3LdrGetSymbolR0(pVM, NULL, PGM_GST_NAME_R0_STR(GetPage), &pModeData->pfnR0GstGetPage);
72
AssertMsgRCReturn(rc, ("%s -> rc=%Rrc\n", PGM_GST_NAME_R0_STR(GetPage), rc), rc);
73
rc = PDMR3LdrGetSymbolR0(pVM, NULL, PGM_GST_NAME_R0_STR(ModifyPage), &pModeData->pfnR0GstModifyPage);
74
AssertMsgRCReturn(rc, ("%s -> rc=%Rrc\n", PGM_GST_NAME_R0_STR(ModifyPage), rc), rc);
75
rc = PDMR3LdrGetSymbolR0(pVM, NULL, PGM_GST_NAME_R0_STR(GetPDE), &pModeData->pfnR0GstGetPDE);
76
AssertMsgRCReturn(rc, ("%s -> rc=%Rrc\n", PGM_GST_NAME_R0_STR(GetPDE), rc), rc);
84
* Enters the guest mode.
86
* @returns VBox status code.
87
* @param pVCpu The VMCPU to operate on.
88
* @param GCPhysCR3 The physical address from the CR3 register.
90
PGM_GST_DECL(int, Enter)(PVMCPU pVCpu, RTGCPHYS GCPhysCR3)
95
int rc = PGM_BTH_PFN(MapCR3, pVCpu)(pVCpu, GCPhysCR3);
101
* Relocate any GC pointers related to guest mode paging.
103
* @returns VBox status code.
104
* @param pVCpu The VMCPU to operate on.
105
* @param offDelta The relocation offset.
107
PGM_GST_DECL(int, Relocate)(PVMCPU pVCpu, RTGCPTR offDelta)
109
pVCpu->pgm.s.pGst32BitPdRC += offDelta;
111
for (unsigned i = 0; i < RT_ELEMENTS(pVCpu->pgm.s.apGstPaePDsRC); i++)
113
pVCpu->pgm.s.apGstPaePDsRC[i] += offDelta;
115
pVCpu->pgm.s.pGstPaePdptRC += offDelta;
122
* Exits the guest mode.
124
* @returns VBox status code.
125
* @param pVCpu The VMCPU to operate on.
127
PGM_GST_DECL(int, Exit)(PVMCPU pVCpu)
131
rc = PGM_BTH_PFN(UnmapCR3, pVCpu)(pVCpu);