1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
/* $Id$ */
/** @file
* NEM - Native execution manager, R0 and R3 context code.
*/
/*
* Copyright (C) 2018-2022 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* you can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
/*********************************************************************************************************************************
* Header Files *
*********************************************************************************************************************************/
#define LOG_GROUP LOG_GROUP_NEM
#include <VBox/vmm/nem.h>
#include "NEMInternal.h"
#include <VBox/vmm/vmcc.h>
#include <VBox/err.h>
/**
* Checks if this VM is in NEM mode and is long-mode capable.
*
* Use VMR3IsLongModeAllowed() instead of this, when possible.
*
* @returns true if long mode is allowed, false otherwise.
* @param pVM The cross context VM structure.
* @sa VMR3IsLongModeAllowed, HMIsLongModeAllowed
*/
VMM_INT_DECL(bool) NEMHCIsLongModeAllowed(PVMCC pVM)
{
return pVM->nem.s.fAllow64BitGuests && VM_IS_NEM_ENABLED(pVM);
}
/**
* Physical access handler registration notification.
*
* @param pVM The cross context VM structure.
* @param enmKind The kind of access handler.
* @param GCPhys Start of the access handling range.
* @param cb Length of the access handling range.
*
* @note Called while holding down the PGM lock.
*/
VMM_INT_DECL(void) NEMHCNotifyHandlerPhysicalRegister(PVMCC pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb)
{
#ifdef VBOX_WITH_NATIVE_NEM
if (VM_IS_NEM_ENABLED(pVM))
nemHCNativeNotifyHandlerPhysicalRegister(pVM, enmKind, GCPhys, cb);
#else
RT_NOREF(pVM, enmKind, GCPhys, cb);
#endif
}
VMM_INT_DECL(void) NEMHCNotifyHandlerPhysicalModify(PVMCC pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhysOld,
RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fRestoreAsRAM)
{
#ifdef VBOX_WITH_NATIVE_NEM
if (VM_IS_NEM_ENABLED(pVM))
nemHCNativeNotifyHandlerPhysicalModify(pVM, enmKind, GCPhysOld, GCPhysNew, cb, fRestoreAsRAM);
#else
RT_NOREF(pVM, enmKind, GCPhysOld, GCPhysNew, cb, fRestoreAsRAM);
#endif
}
VMM_INT_DECL(int) NEMHCNotifyPhysPageAllocated(PVMCC pVM, RTGCPHYS GCPhys, RTHCPHYS HCPhys, uint32_t fPageProt,
PGMPAGETYPE enmType, uint8_t *pu2State)
{
Assert(VM_IS_NEM_ENABLED(pVM));
#ifdef VBOX_WITH_NATIVE_NEM
return nemHCNativeNotifyPhysPageAllocated(pVM, GCPhys, HCPhys, fPageProt, enmType, pu2State);
#else
RT_NOREF(pVM, GCPhys, HCPhys, fPageProt, enmType, pu2State);
return VINF_SUCCESS;
#endif
}
#ifndef VBOX_WITH_NATIVE_NEM
VMM_INT_DECL(uint32_t) NEMHCGetFeatures(PVMCC pVM)
{
RT_NOREF(pVM);
return 0;
}
#endif
#ifndef VBOX_WITH_NATIVE_NEM
VMM_INT_DECL(int) NEMImportStateOnDemand(PVMCPUCC pVCpu, uint64_t fWhat)
{
RT_NOREF(pVCpu, fWhat);
return VERR_NEM_IPE_9;
}
#endif
#ifndef VBOX_WITH_NATIVE_NEM
VMM_INT_DECL(int) NEMHCQueryCpuTick(PVMCPUCC pVCpu, uint64_t *pcTicks, uint32_t *puAux)
{
RT_NOREF(pVCpu, pcTicks, puAux);
AssertFailed();
return VERR_NEM_IPE_9;
}
#endif
#ifndef VBOX_WITH_NATIVE_NEM
VMM_INT_DECL(int) NEMHCResumeCpuTickOnAll(PVMCC pVM, PVMCPUCC pVCpu, uint64_t uPausedTscValue)
{
RT_NOREF(pVM, pVCpu, uPausedTscValue);
AssertFailed();
return VERR_NEM_IPE_9;
}
#endif
|