~ubuntu-branches/ubuntu/raring/virtualbox-ose/raring

« back to all changes in this revision

Viewing changes to src/VBox/VMM/VMMR3/PGMGst.h

  • Committer: Bazaar Package Importer
  • Author(s): Felix Geyer
  • Date: 2011-01-30 23:27:25 UTC
  • mfrom: (0.3.12 upstream)
  • Revision ID: james.westby@ubuntu.com-20110130232725-2ouajjd2ggdet0zd
Tags: 4.0.2-dfsg-1ubuntu1
* Merge from Debian unstable, remaining changes:
  - Add Apport hook.
    - debian/virtualbox-ose.files/source_virtualbox-ose.py
    - debian/virtualbox-ose.install
  - Drop *-source packages.
* Drop ubuntu-01-fix-build-gcc45.patch, fixed upstream.
* Drop ubuntu-02-as-needed.patch, added to the Debian package.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* $Id: PGMGst.h 35333 2010-12-27 12:10:56Z vboxsync $ */
 
2
/** @file
 
3
 * VBox - Page Manager / Monitor, Guest Paging Template.
 
4
 */
 
5
 
 
6
/*
 
7
 * Copyright (C) 2006-2007 Oracle Corporation
 
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 (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.
 
16
 */
 
17
 
 
18
 
 
19
/*******************************************************************************
 
20
*   Internal Functions                                                         *
 
21
*******************************************************************************/
 
22
RT_C_DECLS_BEGIN
 
23
/* r3 */
 
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);
 
28
 
 
29
/* all */
 
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);
 
33
RT_C_DECLS_END
 
34
 
 
35
 
 
36
/**
 
37
 * Initializes the guest bit of the paging mode data.
 
38
 *
 
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.
 
44
 */
 
45
PGM_GST_DECL(int, InitData)(PVM pVM, PPGMMODEDATA pModeData, bool fResolveGCAndR0)
 
46
{
 
47
    Assert(pModeData->uGstType == PGM_GST_TYPE);
 
48
 
 
49
    /* Ring-3 */
 
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);
 
55
 
 
56
    if (fResolveGCAndR0)
 
57
    {
 
58
        int rc;
 
59
 
 
60
#if PGM_SHW_TYPE != PGM_TYPE_AMD64 /* No AMD64 for traditional virtualization, only VT-x and AMD-V. */
 
61
        /* GC */
 
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. */
 
69
 
 
70
        /* Ring-0 */
 
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);
 
77
    }
 
78
 
 
79
    return VINF_SUCCESS;
 
80
}
 
81
 
 
82
 
 
83
/**
 
84
 * Enters the guest mode.
 
85
 *
 
86
 * @returns VBox status code.
 
87
 * @param   pVCpu       The VMCPU to operate on.
 
88
 * @param   GCPhysCR3   The physical address from the CR3 register.
 
89
 */
 
90
PGM_GST_DECL(int, Enter)(PVMCPU pVCpu, RTGCPHYS GCPhysCR3)
 
91
{
 
92
    /*
 
93
     * Map and monitor CR3
 
94
     */
 
95
    int rc = PGM_BTH_PFN(MapCR3, pVCpu)(pVCpu, GCPhysCR3);
 
96
    return rc;
 
97
}
 
98
 
 
99
 
 
100
/**
 
101
 * Relocate any GC pointers related to guest mode paging.
 
102
 *
 
103
 * @returns VBox status code.
 
104
 * @param   pVCpu       The VMCPU to operate on.
 
105
 * @param   offDelta    The relocation offset.
 
106
 */
 
107
PGM_GST_DECL(int, Relocate)(PVMCPU pVCpu, RTGCPTR offDelta)
 
108
{
 
109
    pVCpu->pgm.s.pGst32BitPdRC += offDelta;
 
110
 
 
111
    for (unsigned i = 0; i < RT_ELEMENTS(pVCpu->pgm.s.apGstPaePDsRC); i++)
 
112
    {
 
113
        pVCpu->pgm.s.apGstPaePDsRC[i] += offDelta;
 
114
    }
 
115
    pVCpu->pgm.s.pGstPaePdptRC += offDelta;
 
116
 
 
117
    return VINF_SUCCESS;
 
118
}
 
119
 
 
120
 
 
121
/**
 
122
 * Exits the guest mode.
 
123
 *
 
124
 * @returns VBox status code.
 
125
 * @param   pVCpu       The VMCPU to operate on.
 
126
 */
 
127
PGM_GST_DECL(int, Exit)(PVMCPU pVCpu)
 
128
{
 
129
    int rc;
 
130
 
 
131
    rc = PGM_BTH_PFN(UnmapCR3, pVCpu)(pVCpu);
 
132
    return rc;
 
133
}
 
134