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

« back to all changes in this revision

Viewing changes to src/VBox/VMM/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 $ */
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 reloation 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