VirtualBox

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

Last change on this file since 53390 was 52768, checked in by vboxsync, 10 years ago

VMM/GIM: doxygen beautifications.

  • 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 52768 2014-09-16 17:02:30Z 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.enmProviderId != GIMPROVIDERID_NONE;
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.
111 *
112 * Paravirtualized TSCs are per-VM and the rest of the execution engine logic
113 * relies on that.
114 *
115 * @returns true if enabled and usable, false otherwise.
116 * @param pVM Pointer to the VM.
117 */
118VMM_INT_DECL(bool) GIMIsParavirtTscEnabled(PVM pVM)
119{
120 switch (pVM->gim.s.enmProviderId)
121 {
122 case GIMPROVIDERID_HYPERV:
123 return GIMHvIsParavirtTscEnabled(pVM);
124
125 default:
126 break;
127 }
128 return false;
129}
130
131
132/**
133 * Invokes the read-MSR handler for the GIM provider configured for the VM.
134 *
135 * @returns VBox status code.
136 * @param pVCpu Pointer to the VMCPU.
137 * @param idMsr The MSR to read.
138 * @param pRange The range this MSR belongs to.
139 * @param puValue Where to store the MSR value read.
140 */
141VMM_INT_DECL(int) GIMReadMsr(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
142{
143 Assert(pVCpu);
144 PVM pVM = pVCpu->CTX_SUFF(pVM);
145 Assert(GIMIsEnabled(pVM));
146 VMCPU_ASSERT_EMT(pVCpu);
147
148 switch (pVM->gim.s.enmProviderId)
149 {
150 case GIMPROVIDERID_HYPERV:
151 return GIMHvReadMsr(pVCpu, idMsr, pRange, puValue);
152
153 default:
154 AssertMsgFailed(("GIMReadMsr: for unknown provider %u idMsr=%#RX32 -> #GP(0)", pVM->gim.s.enmProviderId, idMsr));
155 return VERR_CPUM_RAISE_GP_0;
156 }
157}
158
159
160/**
161 * Invokes the write-MSR handler for the GIM provider configured for the VM.
162 *
163 * @returns VBox status code.
164 * @param pVCpu Pointer to the VMCPU.
165 * @param idMsr The MSR to write.
166 * @param pRange The range this MSR belongs to.
167 * @param uValue The value to set, ignored bits masked.
168 * @param uRawValue The raw value with the ignored bits not masked.
169 */
170VMM_INT_DECL(int) GIMWriteMsr(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
171{
172 AssertPtr(pVCpu);
173 NOREF(uValue);
174
175 PVM pVM = pVCpu->CTX_SUFF(pVM);
176 Assert(GIMIsEnabled(pVM));
177 VMCPU_ASSERT_EMT(pVCpu);
178
179 switch (pVM->gim.s.enmProviderId)
180 {
181 case GIMPROVIDERID_HYPERV:
182 return GIMHvWriteMsr(pVCpu, idMsr, pRange, uRawValue);
183
184 default:
185 AssertMsgFailed(("GIMWriteMsr: for unknown provider %u idMsr=%#RX32 -> #GP(0)", pVM->gim.s.enmProviderId, idMsr));
186 return VERR_CPUM_RAISE_GP_0;
187 }
188}
189
Note: See TracBrowser for help on using the repository browser.

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