diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-11 08:17:27 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-11 08:17:27 +0000 |
commit | f215e02bf85f68d3a6106c2a1f4f7f063f819064 (patch) | |
tree | 6bb5b92c046312c4e95ac2620b10ddf482d3fa8b /src/VBox/VMM/VMMAll/NEMAll.cpp | |
parent | Initial commit. (diff) | |
download | virtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.tar.xz virtualbox-f215e02bf85f68d3a6106c2a1f4f7f063f819064.zip |
Adding upstream version 7.0.14-dfsg.upstream/7.0.14-dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/VMM/VMMAll/NEMAll.cpp')
-rw-r--r-- | src/VBox/VMM/VMMAll/NEMAll.cpp | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/src/VBox/VMM/VMMAll/NEMAll.cpp b/src/VBox/VMM/VMMAll/NEMAll.cpp new file mode 100644 index 00000000..1a44e573 --- /dev/null +++ b/src/VBox/VMM/VMMAll/NEMAll.cpp @@ -0,0 +1,136 @@ +/* $Id: NEMAll.cpp $ */ +/** @file + * NEM - Native execution manager, R0 and R3 context code. + */ + +/* + * Copyright (C) 2018-2023 Oracle and/or its affiliates. + * + * This file is part of VirtualBox base platform packages, as + * available from https://www.virtualbox.org. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, in version 3 of the + * License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <https://www.gnu.org/licenses>. + * + * SPDX-License-Identifier: GPL-3.0-only + */ + + +/********************************************************************************************************************************* +* 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 + |