VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp@ 93293

Last change on this file since 93293 was 93293, checked in by vboxsync, 3 years ago

VMM/CPUM: Cleanup RT_NOREF_PV. No functional change.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 241.8 KB
Line 
1/* $Id: CPUMAllMsrs.cpp 93293 2022-01-18 08:46:25Z vboxsync $ */
2/** @file
3 * CPUM - CPU MSR Registers.
4 */
5
6/*
7 * Copyright (C) 2013-2022 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_CPUM
23#include <VBox/vmm/cpum.h>
24#include <VBox/vmm/apic.h>
25#include <VBox/vmm/hm.h>
26#include <VBox/vmm/hm_vmx.h>
27#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
28# include <VBox/vmm/iem.h>
29#endif
30#include <VBox/vmm/tm.h>
31#include <VBox/vmm/gim.h>
32#include "CPUMInternal.h"
33#include <VBox/vmm/vmcc.h>
34#include <VBox/err.h>
35
36
37/*********************************************************************************************************************************
38* Defined Constants And Macros *
39*********************************************************************************************************************************/
40/**
41 * Validates the CPUMMSRRANGE::offCpumCpu value and declares a local variable
42 * pointing to it.
43 *
44 * ASSUMES sizeof(a_Type) is a power of two and that the member is aligned
45 * correctly.
46 */
47#define CPUM_MSR_ASSERT_CPUMCPU_OFFSET_RETURN(a_pVCpu, a_pRange, a_Type, a_VarName) \
48 AssertMsgReturn( (a_pRange)->offCpumCpu >= 8 \
49 && (a_pRange)->offCpumCpu < sizeof(CPUMCPU) \
50 && !((a_pRange)->offCpumCpu & (RT_MIN(sizeof(a_Type), 8) - 1)) \
51 , ("offCpumCpu=%#x %s\n", (a_pRange)->offCpumCpu, (a_pRange)->szName), \
52 VERR_CPUM_MSR_BAD_CPUMCPU_OFFSET); \
53 a_Type *a_VarName = (a_Type *)((uintptr_t)&(a_pVCpu)->cpum.s + (a_pRange)->offCpumCpu)
54
55
56/*********************************************************************************************************************************
57* Structures and Typedefs *
58*********************************************************************************************************************************/
59
60/**
61 * Implements reading one or more MSRs.
62 *
63 * @returns VBox status code.
64 * @retval VINF_SUCCESS on success.
65 * @retval VINF_CPUM_R3_MSR_READ if the MSR read could not be serviced in the
66 * current context (raw-mode or ring-0).
67 * @retval VERR_CPUM_RAISE_GP_0 on failure (invalid MSR).
68 *
69 * @param pVCpu The cross context virtual CPU structure.
70 * @param idMsr The MSR we're reading.
71 * @param pRange The MSR range descriptor.
72 * @param puValue Where to return the value.
73 */
74typedef DECLCALLBACKTYPE(VBOXSTRICTRC, FNCPUMRDMSR,(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue));
75/** Pointer to a RDMSR worker for a specific MSR or range of MSRs. */
76typedef FNCPUMRDMSR *PFNCPUMRDMSR;
77
78
79/**
80 * Implements writing one or more MSRs.
81 *
82 * @retval VINF_SUCCESS on success.
83 * @retval VINF_CPUM_R3_MSR_WRITE if the MSR write could not be serviced in the
84 * current context (raw-mode or ring-0).
85 * @retval VERR_CPUM_RAISE_GP_0 on failure.
86 *
87 * @param pVCpu The cross context virtual CPU structure.
88 * @param idMsr The MSR we're writing.
89 * @param pRange The MSR range descriptor.
90 * @param uValue The value to set, ignored bits masked.
91 * @param uRawValue The raw value with the ignored bits not masked.
92 */
93typedef DECLCALLBACKTYPE(VBOXSTRICTRC, FNCPUMWRMSR,(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange,
94 uint64_t uValue, uint64_t uRawValue));
95/** Pointer to a WRMSR worker for a specific MSR or range of MSRs. */
96typedef FNCPUMWRMSR *PFNCPUMWRMSR;
97
98
99
100/*
101 * Generic functions.
102 * Generic functions.
103 * Generic functions.
104 */
105
106
107/** @callback_method_impl{FNCPUMRDMSR} */
108static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_FixedValue(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
109{
110 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
111 *puValue = pRange->uValue;
112 return VINF_SUCCESS;
113}
114
115
116/** @callback_method_impl{FNCPUMWRMSR} */
117static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IgnoreWrite(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
118{
119 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
120 Log(("CPUM: Ignoring WRMSR %#x (%s), %#llx\n", idMsr, pRange->szName, uValue));
121 return VINF_SUCCESS;
122}
123
124
125/** @callback_method_impl{FNCPUMRDMSR} */
126static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_WriteOnly(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
127{
128 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(puValue);
129 return VERR_CPUM_RAISE_GP_0;
130}
131
132
133/** @callback_method_impl{FNCPUMWRMSR} */
134static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_ReadOnly(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
135{
136 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
137 Assert(pRange->fWrGpMask == UINT64_MAX);
138 return VERR_CPUM_RAISE_GP_0;
139}
140
141
142
143
144/*
145 * IA32
146 * IA32
147 * IA32
148 */
149
150/** @callback_method_impl{FNCPUMRDMSR} */
151static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32P5McAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
152{
153 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
154 *puValue = 0; /** @todo implement machine check injection. */
155 return VINF_SUCCESS;
156}
157
158
159/** @callback_method_impl{FNCPUMWRMSR} */
160static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32P5McAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
161{
162 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
163 /** @todo implement machine check injection. */
164 return VINF_SUCCESS;
165}
166
167
168/** @callback_method_impl{FNCPUMRDMSR} */
169static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32P5McType(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
170{
171 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
172 *puValue = 0; /** @todo implement machine check injection. */
173 return VINF_SUCCESS;
174}
175
176
177/** @callback_method_impl{FNCPUMWRMSR} */
178static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32P5McType(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
179{
180 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
181 /** @todo implement machine check injection. */
182 return VINF_SUCCESS;
183}
184
185
186/** @callback_method_impl{FNCPUMRDMSR} */
187static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32TimestampCounter(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
188{
189 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
190 *puValue = TMCpuTickGet(pVCpu);
191#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
192 *puValue = CPUMApplyNestedGuestTscOffset(pVCpu, *puValue);
193#endif
194 return VINF_SUCCESS;
195}
196
197
198/** @callback_method_impl{FNCPUMWRMSR} */
199static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32TimestampCounter(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
200{
201 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
202 TMCpuTickSet(pVCpu->CTX_SUFF(pVM), pVCpu, uValue);
203 return VINF_SUCCESS;
204}
205
206
207/** @callback_method_impl{FNCPUMRDMSR} */
208static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32PlatformId(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
209{
210 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
211 uint64_t uValue = pRange->uValue;
212 if (uValue & 0x1f00)
213 {
214 /* Max allowed bus ratio present. */
215 /** @todo Implement scaled BUS frequency. */
216 }
217
218 *puValue = uValue;
219 return VINF_SUCCESS;
220}
221
222
223/** @callback_method_impl{FNCPUMRDMSR} */
224static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32ApicBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
225{
226 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
227 return APICGetBaseMsr(pVCpu, puValue);
228}
229
230
231/** @callback_method_impl{FNCPUMWRMSR} */
232static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32ApicBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
233{
234 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
235 return APICSetBaseMsr(pVCpu, uValue);
236}
237
238
239/**
240 * Gets IA32_FEATURE_CONTROL value for IEM, NEM and cpumMsrRd_Ia32FeatureControl.
241 *
242 * @returns IA32_FEATURE_CONTROL value.
243 * @param pVCpu The cross context per CPU structure.
244 */
245VMM_INT_DECL(uint64_t) CPUMGetGuestIa32FeatCtrl(PCVMCPUCC pVCpu)
246{
247 uint64_t uFeatCtrlMsr = MSR_IA32_FEATURE_CONTROL_LOCK;
248 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
249 uFeatCtrlMsr |= MSR_IA32_FEATURE_CONTROL_VMXON;
250 return uFeatCtrlMsr;
251}
252
253
254/** @callback_method_impl{FNCPUMRDMSR} */
255static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32FeatureControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
256{
257 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
258 *puValue = CPUMGetGuestIa32FeatCtrl(pVCpu);
259 return VINF_SUCCESS;
260}
261
262
263/** @callback_method_impl{FNCPUMWRMSR} */
264static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32FeatureControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
265{
266 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
267 return VERR_CPUM_RAISE_GP_0;
268}
269
270
271/** @callback_method_impl{FNCPUMRDMSR} */
272static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32BiosSignId(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
273{
274 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
275 /** @todo fake microcode update. */
276 *puValue = pRange->uValue;
277 return VINF_SUCCESS;
278}
279
280
281/** @callback_method_impl{FNCPUMWRMSR} */
282static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32BiosSignId(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
283{
284 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
285 /* Normally, zero is written to Ia32BiosSignId before reading it in order
286 to select the signature instead of the BBL_CR_D3 behaviour. The GP mask
287 of the database entry should take care of most illegal writes for now, so
288 just ignore all writes atm. */
289 return VINF_SUCCESS;
290}
291
292
293/** @callback_method_impl{FNCPUMWRMSR} */
294static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32BiosUpdateTrigger(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
295{
296 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
297
298 /* Microcode updates cannot be loaded in VMX non-root mode. */
299 if (CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.s.Guest))
300 return VINF_SUCCESS;
301
302 /** @todo Fake bios update trigger better. The value is the address to an
303 * update package, I think. We should probably GP if it's invalid. */
304 return VINF_SUCCESS;
305}
306
307
308/**
309 * Get MSR_IA32_SMM_MONITOR_CTL value for IEM and cpumMsrRd_Ia32SmmMonitorCtl.
310 *
311 * @returns The MSR_IA32_SMM_MONITOR_CTL value.
312 * @param pVCpu The cross context per CPU structure.
313 */
314VMM_INT_DECL(uint64_t) CPUMGetGuestIa32SmmMonitorCtl(PCVMCPUCC pVCpu)
315{
316 /* We do not support dual-monitor treatment for SMI and SMM. */
317 /** @todo SMM. */
318 RT_NOREF(pVCpu);
319 return 0;
320}
321
322
323/** @callback_method_impl{FNCPUMRDMSR} */
324static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32SmmMonitorCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
325{
326 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
327 *puValue = CPUMGetGuestIa32SmmMonitorCtl(pVCpu);
328 return VINF_SUCCESS;
329}
330
331
332/** @callback_method_impl{FNCPUMWRMSR} */
333static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32SmmMonitorCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
334{
335 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
336 /** @todo SMM. */
337 return VINF_SUCCESS;
338}
339
340
341/** @callback_method_impl{FNCPUMRDMSR} */
342static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32PmcN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
343{
344 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
345 /** @todo check CPUID leaf 0ah. */
346 *puValue = 0;
347 return VINF_SUCCESS;
348}
349
350
351/** @callback_method_impl{FNCPUMWRMSR} */
352static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32PmcN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
353{
354 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
355 /** @todo check CPUID leaf 0ah. */
356 return VINF_SUCCESS;
357}
358
359
360/** @callback_method_impl{FNCPUMRDMSR} */
361static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32MonitorFilterLineSize(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
362{
363 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
364 /** @todo return 0x1000 if we try emulate mwait 100% correctly. */
365 *puValue = 0x40; /** @todo Change to CPU cache line size. */
366 return VINF_SUCCESS;
367}
368
369
370/** @callback_method_impl{FNCPUMWRMSR} */
371static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32MonitorFilterLineSize(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
372{
373 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
374 /** @todo should remember writes, though it's supposedly something only a BIOS
375 * would write so, it's not extremely important. */
376 return VINF_SUCCESS;
377}
378
379/** @callback_method_impl{FNCPUMRDMSR} */
380static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32MPerf(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
381{
382 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
383 /** @todo Read MPERF: Adjust against previously written MPERF value. Is TSC
384 * what we want? */
385 *puValue = TMCpuTickGet(pVCpu);
386#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
387 *puValue = CPUMApplyNestedGuestTscOffset(pVCpu, *puValue);
388#endif
389 return VINF_SUCCESS;
390}
391
392
393/** @callback_method_impl{FNCPUMWRMSR} */
394static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32MPerf(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
395{
396 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
397 /** @todo Write MPERF: Calc adjustment. */
398 return VINF_SUCCESS;
399}
400
401
402/** @callback_method_impl{FNCPUMRDMSR} */
403static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32APerf(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
404{
405 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
406 /** @todo Read APERF: Adjust against previously written MPERF value. Is TSC
407 * what we want? */
408 *puValue = TMCpuTickGet(pVCpu);
409#ifdef VBOX_WITH_NESTED_HWVIRT_SVM
410 *puValue = CPUMApplyNestedGuestTscOffset(pVCpu, *puValue);
411#endif
412 return VINF_SUCCESS;
413}
414
415
416/** @callback_method_impl{FNCPUMWRMSR} */
417static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32APerf(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
418{
419 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
420 /** @todo Write APERF: Calc adjustment. */
421 return VINF_SUCCESS;
422}
423
424
425/**
426 * Get fixed IA32_MTRR_CAP value for NEM and cpumMsrRd_Ia32MtrrCap.
427 *
428 * @returns Fixed IA32_MTRR_CAP value.
429 * @param pVCpu The cross context per CPU structure.
430 */
431VMM_INT_DECL(uint64_t) CPUMGetGuestIa32MtrrCap(PCVMCPU pVCpu)
432{
433 RT_NOREF_PV(pVCpu);
434
435 /* This is currently a bit weird. :-) */
436 uint8_t const cVariableRangeRegs = 0;
437 bool const fSystemManagementRangeRegisters = false;
438 bool const fFixedRangeRegisters = false;
439 bool const fWriteCombiningType = false;
440 return cVariableRangeRegs
441 | (fFixedRangeRegisters ? RT_BIT_64(8) : 0)
442 | (fWriteCombiningType ? RT_BIT_64(10) : 0)
443 | (fSystemManagementRangeRegisters ? RT_BIT_64(11) : 0);
444}
445
446/** @callback_method_impl{FNCPUMRDMSR} */
447static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32MtrrCap(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
448{
449 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
450 *puValue = CPUMGetGuestIa32MtrrCap(pVCpu);
451 return VINF_SUCCESS;
452}
453
454
455/** @callback_method_impl{FNCPUMRDMSR} */
456static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32MtrrPhysBaseN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
457{
458 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
459 /** @todo Implement variable MTRR storage. */
460 Assert(pRange->uValue == (idMsr - 0x200) / 2);
461 *puValue = 0;
462 return VINF_SUCCESS;
463}
464
465
466/** @callback_method_impl{FNCPUMWRMSR} */
467static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32MtrrPhysBaseN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
468{
469 /*
470 * Validate the value.
471 */
472 Assert(pRange->uValue == (idMsr - 0x200) / 2);
473 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(uRawValue); RT_NOREF_PV(pRange);
474
475 uint8_t uType = uValue & 0xff;
476 if ((uType >= 7) || (uType == 2) || (uType == 3))
477 {
478 Log(("CPUM: Invalid type set writing MTRR PhysBase MSR %#x: %#llx (%#llx)\n", idMsr, uValue, uType));
479 return VERR_CPUM_RAISE_GP_0;
480 }
481
482 uint64_t fInvPhysMask = ~(RT_BIT_64(pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.cMaxPhysAddrWidth) - 1U);
483 if (fInvPhysMask & uValue)
484 {
485 Log(("CPUM: Invalid physical address bits set writing MTRR PhysBase MSR %#x: %#llx (%#llx)\n",
486 idMsr, uValue, uValue & fInvPhysMask));
487 return VERR_CPUM_RAISE_GP_0;
488 }
489
490 /*
491 * Store it.
492 */
493 /** @todo Implement variable MTRR storage. */
494 return VINF_SUCCESS;
495}
496
497
498/** @callback_method_impl{FNCPUMRDMSR} */
499static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32MtrrPhysMaskN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
500{
501 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
502 /** @todo Implement variable MTRR storage. */
503 Assert(pRange->uValue == (idMsr - 0x200) / 2);
504 *puValue = 0;
505 return VINF_SUCCESS;
506}
507
508
509/** @callback_method_impl{FNCPUMWRMSR} */
510static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32MtrrPhysMaskN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
511{
512 /*
513 * Validate the value.
514 */
515 Assert(pRange->uValue == (idMsr - 0x200) / 2);
516 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(uRawValue); RT_NOREF_PV(pRange);
517
518 uint64_t fInvPhysMask = ~(RT_BIT_64(pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.cMaxPhysAddrWidth) - 1U);
519 if (fInvPhysMask & uValue)
520 {
521 Log(("CPUM: Invalid physical address bits set writing MTRR PhysMask MSR %#x: %#llx (%#llx)\n",
522 idMsr, uValue, uValue & fInvPhysMask));
523 return VERR_CPUM_RAISE_GP_0;
524 }
525
526 /*
527 * Store it.
528 */
529 /** @todo Implement variable MTRR storage. */
530 return VINF_SUCCESS;
531}
532
533
534/** @callback_method_impl{FNCPUMRDMSR} */
535static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32MtrrFixed(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
536{
537 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
538 CPUM_MSR_ASSERT_CPUMCPU_OFFSET_RETURN(pVCpu, pRange, uint64_t, puFixedMtrr);
539 *puValue = *puFixedMtrr;
540 return VINF_SUCCESS;
541}
542
543
544/** @callback_method_impl{FNCPUMWRMSR} */
545static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32MtrrFixed(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
546{
547 CPUM_MSR_ASSERT_CPUMCPU_OFFSET_RETURN(pVCpu, pRange, uint64_t, puFixedMtrr);
548 RT_NOREF_PV(idMsr); RT_NOREF_PV(uRawValue);
549
550 for (uint32_t cShift = 0; cShift < 63; cShift += 8)
551 {
552 uint8_t uType = (uint8_t)(uValue >> cShift);
553 if ((uType >= 7) || (uType == 2) || (uType == 3))
554 {
555 Log(("CPUM: Invalid MTRR type at %u:%u in fixed range (%#x/%s): %#llx (%#llx)\n",
556 cShift + 7, cShift, idMsr, pRange->szName, uValue, uType));
557 return VERR_CPUM_RAISE_GP_0;
558 }
559 }
560 *puFixedMtrr = uValue;
561 return VINF_SUCCESS;
562}
563
564
565/** @callback_method_impl{FNCPUMRDMSR} */
566static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32MtrrDefType(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
567{
568 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
569 *puValue = pVCpu->cpum.s.GuestMsrs.msr.MtrrDefType;
570 return VINF_SUCCESS;
571}
572
573
574/** @callback_method_impl{FNCPUMWRMSR} */
575static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32MtrrDefType(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
576{
577 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
578
579 uint8_t uType = uValue & 0xff;
580 if ((uType >= 7) || (uType == 2) || (uType == 3))
581 {
582 Log(("CPUM: Invalid MTRR default type value on %s: %#llx (%#llx)\n", pRange->szName, uValue, uType));
583 return VERR_CPUM_RAISE_GP_0;
584 }
585
586 pVCpu->cpum.s.GuestMsrs.msr.MtrrDefType = uValue;
587 return VINF_SUCCESS;
588}
589
590
591/** @callback_method_impl{FNCPUMRDMSR} */
592static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32Pat(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
593{
594 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
595 *puValue = pVCpu->cpum.s.Guest.msrPAT;
596 return VINF_SUCCESS;
597}
598
599
600/** @callback_method_impl{FNCPUMWRMSR} */
601static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32Pat(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
602{
603 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
604 if (CPUMIsPatMsrValid(uValue))
605 {
606 pVCpu->cpum.s.Guest.msrPAT = uValue;
607 return VINF_SUCCESS;
608 }
609 return VERR_CPUM_RAISE_GP_0;
610}
611
612
613/** @callback_method_impl{FNCPUMRDMSR} */
614static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32SysEnterCs(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
615{
616 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
617 *puValue = pVCpu->cpum.s.Guest.SysEnter.cs;
618 return VINF_SUCCESS;
619}
620
621
622/** @callback_method_impl{FNCPUMWRMSR} */
623static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32SysEnterCs(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
624{
625 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
626
627 /* Note! We used to mask this by 0xffff, but turns out real HW doesn't and
628 there are generally 32-bit working bits backing this register. */
629 pVCpu->cpum.s.Guest.SysEnter.cs = uValue;
630 return VINF_SUCCESS;
631}
632
633
634/** @callback_method_impl{FNCPUMRDMSR} */
635static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32SysEnterEsp(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
636{
637 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
638 *puValue = pVCpu->cpum.s.Guest.SysEnter.esp;
639 return VINF_SUCCESS;
640}
641
642
643/** @callback_method_impl{FNCPUMWRMSR} */
644static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32SysEnterEsp(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
645{
646 if (X86_IS_CANONICAL(uValue))
647 {
648 pVCpu->cpum.s.Guest.SysEnter.esp = uValue;
649 return VINF_SUCCESS;
650 }
651 Log(("CPUM: IA32_SYSENTER_ESP not canonical! %#llx\n", uValue));
652 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
653 return VERR_CPUM_RAISE_GP_0;
654}
655
656
657/** @callback_method_impl{FNCPUMRDMSR} */
658static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32SysEnterEip(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
659{
660 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
661 *puValue = pVCpu->cpum.s.Guest.SysEnter.eip;
662 return VINF_SUCCESS;
663}
664
665
666/** @callback_method_impl{FNCPUMWRMSR} */
667static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32SysEnterEip(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
668{
669 if (X86_IS_CANONICAL(uValue))
670 {
671 pVCpu->cpum.s.Guest.SysEnter.eip = uValue;
672 return VINF_SUCCESS;
673 }
674 LogRel(("CPUM: IA32_SYSENTER_EIP not canonical! %#llx\n", uValue));
675 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
676 return VERR_CPUM_RAISE_GP_0;
677}
678
679
680/** @callback_method_impl{FNCPUMRDMSR} */
681static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32McgCap(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
682{
683 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
684#if 0 /** @todo implement machine checks. */
685 *puValue = pRange->uValue & (RT_BIT_64(8) | 0);
686#else
687 *puValue = 0;
688#endif
689 return VINF_SUCCESS;
690}
691
692
693/** @callback_method_impl{FNCPUMRDMSR} */
694static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32McgStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
695{
696 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
697 /** @todo implement machine checks. */
698 *puValue = 0;
699 return VINF_SUCCESS;
700}
701
702
703/** @callback_method_impl{FNCPUMWRMSR} */
704static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32McgStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
705{
706 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
707 /** @todo implement machine checks. */
708 return VINF_SUCCESS;
709}
710
711
712/** @callback_method_impl{FNCPUMRDMSR} */
713static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32McgCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
714{
715 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
716 /** @todo implement machine checks. */
717 *puValue = 0;
718 return VINF_SUCCESS;
719}
720
721
722/** @callback_method_impl{FNCPUMWRMSR} */
723static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32McgCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
724{
725 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
726 /** @todo implement machine checks. */
727 return VINF_SUCCESS;
728}
729
730
731/** @callback_method_impl{FNCPUMRDMSR} */
732static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32DebugCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
733{
734 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
735 /** @todo implement IA32_DEBUGCTL. */
736 *puValue = 0;
737 return VINF_SUCCESS;
738}
739
740
741/** @callback_method_impl{FNCPUMWRMSR} */
742static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32DebugCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
743{
744 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
745 /** @todo implement IA32_DEBUGCTL. */
746 return VINF_SUCCESS;
747}
748
749
750/** @callback_method_impl{FNCPUMRDMSR} */
751static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32SmrrPhysBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
752{
753 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
754 /** @todo implement intel SMM. */
755 *puValue = 0;
756 return VINF_SUCCESS;
757}
758
759
760/** @callback_method_impl{FNCPUMWRMSR} */
761static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32SmrrPhysBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
762{
763 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
764 /** @todo implement intel SMM. */
765 return VERR_CPUM_RAISE_GP_0;
766}
767
768
769/** @callback_method_impl{FNCPUMRDMSR} */
770static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32SmrrPhysMask(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
771{
772 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
773 /** @todo implement intel SMM. */
774 *puValue = 0;
775 return VINF_SUCCESS;
776}
777
778
779/** @callback_method_impl{FNCPUMWRMSR} */
780static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32SmrrPhysMask(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
781{
782 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
783 /** @todo implement intel SMM. */
784 return VERR_CPUM_RAISE_GP_0;
785}
786
787
788/** @callback_method_impl{FNCPUMRDMSR} */
789static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32PlatformDcaCap(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
790{
791 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
792 /** @todo implement intel direct cache access (DCA)?? */
793 *puValue = 0;
794 return VINF_SUCCESS;
795}
796
797
798/** @callback_method_impl{FNCPUMWRMSR} */
799static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32PlatformDcaCap(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
800{
801 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
802 /** @todo implement intel direct cache access (DCA)?? */
803 return VINF_SUCCESS;
804}
805
806
807/** @callback_method_impl{FNCPUMRDMSR} */
808static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32CpuDcaCap(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
809{
810 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
811 /** @todo implement intel direct cache access (DCA)?? */
812 *puValue = 0;
813 return VINF_SUCCESS;
814}
815
816
817/** @callback_method_impl{FNCPUMRDMSR} */
818static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32Dca0Cap(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
819{
820 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
821 /** @todo implement intel direct cache access (DCA)?? */
822 *puValue = 0;
823 return VINF_SUCCESS;
824}
825
826
827/** @callback_method_impl{FNCPUMWRMSR} */
828static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32Dca0Cap(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
829{
830 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
831 /** @todo implement intel direct cache access (DCA)?? */
832 return VINF_SUCCESS;
833}
834
835
836/** @callback_method_impl{FNCPUMRDMSR} */
837static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32PerfEvtSelN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
838{
839 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
840 /** @todo implement IA32_PERFEVTSEL0+. */
841 *puValue = 0;
842 return VINF_SUCCESS;
843}
844
845
846/** @callback_method_impl{FNCPUMWRMSR} */
847static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32PerfEvtSelN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
848{
849 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
850 /** @todo implement IA32_PERFEVTSEL0+. */
851 return VINF_SUCCESS;
852}
853
854
855/** @callback_method_impl{FNCPUMRDMSR} */
856static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32PerfStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
857{
858 RT_NOREF_PV(idMsr);
859 uint64_t uValue = pRange->uValue;
860
861 /* Always provide the max bus ratio for now. XNU expects it. */
862 uValue &= ~((UINT64_C(0x1f) << 40) | RT_BIT_64(46));
863
864 PVMCC pVM = pVCpu->CTX_SUFF(pVM);
865 uint64_t uScalableBusHz = CPUMGetGuestScalableBusFrequency(pVM);
866 uint64_t uTscHz = TMCpuTicksPerSecond(pVM);
867 uint8_t uTscRatio = (uint8_t)((uTscHz + uScalableBusHz / 2) / uScalableBusHz);
868 if (uTscRatio > 0x1f)
869 uTscRatio = 0x1f;
870 uValue |= (uint64_t)uTscRatio << 40;
871
872 *puValue = uValue;
873 return VINF_SUCCESS;
874}
875
876
877/** @callback_method_impl{FNCPUMWRMSR} */
878static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32PerfStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
879{
880 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
881 /* Pentium4 allows writing, but all bits are ignored. */
882 return VINF_SUCCESS;
883}
884
885
886/** @callback_method_impl{FNCPUMRDMSR} */
887static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32PerfCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
888{
889 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
890 /** @todo implement IA32_PERFCTL. */
891 *puValue = 0;
892 return VINF_SUCCESS;
893}
894
895
896/** @callback_method_impl{FNCPUMWRMSR} */
897static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32PerfCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
898{
899 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
900 /** @todo implement IA32_PERFCTL. */
901 return VINF_SUCCESS;
902}
903
904
905/** @callback_method_impl{FNCPUMRDMSR} */
906static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32FixedCtrN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
907{
908 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
909 /** @todo implement IA32_FIXED_CTRn (fixed performance counters). */
910 *puValue = 0;
911 return VINF_SUCCESS;
912}
913
914
915/** @callback_method_impl{FNCPUMWRMSR} */
916static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32FixedCtrN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
917{
918 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
919 /** @todo implement IA32_FIXED_CTRn (fixed performance counters). */
920 return VINF_SUCCESS;
921}
922
923
924/** @callback_method_impl{FNCPUMRDMSR} */
925static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32PerfCapabilities(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
926{
927 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
928 /** @todo implement performance counters. */
929 *puValue = 0;
930 return VINF_SUCCESS;
931}
932
933
934/** @callback_method_impl{FNCPUMWRMSR} */
935static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32PerfCapabilities(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
936{
937 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
938 /** @todo implement performance counters. */
939 return VINF_SUCCESS;
940}
941
942
943/** @callback_method_impl{FNCPUMRDMSR} */
944static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32FixedCtrCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
945{
946 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
947 /** @todo implement performance counters. */
948 *puValue = 0;
949 return VINF_SUCCESS;
950}
951
952
953/** @callback_method_impl{FNCPUMWRMSR} */
954static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32FixedCtrCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
955{
956 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
957 /** @todo implement performance counters. */
958 return VINF_SUCCESS;
959}
960
961
962/** @callback_method_impl{FNCPUMRDMSR} */
963static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32PerfGlobalStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
964{
965 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
966 /** @todo implement performance counters. */
967 *puValue = 0;
968 return VINF_SUCCESS;
969}
970
971
972/** @callback_method_impl{FNCPUMWRMSR} */
973static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32PerfGlobalStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
974{
975 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
976 /** @todo implement performance counters. */
977 return VINF_SUCCESS;
978}
979
980
981/** @callback_method_impl{FNCPUMRDMSR} */
982static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32PerfGlobalCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
983{
984 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
985 /** @todo implement performance counters. */
986 *puValue = 0;
987 return VINF_SUCCESS;
988}
989
990
991/** @callback_method_impl{FNCPUMWRMSR} */
992static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32PerfGlobalCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
993{
994 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
995 /** @todo implement performance counters. */
996 return VINF_SUCCESS;
997}
998
999
1000/** @callback_method_impl{FNCPUMRDMSR} */
1001static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32PerfGlobalOvfCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1002{
1003 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1004 /** @todo implement performance counters. */
1005 *puValue = 0;
1006 return VINF_SUCCESS;
1007}
1008
1009
1010/** @callback_method_impl{FNCPUMWRMSR} */
1011static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32PerfGlobalOvfCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1012{
1013 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1014 /** @todo implement performance counters. */
1015 return VINF_SUCCESS;
1016}
1017
1018
1019/** @callback_method_impl{FNCPUMRDMSR} */
1020static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32PebsEnable(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1021{
1022 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1023 /** @todo implement performance counters. */
1024 *puValue = 0;
1025 return VINF_SUCCESS;
1026}
1027
1028
1029/** @callback_method_impl{FNCPUMWRMSR} */
1030static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32PebsEnable(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1031{
1032 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1033 /** @todo implement performance counters. */
1034 return VINF_SUCCESS;
1035}
1036
1037
1038/** @callback_method_impl{FNCPUMRDMSR} */
1039static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32ClockModulation(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1040{
1041 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1042 /** @todo implement IA32_CLOCK_MODULATION. */
1043 *puValue = 0;
1044 return VINF_SUCCESS;
1045}
1046
1047
1048/** @callback_method_impl{FNCPUMWRMSR} */
1049static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32ClockModulation(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1050{
1051 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1052 /** @todo implement IA32_CLOCK_MODULATION. */
1053 return VINF_SUCCESS;
1054}
1055
1056
1057/** @callback_method_impl{FNCPUMRDMSR} */
1058static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32ThermInterrupt(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1059{
1060 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1061 /** @todo implement IA32_THERM_INTERRUPT. */
1062 *puValue = 0;
1063 return VINF_SUCCESS;
1064}
1065
1066
1067/** @callback_method_impl{FNCPUMWRMSR} */
1068static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32ThermInterrupt(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1069{
1070 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1071 /** @todo implement IA32_THERM_STATUS. */
1072 return VINF_SUCCESS;
1073}
1074
1075
1076/** @callback_method_impl{FNCPUMRDMSR} */
1077static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32ThermStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1078{
1079 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1080 /** @todo implement IA32_THERM_STATUS. */
1081 *puValue = 0;
1082 return VINF_SUCCESS;
1083}
1084
1085
1086/** @callback_method_impl{FNCPUMWRMSR} */
1087static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32ThermStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1088{
1089 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1090 /** @todo implement IA32_THERM_INTERRUPT. */
1091 return VINF_SUCCESS;
1092}
1093
1094
1095/** @callback_method_impl{FNCPUMRDMSR} */
1096static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32Therm2Ctl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1097{
1098 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1099 /** @todo implement IA32_THERM2_CTL. */
1100 *puValue = 0;
1101 return VINF_SUCCESS;
1102}
1103
1104
1105/** @callback_method_impl{FNCPUMWRMSR} */
1106static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32Therm2Ctl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1107{
1108 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1109 /** @todo implement IA32_THERM2_CTL. */
1110 return VINF_SUCCESS;
1111}
1112
1113
1114/** @callback_method_impl{FNCPUMRDMSR} */
1115static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32MiscEnable(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1116{
1117 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1118 *puValue = pVCpu->cpum.s.GuestMsrs.msr.MiscEnable;
1119 return VINF_SUCCESS;
1120}
1121
1122
1123/** @callback_method_impl{FNCPUMWRMSR} */
1124static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32MiscEnable(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1125{
1126 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1127#ifdef LOG_ENABLED
1128 uint64_t const uOld = pVCpu->cpum.s.GuestMsrs.msr.MiscEnable;
1129#endif
1130
1131 /* Unsupported bits are generally ignored and stripped by the MSR range
1132 entry that got us here. So, we just need to preserve fixed bits. */
1133 pVCpu->cpum.s.GuestMsrs.msr.MiscEnable = uValue
1134 | MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL
1135 | MSR_IA32_MISC_ENABLE_BTS_UNAVAIL;
1136
1137 Log(("CPUM: IA32_MISC_ENABLE; old=%#llx written=%#llx => %#llx\n",
1138 uOld, uValue, pVCpu->cpum.s.GuestMsrs.msr.MiscEnable));
1139
1140 /** @todo Wire IA32_MISC_ENABLE bit 22 to our NT 4 CPUID trick. */
1141 /** @todo Wire up MSR_IA32_MISC_ENABLE_XD_DISABLE. */
1142 return VINF_SUCCESS;
1143}
1144
1145
1146/** @callback_method_impl{FNCPUMRDMSR} */
1147static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32McCtlStatusAddrMiscN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1148{
1149 RT_NOREF_PV(pVCpu); RT_NOREF_PV(pRange);
1150
1151 /** @todo Implement machine check exception injection. */
1152 switch (idMsr & 3)
1153 {
1154 case 0:
1155 case 1:
1156 *puValue = 0;
1157 break;
1158
1159 /* The ADDR and MISC registers aren't accessible since the
1160 corresponding STATUS bits are zero. */
1161 case 2:
1162 Log(("CPUM: Reading IA32_MCi_ADDR %#x -> #GP\n", idMsr));
1163 return VERR_CPUM_RAISE_GP_0;
1164 case 3:
1165 Log(("CPUM: Reading IA32_MCi_MISC %#x -> #GP\n", idMsr));
1166 return VERR_CPUM_RAISE_GP_0;
1167 }
1168 return VINF_SUCCESS;
1169}
1170
1171
1172/** @callback_method_impl{FNCPUMWRMSR} */
1173static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32McCtlStatusAddrMiscN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1174{
1175 RT_NOREF_PV(pVCpu); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1176 switch (idMsr & 3)
1177 {
1178 case 0:
1179 /* Ignore writes to the CTL register. */
1180 break;
1181
1182 case 1:
1183 /* According to specs, the STATUS register can only be written to
1184 with the value 0. VBoxCpuReport thinks different for a
1185 Pentium M Dothan, but implementing according to specs now. */
1186 if (uValue != 0)
1187 {
1188 Log(("CPUM: Writing non-zero value (%#llx) to IA32_MCi_STATUS %#x -> #GP\n", uValue, idMsr));
1189 return VERR_CPUM_RAISE_GP_0;
1190 }
1191 break;
1192
1193 /* Specs states that ADDR and MISC can be cleared by writing zeros.
1194 Writing 1s will GP. Need to figure out how this relates to the
1195 ADDRV and MISCV status flags. If writing is independent of those
1196 bits, we need to know whether the CPU really implements them since
1197 that is exposed by writing 0 to them.
1198 Implementing the solution with the fewer GPs for now. */
1199 case 2:
1200 if (uValue != 0)
1201 {
1202 Log(("CPUM: Writing non-zero value (%#llx) to IA32_MCi_ADDR %#x -> #GP\n", uValue, idMsr));
1203 return VERR_CPUM_RAISE_GP_0;
1204 }
1205 break;
1206 case 3:
1207 if (uValue != 0)
1208 {
1209 Log(("CPUM: Writing non-zero value (%#llx) to IA32_MCi_MISC %#x -> #GP\n", uValue, idMsr));
1210 return VERR_CPUM_RAISE_GP_0;
1211 }
1212 break;
1213 }
1214 return VINF_SUCCESS;
1215}
1216
1217
1218/** @callback_method_impl{FNCPUMRDMSR} */
1219static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32McNCtl2(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1220{
1221 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1222 /** @todo Implement machine check exception injection. */
1223 *puValue = 0;
1224 return VINF_SUCCESS;
1225}
1226
1227
1228/** @callback_method_impl{FNCPUMWRMSR} */
1229static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32McNCtl2(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1230{
1231 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1232 /** @todo Implement machine check exception injection. */
1233 return VINF_SUCCESS;
1234}
1235
1236
1237/** @callback_method_impl{FNCPUMRDMSR} */
1238static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32DsArea(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1239{
1240 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1241 /** @todo implement IA32_DS_AREA. */
1242 *puValue = 0;
1243 return VINF_SUCCESS;
1244}
1245
1246
1247/** @callback_method_impl{FNCPUMWRMSR} */
1248static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32DsArea(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1249{
1250 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1251 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1252 return VINF_SUCCESS;
1253}
1254
1255
1256/** @callback_method_impl{FNCPUMRDMSR} */
1257static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32TscDeadline(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1258{
1259 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1260 /** @todo implement TSC deadline timer. */
1261 *puValue = 0;
1262 return VINF_SUCCESS;
1263}
1264
1265
1266/** @callback_method_impl{FNCPUMWRMSR} */
1267static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32TscDeadline(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1268{
1269 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1270 /** @todo implement TSC deadline timer. */
1271 return VINF_SUCCESS;
1272}
1273
1274
1275/** @callback_method_impl{FNCPUMRDMSR} */
1276static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32X2ApicN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1277{
1278 RT_NOREF_PV(pRange);
1279#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
1280 if ( CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.s.Guest)
1281 && CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.s.Guest, VMX_PROC_CTLS2_VIRT_X2APIC_MODE))
1282 {
1283 VBOXSTRICTRC rcStrict = IEMExecVmxVirtApicAccessMsr(pVCpu, idMsr, puValue, false /* fWrite */);
1284 if (rcStrict == VINF_VMX_MODIFIES_BEHAVIOR)
1285 return VINF_SUCCESS;
1286 if (rcStrict == VERR_OUT_OF_RANGE)
1287 return VERR_CPUM_RAISE_GP_0;
1288 Assert(rcStrict == VINF_VMX_INTERCEPT_NOT_ACTIVE);
1289 }
1290#endif
1291 return APICReadMsr(pVCpu, idMsr, puValue);
1292}
1293
1294
1295/** @callback_method_impl{FNCPUMWRMSR} */
1296static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32X2ApicN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1297{
1298 RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1299#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
1300 if ( CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.s.Guest)
1301 && CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.s.Guest, VMX_PROC_CTLS2_VIRT_X2APIC_MODE))
1302 {
1303 VBOXSTRICTRC rcStrict = IEMExecVmxVirtApicAccessMsr(pVCpu, idMsr, &uValue, true /* fWrite */);
1304 if (rcStrict == VINF_VMX_MODIFIES_BEHAVIOR)
1305 return VINF_SUCCESS;
1306 if (rcStrict == VERR_OUT_OF_RANGE)
1307 return VERR_CPUM_RAISE_GP_0;
1308 Assert(rcStrict == VINF_VMX_INTERCEPT_NOT_ACTIVE);
1309 }
1310#endif
1311 return APICWriteMsr(pVCpu, idMsr, uValue);
1312}
1313
1314
1315/** @callback_method_impl{FNCPUMRDMSR} */
1316static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32DebugInterface(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1317{
1318 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1319 /** @todo IA32_DEBUG_INTERFACE (no docs) */
1320 *puValue = 0;
1321 return VINF_SUCCESS;
1322}
1323
1324
1325/** @callback_method_impl{FNCPUMWRMSR} */
1326static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32DebugInterface(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1327{
1328 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1329 /** @todo IA32_DEBUG_INTERFACE (no docs) */
1330 return VINF_SUCCESS;
1331}
1332
1333
1334/** @callback_method_impl{FNCPUMRDMSR} */
1335static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxBasic(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1336{
1337 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1338 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1339 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Basic;
1340 else
1341 *puValue = 0;
1342 return VINF_SUCCESS;
1343}
1344
1345
1346/** @callback_method_impl{FNCPUMRDMSR} */
1347static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxPinbasedCtls(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1348{
1349 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1350 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1351 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.PinCtls.u;
1352 else
1353 *puValue = 0;
1354 return VINF_SUCCESS;
1355}
1356
1357/** @callback_method_impl{FNCPUMRDMSR} */
1358static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxProcbasedCtls(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1359{
1360 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1361 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1362 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.ProcCtls.u;
1363 else
1364 *puValue = 0;
1365 return VINF_SUCCESS;
1366}
1367
1368
1369/** @callback_method_impl{FNCPUMRDMSR} */
1370static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxExitCtls(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1371{
1372 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1373 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1374 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.ExitCtls.u;
1375 else
1376 *puValue = 0;
1377 return VINF_SUCCESS;
1378}
1379
1380
1381/** @callback_method_impl{FNCPUMRDMSR} */
1382static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxEntryCtls(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1383{
1384 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1385 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1386 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.EntryCtls.u;
1387 else
1388 *puValue = 0;
1389 return VINF_SUCCESS;
1390}
1391
1392
1393
1394/** @callback_method_impl{FNCPUMRDMSR} */
1395static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxMisc(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1396{
1397 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1398 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1399 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Misc;
1400 else
1401 *puValue = 0;
1402 return VINF_SUCCESS;
1403}
1404
1405
1406/** @callback_method_impl{FNCPUMRDMSR} */
1407static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxCr0Fixed0(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1408{
1409 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1410 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Cr0Fixed0;
1411 return VINF_SUCCESS;
1412}
1413
1414
1415/** @callback_method_impl{FNCPUMRDMSR} */
1416static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxCr0Fixed1(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1417{
1418 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1419 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1420 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Cr0Fixed1;
1421 else
1422 *puValue = 0;
1423 return VINF_SUCCESS;
1424}
1425
1426
1427/** @callback_method_impl{FNCPUMRDMSR} */
1428static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxCr4Fixed0(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1429{
1430 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1431 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1432 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Cr4Fixed0;
1433 else
1434 *puValue = 0;
1435 return VINF_SUCCESS;
1436}
1437
1438
1439/** @callback_method_impl{FNCPUMRDMSR} */
1440static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxCr4Fixed1(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1441{
1442 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1443 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1444 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Cr4Fixed1;
1445 else
1446 *puValue = 0;
1447 return VINF_SUCCESS;
1448}
1449
1450
1451/** @callback_method_impl{FNCPUMRDMSR} */
1452static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxVmcsEnum(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1453{
1454 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1455 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1456 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64VmcsEnum;
1457 else
1458 *puValue = 0;
1459 return VINF_SUCCESS;
1460}
1461
1462
1463/** @callback_method_impl{FNCPUMRDMSR} */
1464static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxProcBasedCtls2(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1465{
1466 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1467 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1468 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.ProcCtls2.u;
1469 else
1470 *puValue = 0;
1471 return VINF_SUCCESS;
1472}
1473
1474
1475/**
1476 * Get fixed IA32_VMX_EPT_VPID_CAP value for PGM and cpumMsrRd_Ia32VmxEptVpidCap.
1477 *
1478 * @returns Fixed IA32_VMX_EPT_VPID_CAP value.
1479 * @param pVCpu The cross context per CPU structure.
1480 */
1481VMM_INT_DECL(uint64_t) CPUMGetGuestIa32VmxEptVpidCap(PCVMCPUCC pVCpu)
1482{
1483 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1484 return pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64EptVpidCaps;
1485 return 0;
1486}
1487
1488
1489/** @callback_method_impl{FNCPUMRDMSR} */
1490static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxEptVpidCap(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1491{
1492 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1493 *puValue = CPUMGetGuestIa32VmxEptVpidCap(pVCpu);
1494 return VINF_SUCCESS;
1495}
1496
1497
1498/** @callback_method_impl{FNCPUMRDMSR} */
1499static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxTruePinbasedCtls(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1500{
1501 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1502 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1503 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.TruePinCtls.u;
1504 else
1505 *puValue = 0;
1506 return VINF_SUCCESS;
1507}
1508
1509
1510/** @callback_method_impl{FNCPUMRDMSR} */
1511static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxTrueProcbasedCtls(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1512{
1513 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1514 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1515 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.TrueProcCtls.u;
1516 else
1517 *puValue = 0;
1518 return VINF_SUCCESS;
1519}
1520
1521
1522/** @callback_method_impl{FNCPUMRDMSR} */
1523static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxTrueExitCtls(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1524{
1525 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1526 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1527 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.TrueExitCtls.u;
1528 else
1529 *puValue = 0;
1530 return VINF_SUCCESS;
1531}
1532
1533
1534/** @callback_method_impl{FNCPUMRDMSR} */
1535static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxTrueEntryCtls(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1536{
1537 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1538 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1539 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.TrueEntryCtls.u;
1540 else
1541 *puValue = 0;
1542 return VINF_SUCCESS;
1543}
1544
1545
1546/** @callback_method_impl{FNCPUMRDMSR} */
1547static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxVmFunc(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1548{
1549 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1550 if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
1551 *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64VmFunc;
1552 else
1553 *puValue = 0;
1554 return VINF_SUCCESS;
1555}
1556
1557
1558/** @callback_method_impl{FNCPUMRDMSR} */
1559static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32SpecCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1560{
1561 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1562 *puValue = pVCpu->cpum.s.GuestMsrs.msr.SpecCtrl;
1563 return VINF_SUCCESS;
1564}
1565
1566
1567/** @callback_method_impl{FNCPUMWRMSR} */
1568static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32SpecCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1569{
1570 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1571
1572 /* NB: The STIBP bit can be set even when IBRS is present, regardless of whether STIBP is actually implemented. */
1573 if (uValue & ~(MSR_IA32_SPEC_CTRL_F_IBRS | MSR_IA32_SPEC_CTRL_F_STIBP))
1574 {
1575 Log(("CPUM: Invalid IA32_SPEC_CTRL bits (trying to write %#llx)\n", uValue));
1576 return VERR_CPUM_RAISE_GP_0;
1577 }
1578
1579 pVCpu->cpum.s.GuestMsrs.msr.SpecCtrl = uValue;
1580 return VINF_SUCCESS;
1581}
1582
1583
1584/** @callback_method_impl{FNCPUMWRMSR} */
1585static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32PredCmd(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1586{
1587 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1588 return VINF_SUCCESS;
1589}
1590
1591
1592/** @callback_method_impl{FNCPUMRDMSR} */
1593static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32ArchCapabilities(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1594{
1595 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1596 *puValue = pVCpu->cpum.s.GuestMsrs.msr.ArchCaps;
1597 return VINF_SUCCESS;
1598}
1599
1600
1601/** @callback_method_impl{FNCPUMWRMSR} */
1602static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Ia32FlushCmd(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1603{
1604 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1605 if ((uValue & ~MSR_IA32_FLUSH_CMD_F_L1D) == 0)
1606 return VINF_SUCCESS;
1607 Log(("CPUM: Invalid MSR_IA32_FLUSH_CMD_ bits (trying to write %#llx)\n", uValue));
1608 return VERR_CPUM_RAISE_GP_0;
1609}
1610
1611
1612
1613/*
1614 * AMD64
1615 * AMD64
1616 * AMD64
1617 */
1618
1619
1620/** @callback_method_impl{FNCPUMRDMSR} */
1621static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Amd64Efer(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1622{
1623 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1624 *puValue = pVCpu->cpum.s.Guest.msrEFER;
1625 return VINF_SUCCESS;
1626}
1627
1628
1629/** @callback_method_impl{FNCPUMWRMSR} */
1630static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Amd64Efer(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1631{
1632 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1633 uint64_t uValidatedEfer;
1634 uint64_t const uOldEfer = pVCpu->cpum.s.Guest.msrEFER;
1635 int rc = CPUMIsGuestEferMsrWriteValid(pVCpu->CTX_SUFF(pVM), pVCpu->cpum.s.Guest.cr0, uOldEfer, uValue, &uValidatedEfer);
1636 if (RT_FAILURE(rc))
1637 return VERR_CPUM_RAISE_GP_0;
1638
1639 CPUMSetGuestEferMsrNoChecks(pVCpu, uOldEfer, uValidatedEfer);
1640 return VINF_SUCCESS;
1641}
1642
1643
1644/** @callback_method_impl{FNCPUMRDMSR} */
1645static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Amd64SyscallTarget(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1646{
1647 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1648 *puValue = pVCpu->cpum.s.Guest.msrSTAR;
1649 return VINF_SUCCESS;
1650}
1651
1652
1653/** @callback_method_impl{FNCPUMWRMSR} */
1654static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Amd64SyscallTarget(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1655{
1656 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1657 pVCpu->cpum.s.Guest.msrSTAR = uValue;
1658 return VINF_SUCCESS;
1659}
1660
1661
1662/** @callback_method_impl{FNCPUMRDMSR} */
1663static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Amd64LongSyscallTarget(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1664{
1665 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1666 *puValue = pVCpu->cpum.s.Guest.msrLSTAR;
1667 return VINF_SUCCESS;
1668}
1669
1670
1671/** @callback_method_impl{FNCPUMWRMSR} */
1672static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Amd64LongSyscallTarget(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1673{
1674 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1675 if (!X86_IS_CANONICAL(uValue))
1676 {
1677 Log(("CPUM: wrmsr %s(%#x), %#llx -> #GP - not canonical\n", pRange->szName, idMsr, uValue));
1678 return VERR_CPUM_RAISE_GP_0;
1679 }
1680 pVCpu->cpum.s.Guest.msrLSTAR = uValue;
1681 return VINF_SUCCESS;
1682}
1683
1684
1685/** @callback_method_impl{FNCPUMRDMSR} */
1686static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Amd64CompSyscallTarget(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1687{
1688 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1689 *puValue = pVCpu->cpum.s.Guest.msrCSTAR;
1690 return VINF_SUCCESS;
1691}
1692
1693
1694/** @callback_method_impl{FNCPUMWRMSR} */
1695static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Amd64CompSyscallTarget(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1696{
1697 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1698 if (!X86_IS_CANONICAL(uValue))
1699 {
1700 Log(("CPUM: wrmsr %s(%#x), %#llx -> #GP - not canonical\n", pRange->szName, idMsr, uValue));
1701 return VERR_CPUM_RAISE_GP_0;
1702 }
1703 pVCpu->cpum.s.Guest.msrCSTAR = uValue;
1704 return VINF_SUCCESS;
1705}
1706
1707
1708/** @callback_method_impl{FNCPUMRDMSR} */
1709static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Amd64SyscallFlagMask(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1710{
1711 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1712 *puValue = pVCpu->cpum.s.Guest.msrSFMASK;
1713 return VINF_SUCCESS;
1714}
1715
1716
1717/** @callback_method_impl{FNCPUMWRMSR} */
1718static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Amd64SyscallFlagMask(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1719{
1720 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1721 pVCpu->cpum.s.Guest.msrSFMASK = uValue;
1722 return VINF_SUCCESS;
1723}
1724
1725
1726/** @callback_method_impl{FNCPUMRDMSR} */
1727static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Amd64FsBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1728{
1729 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1730 *puValue = pVCpu->cpum.s.Guest.fs.u64Base;
1731 return VINF_SUCCESS;
1732}
1733
1734
1735/** @callback_method_impl{FNCPUMWRMSR} */
1736static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Amd64FsBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1737{
1738 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1739 pVCpu->cpum.s.Guest.fs.u64Base = uValue;
1740 return VINF_SUCCESS;
1741}
1742
1743
1744/** @callback_method_impl{FNCPUMRDMSR} */
1745static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Amd64GsBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1746{
1747 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1748 *puValue = pVCpu->cpum.s.Guest.gs.u64Base;
1749 return VINF_SUCCESS;
1750}
1751
1752/** @callback_method_impl{FNCPUMWRMSR} */
1753static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Amd64GsBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1754{
1755 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1756 pVCpu->cpum.s.Guest.gs.u64Base = uValue;
1757 return VINF_SUCCESS;
1758}
1759
1760
1761
1762/** @callback_method_impl{FNCPUMRDMSR} */
1763static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Amd64KernelGsBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1764{
1765 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1766 *puValue = pVCpu->cpum.s.Guest.msrKERNELGSBASE;
1767 return VINF_SUCCESS;
1768}
1769
1770/** @callback_method_impl{FNCPUMWRMSR} */
1771static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Amd64KernelGsBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1772{
1773 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1774 pVCpu->cpum.s.Guest.msrKERNELGSBASE = uValue;
1775 return VINF_SUCCESS;
1776}
1777
1778
1779/** @callback_method_impl{FNCPUMRDMSR} */
1780static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Amd64TscAux(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1781{
1782 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1783 *puValue = pVCpu->cpum.s.GuestMsrs.msr.TscAux;
1784 return VINF_SUCCESS;
1785}
1786
1787/** @callback_method_impl{FNCPUMWRMSR} */
1788static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Amd64TscAux(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1789{
1790 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
1791 pVCpu->cpum.s.GuestMsrs.msr.TscAux = uValue;
1792 return VINF_SUCCESS;
1793}
1794
1795
1796/*
1797 * Intel specific
1798 * Intel specific
1799 * Intel specific
1800 */
1801
1802/** @callback_method_impl{FNCPUMRDMSR} */
1803static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelEblCrPowerOn(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1804{
1805 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
1806 /** @todo recalc clock frequency ratio? */
1807 *puValue = pRange->uValue;
1808 return VINF_SUCCESS;
1809}
1810
1811
1812/** @callback_method_impl{FNCPUMWRMSR} */
1813static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelEblCrPowerOn(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1814{
1815 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1816 /** @todo Write EBL_CR_POWERON: Remember written bits. */
1817 return VINF_SUCCESS;
1818}
1819
1820
1821/** @callback_method_impl{FNCPUMRDMSR} */
1822static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7CoreThreadCount(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1823{
1824 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1825
1826 /* Note! According to cpuid_set_info in XNU (10.7.0), Westmere CPU only
1827 have a 4-bit core count. */
1828 uint16_t cCores = pVCpu->CTX_SUFF(pVM)->cCpus;
1829 uint16_t cThreads = cCores; /** @todo hyper-threading. */
1830 *puValue = RT_MAKE_U32(cThreads, cCores);
1831 return VINF_SUCCESS;
1832}
1833
1834
1835/** @callback_method_impl{FNCPUMRDMSR} */
1836static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelP4EbcHardPowerOn(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1837{
1838 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
1839 /** @todo P4 hard power on config */
1840 *puValue = pRange->uValue;
1841 return VINF_SUCCESS;
1842}
1843
1844
1845/** @callback_method_impl{FNCPUMWRMSR} */
1846static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelP4EbcHardPowerOn(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1847{
1848 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1849 /** @todo P4 hard power on config */
1850 return VINF_SUCCESS;
1851}
1852
1853
1854/** @callback_method_impl{FNCPUMRDMSR} */
1855static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelP4EbcSoftPowerOn(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1856{
1857 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
1858 /** @todo P4 soft power on config */
1859 *puValue = pRange->uValue;
1860 return VINF_SUCCESS;
1861}
1862
1863
1864/** @callback_method_impl{FNCPUMWRMSR} */
1865static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelP4EbcSoftPowerOn(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1866{
1867 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1868 /** @todo P4 soft power on config */
1869 return VINF_SUCCESS;
1870}
1871
1872
1873/** @callback_method_impl{FNCPUMRDMSR} */
1874static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelP4EbcFrequencyId(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1875{
1876 RT_NOREF_PV(idMsr);
1877
1878 uint64_t uValue;
1879 PVMCC pVM = pVCpu->CTX_SUFF(pVM);
1880 uint64_t uScalableBusHz = CPUMGetGuestScalableBusFrequency(pVM);
1881 if (pVM->cpum.s.GuestFeatures.uModel >= 2)
1882 {
1883 if (uScalableBusHz <= CPUM_SBUSFREQ_100MHZ && pVM->cpum.s.GuestFeatures.uModel <= 2)
1884 {
1885 uScalableBusHz = CPUM_SBUSFREQ_100MHZ;
1886 uValue = 0;
1887 }
1888 else if (uScalableBusHz <= CPUM_SBUSFREQ_133MHZ)
1889 {
1890 uScalableBusHz = CPUM_SBUSFREQ_133MHZ;
1891 uValue = 1;
1892 }
1893 else if (uScalableBusHz <= CPUM_SBUSFREQ_167MHZ)
1894 {
1895 uScalableBusHz = CPUM_SBUSFREQ_167MHZ;
1896 uValue = 3;
1897 }
1898 else if (uScalableBusHz <= CPUM_SBUSFREQ_200MHZ)
1899 {
1900 uScalableBusHz = CPUM_SBUSFREQ_200MHZ;
1901 uValue = 2;
1902 }
1903 else if (uScalableBusHz <= CPUM_SBUSFREQ_267MHZ && pVM->cpum.s.GuestFeatures.uModel > 2)
1904 {
1905 uScalableBusHz = CPUM_SBUSFREQ_267MHZ;
1906 uValue = 0;
1907 }
1908 else
1909 {
1910 uScalableBusHz = CPUM_SBUSFREQ_333MHZ;
1911 uValue = 6;
1912 }
1913 uValue <<= 16;
1914
1915 uint64_t uTscHz = TMCpuTicksPerSecond(pVM);
1916 uint8_t uTscRatio = (uint8_t)((uTscHz + uScalableBusHz / 2) / uScalableBusHz);
1917 uValue |= (uint32_t)uTscRatio << 24;
1918
1919 uValue |= pRange->uValue & ~UINT64_C(0xff0f0000);
1920 }
1921 else
1922 {
1923 /* Probably more stuff here, but intel doesn't want to tell us. */
1924 uValue = pRange->uValue;
1925 uValue &= ~(RT_BIT_64(21) | RT_BIT_64(22) | RT_BIT_64(23)); /* 100 MHz is only documented value */
1926 }
1927
1928 *puValue = uValue;
1929 return VINF_SUCCESS;
1930}
1931
1932
1933/** @callback_method_impl{FNCPUMWRMSR} */
1934static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelP4EbcFrequencyId(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
1935{
1936 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
1937 /** @todo P4 bus frequency config */
1938 return VINF_SUCCESS;
1939}
1940
1941
1942/** @callback_method_impl{FNCPUMRDMSR} */
1943static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelP6FsbFrequency(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1944{
1945 RT_NOREF_PV(idMsr);
1946
1947 /* Convert the scalable bus frequency to the encoding in the intel manual (for core+). */
1948 uint64_t uScalableBusHz = CPUMGetGuestScalableBusFrequency(pVCpu->CTX_SUFF(pVM));
1949 if (uScalableBusHz <= CPUM_SBUSFREQ_100MHZ)
1950 *puValue = 5;
1951 else if (uScalableBusHz <= CPUM_SBUSFREQ_133MHZ)
1952 *puValue = 1;
1953 else if (uScalableBusHz <= CPUM_SBUSFREQ_167MHZ)
1954 *puValue = 3;
1955 else if (uScalableBusHz <= CPUM_SBUSFREQ_200MHZ)
1956 *puValue = 2;
1957 else if (uScalableBusHz <= CPUM_SBUSFREQ_267MHZ)
1958 *puValue = 0;
1959 else if (uScalableBusHz <= CPUM_SBUSFREQ_333MHZ)
1960 *puValue = 4;
1961 else /*if (uScalableBusHz <= CPUM_SBUSFREQ_400MHZ)*/
1962 *puValue = 6;
1963
1964 *puValue |= pRange->uValue & ~UINT64_C(0x7);
1965
1966 return VINF_SUCCESS;
1967}
1968
1969
1970/** @callback_method_impl{FNCPUMRDMSR} */
1971static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelPlatformInfo(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1972{
1973 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
1974
1975 /* Just indicate a fixed TSC, no turbo boost, no programmable anything. */
1976 PVMCC pVM = pVCpu->CTX_SUFF(pVM);
1977 uint64_t uScalableBusHz = CPUMGetGuestScalableBusFrequency(pVM);
1978 uint64_t uTscHz = TMCpuTicksPerSecond(pVM);
1979 uint8_t uTscRatio = (uint8_t)((uTscHz + uScalableBusHz / 2) / uScalableBusHz);
1980 uint64_t uValue = ((uint32_t)uTscRatio << 8) /* TSC invariant frequency. */
1981 | ((uint64_t)uTscRatio << 40); /* The max turbo frequency. */
1982
1983 /* Ivy bridge has a minimum operating ratio as well. */
1984 if (true) /** @todo detect sandy bridge. */
1985 uValue |= (uint64_t)uTscRatio << 48;
1986
1987 *puValue = uValue;
1988 return VINF_SUCCESS;
1989}
1990
1991
1992/** @callback_method_impl{FNCPUMRDMSR} */
1993static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelFlexRatio(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
1994{
1995 RT_NOREF_PV(idMsr);
1996
1997 uint64_t uValue = pRange->uValue & ~UINT64_C(0x1ff00);
1998
1999 PVMCC pVM = pVCpu->CTX_SUFF(pVM);
2000 uint64_t uScalableBusHz = CPUMGetGuestScalableBusFrequency(pVM);
2001 uint64_t uTscHz = TMCpuTicksPerSecond(pVM);
2002 uint8_t uTscRatio = (uint8_t)((uTscHz + uScalableBusHz / 2) / uScalableBusHz);
2003 uValue |= (uint32_t)uTscRatio << 8;
2004
2005 *puValue = uValue;
2006 return VINF_SUCCESS;
2007}
2008
2009
2010/** @callback_method_impl{FNCPUMWRMSR} */
2011static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelFlexRatio(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2012{
2013 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2014 /** @todo implement writing MSR_FLEX_RATIO. */
2015 return VINF_SUCCESS;
2016}
2017
2018
2019/** @callback_method_impl{FNCPUMRDMSR} */
2020static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelPkgCStConfigControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2021{
2022 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2023 *puValue = pVCpu->cpum.s.GuestMsrs.msr.PkgCStateCfgCtrl;
2024 return VINF_SUCCESS;
2025}
2026
2027
2028/** @callback_method_impl{FNCPUMWRMSR} */
2029static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelPkgCStConfigControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2030{
2031 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
2032
2033 if (pVCpu->cpum.s.GuestMsrs.msr.PkgCStateCfgCtrl & RT_BIT_64(15))
2034 {
2035 Log(("CPUM: WRMSR %#x (%s), %#llx: Write protected -> #GP\n", idMsr, pRange->szName, uValue));
2036 return VERR_CPUM_RAISE_GP_0;
2037 }
2038#if 0 /** @todo check what real (old) hardware does. */
2039 if ((uValue & 7) >= 5)
2040 {
2041 Log(("CPUM: WRMSR %#x (%s), %#llx: Invalid limit (%d) -> #GP\n", idMsr, pRange->szName, uValue, (uint32_t)(uValue & 7)));
2042 return VERR_CPUM_RAISE_GP_0;
2043 }
2044#endif
2045 pVCpu->cpum.s.GuestMsrs.msr.PkgCStateCfgCtrl = uValue;
2046 return VINF_SUCCESS;
2047}
2048
2049
2050/** @callback_method_impl{FNCPUMRDMSR} */
2051static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelPmgIoCaptureBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2052{
2053 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2054 /** @todo implement I/O mwait wakeup. */
2055 *puValue = 0;
2056 return VINF_SUCCESS;
2057}
2058
2059
2060/** @callback_method_impl{FNCPUMWRMSR} */
2061static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelPmgIoCaptureBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2062{
2063 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2064 /** @todo implement I/O mwait wakeup. */
2065 return VINF_SUCCESS;
2066}
2067
2068
2069/** @callback_method_impl{FNCPUMRDMSR} */
2070static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelLastBranchFromToN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2071{
2072 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2073 /** @todo implement last branch records. */
2074 *puValue = 0;
2075 return VINF_SUCCESS;
2076}
2077
2078
2079/** @callback_method_impl{FNCPUMWRMSR} */
2080static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelLastBranchFromToN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2081{
2082 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2083 /** @todo implement last branch records. */
2084 return VINF_SUCCESS;
2085}
2086
2087
2088/** @callback_method_impl{FNCPUMRDMSR} */
2089static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelLastBranchFromN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2090{
2091 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2092 /** @todo implement last branch records. */
2093 *puValue = 0;
2094 return VINF_SUCCESS;
2095}
2096
2097
2098/** @callback_method_impl{FNCPUMWRMSR} */
2099static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelLastBranchFromN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2100{
2101 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
2102 /** @todo implement last branch records. */
2103 /** @todo Probing indicates that bit 63 is settable on SandyBridge, at least
2104 * if the rest of the bits are zero. Automatic sign extending?
2105 * Investigate! */
2106 if (!X86_IS_CANONICAL(uValue))
2107 {
2108 Log(("CPUM: wrmsr %s(%#x), %#llx -> #GP - not canonical\n", pRange->szName, idMsr, uValue));
2109 return VERR_CPUM_RAISE_GP_0;
2110 }
2111 return VINF_SUCCESS;
2112}
2113
2114
2115/** @callback_method_impl{FNCPUMRDMSR} */
2116static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelLastBranchToN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2117{
2118 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2119 /** @todo implement last branch records. */
2120 *puValue = 0;
2121 return VINF_SUCCESS;
2122}
2123
2124
2125/** @callback_method_impl{FNCPUMWRMSR} */
2126static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelLastBranchToN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2127{
2128 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2129 /** @todo implement last branch records. */
2130 /** @todo Probing indicates that bit 63 is settable on SandyBridge, at least
2131 * if the rest of the bits are zero. Automatic sign extending?
2132 * Investigate! */
2133 if (!X86_IS_CANONICAL(uValue))
2134 {
2135 Log(("CPUM: wrmsr %s(%#x), %#llx -> #GP - not canonical\n", pRange->szName, idMsr, uValue));
2136 return VERR_CPUM_RAISE_GP_0;
2137 }
2138 return VINF_SUCCESS;
2139}
2140
2141
2142/** @callback_method_impl{FNCPUMRDMSR} */
2143static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelLastBranchTos(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2144{
2145 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2146 /** @todo implement last branch records. */
2147 *puValue = 0;
2148 return VINF_SUCCESS;
2149}
2150
2151
2152/** @callback_method_impl{FNCPUMWRMSR} */
2153static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelLastBranchTos(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2154{
2155 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2156 /** @todo implement last branch records. */
2157 return VINF_SUCCESS;
2158}
2159
2160
2161/** @callback_method_impl{FNCPUMRDMSR} */
2162static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelBblCrCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2163{
2164 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
2165 *puValue = pRange->uValue;
2166 return VINF_SUCCESS;
2167}
2168
2169
2170/** @callback_method_impl{FNCPUMWRMSR} */
2171static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelBblCrCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2172{
2173 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2174 return VINF_SUCCESS;
2175}
2176
2177
2178/** @callback_method_impl{FNCPUMRDMSR} */
2179static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelBblCrCtl3(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2180{
2181 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
2182 *puValue = pRange->uValue;
2183 return VINF_SUCCESS;
2184}
2185
2186
2187/** @callback_method_impl{FNCPUMWRMSR} */
2188static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelBblCrCtl3(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2189{
2190 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2191 return VINF_SUCCESS;
2192}
2193
2194
2195/** @callback_method_impl{FNCPUMRDMSR} */
2196static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7TemperatureTarget(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2197{
2198 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
2199 *puValue = pRange->uValue;
2200 return VINF_SUCCESS;
2201}
2202
2203
2204/** @callback_method_impl{FNCPUMWRMSR} */
2205static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7TemperatureTarget(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2206{
2207 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2208 return VINF_SUCCESS;
2209}
2210
2211
2212/** @callback_method_impl{FNCPUMRDMSR} */
2213static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7MsrOffCoreResponseN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2214{
2215 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
2216 /** @todo machine check. */
2217 *puValue = pRange->uValue;
2218 return VINF_SUCCESS;
2219}
2220
2221
2222/** @callback_method_impl{FNCPUMWRMSR} */
2223static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7MsrOffCoreResponseN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2224{
2225 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2226 /** @todo machine check. */
2227 return VINF_SUCCESS;
2228}
2229
2230
2231/** @callback_method_impl{FNCPUMRDMSR} */
2232static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7MiscPwrMgmt(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2233{
2234 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2235 *puValue = 0;
2236 return VINF_SUCCESS;
2237}
2238
2239
2240/** @callback_method_impl{FNCPUMWRMSR} */
2241static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7MiscPwrMgmt(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2242{
2243 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2244 return VINF_SUCCESS;
2245}
2246
2247
2248/** @callback_method_impl{FNCPUMRDMSR} */
2249static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelP6CrN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2250{
2251 RT_NOREF_PV(idMsr);
2252 int rc = CPUMGetGuestCRx(pVCpu, pRange->uValue, puValue);
2253 AssertRC(rc);
2254 return VINF_SUCCESS;
2255}
2256
2257
2258/** @callback_method_impl{FNCPUMWRMSR} */
2259static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelP6CrN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2260{
2261 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2262 /* This CRx interface differs from the MOV CRx, GReg interface in that
2263 #GP(0) isn't raised if unsupported bits are written to. Instead they
2264 are simply ignored and masked off. (Pentium M Dothan) */
2265 /** @todo Implement MSR_P6_CRx writing. Too much effort for very little, if
2266 * any, gain. */
2267 return VINF_SUCCESS;
2268}
2269
2270
2271/** @callback_method_impl{FNCPUMRDMSR} */
2272static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelCpuId1FeatureMaskEcdx(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2273{
2274 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2275 /** @todo implement CPUID masking. */
2276 *puValue = UINT64_MAX;
2277 return VINF_SUCCESS;
2278}
2279
2280
2281/** @callback_method_impl{FNCPUMWRMSR} */
2282static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelCpuId1FeatureMaskEcdx(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2283{
2284 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2285 /** @todo implement CPUID masking. */
2286 return VINF_SUCCESS;
2287}
2288
2289
2290/** @callback_method_impl{FNCPUMRDMSR} */
2291static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelCpuId1FeatureMaskEax(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2292{
2293 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2294 /** @todo implement CPUID masking. */
2295 *puValue = 0;
2296 return VINF_SUCCESS;
2297}
2298
2299
2300/** @callback_method_impl{FNCPUMWRMSR} */
2301static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelCpuId1FeatureMaskEax(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2302{
2303 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2304 /** @todo implement CPUID masking. */
2305 return VINF_SUCCESS;
2306}
2307
2308
2309
2310/** @callback_method_impl{FNCPUMRDMSR} */
2311static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelCpuId80000001FeatureMaskEcdx(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2312{
2313 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2314 /** @todo implement CPUID masking. */
2315 *puValue = UINT64_MAX;
2316 return VINF_SUCCESS;
2317}
2318
2319
2320/** @callback_method_impl{FNCPUMWRMSR} */
2321static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelCpuId80000001FeatureMaskEcdx(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2322{
2323 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2324 /** @todo implement CPUID masking. */
2325 return VINF_SUCCESS;
2326}
2327
2328
2329
2330/** @callback_method_impl{FNCPUMRDMSR} */
2331static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7SandyAesNiCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2332{
2333 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2334 /** @todo implement AES-NI. */
2335 *puValue = 3; /* Bit 0 is lock bit, bit 1 disables AES-NI. That's what they say. */
2336 return VINF_SUCCESS;
2337}
2338
2339
2340/** @callback_method_impl{FNCPUMWRMSR} */
2341static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7SandyAesNiCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2342{
2343 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2344 /** @todo implement AES-NI. */
2345 return VERR_CPUM_RAISE_GP_0;
2346}
2347
2348
2349/** @callback_method_impl{FNCPUMRDMSR} */
2350static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7TurboRatioLimit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2351{
2352 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
2353 /** @todo implement intel C states. */
2354 *puValue = pRange->uValue;
2355 return VINF_SUCCESS;
2356}
2357
2358
2359/** @callback_method_impl{FNCPUMWRMSR} */
2360static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7TurboRatioLimit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2361{
2362 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2363 /** @todo implement intel C states. */
2364 return VINF_SUCCESS;
2365}
2366
2367
2368/** @callback_method_impl{FNCPUMRDMSR} */
2369static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7LbrSelect(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2370{
2371 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2372 /** @todo implement last-branch-records. */
2373 *puValue = 0;
2374 return VINF_SUCCESS;
2375}
2376
2377
2378/** @callback_method_impl{FNCPUMWRMSR} */
2379static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7LbrSelect(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2380{
2381 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2382 /** @todo implement last-branch-records. */
2383 return VINF_SUCCESS;
2384}
2385
2386
2387/** @callback_method_impl{FNCPUMRDMSR} */
2388static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7SandyErrorControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2389{
2390 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2391 /** @todo implement memory error injection (MSR_ERROR_CONTROL). */
2392 *puValue = 0;
2393 return VINF_SUCCESS;
2394}
2395
2396
2397/** @callback_method_impl{FNCPUMWRMSR} */
2398static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7SandyErrorControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2399{
2400 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2401 /** @todo implement memory error injection (MSR_ERROR_CONTROL). */
2402 return VINF_SUCCESS;
2403}
2404
2405
2406/** @callback_method_impl{FNCPUMRDMSR} */
2407static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7VirtualLegacyWireCap(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2408{
2409 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
2410 /** @todo implement memory VLW? */
2411 *puValue = pRange->uValue;
2412 /* Note: A20M is known to be bit 1 as this was disclosed in spec update
2413 AAJ49/AAK51/????, which documents the inversion of this bit. The
2414 Sandy bridge CPU here has value 0x74, so it probably doesn't have a BIOS
2415 that correct things. Some guesses at the other bits:
2416 bit 2 = INTR
2417 bit 4 = SMI
2418 bit 5 = INIT
2419 bit 6 = NMI */
2420 return VINF_SUCCESS;
2421}
2422
2423
2424/** @callback_method_impl{FNCPUMRDMSR} */
2425static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7PowerCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2426{
2427 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2428 /** @todo intel power management */
2429 *puValue = 0;
2430 return VINF_SUCCESS;
2431}
2432
2433
2434/** @callback_method_impl{FNCPUMWRMSR} */
2435static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7PowerCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2436{
2437 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2438 /** @todo intel power management */
2439 return VINF_SUCCESS;
2440}
2441
2442
2443/** @callback_method_impl{FNCPUMRDMSR} */
2444static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7SandyPebsNumAlt(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2445{
2446 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2447 /** @todo intel performance counters. */
2448 *puValue = 0;
2449 return VINF_SUCCESS;
2450}
2451
2452
2453/** @callback_method_impl{FNCPUMWRMSR} */
2454static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7SandyPebsNumAlt(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2455{
2456 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2457 /** @todo intel performance counters. */
2458 return VINF_SUCCESS;
2459}
2460
2461
2462/** @callback_method_impl{FNCPUMRDMSR} */
2463static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7PebsLdLat(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2464{
2465 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2466 /** @todo intel performance counters. */
2467 *puValue = 0;
2468 return VINF_SUCCESS;
2469}
2470
2471
2472/** @callback_method_impl{FNCPUMWRMSR} */
2473static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7PebsLdLat(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2474{
2475 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2476 /** @todo intel performance counters. */
2477 return VINF_SUCCESS;
2478}
2479
2480
2481/** @callback_method_impl{FNCPUMRDMSR} */
2482static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7PkgCnResidencyN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2483{
2484 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2485 /** @todo intel power management. */
2486 *puValue = 0;
2487 return VINF_SUCCESS;
2488}
2489
2490
2491/** @callback_method_impl{FNCPUMRDMSR} */
2492static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7CoreCnResidencyN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2493{
2494 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2495 /** @todo intel power management. */
2496 *puValue = 0;
2497 return VINF_SUCCESS;
2498}
2499
2500
2501/** @callback_method_impl{FNCPUMRDMSR} */
2502static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7SandyVrCurrentConfig(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2503{
2504 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2505 /** @todo Figure out what MSR_VR_CURRENT_CONFIG & MSR_VR_MISC_CONFIG are. */
2506 *puValue = 0;
2507 return VINF_SUCCESS;
2508}
2509
2510
2511/** @callback_method_impl{FNCPUMWRMSR} */
2512static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7SandyVrCurrentConfig(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2513{
2514 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2515 /** @todo Figure out what MSR_VR_CURRENT_CONFIG & MSR_VR_MISC_CONFIG are. */
2516 return VINF_SUCCESS;
2517}
2518
2519
2520/** @callback_method_impl{FNCPUMRDMSR} */
2521static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7SandyVrMiscConfig(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2522{
2523 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2524 /** @todo Figure out what MSR_VR_CURRENT_CONFIG & MSR_VR_MISC_CONFIG are. */
2525 *puValue = 0;
2526 return VINF_SUCCESS;
2527}
2528
2529
2530/** @callback_method_impl{FNCPUMWRMSR} */
2531static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7SandyVrMiscConfig(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2532{
2533 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2534 /** @todo Figure out what MSR_VR_CURRENT_CONFIG & MSR_VR_MISC_CONFIG are. */
2535 return VINF_SUCCESS;
2536}
2537
2538
2539/** @callback_method_impl{FNCPUMRDMSR} */
2540static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7SandyRaplPowerUnit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2541{
2542 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
2543 /** @todo intel RAPL. */
2544 *puValue = pRange->uValue;
2545 return VINF_SUCCESS;
2546}
2547
2548
2549/** @callback_method_impl{FNCPUMWRMSR} */
2550static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7SandyRaplPowerUnit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2551{
2552 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2553 /* Note! This is documented as read only and except for a Silvermont sample has
2554 always been classified as read only. This is just here to make it compile. */
2555 return VINF_SUCCESS;
2556}
2557
2558
2559/** @callback_method_impl{FNCPUMRDMSR} */
2560static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7SandyPkgCnIrtlN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2561{
2562 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2563 /** @todo intel power management. */
2564 *puValue = 0;
2565 return VINF_SUCCESS;
2566}
2567
2568
2569/** @callback_method_impl{FNCPUMWRMSR} */
2570static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7SandyPkgCnIrtlN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2571{
2572 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2573 /** @todo intel power management. */
2574 return VINF_SUCCESS;
2575}
2576
2577
2578/** @callback_method_impl{FNCPUMRDMSR} */
2579static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7SandyPkgC2Residency(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2580{
2581 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2582 /** @todo intel power management. */
2583 *puValue = 0;
2584 return VINF_SUCCESS;
2585}
2586
2587
2588/** @callback_method_impl{FNCPUMWRMSR} */
2589static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7SandyPkgC2Residency(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2590{
2591 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2592 /* Note! This is documented as read only and except for a Silvermont sample has
2593 always been classified as read only. This is just here to make it compile. */
2594 return VINF_SUCCESS;
2595}
2596
2597
2598/** @callback_method_impl{FNCPUMRDMSR} */
2599static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplPkgPowerLimit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2600{
2601 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2602 /** @todo intel RAPL. */
2603 *puValue = 0;
2604 return VINF_SUCCESS;
2605}
2606
2607
2608/** @callback_method_impl{FNCPUMWRMSR} */
2609static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7RaplPkgPowerLimit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2610{
2611 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2612 /** @todo intel RAPL. */
2613 return VINF_SUCCESS;
2614}
2615
2616
2617/** @callback_method_impl{FNCPUMRDMSR} */
2618static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplPkgEnergyStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2619{
2620 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2621 /** @todo intel power management. */
2622 *puValue = 0;
2623 return VINF_SUCCESS;
2624}
2625
2626
2627/** @callback_method_impl{FNCPUMRDMSR} */
2628static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplPkgPerfStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2629{
2630 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2631 /** @todo intel power management. */
2632 *puValue = 0;
2633 return VINF_SUCCESS;
2634}
2635
2636
2637/** @callback_method_impl{FNCPUMRDMSR} */
2638static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplPkgPowerInfo(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2639{
2640 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2641 /** @todo intel power management. */
2642 *puValue = 0;
2643 return VINF_SUCCESS;
2644}
2645
2646
2647/** @callback_method_impl{FNCPUMRDMSR} */
2648static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplDramPowerLimit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2649{
2650 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2651 /** @todo intel RAPL. */
2652 *puValue = 0;
2653 return VINF_SUCCESS;
2654}
2655
2656
2657/** @callback_method_impl{FNCPUMWRMSR} */
2658static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7RaplDramPowerLimit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2659{
2660 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2661 /** @todo intel RAPL. */
2662 return VINF_SUCCESS;
2663}
2664
2665
2666/** @callback_method_impl{FNCPUMRDMSR} */
2667static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplDramEnergyStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2668{
2669 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2670 /** @todo intel power management. */
2671 *puValue = 0;
2672 return VINF_SUCCESS;
2673}
2674
2675
2676/** @callback_method_impl{FNCPUMRDMSR} */
2677static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplDramPerfStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2678{
2679 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2680 /** @todo intel power management. */
2681 *puValue = 0;
2682 return VINF_SUCCESS;
2683}
2684
2685
2686/** @callback_method_impl{FNCPUMRDMSR} */
2687static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplDramPowerInfo(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2688{
2689 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2690 /** @todo intel power management. */
2691 *puValue = 0;
2692 return VINF_SUCCESS;
2693}
2694
2695
2696/** @callback_method_impl{FNCPUMRDMSR} */
2697static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplPp0PowerLimit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2698{
2699 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2700 /** @todo intel RAPL. */
2701 *puValue = 0;
2702 return VINF_SUCCESS;
2703}
2704
2705
2706/** @callback_method_impl{FNCPUMWRMSR} */
2707static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7RaplPp0PowerLimit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2708{
2709 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2710 /** @todo intel RAPL. */
2711 return VINF_SUCCESS;
2712}
2713
2714
2715/** @callback_method_impl{FNCPUMRDMSR} */
2716static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplPp0EnergyStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2717{
2718 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2719 /** @todo intel power management. */
2720 *puValue = 0;
2721 return VINF_SUCCESS;
2722}
2723
2724
2725/** @callback_method_impl{FNCPUMRDMSR} */
2726static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplPp0Policy(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2727{
2728 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2729 /** @todo intel RAPL. */
2730 *puValue = 0;
2731 return VINF_SUCCESS;
2732}
2733
2734
2735/** @callback_method_impl{FNCPUMWRMSR} */
2736static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7RaplPp0Policy(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2737{
2738 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2739 /** @todo intel RAPL. */
2740 return VINF_SUCCESS;
2741}
2742
2743
2744/** @callback_method_impl{FNCPUMRDMSR} */
2745static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplPp0PerfStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2746{
2747 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2748 /** @todo intel power management. */
2749 *puValue = 0;
2750 return VINF_SUCCESS;
2751}
2752
2753
2754/** @callback_method_impl{FNCPUMRDMSR} */
2755static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplPp1PowerLimit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2756{
2757 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2758 /** @todo intel RAPL. */
2759 *puValue = 0;
2760 return VINF_SUCCESS;
2761}
2762
2763
2764/** @callback_method_impl{FNCPUMWRMSR} */
2765static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7RaplPp1PowerLimit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2766{
2767 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2768 /** @todo intel RAPL. */
2769 return VINF_SUCCESS;
2770}
2771
2772
2773/** @callback_method_impl{FNCPUMRDMSR} */
2774static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplPp1EnergyStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2775{
2776 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2777 /** @todo intel power management. */
2778 *puValue = 0;
2779 return VINF_SUCCESS;
2780}
2781
2782
2783/** @callback_method_impl{FNCPUMRDMSR} */
2784static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7RaplPp1Policy(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2785{
2786 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2787 /** @todo intel RAPL. */
2788 *puValue = 0;
2789 return VINF_SUCCESS;
2790}
2791
2792
2793/** @callback_method_impl{FNCPUMWRMSR} */
2794static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7RaplPp1Policy(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2795{
2796 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2797 /** @todo intel RAPL. */
2798 return VINF_SUCCESS;
2799}
2800
2801
2802/** @callback_method_impl{FNCPUMRDMSR} */
2803static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7IvyConfigTdpNominal(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2804{
2805 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
2806 /** @todo intel power management. */
2807 *puValue = pRange->uValue;
2808 return VINF_SUCCESS;
2809}
2810
2811
2812/** @callback_method_impl{FNCPUMRDMSR} */
2813static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7IvyConfigTdpLevel1(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2814{
2815 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
2816 /** @todo intel power management. */
2817 *puValue = pRange->uValue;
2818 return VINF_SUCCESS;
2819}
2820
2821
2822/** @callback_method_impl{FNCPUMRDMSR} */
2823static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7IvyConfigTdpLevel2(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2824{
2825 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
2826 /** @todo intel power management. */
2827 *puValue = pRange->uValue;
2828 return VINF_SUCCESS;
2829}
2830
2831
2832/** @callback_method_impl{FNCPUMRDMSR} */
2833static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7IvyConfigTdpControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2834{
2835 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2836 /** @todo intel power management. */
2837 *puValue = 0;
2838 return VINF_SUCCESS;
2839}
2840
2841
2842/** @callback_method_impl{FNCPUMWRMSR} */
2843static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7IvyConfigTdpControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2844{
2845 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2846 /** @todo intel power management. */
2847 return VINF_SUCCESS;
2848}
2849
2850
2851/** @callback_method_impl{FNCPUMRDMSR} */
2852static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7IvyTurboActivationRatio(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2853{
2854 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2855 /** @todo intel power management. */
2856 *puValue = 0;
2857 return VINF_SUCCESS;
2858}
2859
2860
2861/** @callback_method_impl{FNCPUMWRMSR} */
2862static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7IvyTurboActivationRatio(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2863{
2864 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2865 /** @todo intel power management. */
2866 return VINF_SUCCESS;
2867}
2868
2869
2870/** @callback_method_impl{FNCPUMRDMSR} */
2871static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7UncPerfGlobalCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2872{
2873 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2874 /** @todo uncore msrs. */
2875 *puValue = 0;
2876 return VINF_SUCCESS;
2877}
2878
2879
2880/** @callback_method_impl{FNCPUMWRMSR} */
2881static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7UncPerfGlobalCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2882{
2883 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2884 /** @todo uncore msrs. */
2885 return VINF_SUCCESS;
2886}
2887
2888
2889/** @callback_method_impl{FNCPUMRDMSR} */
2890static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7UncPerfGlobalStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2891{
2892 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2893 /** @todo uncore msrs. */
2894 *puValue = 0;
2895 return VINF_SUCCESS;
2896}
2897
2898
2899/** @callback_method_impl{FNCPUMWRMSR} */
2900static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7UncPerfGlobalStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2901{
2902 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2903 /** @todo uncore msrs. */
2904 return VINF_SUCCESS;
2905}
2906
2907
2908/** @callback_method_impl{FNCPUMRDMSR} */
2909static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7UncPerfGlobalOvfCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2910{
2911 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2912 /** @todo uncore msrs. */
2913 *puValue = 0;
2914 return VINF_SUCCESS;
2915}
2916
2917
2918/** @callback_method_impl{FNCPUMWRMSR} */
2919static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7UncPerfGlobalOvfCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2920{
2921 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2922 /** @todo uncore msrs. */
2923 return VINF_SUCCESS;
2924}
2925
2926
2927/** @callback_method_impl{FNCPUMRDMSR} */
2928static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7UncPerfFixedCtrCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2929{
2930 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2931 /** @todo uncore msrs. */
2932 *puValue = 0;
2933 return VINF_SUCCESS;
2934}
2935
2936
2937/** @callback_method_impl{FNCPUMWRMSR} */
2938static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7UncPerfFixedCtrCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2939{
2940 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2941 /** @todo uncore msrs. */
2942 return VINF_SUCCESS;
2943}
2944
2945
2946/** @callback_method_impl{FNCPUMRDMSR} */
2947static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7UncPerfFixedCtr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2948{
2949 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2950 /** @todo uncore msrs. */
2951 *puValue = 0;
2952 return VINF_SUCCESS;
2953}
2954
2955
2956/** @callback_method_impl{FNCPUMWRMSR} */
2957static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7UncPerfFixedCtr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2958{
2959 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2960 /** @todo uncore msrs. */
2961 return VINF_SUCCESS;
2962}
2963
2964
2965/** @callback_method_impl{FNCPUMRDMSR} */
2966static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7UncCBoxConfig(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2967{
2968 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2969 /** @todo uncore msrs. */
2970 *puValue = 0;
2971 return VINF_SUCCESS;
2972}
2973
2974
2975/** @callback_method_impl{FNCPUMRDMSR} */
2976static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7UncArbPerfCtrN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2977{
2978 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2979 /** @todo uncore msrs. */
2980 *puValue = 0;
2981 return VINF_SUCCESS;
2982}
2983
2984
2985/** @callback_method_impl{FNCPUMWRMSR} */
2986static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7UncArbPerfCtrN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
2987{
2988 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
2989 /** @todo uncore msrs. */
2990 return VINF_SUCCESS;
2991}
2992
2993
2994/** @callback_method_impl{FNCPUMRDMSR} */
2995static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7UncArbPerfEvtSelN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
2996{
2997 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
2998 /** @todo uncore msrs. */
2999 *puValue = 0;
3000 return VINF_SUCCESS;
3001}
3002
3003
3004/** @callback_method_impl{FNCPUMWRMSR} */
3005static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelI7UncArbPerfEvtSelN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3006{
3007 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3008 /** @todo uncore msrs. */
3009 return VINF_SUCCESS;
3010}
3011
3012
3013/** @callback_method_impl{FNCPUMRDMSR} */
3014static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelI7SmiCount(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3015{
3016 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3017
3018 /*
3019 * 31:0 is SMI count (read only), 63:32 reserved.
3020 * Since we don't do SMI, the count is always zero.
3021 */
3022 *puValue = 0;
3023 return VINF_SUCCESS;
3024}
3025
3026
3027/** @callback_method_impl{FNCPUMRDMSR} */
3028static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelCore2EmttmCrTablesN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3029{
3030 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
3031 /** @todo implement enhanced multi thread termal monitoring? */
3032 *puValue = pRange->uValue;
3033 return VINF_SUCCESS;
3034}
3035
3036
3037/** @callback_method_impl{FNCPUMWRMSR} */
3038static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelCore2EmttmCrTablesN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3039{
3040 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3041 /** @todo implement enhanced multi thread termal monitoring? */
3042 return VINF_SUCCESS;
3043}
3044
3045
3046/** @callback_method_impl{FNCPUMRDMSR} */
3047static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelCore2SmmCStMiscInfo(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3048{
3049 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3050 /** @todo SMM & C-states? */
3051 *puValue = 0;
3052 return VINF_SUCCESS;
3053}
3054
3055
3056/** @callback_method_impl{FNCPUMWRMSR} */
3057static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelCore2SmmCStMiscInfo(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3058{
3059 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3060 /** @todo SMM & C-states? */
3061 return VINF_SUCCESS;
3062}
3063
3064
3065/** @callback_method_impl{FNCPUMRDMSR} */
3066static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelCore1ExtConfig(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3067{
3068 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3069 /** @todo Core1&2 EXT_CONFIG (whatever that is)? */
3070 *puValue = 0;
3071 return VINF_SUCCESS;
3072}
3073
3074
3075/** @callback_method_impl{FNCPUMWRMSR} */
3076static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelCore1ExtConfig(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3077{
3078 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3079 /** @todo Core1&2 EXT_CONFIG (whatever that is)? */
3080 return VINF_SUCCESS;
3081}
3082
3083
3084/** @callback_method_impl{FNCPUMRDMSR} */
3085static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelCore1DtsCalControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3086{
3087 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3088 /** @todo Core1&2(?) DTS_CAL_CTRL (whatever that is)? */
3089 *puValue = 0;
3090 return VINF_SUCCESS;
3091}
3092
3093
3094/** @callback_method_impl{FNCPUMWRMSR} */
3095static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelCore1DtsCalControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3096{
3097 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3098 /** @todo Core1&2(?) DTS_CAL_CTRL (whatever that is)? */
3099 return VINF_SUCCESS;
3100}
3101
3102
3103/** @callback_method_impl{FNCPUMRDMSR} */
3104static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelCore2PeciControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3105{
3106 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3107 /** @todo Core2+ platform environment control interface control register? */
3108 *puValue = 0;
3109 return VINF_SUCCESS;
3110}
3111
3112
3113/** @callback_method_impl{FNCPUMWRMSR} */
3114static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_IntelCore2PeciControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3115{
3116 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3117 /** @todo Core2+ platform environment control interface control register? */
3118 return VINF_SUCCESS;
3119}
3120
3121
3122/** @callback_method_impl{FNCPUMRDMSR} */
3123static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_IntelAtSilvCoreC1Recidency(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3124{
3125 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3126 *puValue = 0;
3127 return VINF_SUCCESS;
3128}
3129
3130
3131/*
3132 * Multiple vendor P6 MSRs.
3133 * Multiple vendor P6 MSRs.
3134 * Multiple vendor P6 MSRs.
3135 *
3136 * These MSRs were introduced with the P6 but not elevated to architectural
3137 * MSRs, despite other vendors implementing them.
3138 */
3139
3140
3141/** @callback_method_impl{FNCPUMRDMSR} */
3142static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_P6LastBranchFromIp(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3143{
3144 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3145 /* AMD seems to just record RIP, while intel claims to record RIP+CS.BASE
3146 if I read the docs correctly, thus the need for separate functions. */
3147 /** @todo implement last branch records. */
3148 *puValue = 0;
3149 return VINF_SUCCESS;
3150}
3151
3152
3153/** @callback_method_impl{FNCPUMRDMSR} */
3154static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_P6LastBranchToIp(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3155{
3156 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3157 /** @todo implement last branch records. */
3158 *puValue = 0;
3159 return VINF_SUCCESS;
3160}
3161
3162
3163/** @callback_method_impl{FNCPUMRDMSR} */
3164static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_P6LastIntFromIp(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3165{
3166 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3167 /** @todo implement last exception records. */
3168 *puValue = 0;
3169 return VINF_SUCCESS;
3170}
3171
3172
3173/** @callback_method_impl{FNCPUMWRMSR} */
3174static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_P6LastIntFromIp(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3175{
3176 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3177 /** @todo implement last exception records. */
3178 /* Note! On many CPUs, the high bit of the 0x000001dd register is always writable, even when the result is
3179 a non-cannonical address. */
3180 return VINF_SUCCESS;
3181}
3182
3183
3184/** @callback_method_impl{FNCPUMRDMSR} */
3185static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_P6LastIntToIp(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3186{
3187 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3188 /** @todo implement last exception records. */
3189 *puValue = 0;
3190 return VINF_SUCCESS;
3191}
3192
3193
3194/** @callback_method_impl{FNCPUMWRMSR} */
3195static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_P6LastIntToIp(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3196{
3197 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3198 /** @todo implement last exception records. */
3199 return VINF_SUCCESS;
3200}
3201
3202
3203
3204/*
3205 * AMD specific
3206 * AMD specific
3207 * AMD specific
3208 */
3209
3210
3211/** @callback_method_impl{FNCPUMRDMSR} */
3212static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam15hTscRate(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3213{
3214 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3215 /** @todo Implement TscRateMsr */
3216 *puValue = RT_MAKE_U64(0, 1); /* 1.0 = reset value. */
3217 return VINF_SUCCESS;
3218}
3219
3220
3221/** @callback_method_impl{FNCPUMWRMSR} */
3222static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam15hTscRate(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3223{
3224 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3225 /** @todo Implement TscRateMsr */
3226 return VINF_SUCCESS;
3227}
3228
3229
3230/** @callback_method_impl{FNCPUMRDMSR} */
3231static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam15hLwpCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3232{
3233 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3234 /** @todo Implement AMD LWP? (Instructions: LWPINS, LWPVAL, LLWPCB, SLWPCB) */
3235 /* Note: Only listes in BKDG for Family 15H. */
3236 *puValue = 0;
3237 return VINF_SUCCESS;
3238}
3239
3240
3241/** @callback_method_impl{FNCPUMWRMSR} */
3242static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam15hLwpCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3243{
3244 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3245 /** @todo Implement AMD LWP? (Instructions: LWPINS, LWPVAL, LLWPCB, SLWPCB) */
3246 return VINF_SUCCESS;
3247}
3248
3249
3250/** @callback_method_impl{FNCPUMRDMSR} */
3251static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam15hLwpCbAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3252{
3253 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3254 /** @todo Implement AMD LWP? (Instructions: LWPINS, LWPVAL, LLWPCB, SLWPCB) */
3255 /* Note: Only listes in BKDG for Family 15H. */
3256 *puValue = 0;
3257 return VINF_SUCCESS;
3258}
3259
3260
3261/** @callback_method_impl{FNCPUMWRMSR} */
3262static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam15hLwpCbAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3263{
3264 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3265 /** @todo Implement AMD LWP? (Instructions: LWPINS, LWPVAL, LLWPCB, SLWPCB) */
3266 return VINF_SUCCESS;
3267}
3268
3269
3270/** @callback_method_impl{FNCPUMRDMSR} */
3271static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hMc4MiscN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3272{
3273 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3274 /** @todo machine check. */
3275 *puValue = 0;
3276 return VINF_SUCCESS;
3277}
3278
3279
3280/** @callback_method_impl{FNCPUMWRMSR} */
3281static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hMc4MiscN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3282{
3283 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3284 /** @todo machine check. */
3285 return VINF_SUCCESS;
3286}
3287
3288
3289/** @callback_method_impl{FNCPUMRDMSR} */
3290static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8PerfCtlN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3291{
3292 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3293 /** @todo AMD performance events. */
3294 *puValue = 0;
3295 return VINF_SUCCESS;
3296}
3297
3298
3299/** @callback_method_impl{FNCPUMWRMSR} */
3300static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8PerfCtlN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3301{
3302 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3303 /** @todo AMD performance events. */
3304 return VINF_SUCCESS;
3305}
3306
3307
3308/** @callback_method_impl{FNCPUMRDMSR} */
3309static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8PerfCtrN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3310{
3311 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3312 /** @todo AMD performance events. */
3313 *puValue = 0;
3314 return VINF_SUCCESS;
3315}
3316
3317
3318/** @callback_method_impl{FNCPUMWRMSR} */
3319static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8PerfCtrN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3320{
3321 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3322 /** @todo AMD performance events. */
3323 return VINF_SUCCESS;
3324}
3325
3326
3327/** @callback_method_impl{FNCPUMRDMSR} */
3328static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8SysCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3329{
3330 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
3331 /** @todo AMD SYS_CFG */
3332 *puValue = pRange->uValue;
3333 return VINF_SUCCESS;
3334}
3335
3336
3337/** @callback_method_impl{FNCPUMWRMSR} */
3338static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8SysCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3339{
3340 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3341 /** @todo AMD SYS_CFG */
3342 return VINF_SUCCESS;
3343}
3344
3345
3346/** @callback_method_impl{FNCPUMRDMSR} */
3347static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8HwCr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3348{
3349 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3350 /** @todo AMD HW_CFG */
3351 *puValue = 0;
3352 return VINF_SUCCESS;
3353}
3354
3355
3356/** @callback_method_impl{FNCPUMWRMSR} */
3357static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8HwCr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3358{
3359 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3360 /** @todo AMD HW_CFG */
3361 return VINF_SUCCESS;
3362}
3363
3364
3365/** @callback_method_impl{FNCPUMRDMSR} */
3366static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8IorrBaseN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3367{
3368 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3369 /** @todo AMD IorrMask/IorrBase */
3370 *puValue = 0;
3371 return VINF_SUCCESS;
3372}
3373
3374
3375/** @callback_method_impl{FNCPUMWRMSR} */
3376static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8IorrBaseN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3377{
3378 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3379 /** @todo AMD IorrMask/IorrBase */
3380 return VINF_SUCCESS;
3381}
3382
3383
3384/** @callback_method_impl{FNCPUMRDMSR} */
3385static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8IorrMaskN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3386{
3387 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3388 /** @todo AMD IorrMask/IorrBase */
3389 *puValue = 0;
3390 return VINF_SUCCESS;
3391}
3392
3393
3394/** @callback_method_impl{FNCPUMWRMSR} */
3395static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8IorrMaskN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3396{
3397 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3398 /** @todo AMD IorrMask/IorrBase */
3399 return VINF_SUCCESS;
3400}
3401
3402
3403/** @callback_method_impl{FNCPUMRDMSR} */
3404static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8TopOfMemN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3405{
3406 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3407 *puValue = 0;
3408 /** @todo return 4GB - RamHoleSize here for TOPMEM. Figure out what to return
3409 * for TOPMEM2. */
3410 //if (pRange->uValue == 0)
3411 // *puValue = _4G - RamHoleSize;
3412 return VINF_SUCCESS;
3413}
3414
3415
3416/** @callback_method_impl{FNCPUMWRMSR} */
3417static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8TopOfMemN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3418{
3419 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3420 /** @todo AMD TOPMEM and TOPMEM2/TOM2. */
3421 return VINF_SUCCESS;
3422}
3423
3424
3425/** @callback_method_impl{FNCPUMRDMSR} */
3426static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8NbCfg1(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3427{
3428 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3429 /** @todo AMD NB_CFG1 */
3430 *puValue = 0;
3431 return VINF_SUCCESS;
3432}
3433
3434
3435/** @callback_method_impl{FNCPUMWRMSR} */
3436static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8NbCfg1(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3437{
3438 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3439 /** @todo AMD NB_CFG1 */
3440 return VINF_SUCCESS;
3441}
3442
3443
3444/** @callback_method_impl{FNCPUMRDMSR} */
3445static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8McXcptRedir(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3446{
3447 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3448 /** @todo machine check. */
3449 *puValue = 0;
3450 return VINF_SUCCESS;
3451}
3452
3453
3454/** @callback_method_impl{FNCPUMWRMSR} */
3455static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8McXcptRedir(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3456{
3457 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3458 /** @todo machine check. */
3459 return VINF_SUCCESS;
3460}
3461
3462
3463/** @callback_method_impl{FNCPUMRDMSR} */
3464static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8CpuNameN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3465{
3466 RT_NOREF_PV(idMsr);
3467 PCPUMCPUIDLEAF pLeaf = cpumCpuIdGetLeaf(pVCpu->CTX_SUFF(pVM), pRange->uValue / 2 + 0x80000001);
3468 if (pLeaf)
3469 {
3470 if (!(pRange->uValue & 1))
3471 *puValue = RT_MAKE_U64(pLeaf->uEax, pLeaf->uEbx);
3472 else
3473 *puValue = RT_MAKE_U64(pLeaf->uEcx, pLeaf->uEdx);
3474 }
3475 else
3476 *puValue = 0;
3477 return VINF_SUCCESS;
3478}
3479
3480
3481/** @callback_method_impl{FNCPUMWRMSR} */
3482static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8CpuNameN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3483{
3484 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3485 /** @todo Remember guest programmed CPU name. */
3486 return VINF_SUCCESS;
3487}
3488
3489
3490/** @callback_method_impl{FNCPUMRDMSR} */
3491static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8HwThermalCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3492{
3493 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
3494 /** @todo AMD HTC. */
3495 *puValue = pRange->uValue;
3496 return VINF_SUCCESS;
3497}
3498
3499
3500/** @callback_method_impl{FNCPUMWRMSR} */
3501static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8HwThermalCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3502{
3503 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3504 /** @todo AMD HTC. */
3505 return VINF_SUCCESS;
3506}
3507
3508
3509/** @callback_method_impl{FNCPUMRDMSR} */
3510static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8SwThermalCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3511{
3512 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3513 /** @todo AMD STC. */
3514 *puValue = 0;
3515 return VINF_SUCCESS;
3516}
3517
3518
3519/** @callback_method_impl{FNCPUMWRMSR} */
3520static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8SwThermalCtrl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3521{
3522 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3523 /** @todo AMD STC. */
3524 return VINF_SUCCESS;
3525}
3526
3527
3528/** @callback_method_impl{FNCPUMRDMSR} */
3529static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8FidVidControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3530{
3531 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
3532 /** @todo AMD FIDVID_CTL. */
3533 *puValue = pRange->uValue;
3534 return VINF_SUCCESS;
3535}
3536
3537
3538/** @callback_method_impl{FNCPUMWRMSR} */
3539static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8FidVidControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3540{
3541 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3542 /** @todo AMD FIDVID_CTL. */
3543 return VINF_SUCCESS;
3544}
3545
3546
3547/** @callback_method_impl{FNCPUMRDMSR} */
3548static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8FidVidStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3549{
3550 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
3551 /** @todo AMD FIDVID_STATUS. */
3552 *puValue = pRange->uValue;
3553 return VINF_SUCCESS;
3554}
3555
3556
3557/** @callback_method_impl{FNCPUMRDMSR} */
3558static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8McCtlMaskN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3559{
3560 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3561 /** @todo AMD MC. */
3562 *puValue = 0;
3563 return VINF_SUCCESS;
3564}
3565
3566
3567/** @callback_method_impl{FNCPUMWRMSR} */
3568static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8McCtlMaskN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3569{
3570 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3571 /** @todo AMD MC. */
3572 return VINF_SUCCESS;
3573}
3574
3575
3576/** @callback_method_impl{FNCPUMRDMSR} */
3577static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8SmiOnIoTrapN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3578{
3579 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3580 /** @todo AMD SMM/SMI and I/O trap. */
3581 *puValue = 0;
3582 return VINF_SUCCESS;
3583}
3584
3585
3586/** @callback_method_impl{FNCPUMWRMSR} */
3587static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8SmiOnIoTrapN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3588{
3589 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3590 /** @todo AMD SMM/SMI and I/O trap. */
3591 return VINF_SUCCESS;
3592}
3593
3594
3595/** @callback_method_impl{FNCPUMRDMSR} */
3596static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8SmiOnIoTrapCtlSts(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3597{
3598 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3599 /** @todo AMD SMM/SMI and I/O trap. */
3600 *puValue = 0;
3601 return VINF_SUCCESS;
3602}
3603
3604
3605/** @callback_method_impl{FNCPUMWRMSR} */
3606static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8SmiOnIoTrapCtlSts(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3607{
3608 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3609 /** @todo AMD SMM/SMI and I/O trap. */
3610 return VINF_SUCCESS;
3611}
3612
3613
3614/** @callback_method_impl{FNCPUMRDMSR} */
3615static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8IntPendingMessage(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3616{
3617 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3618 /** @todo Interrupt pending message. */
3619 *puValue = 0;
3620 return VINF_SUCCESS;
3621}
3622
3623
3624/** @callback_method_impl{FNCPUMWRMSR} */
3625static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8IntPendingMessage(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3626{
3627 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3628 /** @todo Interrupt pending message. */
3629 return VINF_SUCCESS;
3630}
3631
3632
3633/** @callback_method_impl{FNCPUMRDMSR} */
3634static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8SmiTriggerIoCycle(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3635{
3636 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3637 /** @todo AMD SMM/SMI and trigger I/O cycle. */
3638 *puValue = 0;
3639 return VINF_SUCCESS;
3640}
3641
3642
3643/** @callback_method_impl{FNCPUMWRMSR} */
3644static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8SmiTriggerIoCycle(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3645{
3646 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3647 /** @todo AMD SMM/SMI and trigger I/O cycle. */
3648 return VINF_SUCCESS;
3649}
3650
3651
3652/** @callback_method_impl{FNCPUMRDMSR} */
3653static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hMmioCfgBaseAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3654{
3655 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3656 /** @todo AMD MMIO Configuration base address. */
3657 *puValue = 0;
3658 return VINF_SUCCESS;
3659}
3660
3661
3662/** @callback_method_impl{FNCPUMWRMSR} */
3663static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hMmioCfgBaseAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3664{
3665 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3666 /** @todo AMD MMIO Configuration base address. */
3667 return VINF_SUCCESS;
3668}
3669
3670
3671/** @callback_method_impl{FNCPUMRDMSR} */
3672static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hTrapCtlMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3673{
3674 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3675 /** @todo AMD 0xc0010059. */
3676 *puValue = 0;
3677 return VINF_SUCCESS;
3678}
3679
3680
3681/** @callback_method_impl{FNCPUMWRMSR} */
3682static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hTrapCtlMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3683{
3684 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3685 /** @todo AMD 0xc0010059. */
3686 return VINF_SUCCESS;
3687}
3688
3689
3690/** @callback_method_impl{FNCPUMRDMSR} */
3691static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hPStateCurLimit(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3692{
3693 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
3694 /** @todo AMD P-states. */
3695 *puValue = pRange->uValue;
3696 return VINF_SUCCESS;
3697}
3698
3699
3700/** @callback_method_impl{FNCPUMRDMSR} */
3701static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hPStateControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3702{
3703 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
3704 /** @todo AMD P-states. */
3705 *puValue = pRange->uValue;
3706 return VINF_SUCCESS;
3707}
3708
3709
3710/** @callback_method_impl{FNCPUMWRMSR} */
3711static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hPStateControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3712{
3713 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3714 /** @todo AMD P-states. */
3715 return VINF_SUCCESS;
3716}
3717
3718
3719/** @callback_method_impl{FNCPUMRDMSR} */
3720static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hPStateStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3721{
3722 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
3723 /** @todo AMD P-states. */
3724 *puValue = pRange->uValue;
3725 return VINF_SUCCESS;
3726}
3727
3728
3729/** @callback_method_impl{FNCPUMWRMSR} */
3730static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hPStateStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3731{
3732 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3733 /** @todo AMD P-states. */
3734 return VINF_SUCCESS;
3735}
3736
3737
3738/** @callback_method_impl{FNCPUMRDMSR} */
3739static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hPStateN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3740{
3741 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
3742 /** @todo AMD P-states. */
3743 *puValue = pRange->uValue;
3744 return VINF_SUCCESS;
3745}
3746
3747
3748/** @callback_method_impl{FNCPUMWRMSR} */
3749static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hPStateN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3750{
3751 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3752 /** @todo AMD P-states. */
3753 return VINF_SUCCESS;
3754}
3755
3756
3757/** @callback_method_impl{FNCPUMRDMSR} */
3758static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hCofVidControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3759{
3760 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
3761 /** @todo AMD P-states. */
3762 *puValue = pRange->uValue;
3763 return VINF_SUCCESS;
3764}
3765
3766
3767/** @callback_method_impl{FNCPUMWRMSR} */
3768static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hCofVidControl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3769{
3770 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3771 /** @todo AMD P-states. */
3772 return VINF_SUCCESS;
3773}
3774
3775
3776/** @callback_method_impl{FNCPUMRDMSR} */
3777static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hCofVidStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3778{
3779 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
3780 /** @todo AMD P-states. */
3781 *puValue = pRange->uValue;
3782 return VINF_SUCCESS;
3783}
3784
3785
3786/** @callback_method_impl{FNCPUMWRMSR} */
3787static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hCofVidStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3788{
3789 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3790 /* Note! Writing 0 seems to not GP, not sure if it does anything to the value... */
3791 /** @todo AMD P-states. */
3792 return VINF_SUCCESS;
3793}
3794
3795
3796/** @callback_method_impl{FNCPUMRDMSR} */
3797static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hCStateIoBaseAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3798{
3799 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3800 /** @todo AMD C-states. */
3801 *puValue = 0;
3802 return VINF_SUCCESS;
3803}
3804
3805
3806/** @callback_method_impl{FNCPUMWRMSR} */
3807static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hCStateIoBaseAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3808{
3809 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3810 /** @todo AMD C-states. */
3811 return VINF_SUCCESS;
3812}
3813
3814
3815/** @callback_method_impl{FNCPUMRDMSR} */
3816static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hCpuWatchdogTimer(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3817{
3818 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3819 /** @todo AMD machine checks. */
3820 *puValue = 0;
3821 return VINF_SUCCESS;
3822}
3823
3824
3825/** @callback_method_impl{FNCPUMWRMSR} */
3826static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hCpuWatchdogTimer(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3827{
3828 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3829 /** @todo AMD machine checks. */
3830 return VINF_SUCCESS;
3831}
3832
3833
3834/** @callback_method_impl{FNCPUMRDMSR} */
3835static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8SmmBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3836{
3837 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3838 /** @todo AMD SMM. */
3839 *puValue = 0;
3840 return VINF_SUCCESS;
3841}
3842
3843
3844/** @callback_method_impl{FNCPUMWRMSR} */
3845static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8SmmBase(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3846{
3847 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3848 /** @todo AMD SMM. */
3849 return VINF_SUCCESS;
3850}
3851
3852
3853/** @callback_method_impl{FNCPUMRDMSR} */
3854static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8SmmAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3855{
3856 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3857 /** @todo AMD SMM. */
3858 *puValue = 0;
3859 return VINF_SUCCESS;
3860}
3861
3862
3863/** @callback_method_impl{FNCPUMWRMSR} */
3864static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8SmmAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3865{
3866 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3867 /** @todo AMD SMM. */
3868 return VINF_SUCCESS;
3869}
3870
3871
3872
3873/** @callback_method_impl{FNCPUMRDMSR} */
3874static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8SmmMask(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3875{
3876 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3877 /** @todo AMD SMM. */
3878 *puValue = 0;
3879 return VINF_SUCCESS;
3880}
3881
3882
3883/** @callback_method_impl{FNCPUMWRMSR} */
3884static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8SmmMask(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3885{
3886 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3887 /** @todo AMD SMM. */
3888 return VINF_SUCCESS;
3889}
3890
3891
3892/** @callback_method_impl{FNCPUMRDMSR} */
3893static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8VmCr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3894{
3895 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3896 PVM pVM = pVCpu->CTX_SUFF(pVM);
3897 if (pVM->cpum.s.GuestFeatures.fSvm)
3898 *puValue = MSR_K8_VM_CR_LOCK;
3899 else
3900 *puValue = 0;
3901 return VINF_SUCCESS;
3902}
3903
3904
3905/** @callback_method_impl{FNCPUMWRMSR} */
3906static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8VmCr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3907{
3908 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
3909 PVM pVM = pVCpu->CTX_SUFF(pVM);
3910 if (pVM->cpum.s.GuestFeatures.fSvm)
3911 {
3912 /* Silently ignore writes to LOCK and SVM_DISABLE bit when the LOCK bit is set (see cpumMsrRd_AmdK8VmCr). */
3913 if (uValue & (MSR_K8_VM_CR_DPD | MSR_K8_VM_CR_R_INIT | MSR_K8_VM_CR_DIS_A20M))
3914 return VERR_CPUM_RAISE_GP_0;
3915 return VINF_SUCCESS;
3916 }
3917 return VERR_CPUM_RAISE_GP_0;
3918}
3919
3920
3921/** @callback_method_impl{FNCPUMRDMSR} */
3922static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8IgnNe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3923{
3924 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3925 /** @todo AMD IGNNE\# control. */
3926 *puValue = 0;
3927 return VINF_SUCCESS;
3928}
3929
3930
3931/** @callback_method_impl{FNCPUMWRMSR} */
3932static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8IgnNe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3933{
3934 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3935 /** @todo AMD IGNNE\# control. */
3936 return VINF_SUCCESS;
3937}
3938
3939
3940/** @callback_method_impl{FNCPUMRDMSR} */
3941static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8SmmCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3942{
3943 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3944 /** @todo AMD SMM. */
3945 *puValue = 0;
3946 return VINF_SUCCESS;
3947}
3948
3949
3950/** @callback_method_impl{FNCPUMWRMSR} */
3951static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8SmmCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3952{
3953 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
3954 /** @todo AMD SMM. */
3955 return VINF_SUCCESS;
3956}
3957
3958
3959/** @callback_method_impl{FNCPUMRDMSR} */
3960static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8VmHSavePa(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3961{
3962 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3963 *puValue = pVCpu->cpum.s.Guest.hwvirt.svm.uMsrHSavePa;
3964 return VINF_SUCCESS;
3965}
3966
3967
3968/** @callback_method_impl{FNCPUMWRMSR} */
3969static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8VmHSavePa(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
3970{
3971 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uRawValue);
3972 if (uValue & UINT64_C(0xfff))
3973 {
3974 Log(("CPUM: Invalid setting of low 12 bits set writing host-state save area MSR %#x: %#llx\n", idMsr, uValue));
3975 return VERR_CPUM_RAISE_GP_0;
3976 }
3977
3978 uint64_t fInvPhysMask = ~(RT_BIT_64(pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.cMaxPhysAddrWidth) - 1U);
3979 if (fInvPhysMask & uValue)
3980 {
3981 Log(("CPUM: Invalid physical address bits set writing host-state save area MSR %#x: %#llx (%#llx)\n",
3982 idMsr, uValue, uValue & fInvPhysMask));
3983 return VERR_CPUM_RAISE_GP_0;
3984 }
3985
3986 pVCpu->cpum.s.Guest.hwvirt.svm.uMsrHSavePa = uValue;
3987 return VINF_SUCCESS;
3988}
3989
3990
3991/** @callback_method_impl{FNCPUMRDMSR} */
3992static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hVmLockKey(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
3993{
3994 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
3995 /** @todo AMD SVM. */
3996 *puValue = 0; /* RAZ */
3997 return VINF_SUCCESS;
3998}
3999
4000
4001/** @callback_method_impl{FNCPUMWRMSR} */
4002static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hVmLockKey(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4003{
4004 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4005 /** @todo AMD SVM. */
4006 return VINF_SUCCESS;
4007}
4008
4009
4010/** @callback_method_impl{FNCPUMRDMSR} */
4011static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hSmmLockKey(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4012{
4013 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4014 /** @todo AMD SMM. */
4015 *puValue = 0; /* RAZ */
4016 return VINF_SUCCESS;
4017}
4018
4019
4020/** @callback_method_impl{FNCPUMWRMSR} */
4021static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hSmmLockKey(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4022{
4023 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4024 /** @todo AMD SMM. */
4025 return VINF_SUCCESS;
4026}
4027
4028
4029/** @callback_method_impl{FNCPUMRDMSR} */
4030static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hLocalSmiStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4031{
4032 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4033 /** @todo AMD SMM/SMI. */
4034 *puValue = 0;
4035 return VINF_SUCCESS;
4036}
4037
4038
4039/** @callback_method_impl{FNCPUMWRMSR} */
4040static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hLocalSmiStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4041{
4042 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4043 /** @todo AMD SMM/SMI. */
4044 return VINF_SUCCESS;
4045}
4046
4047
4048/** @callback_method_impl{FNCPUMRDMSR} */
4049static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hOsVisWrkIdLength(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4050{
4051 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
4052 /** @todo AMD OS visible workaround. */
4053 *puValue = pRange->uValue;
4054 return VINF_SUCCESS;
4055}
4056
4057
4058/** @callback_method_impl{FNCPUMWRMSR} */
4059static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hOsVisWrkIdLength(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4060{
4061 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4062 /** @todo AMD OS visible workaround. */
4063 return VINF_SUCCESS;
4064}
4065
4066
4067/** @callback_method_impl{FNCPUMRDMSR} */
4068static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hOsVisWrkStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4069{
4070 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4071 /** @todo AMD OS visible workaround. */
4072 *puValue = 0;
4073 return VINF_SUCCESS;
4074}
4075
4076
4077/** @callback_method_impl{FNCPUMWRMSR} */
4078static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hOsVisWrkStatus(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4079{
4080 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4081 /** @todo AMD OS visible workaround. */
4082 return VINF_SUCCESS;
4083}
4084
4085
4086/** @callback_method_impl{FNCPUMRDMSR} */
4087static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam16hL2IPerfCtlN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4088{
4089 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4090 /** @todo AMD L2I performance counters. */
4091 *puValue = 0;
4092 return VINF_SUCCESS;
4093}
4094
4095
4096/** @callback_method_impl{FNCPUMWRMSR} */
4097static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam16hL2IPerfCtlN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4098{
4099 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4100 /** @todo AMD L2I performance counters. */
4101 return VINF_SUCCESS;
4102}
4103
4104
4105/** @callback_method_impl{FNCPUMRDMSR} */
4106static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam16hL2IPerfCtrN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4107{
4108 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4109 /** @todo AMD L2I performance counters. */
4110 *puValue = 0;
4111 return VINF_SUCCESS;
4112}
4113
4114
4115/** @callback_method_impl{FNCPUMWRMSR} */
4116static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam16hL2IPerfCtrN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4117{
4118 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4119 /** @todo AMD L2I performance counters. */
4120 return VINF_SUCCESS;
4121}
4122
4123
4124/** @callback_method_impl{FNCPUMRDMSR} */
4125static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam15hNorthbridgePerfCtlN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4126{
4127 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4128 /** @todo AMD Northbridge performance counters. */
4129 *puValue = 0;
4130 return VINF_SUCCESS;
4131}
4132
4133
4134/** @callback_method_impl{FNCPUMWRMSR} */
4135static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam15hNorthbridgePerfCtlN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4136{
4137 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4138 /** @todo AMD Northbridge performance counters. */
4139 return VINF_SUCCESS;
4140}
4141
4142
4143/** @callback_method_impl{FNCPUMRDMSR} */
4144static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam15hNorthbridgePerfCtrN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4145{
4146 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4147 /** @todo AMD Northbridge performance counters. */
4148 *puValue = 0;
4149 return VINF_SUCCESS;
4150}
4151
4152
4153/** @callback_method_impl{FNCPUMWRMSR} */
4154static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam15hNorthbridgePerfCtrN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4155{
4156 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4157 /** @todo AMD Northbridge performance counters. */
4158 return VINF_SUCCESS;
4159}
4160
4161
4162/** @callback_method_impl{FNCPUMRDMSR} */
4163static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7MicrocodeCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4164{
4165 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
4166 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4167 * cpus. Need to be explored and verify K7 presence. */
4168 /** @todo Undocumented register only seen mentioned in fam15h erratum \#608. */
4169 *puValue = pRange->uValue;
4170 return VINF_SUCCESS;
4171}
4172
4173
4174/** @callback_method_impl{FNCPUMWRMSR} */
4175static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7MicrocodeCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4176{
4177 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4178 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4179 * cpus. Need to be explored and verify K7 presence. */
4180 /** @todo Undocumented register only seen mentioned in fam15h erratum \#608. */
4181 return VINF_SUCCESS;
4182}
4183
4184
4185/** @callback_method_impl{FNCPUMRDMSR} */
4186static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7ClusterIdMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4187{
4188 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
4189 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4190 * cpus. Need to be explored and verify K7 presence. */
4191 /** @todo Undocumented register only seen mentioned in fam16h BKDG r3.00 when
4192 * describing EBL_CR_POWERON. */
4193 *puValue = pRange->uValue;
4194 return VINF_SUCCESS;
4195}
4196
4197
4198/** @callback_method_impl{FNCPUMWRMSR} */
4199static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7ClusterIdMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4200{
4201 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4202 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4203 * cpus. Need to be explored and verify K7 presence. */
4204 /** @todo Undocumented register only seen mentioned in fam16h BKDG r3.00 when
4205 * describing EBL_CR_POWERON. */
4206 return VINF_SUCCESS;
4207}
4208
4209
4210/** @callback_method_impl{FNCPUMRDMSR} */
4211static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8CpuIdCtlStd07hEbax(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4212{
4213 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4214 bool fIgnored;
4215 PCPUMCPUIDLEAF pLeaf = cpumCpuIdGetLeafEx(pVCpu->CTX_SUFF(pVM), 0x00000007, 0, &fIgnored);
4216 if (pLeaf)
4217 *puValue = RT_MAKE_U64(pLeaf->uEbx, pLeaf->uEax);
4218 else
4219 *puValue = 0;
4220 return VINF_SUCCESS;
4221}
4222
4223
4224/** @callback_method_impl{FNCPUMWRMSR} */
4225static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8CpuIdCtlStd07hEbax(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4226{
4227 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4228 /** @todo Changing CPUID leaf 7/0. */
4229 return VINF_SUCCESS;
4230}
4231
4232
4233/** @callback_method_impl{FNCPUMRDMSR} */
4234static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8CpuIdCtlStd06hEcx(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4235{
4236 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4237 PCPUMCPUIDLEAF pLeaf = cpumCpuIdGetLeaf(pVCpu->CTX_SUFF(pVM), 0x00000006);
4238 if (pLeaf)
4239 *puValue = pLeaf->uEcx;
4240 else
4241 *puValue = 0;
4242 return VINF_SUCCESS;
4243}
4244
4245
4246/** @callback_method_impl{FNCPUMWRMSR} */
4247static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8CpuIdCtlStd06hEcx(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4248{
4249 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4250 /** @todo Changing CPUID leaf 6. */
4251 return VINF_SUCCESS;
4252}
4253
4254
4255/** @callback_method_impl{FNCPUMRDMSR} */
4256static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8CpuIdCtlStd01hEdcx(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4257{
4258 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4259 PCPUMCPUIDLEAF pLeaf = cpumCpuIdGetLeaf(pVCpu->CTX_SUFF(pVM), 0x00000001);
4260 if (pLeaf)
4261 *puValue = RT_MAKE_U64(pLeaf->uEdx, pLeaf->uEcx);
4262 else
4263 *puValue = 0;
4264 return VINF_SUCCESS;
4265}
4266
4267
4268/** @callback_method_impl{FNCPUMWRMSR} */
4269static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8CpuIdCtlStd01hEdcx(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4270{
4271 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4272 /** @todo Changing CPUID leaf 0x80000001. */
4273 return VINF_SUCCESS;
4274}
4275
4276
4277/** @callback_method_impl{FNCPUMRDMSR} */
4278static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8CpuIdCtlExt01hEdcx(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4279{
4280 RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4281 PCPUMCPUIDLEAF pLeaf = cpumCpuIdGetLeaf(pVCpu->CTX_SUFF(pVM), 0x80000001);
4282 if (pLeaf)
4283 *puValue = RT_MAKE_U64(pLeaf->uEdx, pLeaf->uEcx);
4284 else
4285 *puValue = 0;
4286 return VINF_SUCCESS;
4287}
4288
4289
4290/** @callback_method_impl{FNCPUMWRMSR} */
4291static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8CpuIdCtlExt01hEdcx(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4292{
4293 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4294 /** @todo Changing CPUID leaf 0x80000001. */
4295 return VINF_SUCCESS;
4296}
4297
4298
4299/** @callback_method_impl{FNCPUMRDMSR} */
4300static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK8PatchLevel(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4301{
4302 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr);
4303 /** @todo Fake AMD microcode patching. */
4304 *puValue = pRange->uValue;
4305 return VINF_SUCCESS;
4306}
4307
4308
4309/** @callback_method_impl{FNCPUMWRMSR} */
4310static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK8PatchLoader(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4311{
4312 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4313 /** @todo Fake AMD microcode patching. */
4314 return VINF_SUCCESS;
4315}
4316
4317
4318/** @callback_method_impl{FNCPUMRDMSR} */
4319static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7DebugStatusMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4320{
4321 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4322 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4323 * cpus. Need to be explored and verify K7 presence. */
4324 /** @todo undocumented */
4325 *puValue = 0;
4326 return VINF_SUCCESS;
4327}
4328
4329
4330/** @callback_method_impl{FNCPUMWRMSR} */
4331static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7DebugStatusMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4332{
4333 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4334 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4335 * cpus. Need to be explored and verify K7 presence. */
4336 /** @todo undocumented */
4337 return VINF_SUCCESS;
4338}
4339
4340
4341/** @callback_method_impl{FNCPUMRDMSR} */
4342static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7BHTraceBaseMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4343{
4344 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4345 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4346 * cpus. Need to be explored and verify K7 presence. */
4347 /** @todo undocumented */
4348 *puValue = 0;
4349 return VINF_SUCCESS;
4350}
4351
4352
4353/** @callback_method_impl{FNCPUMWRMSR} */
4354static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7BHTraceBaseMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4355{
4356 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4357 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4358 * cpus. Need to be explored and verify K7 presence. */
4359 /** @todo undocumented */
4360 return VINF_SUCCESS;
4361}
4362
4363
4364/** @callback_method_impl{FNCPUMRDMSR} */
4365static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7BHTracePtrMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4366{
4367 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4368 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4369 * cpus. Need to be explored and verify K7 presence. */
4370 /** @todo undocumented */
4371 *puValue = 0;
4372 return VINF_SUCCESS;
4373}
4374
4375
4376/** @callback_method_impl{FNCPUMWRMSR} */
4377static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7BHTracePtrMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4378{
4379 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4380 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4381 * cpus. Need to be explored and verify K7 presence. */
4382 /** @todo undocumented */
4383 return VINF_SUCCESS;
4384}
4385
4386
4387/** @callback_method_impl{FNCPUMRDMSR} */
4388static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7BHTraceLimitMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4389{
4390 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4391 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4392 * cpus. Need to be explored and verify K7 presence. */
4393 /** @todo undocumented */
4394 *puValue = 0;
4395 return VINF_SUCCESS;
4396}
4397
4398
4399/** @callback_method_impl{FNCPUMWRMSR} */
4400static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7BHTraceLimitMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4401{
4402 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4403 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4404 * cpus. Need to be explored and verify K7 presence. */
4405 /** @todo undocumented */
4406 return VINF_SUCCESS;
4407}
4408
4409
4410/** @callback_method_impl{FNCPUMRDMSR} */
4411static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7HardwareDebugToolCfgMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4412{
4413 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4414 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4415 * cpus. Need to be explored and verify K7 presence. */
4416 /** @todo undocumented */
4417 *puValue = 0;
4418 return VINF_SUCCESS;
4419}
4420
4421
4422/** @callback_method_impl{FNCPUMWRMSR} */
4423static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7HardwareDebugToolCfgMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4424{
4425 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4426 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4427 * cpus. Need to be explored and verify K7 presence. */
4428 /** @todo undocumented */
4429 return VINF_SUCCESS;
4430}
4431
4432
4433/** @callback_method_impl{FNCPUMRDMSR} */
4434static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7FastFlushCountMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4435{
4436 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4437 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4438 * cpus. Need to be explored and verify K7 presence. */
4439 /** @todo undocumented */
4440 *puValue = 0;
4441 return VINF_SUCCESS;
4442}
4443
4444
4445/** @callback_method_impl{FNCPUMWRMSR} */
4446static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7FastFlushCountMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4447{
4448 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4449 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4450 * cpus. Need to be explored and verify K7 presence. */
4451 /** @todo undocumented */
4452 return VINF_SUCCESS;
4453}
4454
4455
4456/** @callback_method_impl{FNCPUMRDMSR} */
4457static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7NodeId(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4458{
4459 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4460 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4461 * cpus. Need to be explored and verify K7 presence. */
4462 /** @todo AMD node ID and bios scratch. */
4463 *puValue = 0; /* nodeid = 0; nodes-per-cpu = 1 */
4464 return VINF_SUCCESS;
4465}
4466
4467
4468/** @callback_method_impl{FNCPUMWRMSR} */
4469static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7NodeId(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4470{
4471 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4472 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4473 * cpus. Need to be explored and verify K7 presence. */
4474 /** @todo AMD node ID and bios scratch. */
4475 return VINF_SUCCESS;
4476}
4477
4478
4479/** @callback_method_impl{FNCPUMRDMSR} */
4480static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7DrXAddrMaskN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4481{
4482 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4483 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4484 * cpus. Need to be explored and verify K7 presence. */
4485 /** @todo AMD DRx address masking (range breakpoints). */
4486 *puValue = 0;
4487 return VINF_SUCCESS;
4488}
4489
4490
4491/** @callback_method_impl{FNCPUMWRMSR} */
4492static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7DrXAddrMaskN(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4493{
4494 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4495 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4496 * cpus. Need to be explored and verify K7 presence. */
4497 /** @todo AMD DRx address masking (range breakpoints). */
4498 return VINF_SUCCESS;
4499}
4500
4501
4502/** @callback_method_impl{FNCPUMRDMSR} */
4503static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7Dr0DataMatchMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4504{
4505 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4506 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4507 * cpus. Need to be explored and verify K7 presence. */
4508 /** @todo AMD undocument debugging features. */
4509 *puValue = 0;
4510 return VINF_SUCCESS;
4511}
4512
4513
4514/** @callback_method_impl{FNCPUMWRMSR} */
4515static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7Dr0DataMatchMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4516{
4517 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4518 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4519 * cpus. Need to be explored and verify K7 presence. */
4520 /** @todo AMD undocument debugging features. */
4521 return VINF_SUCCESS;
4522}
4523
4524
4525/** @callback_method_impl{FNCPUMRDMSR} */
4526static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7Dr0DataMaskMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4527{
4528 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4529 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4530 * cpus. Need to be explored and verify K7 presence. */
4531 /** @todo AMD undocument debugging features. */
4532 *puValue = 0;
4533 return VINF_SUCCESS;
4534}
4535
4536
4537/** @callback_method_impl{FNCPUMWRMSR} */
4538static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7Dr0DataMaskMaybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4539{
4540 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4541 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4542 * cpus. Need to be explored and verify K7 presence. */
4543 /** @todo AMD undocument debugging features. */
4544 return VINF_SUCCESS;
4545}
4546
4547
4548/** @callback_method_impl{FNCPUMRDMSR} */
4549static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7LoadStoreCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4550{
4551 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4552 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4553 * cpus. Need to be explored and verify K7 presence. */
4554 /** @todo AMD load-store config. */
4555 *puValue = 0;
4556 return VINF_SUCCESS;
4557}
4558
4559
4560/** @callback_method_impl{FNCPUMWRMSR} */
4561static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7LoadStoreCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4562{
4563 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4564 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4565 * cpus. Need to be explored and verify K7 presence. */
4566 /** @todo AMD load-store config. */
4567 return VINF_SUCCESS;
4568}
4569
4570
4571/** @callback_method_impl{FNCPUMRDMSR} */
4572static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7InstrCacheCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4573{
4574 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4575 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4576 * cpus. Need to be explored and verify K7 presence. */
4577 /** @todo AMD instruction cache config. */
4578 *puValue = 0;
4579 return VINF_SUCCESS;
4580}
4581
4582
4583/** @callback_method_impl{FNCPUMWRMSR} */
4584static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7InstrCacheCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4585{
4586 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4587 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4588 * cpus. Need to be explored and verify K7 presence. */
4589 /** @todo AMD instruction cache config. */
4590 return VINF_SUCCESS;
4591}
4592
4593
4594/** @callback_method_impl{FNCPUMRDMSR} */
4595static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7DataCacheCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4596{
4597 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4598 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4599 * cpus. Need to be explored and verify K7 presence. */
4600 /** @todo AMD data cache config. */
4601 *puValue = 0;
4602 return VINF_SUCCESS;
4603}
4604
4605
4606/** @callback_method_impl{FNCPUMWRMSR} */
4607static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7DataCacheCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4608{
4609 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4610 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4611 * cpus. Need to be explored and verify K7 presence. */
4612 /** @todo AMD data cache config. */
4613 return VINF_SUCCESS;
4614}
4615
4616
4617/** @callback_method_impl{FNCPUMRDMSR} */
4618static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7BusUnitCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4619{
4620 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4621 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4622 * cpus. Need to be explored and verify K7 presence. */
4623 /** @todo AMD bus unit config. */
4624 *puValue = 0;
4625 return VINF_SUCCESS;
4626}
4627
4628
4629/** @callback_method_impl{FNCPUMWRMSR} */
4630static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7BusUnitCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4631{
4632 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4633 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4634 * cpus. Need to be explored and verify K7 presence. */
4635 /** @todo AMD bus unit config. */
4636 return VINF_SUCCESS;
4637}
4638
4639
4640/** @callback_method_impl{FNCPUMRDMSR} */
4641static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdK7DebugCtl2Maybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4642{
4643 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4644 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4645 * cpus. Need to be explored and verify K7 presence. */
4646 /** @todo Undocument AMD debug control register \#2. */
4647 *puValue = 0;
4648 return VINF_SUCCESS;
4649}
4650
4651
4652/** @callback_method_impl{FNCPUMWRMSR} */
4653static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdK7DebugCtl2Maybe(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4654{
4655 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4656 /** @todo Allegedly requiring edi=0x9c5a203a when execuing rdmsr/wrmsr on older
4657 * cpus. Need to be explored and verify K7 presence. */
4658 /** @todo Undocument AMD debug control register \#2. */
4659 return VINF_SUCCESS;
4660}
4661
4662
4663/** @callback_method_impl{FNCPUMRDMSR} */
4664static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam15hFpuCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4665{
4666 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4667 /** @todo AMD FPU config. */
4668 *puValue = 0;
4669 return VINF_SUCCESS;
4670}
4671
4672
4673/** @callback_method_impl{FNCPUMWRMSR} */
4674static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam15hFpuCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4675{
4676 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4677 /** @todo AMD FPU config. */
4678 return VINF_SUCCESS;
4679}
4680
4681
4682/** @callback_method_impl{FNCPUMRDMSR} */
4683static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam15hDecoderCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4684{
4685 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4686 /** @todo AMD decoder config. */
4687 *puValue = 0;
4688 return VINF_SUCCESS;
4689}
4690
4691
4692/** @callback_method_impl{FNCPUMWRMSR} */
4693static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam15hDecoderCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4694{
4695 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4696 /** @todo AMD decoder config. */
4697 return VINF_SUCCESS;
4698}
4699
4700
4701/** @callback_method_impl{FNCPUMRDMSR} */
4702static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hBusUnitCfg2(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4703{
4704 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4705 /* Note! 10h and 16h */
4706 /** @todo AMD bus unit config. */
4707 *puValue = 0;
4708 return VINF_SUCCESS;
4709}
4710
4711
4712/** @callback_method_impl{FNCPUMWRMSR} */
4713static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hBusUnitCfg2(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4714{
4715 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4716 /* Note! 10h and 16h */
4717 /** @todo AMD bus unit config. */
4718 return VINF_SUCCESS;
4719}
4720
4721
4722/** @callback_method_impl{FNCPUMRDMSR} */
4723static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam15hCombUnitCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4724{
4725 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4726 /** @todo AMD unit config. */
4727 *puValue = 0;
4728 return VINF_SUCCESS;
4729}
4730
4731
4732/** @callback_method_impl{FNCPUMWRMSR} */
4733static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam15hCombUnitCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4734{
4735 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4736 /** @todo AMD unit config. */
4737 return VINF_SUCCESS;
4738}
4739
4740
4741/** @callback_method_impl{FNCPUMRDMSR} */
4742static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam15hCombUnitCfg2(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4743{
4744 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4745 /** @todo AMD unit config 2. */
4746 *puValue = 0;
4747 return VINF_SUCCESS;
4748}
4749
4750
4751/** @callback_method_impl{FNCPUMWRMSR} */
4752static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam15hCombUnitCfg2(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4753{
4754 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4755 /** @todo AMD unit config 2. */
4756 return VINF_SUCCESS;
4757}
4758
4759
4760/** @callback_method_impl{FNCPUMRDMSR} */
4761static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam15hCombUnitCfg3(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4762{
4763 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4764 /** @todo AMD combined unit config 3. */
4765 *puValue = 0;
4766 return VINF_SUCCESS;
4767}
4768
4769
4770/** @callback_method_impl{FNCPUMWRMSR} */
4771static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam15hCombUnitCfg3(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4772{
4773 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4774 /** @todo AMD combined unit config 3. */
4775 return VINF_SUCCESS;
4776}
4777
4778
4779/** @callback_method_impl{FNCPUMRDMSR} */
4780static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam15hExecUnitCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4781{
4782 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4783 /** @todo AMD execution unit config. */
4784 *puValue = 0;
4785 return VINF_SUCCESS;
4786}
4787
4788
4789/** @callback_method_impl{FNCPUMWRMSR} */
4790static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam15hExecUnitCfg(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4791{
4792 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4793 /** @todo AMD execution unit config. */
4794 return VINF_SUCCESS;
4795}
4796
4797
4798/** @callback_method_impl{FNCPUMRDMSR} */
4799static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam15hLoadStoreCfg2(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4800{
4801 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4802 /** @todo AMD load-store config 2. */
4803 *puValue = 0;
4804 return VINF_SUCCESS;
4805}
4806
4807
4808/** @callback_method_impl{FNCPUMWRMSR} */
4809static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam15hLoadStoreCfg2(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4810{
4811 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4812 /** @todo AMD load-store config 2. */
4813 return VINF_SUCCESS;
4814}
4815
4816
4817/** @callback_method_impl{FNCPUMRDMSR} */
4818static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hIbsFetchCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4819{
4820 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4821 /** @todo AMD IBS. */
4822 *puValue = 0;
4823 return VINF_SUCCESS;
4824}
4825
4826
4827/** @callback_method_impl{FNCPUMWRMSR} */
4828static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hIbsFetchCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4829{
4830 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4831 /** @todo AMD IBS. */
4832 return VINF_SUCCESS;
4833}
4834
4835
4836/** @callback_method_impl{FNCPUMRDMSR} */
4837static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hIbsFetchLinAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4838{
4839 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4840 /** @todo AMD IBS. */
4841 *puValue = 0;
4842 return VINF_SUCCESS;
4843}
4844
4845
4846/** @callback_method_impl{FNCPUMWRMSR} */
4847static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hIbsFetchLinAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4848{
4849 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4850 /** @todo AMD IBS. */
4851 return VINF_SUCCESS;
4852}
4853
4854
4855/** @callback_method_impl{FNCPUMRDMSR} */
4856static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hIbsFetchPhysAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4857{
4858 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4859 /** @todo AMD IBS. */
4860 *puValue = 0;
4861 return VINF_SUCCESS;
4862}
4863
4864
4865/** @callback_method_impl{FNCPUMWRMSR} */
4866static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hIbsFetchPhysAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4867{
4868 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4869 /** @todo AMD IBS. */
4870 return VINF_SUCCESS;
4871}
4872
4873
4874/** @callback_method_impl{FNCPUMRDMSR} */
4875static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hIbsOpExecCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4876{
4877 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4878 /** @todo AMD IBS. */
4879 *puValue = 0;
4880 return VINF_SUCCESS;
4881}
4882
4883
4884/** @callback_method_impl{FNCPUMWRMSR} */
4885static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hIbsOpExecCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4886{
4887 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4888 /** @todo AMD IBS. */
4889 return VINF_SUCCESS;
4890}
4891
4892
4893/** @callback_method_impl{FNCPUMRDMSR} */
4894static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hIbsOpRip(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4895{
4896 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4897 /** @todo AMD IBS. */
4898 *puValue = 0;
4899 return VINF_SUCCESS;
4900}
4901
4902
4903/** @callback_method_impl{FNCPUMWRMSR} */
4904static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hIbsOpRip(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4905{
4906 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4907 /** @todo AMD IBS. */
4908 if (!X86_IS_CANONICAL(uValue))
4909 {
4910 Log(("CPUM: wrmsr %s(%#x), %#llx -> #GP - not canonical\n", pRange->szName, idMsr, uValue));
4911 return VERR_CPUM_RAISE_GP_0;
4912 }
4913 return VINF_SUCCESS;
4914}
4915
4916
4917/** @callback_method_impl{FNCPUMRDMSR} */
4918static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hIbsOpData(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4919{
4920 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4921 /** @todo AMD IBS. */
4922 *puValue = 0;
4923 return VINF_SUCCESS;
4924}
4925
4926
4927/** @callback_method_impl{FNCPUMWRMSR} */
4928static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hIbsOpData(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4929{
4930 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4931 /** @todo AMD IBS. */
4932 return VINF_SUCCESS;
4933}
4934
4935
4936/** @callback_method_impl{FNCPUMRDMSR} */
4937static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hIbsOpData2(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4938{
4939 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4940 /** @todo AMD IBS. */
4941 *puValue = 0;
4942 return VINF_SUCCESS;
4943}
4944
4945
4946/** @callback_method_impl{FNCPUMWRMSR} */
4947static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hIbsOpData2(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4948{
4949 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4950 /** @todo AMD IBS. */
4951 return VINF_SUCCESS;
4952}
4953
4954
4955/** @callback_method_impl{FNCPUMRDMSR} */
4956static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hIbsOpData3(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4957{
4958 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4959 /** @todo AMD IBS. */
4960 *puValue = 0;
4961 return VINF_SUCCESS;
4962}
4963
4964
4965/** @callback_method_impl{FNCPUMWRMSR} */
4966static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hIbsOpData3(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4967{
4968 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4969 /** @todo AMD IBS. */
4970 return VINF_SUCCESS;
4971}
4972
4973
4974/** @callback_method_impl{FNCPUMRDMSR} */
4975static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hIbsDcLinAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
4976{
4977 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
4978 /** @todo AMD IBS. */
4979 *puValue = 0;
4980 return VINF_SUCCESS;
4981}
4982
4983
4984/** @callback_method_impl{FNCPUMWRMSR} */
4985static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hIbsDcLinAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
4986{
4987 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
4988 /** @todo AMD IBS. */
4989 if (!X86_IS_CANONICAL(uValue))
4990 {
4991 Log(("CPUM: wrmsr %s(%#x), %#llx -> #GP - not canonical\n", pRange->szName, idMsr, uValue));
4992 return VERR_CPUM_RAISE_GP_0;
4993 }
4994 return VINF_SUCCESS;
4995}
4996
4997
4998/** @callback_method_impl{FNCPUMRDMSR} */
4999static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hIbsDcPhysAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
5000{
5001 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
5002 /** @todo AMD IBS. */
5003 *puValue = 0;
5004 return VINF_SUCCESS;
5005}
5006
5007
5008/** @callback_method_impl{FNCPUMWRMSR} */
5009static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hIbsDcPhysAddr(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
5010{
5011 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
5012 /** @todo AMD IBS. */
5013 return VINF_SUCCESS;
5014}
5015
5016
5017/** @callback_method_impl{FNCPUMRDMSR} */
5018static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam10hIbsCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
5019{
5020 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
5021 /** @todo AMD IBS. */
5022 *puValue = 0;
5023 return VINF_SUCCESS;
5024}
5025
5026
5027/** @callback_method_impl{FNCPUMWRMSR} */
5028static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam10hIbsCtl(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
5029{
5030 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
5031 /** @todo AMD IBS. */
5032 return VINF_SUCCESS;
5033}
5034
5035
5036/** @callback_method_impl{FNCPUMRDMSR} */
5037static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_AmdFam14hIbsBrTarget(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
5038{
5039 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
5040 /** @todo AMD IBS. */
5041 *puValue = 0;
5042 return VINF_SUCCESS;
5043}
5044
5045
5046/** @callback_method_impl{FNCPUMWRMSR} */
5047static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_AmdFam14hIbsBrTarget(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
5048{
5049 RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange); RT_NOREF_PV(uValue); RT_NOREF_PV(uRawValue);
5050 /** @todo AMD IBS. */
5051 if (!X86_IS_CANONICAL(uValue))
5052 {
5053 Log(("CPUM: wrmsr %s(%#x), %#llx -> #GP - not canonical\n", pRange->szName, idMsr, uValue));
5054 return VERR_CPUM_RAISE_GP_0;
5055 }
5056 return VINF_SUCCESS;
5057}
5058
5059
5060
5061/*
5062 * GIM MSRs.
5063 * GIM MSRs.
5064 * GIM MSRs.
5065 */
5066
5067
5068/** @callback_method_impl{FNCPUMRDMSR} */
5069static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Gim(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
5070{
5071#if defined(VBOX_WITH_NESTED_HWVIRT_SVM) || defined(VBOX_WITH_NESTED_HWVIRT_VMX)
5072 /* Raise #GP(0) like a physical CPU would since the nested-hypervisor hasn't intercept these MSRs. */
5073 if ( CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.s.Guest)
5074 || CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.s.Guest))
5075 return VERR_CPUM_RAISE_GP_0;
5076#endif
5077 return GIMReadMsr(pVCpu, idMsr, pRange, puValue);
5078}
5079
5080
5081/** @callback_method_impl{FNCPUMWRMSR} */
5082static DECLCALLBACK(VBOXSTRICTRC) cpumMsrWr_Gim(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t uValue, uint64_t uRawValue)
5083{
5084#if defined(VBOX_WITH_NESTED_HWVIRT_SVM) || defined(VBOX_WITH_NESTED_HWVIRT_VMX)
5085 /* Raise #GP(0) like a physical CPU would since the nested-hypervisor hasn't intercept these MSRs. */
5086 if ( CPUMIsGuestInSvmNestedHwVirtMode(&pVCpu->cpum.s.Guest)
5087 || CPUMIsGuestInVmxNonRootMode(&pVCpu->cpum.s.Guest))
5088 return VERR_CPUM_RAISE_GP_0;
5089#endif
5090 return GIMWriteMsr(pVCpu, idMsr, pRange, uValue, uRawValue);
5091}
5092
5093
5094/**
5095 * MSR read function table.
5096 */
5097static const struct READMSRCLANG11WEIRDNOTHROW { PFNCPUMRDMSR pfnRdMsr; } g_aCpumRdMsrFns[kCpumMsrRdFn_End] =
5098{
5099 { NULL }, /* Invalid */
5100 { cpumMsrRd_FixedValue },
5101 { NULL }, /* Alias */
5102 { cpumMsrRd_WriteOnly },
5103 { cpumMsrRd_Ia32P5McAddr },
5104 { cpumMsrRd_Ia32P5McType },
5105 { cpumMsrRd_Ia32TimestampCounter },
5106 { cpumMsrRd_Ia32PlatformId },
5107 { cpumMsrRd_Ia32ApicBase },
5108 { cpumMsrRd_Ia32FeatureControl },
5109 { cpumMsrRd_Ia32BiosSignId },
5110 { cpumMsrRd_Ia32SmmMonitorCtl },
5111 { cpumMsrRd_Ia32PmcN },
5112 { cpumMsrRd_Ia32MonitorFilterLineSize },
5113 { cpumMsrRd_Ia32MPerf },
5114 { cpumMsrRd_Ia32APerf },
5115 { cpumMsrRd_Ia32MtrrCap },
5116 { cpumMsrRd_Ia32MtrrPhysBaseN },
5117 { cpumMsrRd_Ia32MtrrPhysMaskN },
5118 { cpumMsrRd_Ia32MtrrFixed },
5119 { cpumMsrRd_Ia32MtrrDefType },
5120 { cpumMsrRd_Ia32Pat },
5121 { cpumMsrRd_Ia32SysEnterCs },
5122 { cpumMsrRd_Ia32SysEnterEsp },
5123 { cpumMsrRd_Ia32SysEnterEip },
5124 { cpumMsrRd_Ia32McgCap },
5125 { cpumMsrRd_Ia32McgStatus },
5126 { cpumMsrRd_Ia32McgCtl },
5127 { cpumMsrRd_Ia32DebugCtl },
5128 { cpumMsrRd_Ia32SmrrPhysBase },
5129 { cpumMsrRd_Ia32SmrrPhysMask },
5130 { cpumMsrRd_Ia32PlatformDcaCap },
5131 { cpumMsrRd_Ia32CpuDcaCap },
5132 { cpumMsrRd_Ia32Dca0Cap },
5133 { cpumMsrRd_Ia32PerfEvtSelN },
5134 { cpumMsrRd_Ia32PerfStatus },
5135 { cpumMsrRd_Ia32PerfCtl },
5136 { cpumMsrRd_Ia32FixedCtrN },
5137 { cpumMsrRd_Ia32PerfCapabilities },
5138 { cpumMsrRd_Ia32FixedCtrCtrl },
5139 { cpumMsrRd_Ia32PerfGlobalStatus },
5140 { cpumMsrRd_Ia32PerfGlobalCtrl },
5141 { cpumMsrRd_Ia32PerfGlobalOvfCtrl },
5142 { cpumMsrRd_Ia32PebsEnable },
5143 { cpumMsrRd_Ia32ClockModulation },
5144 { cpumMsrRd_Ia32ThermInterrupt },
5145 { cpumMsrRd_Ia32ThermStatus },
5146 { cpumMsrRd_Ia32Therm2Ctl },
5147 { cpumMsrRd_Ia32MiscEnable },
5148 { cpumMsrRd_Ia32McCtlStatusAddrMiscN },
5149 { cpumMsrRd_Ia32McNCtl2 },
5150 { cpumMsrRd_Ia32DsArea },
5151 { cpumMsrRd_Ia32TscDeadline },
5152 { cpumMsrRd_Ia32X2ApicN },
5153 { cpumMsrRd_Ia32DebugInterface },
5154 { cpumMsrRd_Ia32VmxBasic },
5155 { cpumMsrRd_Ia32VmxPinbasedCtls },
5156 { cpumMsrRd_Ia32VmxProcbasedCtls },
5157 { cpumMsrRd_Ia32VmxExitCtls },
5158 { cpumMsrRd_Ia32VmxEntryCtls },
5159 { cpumMsrRd_Ia32VmxMisc },
5160 { cpumMsrRd_Ia32VmxCr0Fixed0 },
5161 { cpumMsrRd_Ia32VmxCr0Fixed1 },
5162 { cpumMsrRd_Ia32VmxCr4Fixed0 },
5163 { cpumMsrRd_Ia32VmxCr4Fixed1 },
5164 { cpumMsrRd_Ia32VmxVmcsEnum },
5165 { cpumMsrRd_Ia32VmxProcBasedCtls2 },
5166 { cpumMsrRd_Ia32VmxEptVpidCap },
5167 { cpumMsrRd_Ia32VmxTruePinbasedCtls },
5168 { cpumMsrRd_Ia32VmxTrueProcbasedCtls },
5169 { cpumMsrRd_Ia32VmxTrueExitCtls },
5170 { cpumMsrRd_Ia32VmxTrueEntryCtls },
5171 { cpumMsrRd_Ia32VmxVmFunc },
5172 { cpumMsrRd_Ia32SpecCtrl },
5173 { cpumMsrRd_Ia32ArchCapabilities },
5174
5175 { cpumMsrRd_Amd64Efer },
5176 { cpumMsrRd_Amd64SyscallTarget },
5177 { cpumMsrRd_Amd64LongSyscallTarget },
5178 { cpumMsrRd_Amd64CompSyscallTarget },
5179 { cpumMsrRd_Amd64SyscallFlagMask },
5180 { cpumMsrRd_Amd64FsBase },
5181 { cpumMsrRd_Amd64GsBase },
5182 { cpumMsrRd_Amd64KernelGsBase },
5183 { cpumMsrRd_Amd64TscAux },
5184
5185 { cpumMsrRd_IntelEblCrPowerOn },
5186 { cpumMsrRd_IntelI7CoreThreadCount },
5187 { cpumMsrRd_IntelP4EbcHardPowerOn },
5188 { cpumMsrRd_IntelP4EbcSoftPowerOn },
5189 { cpumMsrRd_IntelP4EbcFrequencyId },
5190 { cpumMsrRd_IntelP6FsbFrequency },
5191 { cpumMsrRd_IntelPlatformInfo },
5192 { cpumMsrRd_IntelFlexRatio },
5193 { cpumMsrRd_IntelPkgCStConfigControl },
5194 { cpumMsrRd_IntelPmgIoCaptureBase },
5195 { cpumMsrRd_IntelLastBranchFromToN },
5196 { cpumMsrRd_IntelLastBranchFromN },
5197 { cpumMsrRd_IntelLastBranchToN },
5198 { cpumMsrRd_IntelLastBranchTos },
5199 { cpumMsrRd_IntelBblCrCtl },
5200 { cpumMsrRd_IntelBblCrCtl3 },
5201 { cpumMsrRd_IntelI7TemperatureTarget },
5202 { cpumMsrRd_IntelI7MsrOffCoreResponseN },
5203 { cpumMsrRd_IntelI7MiscPwrMgmt },
5204 { cpumMsrRd_IntelP6CrN },
5205 { cpumMsrRd_IntelCpuId1FeatureMaskEcdx },
5206 { cpumMsrRd_IntelCpuId1FeatureMaskEax },
5207 { cpumMsrRd_IntelCpuId80000001FeatureMaskEcdx },
5208 { cpumMsrRd_IntelI7SandyAesNiCtl },
5209 { cpumMsrRd_IntelI7TurboRatioLimit },
5210 { cpumMsrRd_IntelI7LbrSelect },
5211 { cpumMsrRd_IntelI7SandyErrorControl },
5212 { cpumMsrRd_IntelI7VirtualLegacyWireCap },
5213 { cpumMsrRd_IntelI7PowerCtl },
5214 { cpumMsrRd_IntelI7SandyPebsNumAlt },
5215 { cpumMsrRd_IntelI7PebsLdLat },
5216 { cpumMsrRd_IntelI7PkgCnResidencyN },
5217 { cpumMsrRd_IntelI7CoreCnResidencyN },
5218 { cpumMsrRd_IntelI7SandyVrCurrentConfig },
5219 { cpumMsrRd_IntelI7SandyVrMiscConfig },
5220 { cpumMsrRd_IntelI7SandyRaplPowerUnit },
5221 { cpumMsrRd_IntelI7SandyPkgCnIrtlN },
5222 { cpumMsrRd_IntelI7SandyPkgC2Residency },
5223 { cpumMsrRd_IntelI7RaplPkgPowerLimit },
5224 { cpumMsrRd_IntelI7RaplPkgEnergyStatus },
5225 { cpumMsrRd_IntelI7RaplPkgPerfStatus },
5226 { cpumMsrRd_IntelI7RaplPkgPowerInfo },
5227 { cpumMsrRd_IntelI7RaplDramPowerLimit },
5228 { cpumMsrRd_IntelI7RaplDramEnergyStatus },
5229 { cpumMsrRd_IntelI7RaplDramPerfStatus },
5230 { cpumMsrRd_IntelI7RaplDramPowerInfo },
5231 { cpumMsrRd_IntelI7RaplPp0PowerLimit },
5232 { cpumMsrRd_IntelI7RaplPp0EnergyStatus },
5233 { cpumMsrRd_IntelI7RaplPp0Policy },
5234 { cpumMsrRd_IntelI7RaplPp0PerfStatus },
5235 { cpumMsrRd_IntelI7RaplPp1PowerLimit },
5236 { cpumMsrRd_IntelI7RaplPp1EnergyStatus },
5237 { cpumMsrRd_IntelI7RaplPp1Policy },
5238 { cpumMsrRd_IntelI7IvyConfigTdpNominal },
5239 { cpumMsrRd_IntelI7IvyConfigTdpLevel1 },
5240 { cpumMsrRd_IntelI7IvyConfigTdpLevel2 },
5241 { cpumMsrRd_IntelI7IvyConfigTdpControl },
5242 { cpumMsrRd_IntelI7IvyTurboActivationRatio },
5243 { cpumMsrRd_IntelI7UncPerfGlobalCtrl },
5244 { cpumMsrRd_IntelI7UncPerfGlobalStatus },
5245 { cpumMsrRd_IntelI7UncPerfGlobalOvfCtrl },
5246 { cpumMsrRd_IntelI7UncPerfFixedCtrCtrl },
5247 { cpumMsrRd_IntelI7UncPerfFixedCtr },
5248 { cpumMsrRd_IntelI7UncCBoxConfig },
5249 { cpumMsrRd_IntelI7UncArbPerfCtrN },
5250 { cpumMsrRd_IntelI7UncArbPerfEvtSelN },
5251 { cpumMsrRd_IntelI7SmiCount },
5252 { cpumMsrRd_IntelCore2EmttmCrTablesN },
5253 { cpumMsrRd_IntelCore2SmmCStMiscInfo },
5254 { cpumMsrRd_IntelCore1ExtConfig },
5255 { cpumMsrRd_IntelCore1DtsCalControl },
5256 { cpumMsrRd_IntelCore2PeciControl },
5257 { cpumMsrRd_IntelAtSilvCoreC1Recidency },
5258
5259 { cpumMsrRd_P6LastBranchFromIp },
5260 { cpumMsrRd_P6LastBranchToIp },
5261 { cpumMsrRd_P6LastIntFromIp },
5262 { cpumMsrRd_P6LastIntToIp },
5263
5264 { cpumMsrRd_AmdFam15hTscRate },
5265 { cpumMsrRd_AmdFam15hLwpCfg },
5266 { cpumMsrRd_AmdFam15hLwpCbAddr },
5267 { cpumMsrRd_AmdFam10hMc4MiscN },
5268 { cpumMsrRd_AmdK8PerfCtlN },
5269 { cpumMsrRd_AmdK8PerfCtrN },
5270 { cpumMsrRd_AmdK8SysCfg },
5271 { cpumMsrRd_AmdK8HwCr },
5272 { cpumMsrRd_AmdK8IorrBaseN },
5273 { cpumMsrRd_AmdK8IorrMaskN },
5274 { cpumMsrRd_AmdK8TopOfMemN },
5275 { cpumMsrRd_AmdK8NbCfg1 },
5276 { cpumMsrRd_AmdK8McXcptRedir },
5277 { cpumMsrRd_AmdK8CpuNameN },
5278 { cpumMsrRd_AmdK8HwThermalCtrl },
5279 { cpumMsrRd_AmdK8SwThermalCtrl },
5280 { cpumMsrRd_AmdK8FidVidControl },
5281 { cpumMsrRd_AmdK8FidVidStatus },
5282 { cpumMsrRd_AmdK8McCtlMaskN },
5283 { cpumMsrRd_AmdK8SmiOnIoTrapN },
5284 { cpumMsrRd_AmdK8SmiOnIoTrapCtlSts },
5285 { cpumMsrRd_AmdK8IntPendingMessage },
5286 { cpumMsrRd_AmdK8SmiTriggerIoCycle },
5287 { cpumMsrRd_AmdFam10hMmioCfgBaseAddr },
5288 { cpumMsrRd_AmdFam10hTrapCtlMaybe },
5289 { cpumMsrRd_AmdFam10hPStateCurLimit },
5290 { cpumMsrRd_AmdFam10hPStateControl },
5291 { cpumMsrRd_AmdFam10hPStateStatus },
5292 { cpumMsrRd_AmdFam10hPStateN },
5293 { cpumMsrRd_AmdFam10hCofVidControl },
5294 { cpumMsrRd_AmdFam10hCofVidStatus },
5295 { cpumMsrRd_AmdFam10hCStateIoBaseAddr },
5296 { cpumMsrRd_AmdFam10hCpuWatchdogTimer },
5297 { cpumMsrRd_AmdK8SmmBase },
5298 { cpumMsrRd_AmdK8SmmAddr },
5299 { cpumMsrRd_AmdK8SmmMask },
5300 { cpumMsrRd_AmdK8VmCr },
5301 { cpumMsrRd_AmdK8IgnNe },
5302 { cpumMsrRd_AmdK8SmmCtl },
5303 { cpumMsrRd_AmdK8VmHSavePa },
5304 { cpumMsrRd_AmdFam10hVmLockKey },
5305 { cpumMsrRd_AmdFam10hSmmLockKey },
5306 { cpumMsrRd_AmdFam10hLocalSmiStatus },
5307 { cpumMsrRd_AmdFam10hOsVisWrkIdLength },
5308 { cpumMsrRd_AmdFam10hOsVisWrkStatus },
5309 { cpumMsrRd_AmdFam16hL2IPerfCtlN },
5310 { cpumMsrRd_AmdFam16hL2IPerfCtrN },
5311 { cpumMsrRd_AmdFam15hNorthbridgePerfCtlN },
5312 { cpumMsrRd_AmdFam15hNorthbridgePerfCtrN },
5313 { cpumMsrRd_AmdK7MicrocodeCtl },
5314 { cpumMsrRd_AmdK7ClusterIdMaybe },
5315 { cpumMsrRd_AmdK8CpuIdCtlStd07hEbax },
5316 { cpumMsrRd_AmdK8CpuIdCtlStd06hEcx },
5317 { cpumMsrRd_AmdK8CpuIdCtlStd01hEdcx },
5318 { cpumMsrRd_AmdK8CpuIdCtlExt01hEdcx },
5319 { cpumMsrRd_AmdK8PatchLevel },
5320 { cpumMsrRd_AmdK7DebugStatusMaybe },
5321 { cpumMsrRd_AmdK7BHTraceBaseMaybe },
5322 { cpumMsrRd_AmdK7BHTracePtrMaybe },
5323 { cpumMsrRd_AmdK7BHTraceLimitMaybe },
5324 { cpumMsrRd_AmdK7HardwareDebugToolCfgMaybe },
5325 { cpumMsrRd_AmdK7FastFlushCountMaybe },
5326 { cpumMsrRd_AmdK7NodeId },
5327 { cpumMsrRd_AmdK7DrXAddrMaskN },
5328 { cpumMsrRd_AmdK7Dr0DataMatchMaybe },
5329 { cpumMsrRd_AmdK7Dr0DataMaskMaybe },
5330 { cpumMsrRd_AmdK7LoadStoreCfg },
5331 { cpumMsrRd_AmdK7InstrCacheCfg },
5332 { cpumMsrRd_AmdK7DataCacheCfg },
5333 { cpumMsrRd_AmdK7BusUnitCfg },
5334 { cpumMsrRd_AmdK7DebugCtl2Maybe },
5335 { cpumMsrRd_AmdFam15hFpuCfg },
5336 { cpumMsrRd_AmdFam15hDecoderCfg },
5337 { cpumMsrRd_AmdFam10hBusUnitCfg2 },
5338 { cpumMsrRd_AmdFam15hCombUnitCfg },
5339 { cpumMsrRd_AmdFam15hCombUnitCfg2 },
5340 { cpumMsrRd_AmdFam15hCombUnitCfg3 },
5341 { cpumMsrRd_AmdFam15hExecUnitCfg },
5342 { cpumMsrRd_AmdFam15hLoadStoreCfg2 },
5343 { cpumMsrRd_AmdFam10hIbsFetchCtl },
5344 { cpumMsrRd_AmdFam10hIbsFetchLinAddr },
5345 { cpumMsrRd_AmdFam10hIbsFetchPhysAddr },
5346 { cpumMsrRd_AmdFam10hIbsOpExecCtl },
5347 { cpumMsrRd_AmdFam10hIbsOpRip },
5348 { cpumMsrRd_AmdFam10hIbsOpData },
5349 { cpumMsrRd_AmdFam10hIbsOpData2 },
5350 { cpumMsrRd_AmdFam10hIbsOpData3 },
5351 { cpumMsrRd_AmdFam10hIbsDcLinAddr },
5352 { cpumMsrRd_AmdFam10hIbsDcPhysAddr },
5353 { cpumMsrRd_AmdFam10hIbsCtl },
5354 { cpumMsrRd_AmdFam14hIbsBrTarget },
5355
5356 { cpumMsrRd_Gim },
5357};
5358
5359
5360/**
5361 * MSR write function table.
5362 */
5363static const struct WRITEMSRCLANG11WEIRDNOTHROW { PFNCPUMWRMSR pfnWrMsr; } g_aCpumWrMsrFns[kCpumMsrWrFn_End] =
5364{
5365 { NULL }, /* Invalid */
5366 { cpumMsrWr_IgnoreWrite },
5367 { cpumMsrWr_ReadOnly },
5368 { NULL }, /* Alias */
5369 { cpumMsrWr_Ia32P5McAddr },
5370 { cpumMsrWr_Ia32P5McType },
5371 { cpumMsrWr_Ia32TimestampCounter },
5372 { cpumMsrWr_Ia32ApicBase },
5373 { cpumMsrWr_Ia32FeatureControl },
5374 { cpumMsrWr_Ia32BiosSignId },
5375 { cpumMsrWr_Ia32BiosUpdateTrigger },
5376 { cpumMsrWr_Ia32SmmMonitorCtl },
5377 { cpumMsrWr_Ia32PmcN },
5378 { cpumMsrWr_Ia32MonitorFilterLineSize },
5379 { cpumMsrWr_Ia32MPerf },
5380 { cpumMsrWr_Ia32APerf },
5381 { cpumMsrWr_Ia32MtrrPhysBaseN },
5382 { cpumMsrWr_Ia32MtrrPhysMaskN },
5383 { cpumMsrWr_Ia32MtrrFixed },
5384 { cpumMsrWr_Ia32MtrrDefType },
5385 { cpumMsrWr_Ia32Pat },
5386 { cpumMsrWr_Ia32SysEnterCs },
5387 { cpumMsrWr_Ia32SysEnterEsp },
5388 { cpumMsrWr_Ia32SysEnterEip },
5389 { cpumMsrWr_Ia32McgStatus },
5390 { cpumMsrWr_Ia32McgCtl },
5391 { cpumMsrWr_Ia32DebugCtl },
5392 { cpumMsrWr_Ia32SmrrPhysBase },
5393 { cpumMsrWr_Ia32SmrrPhysMask },
5394 { cpumMsrWr_Ia32PlatformDcaCap },
5395 { cpumMsrWr_Ia32Dca0Cap },
5396 { cpumMsrWr_Ia32PerfEvtSelN },
5397 { cpumMsrWr_Ia32PerfStatus },
5398 { cpumMsrWr_Ia32PerfCtl },
5399 { cpumMsrWr_Ia32FixedCtrN },
5400 { cpumMsrWr_Ia32PerfCapabilities },
5401 { cpumMsrWr_Ia32FixedCtrCtrl },
5402 { cpumMsrWr_Ia32PerfGlobalStatus },
5403 { cpumMsrWr_Ia32PerfGlobalCtrl },
5404 { cpumMsrWr_Ia32PerfGlobalOvfCtrl },
5405 { cpumMsrWr_Ia32PebsEnable },
5406 { cpumMsrWr_Ia32ClockModulation },
5407 { cpumMsrWr_Ia32ThermInterrupt },
5408 { cpumMsrWr_Ia32ThermStatus },
5409 { cpumMsrWr_Ia32Therm2Ctl },
5410 { cpumMsrWr_Ia32MiscEnable },
5411 { cpumMsrWr_Ia32McCtlStatusAddrMiscN },
5412 { cpumMsrWr_Ia32McNCtl2 },
5413 { cpumMsrWr_Ia32DsArea },
5414 { cpumMsrWr_Ia32TscDeadline },
5415 { cpumMsrWr_Ia32X2ApicN },
5416 { cpumMsrWr_Ia32DebugInterface },
5417 { cpumMsrWr_Ia32SpecCtrl },
5418 { cpumMsrWr_Ia32PredCmd },
5419 { cpumMsrWr_Ia32FlushCmd },
5420
5421 { cpumMsrWr_Amd64Efer },
5422 { cpumMsrWr_Amd64SyscallTarget },
5423 { cpumMsrWr_Amd64LongSyscallTarget },
5424 { cpumMsrWr_Amd64CompSyscallTarget },
5425 { cpumMsrWr_Amd64SyscallFlagMask },
5426 { cpumMsrWr_Amd64FsBase },
5427 { cpumMsrWr_Amd64GsBase },
5428 { cpumMsrWr_Amd64KernelGsBase },
5429 { cpumMsrWr_Amd64TscAux },
5430
5431 { cpumMsrWr_IntelEblCrPowerOn },
5432 { cpumMsrWr_IntelP4EbcHardPowerOn },
5433 { cpumMsrWr_IntelP4EbcSoftPowerOn },
5434 { cpumMsrWr_IntelP4EbcFrequencyId },
5435 { cpumMsrWr_IntelFlexRatio },
5436 { cpumMsrWr_IntelPkgCStConfigControl },
5437 { cpumMsrWr_IntelPmgIoCaptureBase },
5438 { cpumMsrWr_IntelLastBranchFromToN },
5439 { cpumMsrWr_IntelLastBranchFromN },
5440 { cpumMsrWr_IntelLastBranchToN },
5441 { cpumMsrWr_IntelLastBranchTos },
5442 { cpumMsrWr_IntelBblCrCtl },
5443 { cpumMsrWr_IntelBblCrCtl3 },
5444 { cpumMsrWr_IntelI7TemperatureTarget },
5445 { cpumMsrWr_IntelI7MsrOffCoreResponseN },
5446 { cpumMsrWr_IntelI7MiscPwrMgmt },
5447 { cpumMsrWr_IntelP6CrN },
5448 { cpumMsrWr_IntelCpuId1FeatureMaskEcdx },
5449 { cpumMsrWr_IntelCpuId1FeatureMaskEax },
5450 { cpumMsrWr_IntelCpuId80000001FeatureMaskEcdx },
5451 { cpumMsrWr_IntelI7SandyAesNiCtl },
5452 { cpumMsrWr_IntelI7TurboRatioLimit },
5453 { cpumMsrWr_IntelI7LbrSelect },
5454 { cpumMsrWr_IntelI7SandyErrorControl },
5455 { cpumMsrWr_IntelI7PowerCtl },
5456 { cpumMsrWr_IntelI7SandyPebsNumAlt },
5457 { cpumMsrWr_IntelI7PebsLdLat },
5458 { cpumMsrWr_IntelI7SandyVrCurrentConfig },
5459 { cpumMsrWr_IntelI7SandyVrMiscConfig },
5460 { cpumMsrWr_IntelI7SandyRaplPowerUnit },
5461 { cpumMsrWr_IntelI7SandyPkgCnIrtlN },
5462 { cpumMsrWr_IntelI7SandyPkgC2Residency },
5463 { cpumMsrWr_IntelI7RaplPkgPowerLimit },
5464 { cpumMsrWr_IntelI7RaplDramPowerLimit },
5465 { cpumMsrWr_IntelI7RaplPp0PowerLimit },
5466 { cpumMsrWr_IntelI7RaplPp0Policy },
5467 { cpumMsrWr_IntelI7RaplPp1PowerLimit },
5468 { cpumMsrWr_IntelI7RaplPp1Policy },
5469 { cpumMsrWr_IntelI7IvyConfigTdpControl },
5470 { cpumMsrWr_IntelI7IvyTurboActivationRatio },
5471 { cpumMsrWr_IntelI7UncPerfGlobalCtrl },
5472 { cpumMsrWr_IntelI7UncPerfGlobalStatus },
5473 { cpumMsrWr_IntelI7UncPerfGlobalOvfCtrl },
5474 { cpumMsrWr_IntelI7UncPerfFixedCtrCtrl },
5475 { cpumMsrWr_IntelI7UncPerfFixedCtr },
5476 { cpumMsrWr_IntelI7UncArbPerfCtrN },
5477 { cpumMsrWr_IntelI7UncArbPerfEvtSelN },
5478 { cpumMsrWr_IntelCore2EmttmCrTablesN },
5479 { cpumMsrWr_IntelCore2SmmCStMiscInfo },
5480 { cpumMsrWr_IntelCore1ExtConfig },
5481 { cpumMsrWr_IntelCore1DtsCalControl },
5482 { cpumMsrWr_IntelCore2PeciControl },
5483
5484 { cpumMsrWr_P6LastIntFromIp },
5485 { cpumMsrWr_P6LastIntToIp },
5486
5487 { cpumMsrWr_AmdFam15hTscRate },
5488 { cpumMsrWr_AmdFam15hLwpCfg },
5489 { cpumMsrWr_AmdFam15hLwpCbAddr },
5490 { cpumMsrWr_AmdFam10hMc4MiscN },
5491 { cpumMsrWr_AmdK8PerfCtlN },
5492 { cpumMsrWr_AmdK8PerfCtrN },
5493 { cpumMsrWr_AmdK8SysCfg },
5494 { cpumMsrWr_AmdK8HwCr },
5495 { cpumMsrWr_AmdK8IorrBaseN },
5496 { cpumMsrWr_AmdK8IorrMaskN },
5497 { cpumMsrWr_AmdK8TopOfMemN },
5498 { cpumMsrWr_AmdK8NbCfg1 },
5499 { cpumMsrWr_AmdK8McXcptRedir },
5500 { cpumMsrWr_AmdK8CpuNameN },
5501 { cpumMsrWr_AmdK8HwThermalCtrl },
5502 { cpumMsrWr_AmdK8SwThermalCtrl },
5503 { cpumMsrWr_AmdK8FidVidControl },
5504 { cpumMsrWr_AmdK8McCtlMaskN },
5505 { cpumMsrWr_AmdK8SmiOnIoTrapN },
5506 { cpumMsrWr_AmdK8SmiOnIoTrapCtlSts },
5507 { cpumMsrWr_AmdK8IntPendingMessage },
5508 { cpumMsrWr_AmdK8SmiTriggerIoCycle },
5509 { cpumMsrWr_AmdFam10hMmioCfgBaseAddr },
5510 { cpumMsrWr_AmdFam10hTrapCtlMaybe },
5511 { cpumMsrWr_AmdFam10hPStateControl },
5512 { cpumMsrWr_AmdFam10hPStateStatus },
5513 { cpumMsrWr_AmdFam10hPStateN },
5514 { cpumMsrWr_AmdFam10hCofVidControl },
5515 { cpumMsrWr_AmdFam10hCofVidStatus },
5516 { cpumMsrWr_AmdFam10hCStateIoBaseAddr },
5517 { cpumMsrWr_AmdFam10hCpuWatchdogTimer },
5518 { cpumMsrWr_AmdK8SmmBase },
5519 { cpumMsrWr_AmdK8SmmAddr },
5520 { cpumMsrWr_AmdK8SmmMask },
5521 { cpumMsrWr_AmdK8VmCr },
5522 { cpumMsrWr_AmdK8IgnNe },
5523 { cpumMsrWr_AmdK8SmmCtl },
5524 { cpumMsrWr_AmdK8VmHSavePa },
5525 { cpumMsrWr_AmdFam10hVmLockKey },
5526 { cpumMsrWr_AmdFam10hSmmLockKey },
5527 { cpumMsrWr_AmdFam10hLocalSmiStatus },
5528 { cpumMsrWr_AmdFam10hOsVisWrkIdLength },
5529 { cpumMsrWr_AmdFam10hOsVisWrkStatus },
5530 { cpumMsrWr_AmdFam16hL2IPerfCtlN },
5531 { cpumMsrWr_AmdFam16hL2IPerfCtrN },
5532 { cpumMsrWr_AmdFam15hNorthbridgePerfCtlN },
5533 { cpumMsrWr_AmdFam15hNorthbridgePerfCtrN },
5534 { cpumMsrWr_AmdK7MicrocodeCtl },
5535 { cpumMsrWr_AmdK7ClusterIdMaybe },
5536 { cpumMsrWr_AmdK8CpuIdCtlStd07hEbax },
5537 { cpumMsrWr_AmdK8CpuIdCtlStd06hEcx },
5538 { cpumMsrWr_AmdK8CpuIdCtlStd01hEdcx },
5539 { cpumMsrWr_AmdK8CpuIdCtlExt01hEdcx },
5540 { cpumMsrWr_AmdK8PatchLoader },
5541 { cpumMsrWr_AmdK7DebugStatusMaybe },
5542 { cpumMsrWr_AmdK7BHTraceBaseMaybe },
5543 { cpumMsrWr_AmdK7BHTracePtrMaybe },
5544 { cpumMsrWr_AmdK7BHTraceLimitMaybe },
5545 { cpumMsrWr_AmdK7HardwareDebugToolCfgMaybe },
5546 { cpumMsrWr_AmdK7FastFlushCountMaybe },
5547 { cpumMsrWr_AmdK7NodeId },
5548 { cpumMsrWr_AmdK7DrXAddrMaskN },
5549 { cpumMsrWr_AmdK7Dr0DataMatchMaybe },
5550 { cpumMsrWr_AmdK7Dr0DataMaskMaybe },
5551 { cpumMsrWr_AmdK7LoadStoreCfg },
5552 { cpumMsrWr_AmdK7InstrCacheCfg },
5553 { cpumMsrWr_AmdK7DataCacheCfg },
5554 { cpumMsrWr_AmdK7BusUnitCfg },
5555 { cpumMsrWr_AmdK7DebugCtl2Maybe },
5556 { cpumMsrWr_AmdFam15hFpuCfg },
5557 { cpumMsrWr_AmdFam15hDecoderCfg },
5558 { cpumMsrWr_AmdFam10hBusUnitCfg2 },
5559 { cpumMsrWr_AmdFam15hCombUnitCfg },
5560 { cpumMsrWr_AmdFam15hCombUnitCfg2 },
5561 { cpumMsrWr_AmdFam15hCombUnitCfg3 },
5562 { cpumMsrWr_AmdFam15hExecUnitCfg },
5563 { cpumMsrWr_AmdFam15hLoadStoreCfg2 },
5564 { cpumMsrWr_AmdFam10hIbsFetchCtl },
5565 { cpumMsrWr_AmdFam10hIbsFetchLinAddr },
5566 { cpumMsrWr_AmdFam10hIbsFetchPhysAddr },
5567 { cpumMsrWr_AmdFam10hIbsOpExecCtl },
5568 { cpumMsrWr_AmdFam10hIbsOpRip },
5569 { cpumMsrWr_AmdFam10hIbsOpData },
5570 { cpumMsrWr_AmdFam10hIbsOpData2 },
5571 { cpumMsrWr_AmdFam10hIbsOpData3 },
5572 { cpumMsrWr_AmdFam10hIbsDcLinAddr },
5573 { cpumMsrWr_AmdFam10hIbsDcPhysAddr },
5574 { cpumMsrWr_AmdFam10hIbsCtl },
5575 { cpumMsrWr_AmdFam14hIbsBrTarget },
5576
5577 { cpumMsrWr_Gim },
5578};
5579
5580
5581/**
5582 * Looks up the range for the given MSR.
5583 *
5584 * @returns Pointer to the range if found, NULL if not.
5585 * @param pVM The cross context VM structure.
5586 * @param idMsr The MSR to look up.
5587 */
5588# ifndef IN_RING3
5589static
5590# endif
5591PCPUMMSRRANGE cpumLookupMsrRange(PVM pVM, uint32_t idMsr)
5592{
5593 /*
5594 * Binary lookup.
5595 */
5596 uint32_t cRanges = RT_MIN(pVM->cpum.s.GuestInfo.cMsrRanges, RT_ELEMENTS(pVM->cpum.s.GuestInfo.aMsrRanges));
5597 if (!cRanges)
5598 return NULL;
5599 PCPUMMSRRANGE paRanges = pVM->cpum.s.GuestInfo.aMsrRanges;
5600 for (;;)
5601 {
5602 uint32_t i = cRanges / 2;
5603 if (idMsr < paRanges[i].uFirst)
5604 {
5605 if (i == 0)
5606 break;
5607 cRanges = i;
5608 }
5609 else if (idMsr > paRanges[i].uLast)
5610 {
5611 i++;
5612 if (i >= cRanges)
5613 break;
5614 cRanges -= i;
5615 paRanges = &paRanges[i];
5616 }
5617 else
5618 {
5619 if (paRanges[i].enmRdFn == kCpumMsrRdFn_MsrAlias)
5620 return cpumLookupMsrRange(pVM, paRanges[i].uValue);
5621 return &paRanges[i];
5622 }
5623 }
5624
5625# ifdef VBOX_STRICT
5626 /*
5627 * Linear lookup to verify the above binary search.
5628 */
5629 uint32_t cLeft = RT_MIN(pVM->cpum.s.GuestInfo.cMsrRanges, RT_ELEMENTS(pVM->cpum.s.GuestInfo.aMsrRanges));
5630 PCPUMMSRRANGE pCur = pVM->cpum.s.GuestInfo.aMsrRanges;
5631 while (cLeft-- > 0)
5632 {
5633 if (idMsr >= pCur->uFirst && idMsr <= pCur->uLast)
5634 {
5635 AssertFailed();
5636 if (pCur->enmRdFn == kCpumMsrRdFn_MsrAlias)
5637 return cpumLookupMsrRange(pVM, pCur->uValue);
5638 return pCur;
5639 }
5640 pCur++;
5641 }
5642# endif
5643 return NULL;
5644}
5645
5646
5647/**
5648 * Query a guest MSR.
5649 *
5650 * The caller is responsible for checking privilege if the call is the result of
5651 * a RDMSR instruction. We'll do the rest.
5652 *
5653 * @retval VINF_SUCCESS on success.
5654 * @retval VINF_CPUM_R3_MSR_READ if the MSR read could not be serviced in the
5655 * current context (raw-mode or ring-0).
5656 * @retval VERR_CPUM_RAISE_GP_0 on failure (invalid MSR), the caller is
5657 * expected to take the appropriate actions. @a *puValue is set to 0.
5658 * @param pVCpu The cross context virtual CPU structure.
5659 * @param idMsr The MSR.
5660 * @param puValue Where to return the value.
5661 *
5662 * @remarks This will always return the right values, even when we're in the
5663 * recompiler.
5664 */
5665VMMDECL(VBOXSTRICTRC) CPUMQueryGuestMsr(PVMCPUCC pVCpu, uint32_t idMsr, uint64_t *puValue)
5666{
5667 *puValue = 0;
5668
5669 VBOXSTRICTRC rcStrict;
5670 PVM pVM = pVCpu->CTX_SUFF(pVM);
5671 PCPUMMSRRANGE pRange = cpumLookupMsrRange(pVM, idMsr);
5672 if (pRange)
5673 {
5674 CPUMMSRRDFN enmRdFn = (CPUMMSRRDFN)pRange->enmRdFn;
5675 AssertReturn(enmRdFn > kCpumMsrRdFn_Invalid && enmRdFn < kCpumMsrRdFn_End, VERR_CPUM_IPE_1);
5676
5677 PFNCPUMRDMSR pfnRdMsr = g_aCpumRdMsrFns[enmRdFn].pfnRdMsr;
5678 AssertReturn(pfnRdMsr, VERR_CPUM_IPE_2);
5679
5680 STAM_COUNTER_INC(&pRange->cReads);
5681 STAM_REL_COUNTER_INC(&pVM->cpum.s.cMsrReads);
5682
5683 rcStrict = pfnRdMsr(pVCpu, idMsr, pRange, puValue);
5684 if (rcStrict == VINF_SUCCESS)
5685 Log2(("CPUM: RDMSR %#x (%s) -> %#llx\n", idMsr, pRange->szName, *puValue));
5686 else if (rcStrict == VERR_CPUM_RAISE_GP_0)
5687 {
5688 Log(("CPUM: RDMSR %#x (%s) -> #GP(0)\n", idMsr, pRange->szName));
5689 STAM_COUNTER_INC(&pRange->cGps);
5690 STAM_REL_COUNTER_INC(&pVM->cpum.s.cMsrReadsRaiseGp);
5691 }
5692#ifndef IN_RING3
5693 else if (rcStrict == VINF_CPUM_R3_MSR_READ)
5694 Log(("CPUM: RDMSR %#x (%s) -> ring-3\n", idMsr, pRange->szName));
5695#endif
5696 else
5697 {
5698 Log(("CPUM: RDMSR %#x (%s) -> rcStrict=%Rrc\n", idMsr, pRange->szName, VBOXSTRICTRC_VAL(rcStrict)));
5699 AssertMsgStmt(RT_FAILURE_NP(rcStrict), ("%Rrc idMsr=%#x\n", VBOXSTRICTRC_VAL(rcStrict), idMsr),
5700 rcStrict = VERR_IPE_UNEXPECTED_INFO_STATUS);
5701 Assert(rcStrict != VERR_EM_INTERPRETER);
5702 }
5703 }
5704 else
5705 {
5706 Log(("CPUM: Unknown RDMSR %#x -> #GP(0)\n", idMsr));
5707 STAM_REL_COUNTER_INC(&pVM->cpum.s.cMsrReads);
5708 STAM_REL_COUNTER_INC(&pVM->cpum.s.cMsrReadsUnknown);
5709 rcStrict = VERR_CPUM_RAISE_GP_0;
5710 }
5711 return rcStrict;
5712}
5713
5714
5715/**
5716 * Writes to a guest MSR.
5717 *
5718 * The caller is responsible for checking privilege if the call is the result of
5719 * a WRMSR instruction. We'll do the rest.
5720 *
5721 * @retval VINF_SUCCESS on success.
5722 * @retval VINF_CPUM_R3_MSR_WRITE if the MSR write could not be serviced in the
5723 * current context (raw-mode or ring-0).
5724 * @retval VERR_CPUM_RAISE_GP_0 on failure, the caller is expected to take the
5725 * appropriate actions.
5726 *
5727 * @param pVCpu The cross context virtual CPU structure.
5728 * @param idMsr The MSR id.
5729 * @param uValue The value to set.
5730 *
5731 * @remarks Everyone changing MSR values, including the recompiler, shall do it
5732 * by calling this method. This makes sure we have current values and
5733 * that we trigger all the right actions when something changes.
5734 *
5735 * For performance reasons, this actually isn't entirely true for some
5736 * MSRs when in HM mode. The code here and in HM must be aware of
5737 * this.
5738 */
5739VMMDECL(VBOXSTRICTRC) CPUMSetGuestMsr(PVMCPUCC pVCpu, uint32_t idMsr, uint64_t uValue)
5740{
5741 VBOXSTRICTRC rcStrict;
5742 PVM pVM = pVCpu->CTX_SUFF(pVM);
5743 PCPUMMSRRANGE pRange = cpumLookupMsrRange(pVM, idMsr);
5744 if (pRange)
5745 {
5746 STAM_COUNTER_INC(&pRange->cWrites);
5747 STAM_REL_COUNTER_INC(&pVM->cpum.s.cMsrWrites);
5748
5749 if (!(uValue & pRange->fWrGpMask))
5750 {
5751 CPUMMSRWRFN enmWrFn = (CPUMMSRWRFN)pRange->enmWrFn;
5752 AssertReturn(enmWrFn > kCpumMsrWrFn_Invalid && enmWrFn < kCpumMsrWrFn_End, VERR_CPUM_IPE_1);
5753
5754 PFNCPUMWRMSR pfnWrMsr = g_aCpumWrMsrFns[enmWrFn].pfnWrMsr;
5755 AssertReturn(pfnWrMsr, VERR_CPUM_IPE_2);
5756
5757 uint64_t uValueAdjusted = uValue & ~pRange->fWrIgnMask;
5758 if (uValueAdjusted != uValue)
5759 {
5760 STAM_COUNTER_INC(&pRange->cIgnoredBits);
5761 STAM_REL_COUNTER_INC(&pVM->cpum.s.cMsrWritesToIgnoredBits);
5762 }
5763
5764 rcStrict = pfnWrMsr(pVCpu, idMsr, pRange, uValueAdjusted, uValue);
5765 if (rcStrict == VINF_SUCCESS)
5766 Log2(("CPUM: WRMSR %#x (%s), %#llx [%#llx]\n", idMsr, pRange->szName, uValueAdjusted, uValue));
5767 else if (rcStrict == VERR_CPUM_RAISE_GP_0)
5768 {
5769 Log(("CPUM: WRMSR %#x (%s), %#llx [%#llx] -> #GP(0)\n", idMsr, pRange->szName, uValueAdjusted, uValue));
5770 STAM_COUNTER_INC(&pRange->cGps);
5771 STAM_REL_COUNTER_INC(&pVM->cpum.s.cMsrWritesRaiseGp);
5772 }
5773#ifndef IN_RING3
5774 else if (rcStrict == VINF_CPUM_R3_MSR_WRITE)
5775 Log(("CPUM: WRMSR %#x (%s), %#llx [%#llx] -> ring-3\n", idMsr, pRange->szName, uValueAdjusted, uValue));
5776#endif
5777 else
5778 {
5779 Log(("CPUM: WRMSR %#x (%s), %#llx [%#llx] -> rcStrict=%Rrc\n",
5780 idMsr, pRange->szName, uValueAdjusted, uValue, VBOXSTRICTRC_VAL(rcStrict)));
5781 AssertMsgStmt(RT_FAILURE_NP(rcStrict), ("%Rrc idMsr=%#x\n", VBOXSTRICTRC_VAL(rcStrict), idMsr),
5782 rcStrict = VERR_IPE_UNEXPECTED_INFO_STATUS);
5783 Assert(rcStrict != VERR_EM_INTERPRETER);
5784 }
5785 }
5786 else
5787 {
5788 Log(("CPUM: WRMSR %#x (%s), %#llx -> #GP(0) - invalid bits %#llx\n",
5789 idMsr, pRange->szName, uValue, uValue & pRange->fWrGpMask));
5790 STAM_COUNTER_INC(&pRange->cGps);
5791 STAM_REL_COUNTER_INC(&pVM->cpum.s.cMsrWritesRaiseGp);
5792 rcStrict = VERR_CPUM_RAISE_GP_0;
5793 }
5794 }
5795 else
5796 {
5797 Log(("CPUM: Unknown WRMSR %#x, %#llx -> #GP(0)\n", idMsr, uValue));
5798 STAM_REL_COUNTER_INC(&pVM->cpum.s.cMsrWrites);
5799 STAM_REL_COUNTER_INC(&pVM->cpum.s.cMsrWritesUnknown);
5800 rcStrict = VERR_CPUM_RAISE_GP_0;
5801 }
5802 return rcStrict;
5803}
5804
5805
5806#if defined(VBOX_STRICT) && defined(IN_RING3)
5807/**
5808 * Performs some checks on the static data related to MSRs.
5809 *
5810 * @returns VINF_SUCCESS on success, error on failure.
5811 */
5812int cpumR3MsrStrictInitChecks(void)
5813{
5814#define CPUM_ASSERT_RD_MSR_FN(a_Register) \
5815 AssertReturn(g_aCpumRdMsrFns[kCpumMsrRdFn_##a_Register].pfnRdMsr == cpumMsrRd_##a_Register, VERR_CPUM_IPE_2);
5816#define CPUM_ASSERT_WR_MSR_FN(a_Register) \
5817 AssertReturn(g_aCpumWrMsrFns[kCpumMsrWrFn_##a_Register].pfnWrMsr == cpumMsrWr_##a_Register, VERR_CPUM_IPE_2);
5818
5819 AssertReturn(g_aCpumRdMsrFns[kCpumMsrRdFn_Invalid].pfnRdMsr == NULL, VERR_CPUM_IPE_2);
5820 CPUM_ASSERT_RD_MSR_FN(FixedValue);
5821 CPUM_ASSERT_RD_MSR_FN(WriteOnly);
5822 CPUM_ASSERT_RD_MSR_FN(Ia32P5McAddr);
5823 CPUM_ASSERT_RD_MSR_FN(Ia32P5McType);
5824 CPUM_ASSERT_RD_MSR_FN(Ia32TimestampCounter);
5825 CPUM_ASSERT_RD_MSR_FN(Ia32PlatformId);
5826 CPUM_ASSERT_RD_MSR_FN(Ia32ApicBase);
5827 CPUM_ASSERT_RD_MSR_FN(Ia32FeatureControl);
5828 CPUM_ASSERT_RD_MSR_FN(Ia32BiosSignId);
5829 CPUM_ASSERT_RD_MSR_FN(Ia32SmmMonitorCtl);
5830 CPUM_ASSERT_RD_MSR_FN(Ia32PmcN);
5831 CPUM_ASSERT_RD_MSR_FN(Ia32MonitorFilterLineSize);
5832 CPUM_ASSERT_RD_MSR_FN(Ia32MPerf);
5833 CPUM_ASSERT_RD_MSR_FN(Ia32APerf);
5834 CPUM_ASSERT_RD_MSR_FN(Ia32MtrrCap);
5835 CPUM_ASSERT_RD_MSR_FN(Ia32MtrrPhysBaseN);
5836 CPUM_ASSERT_RD_MSR_FN(Ia32MtrrPhysMaskN);
5837 CPUM_ASSERT_RD_MSR_FN(Ia32MtrrFixed);
5838 CPUM_ASSERT_RD_MSR_FN(Ia32MtrrDefType);
5839 CPUM_ASSERT_RD_MSR_FN(Ia32Pat);
5840 CPUM_ASSERT_RD_MSR_FN(Ia32SysEnterCs);
5841 CPUM_ASSERT_RD_MSR_FN(Ia32SysEnterEsp);
5842 CPUM_ASSERT_RD_MSR_FN(Ia32SysEnterEip);
5843 CPUM_ASSERT_RD_MSR_FN(Ia32McgCap);
5844 CPUM_ASSERT_RD_MSR_FN(Ia32McgStatus);
5845 CPUM_ASSERT_RD_MSR_FN(Ia32McgCtl);
5846 CPUM_ASSERT_RD_MSR_FN(Ia32DebugCtl);
5847 CPUM_ASSERT_RD_MSR_FN(Ia32SmrrPhysBase);
5848 CPUM_ASSERT_RD_MSR_FN(Ia32SmrrPhysMask);
5849 CPUM_ASSERT_RD_MSR_FN(Ia32PlatformDcaCap);
5850 CPUM_ASSERT_RD_MSR_FN(Ia32CpuDcaCap);
5851 CPUM_ASSERT_RD_MSR_FN(Ia32Dca0Cap);
5852 CPUM_ASSERT_RD_MSR_FN(Ia32PerfEvtSelN);
5853 CPUM_ASSERT_RD_MSR_FN(Ia32PerfStatus);
5854 CPUM_ASSERT_RD_MSR_FN(Ia32PerfCtl);
5855 CPUM_ASSERT_RD_MSR_FN(Ia32FixedCtrN);
5856 CPUM_ASSERT_RD_MSR_FN(Ia32PerfCapabilities);
5857 CPUM_ASSERT_RD_MSR_FN(Ia32FixedCtrCtrl);
5858 CPUM_ASSERT_RD_MSR_FN(Ia32PerfGlobalStatus);
5859 CPUM_ASSERT_RD_MSR_FN(Ia32PerfGlobalCtrl);
5860 CPUM_ASSERT_RD_MSR_FN(Ia32PerfGlobalOvfCtrl);
5861 CPUM_ASSERT_RD_MSR_FN(Ia32PebsEnable);
5862 CPUM_ASSERT_RD_MSR_FN(Ia32ClockModulation);
5863 CPUM_ASSERT_RD_MSR_FN(Ia32ThermInterrupt);
5864 CPUM_ASSERT_RD_MSR_FN(Ia32ThermStatus);
5865 CPUM_ASSERT_RD_MSR_FN(Ia32MiscEnable);
5866 CPUM_ASSERT_RD_MSR_FN(Ia32McCtlStatusAddrMiscN);
5867 CPUM_ASSERT_RD_MSR_FN(Ia32McNCtl2);
5868 CPUM_ASSERT_RD_MSR_FN(Ia32DsArea);
5869 CPUM_ASSERT_RD_MSR_FN(Ia32TscDeadline);
5870 CPUM_ASSERT_RD_MSR_FN(Ia32X2ApicN);
5871 CPUM_ASSERT_RD_MSR_FN(Ia32DebugInterface);
5872 CPUM_ASSERT_RD_MSR_FN(Ia32VmxBasic);
5873 CPUM_ASSERT_RD_MSR_FN(Ia32VmxPinbasedCtls);
5874 CPUM_ASSERT_RD_MSR_FN(Ia32VmxProcbasedCtls);
5875 CPUM_ASSERT_RD_MSR_FN(Ia32VmxExitCtls);
5876 CPUM_ASSERT_RD_MSR_FN(Ia32VmxEntryCtls);
5877 CPUM_ASSERT_RD_MSR_FN(Ia32VmxMisc);
5878 CPUM_ASSERT_RD_MSR_FN(Ia32VmxCr0Fixed0);
5879 CPUM_ASSERT_RD_MSR_FN(Ia32VmxCr0Fixed1);
5880 CPUM_ASSERT_RD_MSR_FN(Ia32VmxCr4Fixed0);
5881 CPUM_ASSERT_RD_MSR_FN(Ia32VmxCr4Fixed1);
5882 CPUM_ASSERT_RD_MSR_FN(Ia32VmxVmcsEnum);
5883 CPUM_ASSERT_RD_MSR_FN(Ia32VmxProcBasedCtls2);
5884 CPUM_ASSERT_RD_MSR_FN(Ia32VmxEptVpidCap);
5885 CPUM_ASSERT_RD_MSR_FN(Ia32VmxTruePinbasedCtls);
5886 CPUM_ASSERT_RD_MSR_FN(Ia32VmxTrueProcbasedCtls);
5887 CPUM_ASSERT_RD_MSR_FN(Ia32VmxTrueExitCtls);
5888 CPUM_ASSERT_RD_MSR_FN(Ia32VmxTrueEntryCtls);
5889 CPUM_ASSERT_RD_MSR_FN(Ia32VmxVmFunc);
5890 CPUM_ASSERT_RD_MSR_FN(Ia32SpecCtrl);
5891 CPUM_ASSERT_RD_MSR_FN(Ia32ArchCapabilities);
5892
5893 CPUM_ASSERT_RD_MSR_FN(Amd64Efer);
5894 CPUM_ASSERT_RD_MSR_FN(Amd64SyscallTarget);
5895 CPUM_ASSERT_RD_MSR_FN(Amd64LongSyscallTarget);
5896 CPUM_ASSERT_RD_MSR_FN(Amd64CompSyscallTarget);
5897 CPUM_ASSERT_RD_MSR_FN(Amd64SyscallFlagMask);
5898 CPUM_ASSERT_RD_MSR_FN(Amd64FsBase);
5899 CPUM_ASSERT_RD_MSR_FN(Amd64GsBase);
5900 CPUM_ASSERT_RD_MSR_FN(Amd64KernelGsBase);
5901 CPUM_ASSERT_RD_MSR_FN(Amd64TscAux);
5902
5903 CPUM_ASSERT_RD_MSR_FN(IntelEblCrPowerOn);
5904 CPUM_ASSERT_RD_MSR_FN(IntelI7CoreThreadCount);
5905 CPUM_ASSERT_RD_MSR_FN(IntelP4EbcHardPowerOn);
5906 CPUM_ASSERT_RD_MSR_FN(IntelP4EbcSoftPowerOn);
5907 CPUM_ASSERT_RD_MSR_FN(IntelP4EbcFrequencyId);
5908 CPUM_ASSERT_RD_MSR_FN(IntelP6FsbFrequency);
5909 CPUM_ASSERT_RD_MSR_FN(IntelPlatformInfo);
5910 CPUM_ASSERT_RD_MSR_FN(IntelFlexRatio);
5911 CPUM_ASSERT_RD_MSR_FN(IntelPkgCStConfigControl);
5912 CPUM_ASSERT_RD_MSR_FN(IntelPmgIoCaptureBase);
5913 CPUM_ASSERT_RD_MSR_FN(IntelLastBranchFromToN);
5914 CPUM_ASSERT_RD_MSR_FN(IntelLastBranchFromN);
5915 CPUM_ASSERT_RD_MSR_FN(IntelLastBranchToN);
5916 CPUM_ASSERT_RD_MSR_FN(IntelLastBranchTos);
5917 CPUM_ASSERT_RD_MSR_FN(IntelBblCrCtl);
5918 CPUM_ASSERT_RD_MSR_FN(IntelBblCrCtl3);
5919 CPUM_ASSERT_RD_MSR_FN(IntelI7TemperatureTarget);
5920 CPUM_ASSERT_RD_MSR_FN(IntelI7MsrOffCoreResponseN);
5921 CPUM_ASSERT_RD_MSR_FN(IntelI7MiscPwrMgmt);
5922 CPUM_ASSERT_RD_MSR_FN(IntelP6CrN);
5923 CPUM_ASSERT_RD_MSR_FN(IntelCpuId1FeatureMaskEcdx);
5924 CPUM_ASSERT_RD_MSR_FN(IntelCpuId1FeatureMaskEax);
5925 CPUM_ASSERT_RD_MSR_FN(IntelCpuId80000001FeatureMaskEcdx);
5926 CPUM_ASSERT_RD_MSR_FN(IntelI7SandyAesNiCtl);
5927 CPUM_ASSERT_RD_MSR_FN(IntelI7TurboRatioLimit);
5928 CPUM_ASSERT_RD_MSR_FN(IntelI7LbrSelect);
5929 CPUM_ASSERT_RD_MSR_FN(IntelI7SandyErrorControl);
5930 CPUM_ASSERT_RD_MSR_FN(IntelI7VirtualLegacyWireCap);
5931 CPUM_ASSERT_RD_MSR_FN(IntelI7PowerCtl);
5932 CPUM_ASSERT_RD_MSR_FN(IntelI7SandyPebsNumAlt);
5933 CPUM_ASSERT_RD_MSR_FN(IntelI7PebsLdLat);
5934 CPUM_ASSERT_RD_MSR_FN(IntelI7PkgCnResidencyN);
5935 CPUM_ASSERT_RD_MSR_FN(IntelI7CoreCnResidencyN);
5936 CPUM_ASSERT_RD_MSR_FN(IntelI7SandyVrCurrentConfig);
5937 CPUM_ASSERT_RD_MSR_FN(IntelI7SandyVrMiscConfig);
5938 CPUM_ASSERT_RD_MSR_FN(IntelI7SandyRaplPowerUnit);
5939 CPUM_ASSERT_RD_MSR_FN(IntelI7SandyPkgCnIrtlN);
5940 CPUM_ASSERT_RD_MSR_FN(IntelI7SandyPkgC2Residency);
5941 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplPkgPowerLimit);
5942 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplPkgEnergyStatus);
5943 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplPkgPerfStatus);
5944 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplPkgPowerInfo);
5945 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplDramPowerLimit);
5946 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplDramEnergyStatus);
5947 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplDramPerfStatus);
5948 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplDramPowerInfo);
5949 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplPp0PowerLimit);
5950 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplPp0EnergyStatus);
5951 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplPp0Policy);
5952 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplPp0PerfStatus);
5953 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplPp1PowerLimit);
5954 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplPp1EnergyStatus);
5955 CPUM_ASSERT_RD_MSR_FN(IntelI7RaplPp1Policy);
5956 CPUM_ASSERT_RD_MSR_FN(IntelI7IvyConfigTdpNominal);
5957 CPUM_ASSERT_RD_MSR_FN(IntelI7IvyConfigTdpLevel1);
5958 CPUM_ASSERT_RD_MSR_FN(IntelI7IvyConfigTdpLevel2);
5959 CPUM_ASSERT_RD_MSR_FN(IntelI7IvyConfigTdpControl);
5960 CPUM_ASSERT_RD_MSR_FN(IntelI7IvyTurboActivationRatio);
5961 CPUM_ASSERT_RD_MSR_FN(IntelI7UncPerfGlobalCtrl);
5962 CPUM_ASSERT_RD_MSR_FN(IntelI7UncPerfGlobalStatus);
5963 CPUM_ASSERT_RD_MSR_FN(IntelI7UncPerfGlobalOvfCtrl);
5964 CPUM_ASSERT_RD_MSR_FN(IntelI7UncPerfFixedCtrCtrl);
5965 CPUM_ASSERT_RD_MSR_FN(IntelI7UncPerfFixedCtr);
5966 CPUM_ASSERT_RD_MSR_FN(IntelI7UncCBoxConfig);
5967 CPUM_ASSERT_RD_MSR_FN(IntelI7UncArbPerfCtrN);
5968 CPUM_ASSERT_RD_MSR_FN(IntelI7UncArbPerfEvtSelN);
5969 CPUM_ASSERT_RD_MSR_FN(IntelI7SmiCount);
5970 CPUM_ASSERT_RD_MSR_FN(IntelCore2EmttmCrTablesN);
5971 CPUM_ASSERT_RD_MSR_FN(IntelCore2SmmCStMiscInfo);
5972 CPUM_ASSERT_RD_MSR_FN(IntelCore1ExtConfig);
5973 CPUM_ASSERT_RD_MSR_FN(IntelCore1DtsCalControl);
5974 CPUM_ASSERT_RD_MSR_FN(IntelCore2PeciControl);
5975 CPUM_ASSERT_RD_MSR_FN(IntelAtSilvCoreC1Recidency);
5976
5977 CPUM_ASSERT_RD_MSR_FN(P6LastBranchFromIp);
5978 CPUM_ASSERT_RD_MSR_FN(P6LastBranchToIp);
5979 CPUM_ASSERT_RD_MSR_FN(P6LastIntFromIp);
5980 CPUM_ASSERT_RD_MSR_FN(P6LastIntToIp);
5981
5982 CPUM_ASSERT_RD_MSR_FN(AmdFam15hTscRate);
5983 CPUM_ASSERT_RD_MSR_FN(AmdFam15hLwpCfg);
5984 CPUM_ASSERT_RD_MSR_FN(AmdFam15hLwpCbAddr);
5985 CPUM_ASSERT_RD_MSR_FN(AmdFam10hMc4MiscN);
5986 CPUM_ASSERT_RD_MSR_FN(AmdK8PerfCtlN);
5987 CPUM_ASSERT_RD_MSR_FN(AmdK8PerfCtrN);
5988 CPUM_ASSERT_RD_MSR_FN(AmdK8SysCfg);
5989 CPUM_ASSERT_RD_MSR_FN(AmdK8HwCr);
5990 CPUM_ASSERT_RD_MSR_FN(AmdK8IorrBaseN);
5991 CPUM_ASSERT_RD_MSR_FN(AmdK8IorrMaskN);
5992 CPUM_ASSERT_RD_MSR_FN(AmdK8TopOfMemN);
5993 CPUM_ASSERT_RD_MSR_FN(AmdK8NbCfg1);
5994 CPUM_ASSERT_RD_MSR_FN(AmdK8McXcptRedir);
5995 CPUM_ASSERT_RD_MSR_FN(AmdK8CpuNameN);
5996 CPUM_ASSERT_RD_MSR_FN(AmdK8HwThermalCtrl);
5997 CPUM_ASSERT_RD_MSR_FN(AmdK8SwThermalCtrl);
5998 CPUM_ASSERT_RD_MSR_FN(AmdK8FidVidControl);
5999 CPUM_ASSERT_RD_MSR_FN(AmdK8FidVidStatus);
6000 CPUM_ASSERT_RD_MSR_FN(AmdK8McCtlMaskN);
6001 CPUM_ASSERT_RD_MSR_FN(AmdK8SmiOnIoTrapN);
6002 CPUM_ASSERT_RD_MSR_FN(AmdK8SmiOnIoTrapCtlSts);
6003 CPUM_ASSERT_RD_MSR_FN(AmdK8IntPendingMessage);
6004 CPUM_ASSERT_RD_MSR_FN(AmdK8SmiTriggerIoCycle);
6005 CPUM_ASSERT_RD_MSR_FN(AmdFam10hMmioCfgBaseAddr);
6006 CPUM_ASSERT_RD_MSR_FN(AmdFam10hTrapCtlMaybe);
6007 CPUM_ASSERT_RD_MSR_FN(AmdFam10hPStateCurLimit);
6008 CPUM_ASSERT_RD_MSR_FN(AmdFam10hPStateControl);
6009 CPUM_ASSERT_RD_MSR_FN(AmdFam10hPStateStatus);
6010 CPUM_ASSERT_RD_MSR_FN(AmdFam10hPStateN);
6011 CPUM_ASSERT_RD_MSR_FN(AmdFam10hCofVidControl);
6012 CPUM_ASSERT_RD_MSR_FN(AmdFam10hCofVidStatus);
6013 CPUM_ASSERT_RD_MSR_FN(AmdFam10hCStateIoBaseAddr);
6014 CPUM_ASSERT_RD_MSR_FN(AmdFam10hCpuWatchdogTimer);
6015 CPUM_ASSERT_RD_MSR_FN(AmdK8SmmBase);
6016 CPUM_ASSERT_RD_MSR_FN(AmdK8SmmAddr);
6017 CPUM_ASSERT_RD_MSR_FN(AmdK8SmmMask);
6018 CPUM_ASSERT_RD_MSR_FN(AmdK8VmCr);
6019 CPUM_ASSERT_RD_MSR_FN(AmdK8IgnNe);
6020 CPUM_ASSERT_RD_MSR_FN(AmdK8SmmCtl);
6021 CPUM_ASSERT_RD_MSR_FN(AmdK8VmHSavePa);
6022 CPUM_ASSERT_RD_MSR_FN(AmdFam10hVmLockKey);
6023 CPUM_ASSERT_RD_MSR_FN(AmdFam10hSmmLockKey);
6024 CPUM_ASSERT_RD_MSR_FN(AmdFam10hLocalSmiStatus);
6025 CPUM_ASSERT_RD_MSR_FN(AmdFam10hOsVisWrkIdLength);
6026 CPUM_ASSERT_RD_MSR_FN(AmdFam10hOsVisWrkStatus);
6027 CPUM_ASSERT_RD_MSR_FN(AmdFam16hL2IPerfCtlN);
6028 CPUM_ASSERT_RD_MSR_FN(AmdFam16hL2IPerfCtrN);
6029 CPUM_ASSERT_RD_MSR_FN(AmdFam15hNorthbridgePerfCtlN);
6030 CPUM_ASSERT_RD_MSR_FN(AmdFam15hNorthbridgePerfCtrN);
6031 CPUM_ASSERT_RD_MSR_FN(AmdK7MicrocodeCtl);
6032 CPUM_ASSERT_RD_MSR_FN(AmdK7ClusterIdMaybe);
6033 CPUM_ASSERT_RD_MSR_FN(AmdK8CpuIdCtlStd07hEbax);
6034 CPUM_ASSERT_RD_MSR_FN(AmdK8CpuIdCtlStd06hEcx);
6035 CPUM_ASSERT_RD_MSR_FN(AmdK8CpuIdCtlStd01hEdcx);
6036 CPUM_ASSERT_RD_MSR_FN(AmdK8CpuIdCtlExt01hEdcx);
6037 CPUM_ASSERT_RD_MSR_FN(AmdK8PatchLevel);
6038 CPUM_ASSERT_RD_MSR_FN(AmdK7DebugStatusMaybe);
6039 CPUM_ASSERT_RD_MSR_FN(AmdK7BHTraceBaseMaybe);
6040 CPUM_ASSERT_RD_MSR_FN(AmdK7BHTracePtrMaybe);
6041 CPUM_ASSERT_RD_MSR_FN(AmdK7BHTraceLimitMaybe);
6042 CPUM_ASSERT_RD_MSR_FN(AmdK7HardwareDebugToolCfgMaybe);
6043 CPUM_ASSERT_RD_MSR_FN(AmdK7FastFlushCountMaybe);
6044 CPUM_ASSERT_RD_MSR_FN(AmdK7NodeId);
6045 CPUM_ASSERT_RD_MSR_FN(AmdK7DrXAddrMaskN);
6046 CPUM_ASSERT_RD_MSR_FN(AmdK7Dr0DataMatchMaybe);
6047 CPUM_ASSERT_RD_MSR_FN(AmdK7Dr0DataMaskMaybe);
6048 CPUM_ASSERT_RD_MSR_FN(AmdK7LoadStoreCfg);
6049 CPUM_ASSERT_RD_MSR_FN(AmdK7InstrCacheCfg);
6050 CPUM_ASSERT_RD_MSR_FN(AmdK7DataCacheCfg);
6051 CPUM_ASSERT_RD_MSR_FN(AmdK7BusUnitCfg);
6052 CPUM_ASSERT_RD_MSR_FN(AmdK7DebugCtl2Maybe);
6053 CPUM_ASSERT_RD_MSR_FN(AmdFam15hFpuCfg);
6054 CPUM_ASSERT_RD_MSR_FN(AmdFam15hDecoderCfg);
6055 CPUM_ASSERT_RD_MSR_FN(AmdFam10hBusUnitCfg2);
6056 CPUM_ASSERT_RD_MSR_FN(AmdFam15hCombUnitCfg);
6057 CPUM_ASSERT_RD_MSR_FN(AmdFam15hCombUnitCfg2);
6058 CPUM_ASSERT_RD_MSR_FN(AmdFam15hCombUnitCfg3);
6059 CPUM_ASSERT_RD_MSR_FN(AmdFam15hExecUnitCfg);
6060 CPUM_ASSERT_RD_MSR_FN(AmdFam15hLoadStoreCfg2);
6061 CPUM_ASSERT_RD_MSR_FN(AmdFam10hIbsFetchCtl);
6062 CPUM_ASSERT_RD_MSR_FN(AmdFam10hIbsFetchLinAddr);
6063 CPUM_ASSERT_RD_MSR_FN(AmdFam10hIbsFetchPhysAddr);
6064 CPUM_ASSERT_RD_MSR_FN(AmdFam10hIbsOpExecCtl);
6065 CPUM_ASSERT_RD_MSR_FN(AmdFam10hIbsOpRip);
6066 CPUM_ASSERT_RD_MSR_FN(AmdFam10hIbsOpData);
6067 CPUM_ASSERT_RD_MSR_FN(AmdFam10hIbsOpData2);
6068 CPUM_ASSERT_RD_MSR_FN(AmdFam10hIbsOpData3);
6069 CPUM_ASSERT_RD_MSR_FN(AmdFam10hIbsDcLinAddr);
6070 CPUM_ASSERT_RD_MSR_FN(AmdFam10hIbsDcPhysAddr);
6071 CPUM_ASSERT_RD_MSR_FN(AmdFam10hIbsCtl);
6072 CPUM_ASSERT_RD_MSR_FN(AmdFam14hIbsBrTarget);
6073
6074 CPUM_ASSERT_RD_MSR_FN(Gim)
6075
6076 AssertReturn(g_aCpumWrMsrFns[kCpumMsrWrFn_Invalid].pfnWrMsr == NULL, VERR_CPUM_IPE_2);
6077 CPUM_ASSERT_WR_MSR_FN(Ia32P5McAddr);
6078 CPUM_ASSERT_WR_MSR_FN(Ia32P5McType);
6079 CPUM_ASSERT_WR_MSR_FN(Ia32TimestampCounter);
6080 CPUM_ASSERT_WR_MSR_FN(Ia32ApicBase);
6081 CPUM_ASSERT_WR_MSR_FN(Ia32FeatureControl);
6082 CPUM_ASSERT_WR_MSR_FN(Ia32BiosSignId);
6083 CPUM_ASSERT_WR_MSR_FN(Ia32BiosUpdateTrigger);
6084 CPUM_ASSERT_WR_MSR_FN(Ia32SmmMonitorCtl);
6085 CPUM_ASSERT_WR_MSR_FN(Ia32PmcN);
6086 CPUM_ASSERT_WR_MSR_FN(Ia32MonitorFilterLineSize);
6087 CPUM_ASSERT_WR_MSR_FN(Ia32MPerf);
6088 CPUM_ASSERT_WR_MSR_FN(Ia32APerf);
6089 CPUM_ASSERT_WR_MSR_FN(Ia32MtrrPhysBaseN);
6090 CPUM_ASSERT_WR_MSR_FN(Ia32MtrrPhysMaskN);
6091 CPUM_ASSERT_WR_MSR_FN(Ia32MtrrFixed);
6092 CPUM_ASSERT_WR_MSR_FN(Ia32MtrrDefType);
6093 CPUM_ASSERT_WR_MSR_FN(Ia32Pat);
6094 CPUM_ASSERT_WR_MSR_FN(Ia32SysEnterCs);
6095 CPUM_ASSERT_WR_MSR_FN(Ia32SysEnterEsp);
6096 CPUM_ASSERT_WR_MSR_FN(Ia32SysEnterEip);
6097 CPUM_ASSERT_WR_MSR_FN(Ia32McgStatus);
6098 CPUM_ASSERT_WR_MSR_FN(Ia32McgCtl);
6099 CPUM_ASSERT_WR_MSR_FN(Ia32DebugCtl);
6100 CPUM_ASSERT_WR_MSR_FN(Ia32SmrrPhysBase);
6101 CPUM_ASSERT_WR_MSR_FN(Ia32SmrrPhysMask);
6102 CPUM_ASSERT_WR_MSR_FN(Ia32PlatformDcaCap);
6103 CPUM_ASSERT_WR_MSR_FN(Ia32Dca0Cap);
6104 CPUM_ASSERT_WR_MSR_FN(Ia32PerfEvtSelN);
6105 CPUM_ASSERT_WR_MSR_FN(Ia32PerfStatus);
6106 CPUM_ASSERT_WR_MSR_FN(Ia32PerfCtl);
6107 CPUM_ASSERT_WR_MSR_FN(Ia32FixedCtrN);
6108 CPUM_ASSERT_WR_MSR_FN(Ia32PerfCapabilities);
6109 CPUM_ASSERT_WR_MSR_FN(Ia32FixedCtrCtrl);
6110 CPUM_ASSERT_WR_MSR_FN(Ia32PerfGlobalStatus);
6111 CPUM_ASSERT_WR_MSR_FN(Ia32PerfGlobalCtrl);
6112 CPUM_ASSERT_WR_MSR_FN(Ia32PerfGlobalOvfCtrl);
6113 CPUM_ASSERT_WR_MSR_FN(Ia32PebsEnable);
6114 CPUM_ASSERT_WR_MSR_FN(Ia32ClockModulation);
6115 CPUM_ASSERT_WR_MSR_FN(Ia32ThermInterrupt);
6116 CPUM_ASSERT_WR_MSR_FN(Ia32ThermStatus);
6117 CPUM_ASSERT_WR_MSR_FN(Ia32MiscEnable);
6118 CPUM_ASSERT_WR_MSR_FN(Ia32McCtlStatusAddrMiscN);
6119 CPUM_ASSERT_WR_MSR_FN(Ia32McNCtl2);
6120 CPUM_ASSERT_WR_MSR_FN(Ia32DsArea);
6121 CPUM_ASSERT_WR_MSR_FN(Ia32TscDeadline);
6122 CPUM_ASSERT_WR_MSR_FN(Ia32X2ApicN);
6123 CPUM_ASSERT_WR_MSR_FN(Ia32DebugInterface);
6124 CPUM_ASSERT_WR_MSR_FN(Ia32SpecCtrl);
6125 CPUM_ASSERT_WR_MSR_FN(Ia32PredCmd);
6126 CPUM_ASSERT_WR_MSR_FN(Ia32FlushCmd);
6127
6128 CPUM_ASSERT_WR_MSR_FN(Amd64Efer);
6129 CPUM_ASSERT_WR_MSR_FN(Amd64SyscallTarget);
6130 CPUM_ASSERT_WR_MSR_FN(Amd64LongSyscallTarget);
6131 CPUM_ASSERT_WR_MSR_FN(Amd64CompSyscallTarget);
6132 CPUM_ASSERT_WR_MSR_FN(Amd64SyscallFlagMask);
6133 CPUM_ASSERT_WR_MSR_FN(Amd64FsBase);
6134 CPUM_ASSERT_WR_MSR_FN(Amd64GsBase);
6135 CPUM_ASSERT_WR_MSR_FN(Amd64KernelGsBase);
6136 CPUM_ASSERT_WR_MSR_FN(Amd64TscAux);
6137
6138 CPUM_ASSERT_WR_MSR_FN(IntelEblCrPowerOn);
6139 CPUM_ASSERT_WR_MSR_FN(IntelP4EbcHardPowerOn);
6140 CPUM_ASSERT_WR_MSR_FN(IntelP4EbcSoftPowerOn);
6141 CPUM_ASSERT_WR_MSR_FN(IntelP4EbcFrequencyId);
6142 CPUM_ASSERT_WR_MSR_FN(IntelFlexRatio);
6143 CPUM_ASSERT_WR_MSR_FN(IntelPkgCStConfigControl);
6144 CPUM_ASSERT_WR_MSR_FN(IntelPmgIoCaptureBase);
6145 CPUM_ASSERT_WR_MSR_FN(IntelLastBranchFromToN);
6146 CPUM_ASSERT_WR_MSR_FN(IntelLastBranchFromN);
6147 CPUM_ASSERT_WR_MSR_FN(IntelLastBranchToN);
6148 CPUM_ASSERT_WR_MSR_FN(IntelLastBranchTos);
6149 CPUM_ASSERT_WR_MSR_FN(IntelBblCrCtl);
6150 CPUM_ASSERT_WR_MSR_FN(IntelBblCrCtl3);
6151 CPUM_ASSERT_WR_MSR_FN(IntelI7TemperatureTarget);
6152 CPUM_ASSERT_WR_MSR_FN(IntelI7MsrOffCoreResponseN);
6153 CPUM_ASSERT_WR_MSR_FN(IntelI7MiscPwrMgmt);
6154 CPUM_ASSERT_WR_MSR_FN(IntelP6CrN);
6155 CPUM_ASSERT_WR_MSR_FN(IntelCpuId1FeatureMaskEcdx);
6156 CPUM_ASSERT_WR_MSR_FN(IntelCpuId1FeatureMaskEax);
6157 CPUM_ASSERT_WR_MSR_FN(IntelCpuId80000001FeatureMaskEcdx);
6158 CPUM_ASSERT_WR_MSR_FN(IntelI7SandyAesNiCtl);
6159 CPUM_ASSERT_WR_MSR_FN(IntelI7TurboRatioLimit);
6160 CPUM_ASSERT_WR_MSR_FN(IntelI7LbrSelect);
6161 CPUM_ASSERT_WR_MSR_FN(IntelI7SandyErrorControl);
6162 CPUM_ASSERT_WR_MSR_FN(IntelI7PowerCtl);
6163 CPUM_ASSERT_WR_MSR_FN(IntelI7SandyPebsNumAlt);
6164 CPUM_ASSERT_WR_MSR_FN(IntelI7PebsLdLat);
6165 CPUM_ASSERT_WR_MSR_FN(IntelI7SandyVrCurrentConfig);
6166 CPUM_ASSERT_WR_MSR_FN(IntelI7SandyVrMiscConfig);
6167 CPUM_ASSERT_WR_MSR_FN(IntelI7SandyPkgCnIrtlN);
6168 CPUM_ASSERT_WR_MSR_FN(IntelI7SandyPkgC2Residency);
6169 CPUM_ASSERT_WR_MSR_FN(IntelI7RaplPkgPowerLimit);
6170 CPUM_ASSERT_WR_MSR_FN(IntelI7RaplDramPowerLimit);
6171 CPUM_ASSERT_WR_MSR_FN(IntelI7RaplPp0PowerLimit);
6172 CPUM_ASSERT_WR_MSR_FN(IntelI7RaplPp0Policy);
6173 CPUM_ASSERT_WR_MSR_FN(IntelI7RaplPp1PowerLimit);
6174 CPUM_ASSERT_WR_MSR_FN(IntelI7RaplPp1Policy);
6175 CPUM_ASSERT_WR_MSR_FN(IntelI7IvyConfigTdpControl);
6176 CPUM_ASSERT_WR_MSR_FN(IntelI7IvyTurboActivationRatio);
6177 CPUM_ASSERT_WR_MSR_FN(IntelI7UncPerfGlobalCtrl);
6178 CPUM_ASSERT_WR_MSR_FN(IntelI7UncPerfGlobalStatus);
6179 CPUM_ASSERT_WR_MSR_FN(IntelI7UncPerfGlobalOvfCtrl);
6180 CPUM_ASSERT_WR_MSR_FN(IntelI7UncPerfFixedCtrCtrl);
6181 CPUM_ASSERT_WR_MSR_FN(IntelI7UncPerfFixedCtr);
6182 CPUM_ASSERT_WR_MSR_FN(IntelI7UncArbPerfCtrN);
6183 CPUM_ASSERT_WR_MSR_FN(IntelI7UncArbPerfEvtSelN);
6184 CPUM_ASSERT_WR_MSR_FN(IntelCore2EmttmCrTablesN);
6185 CPUM_ASSERT_WR_MSR_FN(IntelCore2SmmCStMiscInfo);
6186 CPUM_ASSERT_WR_MSR_FN(IntelCore1ExtConfig);
6187 CPUM_ASSERT_WR_MSR_FN(IntelCore1DtsCalControl);
6188 CPUM_ASSERT_WR_MSR_FN(IntelCore2PeciControl);
6189
6190 CPUM_ASSERT_WR_MSR_FN(P6LastIntFromIp);
6191 CPUM_ASSERT_WR_MSR_FN(P6LastIntToIp);
6192
6193 CPUM_ASSERT_WR_MSR_FN(AmdFam15hTscRate);
6194 CPUM_ASSERT_WR_MSR_FN(AmdFam15hLwpCfg);
6195 CPUM_ASSERT_WR_MSR_FN(AmdFam15hLwpCbAddr);
6196 CPUM_ASSERT_WR_MSR_FN(AmdFam10hMc4MiscN);
6197 CPUM_ASSERT_WR_MSR_FN(AmdK8PerfCtlN);
6198 CPUM_ASSERT_WR_MSR_FN(AmdK8PerfCtrN);
6199 CPUM_ASSERT_WR_MSR_FN(AmdK8SysCfg);
6200 CPUM_ASSERT_WR_MSR_FN(AmdK8HwCr);
6201 CPUM_ASSERT_WR_MSR_FN(AmdK8IorrBaseN);
6202 CPUM_ASSERT_WR_MSR_FN(AmdK8IorrMaskN);
6203 CPUM_ASSERT_WR_MSR_FN(AmdK8TopOfMemN);
6204 CPUM_ASSERT_WR_MSR_FN(AmdK8NbCfg1);
6205 CPUM_ASSERT_WR_MSR_FN(AmdK8McXcptRedir);
6206 CPUM_ASSERT_WR_MSR_FN(AmdK8CpuNameN);
6207 CPUM_ASSERT_WR_MSR_FN(AmdK8HwThermalCtrl);
6208 CPUM_ASSERT_WR_MSR_FN(AmdK8SwThermalCtrl);
6209 CPUM_ASSERT_WR_MSR_FN(AmdK8FidVidControl);
6210 CPUM_ASSERT_WR_MSR_FN(AmdK8McCtlMaskN);
6211 CPUM_ASSERT_WR_MSR_FN(AmdK8SmiOnIoTrapN);
6212 CPUM_ASSERT_WR_MSR_FN(AmdK8SmiOnIoTrapCtlSts);
6213 CPUM_ASSERT_WR_MSR_FN(AmdK8IntPendingMessage);
6214 CPUM_ASSERT_WR_MSR_FN(AmdK8SmiTriggerIoCycle);
6215 CPUM_ASSERT_WR_MSR_FN(AmdFam10hMmioCfgBaseAddr);
6216 CPUM_ASSERT_WR_MSR_FN(AmdFam10hTrapCtlMaybe);
6217 CPUM_ASSERT_WR_MSR_FN(AmdFam10hPStateControl);
6218 CPUM_ASSERT_WR_MSR_FN(AmdFam10hPStateStatus);
6219 CPUM_ASSERT_WR_MSR_FN(AmdFam10hPStateN);
6220 CPUM_ASSERT_WR_MSR_FN(AmdFam10hCofVidControl);
6221 CPUM_ASSERT_WR_MSR_FN(AmdFam10hCofVidStatus);
6222 CPUM_ASSERT_WR_MSR_FN(AmdFam10hCStateIoBaseAddr);
6223 CPUM_ASSERT_WR_MSR_FN(AmdFam10hCpuWatchdogTimer);
6224 CPUM_ASSERT_WR_MSR_FN(AmdK8SmmBase);
6225 CPUM_ASSERT_WR_MSR_FN(AmdK8SmmAddr);
6226 CPUM_ASSERT_WR_MSR_FN(AmdK8SmmMask);
6227 CPUM_ASSERT_WR_MSR_FN(AmdK8VmCr);
6228 CPUM_ASSERT_WR_MSR_FN(AmdK8IgnNe);
6229 CPUM_ASSERT_WR_MSR_FN(AmdK8SmmCtl);
6230 CPUM_ASSERT_WR_MSR_FN(AmdK8VmHSavePa);
6231 CPUM_ASSERT_WR_MSR_FN(AmdFam10hVmLockKey);
6232 CPUM_ASSERT_WR_MSR_FN(AmdFam10hSmmLockKey);
6233 CPUM_ASSERT_WR_MSR_FN(AmdFam10hLocalSmiStatus);
6234 CPUM_ASSERT_WR_MSR_FN(AmdFam10hOsVisWrkIdLength);
6235 CPUM_ASSERT_WR_MSR_FN(AmdFam10hOsVisWrkStatus);
6236 CPUM_ASSERT_WR_MSR_FN(AmdFam16hL2IPerfCtlN);
6237 CPUM_ASSERT_WR_MSR_FN(AmdFam16hL2IPerfCtrN);
6238 CPUM_ASSERT_WR_MSR_FN(AmdFam15hNorthbridgePerfCtlN);
6239 CPUM_ASSERT_WR_MSR_FN(AmdFam15hNorthbridgePerfCtrN);
6240 CPUM_ASSERT_WR_MSR_FN(AmdK7MicrocodeCtl);
6241 CPUM_ASSERT_WR_MSR_FN(AmdK7ClusterIdMaybe);
6242 CPUM_ASSERT_WR_MSR_FN(AmdK8CpuIdCtlStd07hEbax);
6243 CPUM_ASSERT_WR_MSR_FN(AmdK8CpuIdCtlStd06hEcx);
6244 CPUM_ASSERT_WR_MSR_FN(AmdK8CpuIdCtlStd01hEdcx);
6245 CPUM_ASSERT_WR_MSR_FN(AmdK8CpuIdCtlExt01hEdcx);
6246 CPUM_ASSERT_WR_MSR_FN(AmdK8PatchLoader);
6247 CPUM_ASSERT_WR_MSR_FN(AmdK7DebugStatusMaybe);
6248 CPUM_ASSERT_WR_MSR_FN(AmdK7BHTraceBaseMaybe);
6249 CPUM_ASSERT_WR_MSR_FN(AmdK7BHTracePtrMaybe);
6250 CPUM_ASSERT_WR_MSR_FN(AmdK7BHTraceLimitMaybe);
6251 CPUM_ASSERT_WR_MSR_FN(AmdK7HardwareDebugToolCfgMaybe);
6252 CPUM_ASSERT_WR_MSR_FN(AmdK7FastFlushCountMaybe);
6253 CPUM_ASSERT_WR_MSR_FN(AmdK7NodeId);
6254 CPUM_ASSERT_WR_MSR_FN(AmdK7DrXAddrMaskN);
6255 CPUM_ASSERT_WR_MSR_FN(AmdK7Dr0DataMatchMaybe);
6256 CPUM_ASSERT_WR_MSR_FN(AmdK7Dr0DataMaskMaybe);
6257 CPUM_ASSERT_WR_MSR_FN(AmdK7LoadStoreCfg);
6258 CPUM_ASSERT_WR_MSR_FN(AmdK7InstrCacheCfg);
6259 CPUM_ASSERT_WR_MSR_FN(AmdK7DataCacheCfg);
6260 CPUM_ASSERT_WR_MSR_FN(AmdK7BusUnitCfg);
6261 CPUM_ASSERT_WR_MSR_FN(AmdK7DebugCtl2Maybe);
6262 CPUM_ASSERT_WR_MSR_FN(AmdFam15hFpuCfg);
6263 CPUM_ASSERT_WR_MSR_FN(AmdFam15hDecoderCfg);
6264 CPUM_ASSERT_WR_MSR_FN(AmdFam10hBusUnitCfg2);
6265 CPUM_ASSERT_WR_MSR_FN(AmdFam15hCombUnitCfg);
6266 CPUM_ASSERT_WR_MSR_FN(AmdFam15hCombUnitCfg2);
6267 CPUM_ASSERT_WR_MSR_FN(AmdFam15hCombUnitCfg3);
6268 CPUM_ASSERT_WR_MSR_FN(AmdFam15hExecUnitCfg);
6269 CPUM_ASSERT_WR_MSR_FN(AmdFam15hLoadStoreCfg2);
6270 CPUM_ASSERT_WR_MSR_FN(AmdFam10hIbsFetchCtl);
6271 CPUM_ASSERT_WR_MSR_FN(AmdFam10hIbsFetchLinAddr);
6272 CPUM_ASSERT_WR_MSR_FN(AmdFam10hIbsFetchPhysAddr);
6273 CPUM_ASSERT_WR_MSR_FN(AmdFam10hIbsOpExecCtl);
6274 CPUM_ASSERT_WR_MSR_FN(AmdFam10hIbsOpRip);
6275 CPUM_ASSERT_WR_MSR_FN(AmdFam10hIbsOpData);
6276 CPUM_ASSERT_WR_MSR_FN(AmdFam10hIbsOpData2);
6277 CPUM_ASSERT_WR_MSR_FN(AmdFam10hIbsOpData3);
6278 CPUM_ASSERT_WR_MSR_FN(AmdFam10hIbsDcLinAddr);
6279 CPUM_ASSERT_WR_MSR_FN(AmdFam10hIbsDcPhysAddr);
6280 CPUM_ASSERT_WR_MSR_FN(AmdFam10hIbsCtl);
6281 CPUM_ASSERT_WR_MSR_FN(AmdFam14hIbsBrTarget);
6282
6283 CPUM_ASSERT_WR_MSR_FN(Gim);
6284
6285 return VINF_SUCCESS;
6286}
6287#endif /* VBOX_STRICT && IN_RING3 */
6288
6289
6290/**
6291 * Gets the scalable bus frequency.
6292 *
6293 * The bus frequency is used as a base in several MSRs that gives the CPU and
6294 * other frequency ratios.
6295 *
6296 * @returns Scalable bus frequency in Hz. Will not return CPUM_SBUSFREQ_UNKNOWN.
6297 * @param pVM The cross context VM structure.
6298 */
6299VMMDECL(uint64_t) CPUMGetGuestScalableBusFrequency(PVM pVM)
6300{
6301 uint64_t uFreq = pVM->cpum.s.GuestInfo.uScalableBusFreq;
6302 if (uFreq == CPUM_SBUSFREQ_UNKNOWN)
6303 uFreq = CPUM_SBUSFREQ_100MHZ;
6304 return uFreq;
6305}
6306
6307
6308/**
6309 * Sets the guest EFER MSR without performing any additional checks.
6310 *
6311 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
6312 * @param uOldEfer The previous EFER MSR value.
6313 * @param uValidEfer The new, validated EFER MSR value.
6314 *
6315 * @remarks One would normally call CPUMIsGuestEferMsrWriteValid() before calling
6316 * this function to change the EFER in order to perform an EFER transition.
6317 */
6318VMMDECL(void) CPUMSetGuestEferMsrNoChecks(PVMCPUCC pVCpu, uint64_t uOldEfer, uint64_t uValidEfer)
6319{
6320 pVCpu->cpum.s.Guest.msrEFER = uValidEfer;
6321
6322 /* AMD64 Architecture Programmer's Manual: 15.15 TLB Control; flush the TLB
6323 if MSR_K6_EFER_NXE, MSR_K6_EFER_LME or MSR_K6_EFER_LMA are changed. */
6324 if ( (uOldEfer & (MSR_K6_EFER_NXE | MSR_K6_EFER_LME | MSR_K6_EFER_LMA))
6325 != (pVCpu->cpum.s.Guest.msrEFER & (MSR_K6_EFER_NXE | MSR_K6_EFER_LME | MSR_K6_EFER_LMA)))
6326 {
6327 /// @todo PGMFlushTLB(pVCpu, cr3, true /*fGlobal*/);
6328 HMFlushTlb(pVCpu);
6329
6330 /* Notify PGM about NXE changes. */
6331 if ( (uOldEfer & MSR_K6_EFER_NXE)
6332 != (pVCpu->cpum.s.Guest.msrEFER & MSR_K6_EFER_NXE))
6333 PGMNotifyNxeChanged(pVCpu, !(uOldEfer & MSR_K6_EFER_NXE));
6334 }
6335}
6336
6337
6338/**
6339 * Checks if a guest PAT MSR write is valid.
6340 *
6341 * @returns @c true if the PAT bit combination is valid, @c false otherwise.
6342 * @param uValue The PAT MSR value.
6343 */
6344VMMDECL(bool) CPUMIsPatMsrValid(uint64_t uValue)
6345{
6346 for (uint32_t cShift = 0; cShift < 63; cShift += 8)
6347 {
6348 /* Check all eight bits because the top 5 bits of each byte are reserved. */
6349 uint8_t uType = (uint8_t)(uValue >> cShift);
6350 if ((uType >= 8) || (uType == 2) || (uType == 3))
6351 {
6352 Log(("CPUM: Invalid PAT type at %u:%u in IA32_PAT: %#llx (%#llx)\n", cShift + 7, cShift, uValue, uType));
6353 return false;
6354 }
6355 }
6356 return true;
6357}
6358
6359
6360/**
6361 * Validates an EFER MSR write and provides the new, validated EFER MSR.
6362 *
6363 * @returns VBox status code.
6364 * @param pVM The cross context VM structure.
6365 * @param uCr0 The CR0 of the CPU corresponding to the EFER MSR.
6366 * @param uOldEfer Value of the previous EFER MSR on the CPU if any.
6367 * @param uNewEfer The new EFER MSR value being written.
6368 * @param puValidEfer Where to store the validated EFER (only updated if
6369 * this function returns VINF_SUCCESS).
6370 */
6371VMMDECL(int) CPUMIsGuestEferMsrWriteValid(PVM pVM, uint64_t uCr0, uint64_t uOldEfer, uint64_t uNewEfer, uint64_t *puValidEfer)
6372{
6373 /* #GP(0) If anything outside the allowed bits is set. */
6374 uint64_t fMask = CPUMGetGuestEferMsrValidMask(pVM);
6375 if (uNewEfer & ~fMask)
6376 {
6377 Log(("CPUM: Settings disallowed EFER bit. uNewEfer=%#RX64 fAllowed=%#RX64 -> #GP(0)\n", uNewEfer, fMask));
6378 return VERR_CPUM_RAISE_GP_0;
6379 }
6380
6381 /* Check for illegal MSR_K6_EFER_LME transitions: not allowed to change LME if
6382 paging is enabled. (AMD Arch. Programmer's Manual Volume 2: Table 14-5) */
6383 if ( (uOldEfer & MSR_K6_EFER_LME) != (uNewEfer & MSR_K6_EFER_LME)
6384 && (uCr0 & X86_CR0_PG))
6385 {
6386 Log(("CPUM: Illegal MSR_K6_EFER_LME change: paging is enabled!!\n"));
6387 return VERR_CPUM_RAISE_GP_0;
6388 }
6389
6390 /* There are a few more: e.g. MSR_K6_EFER_LMSLE. */
6391 AssertMsg(!(uNewEfer & ~( MSR_K6_EFER_NXE
6392 | MSR_K6_EFER_LME
6393 | MSR_K6_EFER_LMA /* ignored anyway */
6394 | MSR_K6_EFER_SCE
6395 | MSR_K6_EFER_FFXSR
6396 | MSR_K6_EFER_SVME)),
6397 ("Unexpected value %#RX64\n", uNewEfer));
6398
6399 /* Ignore EFER.LMA, it's updated when setting CR0. */
6400 fMask &= ~MSR_K6_EFER_LMA;
6401
6402 *puValidEfer = (uOldEfer & ~fMask) | (uNewEfer & fMask);
6403 return VINF_SUCCESS;
6404}
6405
6406
6407/**
6408 * Gets the mask of valid EFER bits depending on supported guest-CPU features.
6409 *
6410 * @returns Mask of valid EFER bits.
6411 * @param pVM The cross context VM structure.
6412 *
6413 * @remarks EFER.LMA is included as part of the valid mask. It's not invalid but
6414 * rather a read-only bit.
6415 */
6416VMMDECL(uint64_t) CPUMGetGuestEferMsrValidMask(PVM pVM)
6417{
6418 uint32_t const fExtFeatures = pVM->cpum.s.aGuestCpuIdPatmExt[0].uEax >= 0x80000001
6419 ? pVM->cpum.s.aGuestCpuIdPatmExt[1].uEdx
6420 : 0;
6421 uint64_t fMask = 0;
6422 uint64_t const fIgnoreMask = MSR_K6_EFER_LMA;
6423
6424 /* Filter out those bits the guest is allowed to change. (e.g. LMA is read-only) */
6425 if (fExtFeatures & X86_CPUID_EXT_FEATURE_EDX_NX)
6426 fMask |= MSR_K6_EFER_NXE;
6427 if (fExtFeatures & X86_CPUID_EXT_FEATURE_EDX_LONG_MODE)
6428 fMask |= MSR_K6_EFER_LME;
6429 if (fExtFeatures & X86_CPUID_EXT_FEATURE_EDX_SYSCALL)
6430 fMask |= MSR_K6_EFER_SCE;
6431 if (fExtFeatures & X86_CPUID_AMD_FEATURE_EDX_FFXSR)
6432 fMask |= MSR_K6_EFER_FFXSR;
6433 if (pVM->cpum.s.GuestFeatures.fSvm)
6434 fMask |= MSR_K6_EFER_SVME;
6435
6436 return (fIgnoreMask | fMask);
6437}
6438
6439
6440/**
6441 * Fast way for HM to access the MSR_K8_TSC_AUX register.
6442 *
6443 * @returns The register value.
6444 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
6445 * @thread EMT(pVCpu)
6446 */
6447VMM_INT_DECL(uint64_t) CPUMGetGuestTscAux(PVMCPUCC pVCpu)
6448{
6449 Assert(!(pVCpu->cpum.s.Guest.fExtrn & CPUMCTX_EXTRN_TSC_AUX));
6450 return pVCpu->cpum.s.GuestMsrs.msr.TscAux;
6451}
6452
6453
6454/**
6455 * Fast way for HM to access the MSR_K8_TSC_AUX register.
6456 *
6457 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
6458 * @param uValue The new value.
6459 * @thread EMT(pVCpu)
6460 */
6461VMM_INT_DECL(void) CPUMSetGuestTscAux(PVMCPUCC pVCpu, uint64_t uValue)
6462{
6463 pVCpu->cpum.s.Guest.fExtrn &= ~CPUMCTX_EXTRN_TSC_AUX;
6464 pVCpu->cpum.s.GuestMsrs.msr.TscAux = uValue;
6465}
6466
6467
6468/**
6469 * Fast way for HM to access the IA32_SPEC_CTRL register.
6470 *
6471 * @returns The register value.
6472 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
6473 * @thread EMT(pVCpu)
6474 */
6475VMM_INT_DECL(uint64_t) CPUMGetGuestSpecCtrl(PVMCPUCC pVCpu)
6476{
6477 return pVCpu->cpum.s.GuestMsrs.msr.SpecCtrl;
6478}
6479
6480
6481/**
6482 * Fast way for HM to access the IA32_SPEC_CTRL register.
6483 *
6484 * @param pVCpu The cross context virtual CPU structure of the calling EMT.
6485 * @param uValue The new value.
6486 * @thread EMT(pVCpu)
6487 */
6488VMM_INT_DECL(void) CPUMSetGuestSpecCtrl(PVMCPUCC pVCpu, uint64_t uValue)
6489{
6490 pVCpu->cpum.s.GuestMsrs.msr.SpecCtrl = uValue;
6491}
6492
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