VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMAll/GIMAll.cpp@ 52343

Last change on this file since 52343 was 52006, checked in by vboxsync, 11 years ago

VMM: VT-x and AMD-V support for making GIM hypercalls.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.1 KB
Line 
1/* $Id: GIMAll.cpp 52006 2014-07-12 12:01:19Z vboxsync $ */
2/** @file
3 * GIM - Guest Interface Manager - All Contexts.
4 */
5
6/*
7 * Copyright (C) 2014 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* Header Files *
21*******************************************************************************/
22#define LOG_GROUP LOG_GROUP_GIM
23#include "GIMInternal.h"
24#include <VBox/err.h>
25#include <VBox/vmm/vm.h>
26
27/* Include all the providers. */
28#include "GIMHvInternal.h"
29#include "GIMMinimalInternal.h"
30
31
32/**
33 * Checks whether GIM is being used by this VM.
34 *
35 * @retval @c true if used.
36 * @retval @c false if no GIM provider ("none") is used.
37 *
38 * @param pVM Pointer to the VM.
39 */
40VMMDECL(bool) GIMIsEnabled(PVM pVM)
41{
42 return pVM->gim.s.fEnabled;
43}
44
45
46/**
47 * Gets the GIM provider configured for this VM.
48 *
49 * @returns The GIM provider Id.
50 * @param pVM Pointer to the VM.
51 */
52VMMDECL(GIMPROVIDERID) GIMGetProvider(PVM pVM)
53{
54 return pVM->gim.s.enmProviderId;
55}
56
57
58/**
59 * Returns whether the guest has configured and enabled calls to the hypervisor.
60 *
61 * @returns true if hypercalls are enabled and usable, false otherwise.
62 * @param pVCpu Pointer to the VMCPU.
63 */
64VMM_INT_DECL(bool) GIMAreHypercallsEnabled(PVMCPU pVCpu)
65{
66 PVM pVM = pVCpu->CTX_SUFF(pVM);
67 if (!GIMIsEnabled(pVM))
68 return false;
69
70 switch (pVM->gim.s.enmProviderId)
71 {
72 case GIMPROVIDERID_HYPERV:
73 return GIMHvAreHypercallsEnabled(pVCpu);
74
75 default:
76 return false;
77 }
78}
79
80
81/**
82 * Implements a GIM hypercall with the provider configured for the VM.
83 *
84 * @returns VBox status code.
85 * @param pVCpu Pointer to the VMCPU.
86 * @param pCtx Pointer to the guest-CPU context.
87 */
88VMM_INT_DECL(int) GIMHypercall(PVMCPU pVCpu, PCPUMCTX pCtx)
89{
90 PVM pVM = pVCpu->CTX_SUFF(pVM);
91 VMCPU_ASSERT_EMT(pVCpu);
92
93 if (RT_UNLIKELY(!GIMIsEnabled(pVM)))
94 return VERR_GIM_NOT_ENABLED;
95
96 switch (pVM->gim.s.enmProviderId)
97 {
98 case GIMPROVIDERID_HYPERV:
99 return GIMHvHypercall(pVCpu, pCtx);
100
101 default:
102 AssertMsgFailed(("GIMHypercall: for unknown provider %u\n", pVM->gim.s.enmProviderId));
103 return VERR_GIM_IPE_3;
104 }
105}
106
107
108/**
109 * Returns whether the guest has configured and setup the use of paravirtualized
110 * TSC. Paravirtualized TSCs are per-VM and the rest of the execution engine
111 * logic relies on that.
112 *
113 * @returns true if enabled and usable, false otherwise.
114 * @param pVM Pointer to the VM.
115 */
116VMM_INT_DECL(bool) GIMIsParavirtTscEnabled(PVM pVM)
117{
118 if (!pVM->gim.s.fEnabled)
119 return false;
120
121 switch (pVM->gim.s.enmProviderId)
122 {
123 case GIMPROVIDERID_HYPERV:
124 return GIMHvIsParavirtTscEnabled(pVM);
125
126 default:
127 break;
128 }
129 return false;
130}
131
132
133/**
134 * Invokes the read-MSR handler for the GIM provider configured for the VM.
135 *
136 * @returns VBox status code.
137 * @param pVCpu Pointer to the VMCPU.
138 * @param idMsr The MSR to read.
139 * @param pRange The range this MSR belongs to.
140 * @param puValue Where to store the MSR value read.
141 */
142VMM_INT_DECL(int) GIMReadMsr(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
143{
144 Assert(pVCpu);
145 PVM pVM = pVCpu->CTX_SUFF(pVM);
146 Assert(GIMIsEnabled(pVM));
147 VMCPU_ASSERT_EMT(pVCpu);
148
149 switch (pVM->gim.s.enmProviderId)
150 {
151 case GIMPROVIDERID_HYPERV:
152 return GIMHvReadMsr(pVCpu, idMsr, pRange, puValue);
153
154 default:
155 AssertMsgFailed(("GIMReadMsr: for unknown provider %u idMsr=%#RX32 -> #GP(0)", pVM->gim.s.enmProviderId, idMsr));
156 return VERR_CPUM_RAISE_GP_0;
157 }
158}
159
160
161/**
162 * Invokes the write-MSR handler for the GIM provider configured for the VM.
163 *
164 * @returns VBox status code.
165 * @param pVCpu Pointer to the VMCPU.
166 * @param idMsr The MSR to write.
167 * @param pRange The range this MSR belongs to.
168 * @param uValue The value to set, ignored bits masked.
169 * @param uRawValue The raw value with the ignored bits not masked.
170 */
171VMM_INT_DECL(int) GIMWriteMsr(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
172{
173 AssertPtr(pVCpu);
174 NOREF(uValue);
175
176 PVM pVM = pVCpu->CTX_SUFF(pVM);
177 Assert(GIMIsEnabled(pVM));
178 VMCPU_ASSERT_EMT(pVCpu);
179
180 switch (pVM->gim.s.enmProviderId)
181 {
182 case GIMPROVIDERID_HYPERV:
183 return GIMHvWriteMsr(pVCpu, idMsr, pRange, uRawValue);
184
185 default:
186 AssertMsgFailed(("GIMWriteMsr: for unknown provider %u idMsr=%#RX32 -> #GP(0)", pVM->gim.s.enmProviderId, idMsr));
187 return VERR_CPUM_RAISE_GP_0;
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