0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @file
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * PATM - Dynamic Guest OS Patching Manager.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*
c1d279fc0865b91a40b30eda02ed14f6533fe1a4vboxsync * Copyright (C) 2006-2015 Oracle Corporation
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * available from http://www.virtualbox.org. This file is free software;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * you can redistribute it and/or modify it under the terms of the GNU
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * General Public License (GPL) as published by the Free Software
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * The contents of this file may alternatively be used under the terms
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * of the Common Development and Distribution License Version 1.0
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * VirtualBox OSE distribution, in which case the provisions of the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * CDDL are applicable instead of those of the GPL.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * You may elect to license modified versions of this file under the
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * terms and conditions of either the GPL or the CDDL or both.
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifndef ___VBox_vmm_patm_h
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define ___VBox_vmm_patm_h
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#include <VBox/types.h>
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#include <VBox/dis.h>
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
7220367ea1944fa8a7694534401321ad86eb70c6vboxsync#if defined(VBOX_WITH_RAW_MODE) || defined(DOXYGEN_RUNNING)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncRT_C_DECLS_BEGIN
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @defgroup grp_patm The Patch Manager API
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define MAX_PATCHES 512
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Flags for specifying the type of patch to install with PATMR3InstallPatch
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync#define PATMFL_CODE32 RT_BIT_64(0)
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync#define PATMFL_INTHANDLER RT_BIT_64(1)
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync#define PATMFL_SYSENTER RT_BIT_64(2)
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync#define PATMFL_GUEST_SPECIFIC RT_BIT_64(3)
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync#define PATMFL_USER_MODE RT_BIT_64(4)
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync#define PATMFL_IDTHANDLER RT_BIT_64(5)
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync#define PATMFL_TRAPHANDLER RT_BIT_64(6)
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync#define PATMFL_DUPLICATE_FUNCTION RT_BIT_64(7)
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync#define PATMFL_REPLACE_FUNCTION_CALL RT_BIT_64(8)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define PATMFL_TRAPHANDLER_WITH_ERRORCODE RT_BIT_64(9)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define PATMFL_INTHANDLER_WITH_ERRORCODE (PATMFL_TRAPHANDLER_WITH_ERRORCODE)
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync#define PATMFL_MMIO_ACCESS RT_BIT_64(10)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/* no more room -> change PATMInternal.h if more is needed!! */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/*
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Flags above 1024 are reserved for internal use!
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** Enable to activate sysenter emulation in GC. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/* #define PATM_EMULATE_SYSENTER */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Maximum number of cached VGA writes
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#define MAX_VGA_WRITE_CACHE 64
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsynctypedef struct PATMGCSTATE
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync{
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** Virtual Flags register (IF + more later on) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t uVMFlags;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** Pending PATM actions (internal use only) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t uPendingAction;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** Records the number of times all patches are called (indicating how many exceptions we managed to avoid) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t uPatchCalls;
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** Scratchpad dword */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t uScratch;
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** Debugging info */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t uIretEFlags, uIretCS, uIretEIP;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** PATM stack pointer */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t Psp;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** PATM interrupt flag */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t fPIF;
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** PATM inhibit irq address (used by sti) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync RTRCPTR GCPtrInhibitInterrupts;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** Scratch room for call patch */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync RTRCPTR GCCallPatchTargetAddr;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync RTRCPTR GCCallReturnAddr;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** Temporary storage for guest registers. */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync struct
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync {
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t uEAX;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t uECX;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t uEDI;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t eFlags;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync uint32_t uFlags;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync } Restore;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync} PATMGCSTATE, *PPATMGCSTATE;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsynctypedef struct PATMTRAPREC
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync{
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** pointer to original guest code instruction (for emulation) */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync RTRCPTR pNewEIP;
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** pointer to the next guest code instruction */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync RTRCPTR pNextInstr;
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync /** pointer to the corresponding next instruction in the patch block */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync RTRCPTR pNextPatchInstr;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync} PATMTRAPREC, *PPATMTRAPREC;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Translation state (currently patch to GC ptr)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsynctypedef enum
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync{
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync PATMTRANS_FAILED,
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync PATMTRANS_SAFE, /**< Safe translation */
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync PATMTRANS_PATCHSTART, /**< Instruction starts a patch block */
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync PATMTRANS_OVERWRITTEN, /**< Instruction overwritten by patchjump */
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync PATMTRANS_INHIBITIRQ /**< Instruction must be executed due to instruction fusing */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync} PATMTRANSSTATE;
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/**
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * Query PATM state (enabled/disabled)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync *
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @returns 0 - disabled, 1 - enabled
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @param pVM The VM to operate on.
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync * @internal
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync#define PATMIsEnabled(a_pVM) ((a_pVM)->fPATMEnabled)
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
5a7df607b64bfcec6cf547263957ca6db6a20a34vboxsyncVMMDECL(bool) PATMIsPatchGCAddr(PVM pVM, RTRCUINTPTR uGCAddr);
5a7df607b64bfcec6cf547263957ca6db6a20a34vboxsyncVMMDECL(bool) PATMIsPatchGCAddrExclHelpers(PVM pVM, RTRCUINTPTR uGCAddr);
a2179871c3ee5a00079f273fbc72b6e2d704c68dvboxsyncVMM_INT_DECL(int) PATMReadPatchCode(PVM pVM, RTGCPTR GCPtrPatchCode, void *pvDst, size_t cbToRead, size_t *pcbRead);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
4520bd7e24f7f7e396f11e2059ede66bb3c38ef6vboxsyncVMM_INT_DECL(void) PATMRawEnter(PVM pVM, PCPUMCTX pCtx);
4520bd7e24f7f7e396f11e2059ede66bb3c38ef6vboxsyncVMM_INT_DECL(void) PATMRawLeave(PVM pVM, PCPUMCTX pCtx, int rawRC);
4520bd7e24f7f7e396f11e2059ede66bb3c38ef6vboxsyncVMM_INT_DECL(uint32_t) PATMRawGetEFlags(PVM pVM, PCCPUMCTX pCtx);
4520bd7e24f7f7e396f11e2059ede66bb3c38ef6vboxsyncVMM_INT_DECL(void) PATMRawSetEFlags(PVM pVM, PCPUMCTX pCtx, uint32_t efl);
e4c4f1dc57eeabb8863d43b128783766afee2000vboxsyncVMM_INT_DECL(RCPTRTYPE(PPATMGCSTATE)) PATMGetGCState(PVM pVM);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMM_INT_DECL(bool) PATMShouldUseRawMode(PVM pVM, RTRCPTR pAddrGC);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMM_INT_DECL(int) PATMSetMMIOPatchInfo(PVM pVM, RTGCPHYS GCPhys, RTRCPTR pCachedData);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMM_INT_DECL(bool) PATMIsInt3Patch(PVM pVM, RTRCPTR pInstrGC, uint32_t *pOpcode, uint32_t *pSize);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMM_INT_DECL(bool) PATMAreInterruptsEnabled(PVM pVM);
4ef1cd1012e75ff26e27b27d319ecfdf470b2190vboxsyncVMM_INT_DECL(bool) PATMAreInterruptsEnabledByCtx(PVM pVM, PCPUMCTX pCtx);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifdef PATM_EMULATE_SYSENTER
4520bd7e24f7f7e396f11e2059ede66bb3c38ef6vboxsyncVMM_INT_DECL(int) PATMSysCall(PVM pVM, PCPUMCTX pCtx, PDISCPUSTATE pCpu);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifdef IN_RC
c1d279fc0865b91a40b30eda02ed14f6533fe1a4vboxsync/** @defgroup grp_patm_rc The Patch Manager Raw-mode Context API
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMRC_INT_DECL(int) PATMRCHandleInt3PatchTrap(PVM pVM, PCPUMCTXCORE pRegFrame);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMRC_INT_DECL(int) PATMRCHandleWriteToPatchPage(PVM pVM, PCPUMCTXCORE pRegFrame, RTRCPTR GCPtr, uint32_t cbWrite);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMRC_INT_DECL(int) PATMRCHandleIllegalInstrTrap(PVM pVM, PCPUMCTXCORE pRegFrame);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#ifdef IN_RING3
c1d279fc0865b91a40b30eda02ed14f6533fe1a4vboxsync/** @defgroup grp_patm_r3 The Patch Manager Host Ring-3 Context API
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync * @{
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3DECL(int) PATMR3AllowPatching(PUVM pUVM, bool fAllowPatching);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3DECL(bool) PATMR3IsEnabled(PUVM pUVM);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3Init(PVM pVM);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3InitFinalize(PVM pVM);
5a7df607b64bfcec6cf547263957ca6db6a20a34vboxsyncVMMR3_INT_DECL(void) PATMR3Relocate(PVM pVM, RTRCINTPTR offDelta);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3Term(PVM pVM);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3Reset(PVM pVM);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsync
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(bool) PATMR3IsInsidePatchJump(PVM pVM, RTRCPTR pAddr, PRTGCPTR32 pPatchAddr);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(RTRCPTR) PATMR3QueryPatchGCPtr(PVM pVM, RTRCPTR pAddrGC);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(void *) PATMR3GCPtrToHCPtr(PVM pVM, RTRCPTR pAddrGC);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(PPATMGCSTATE) PATMR3QueryGCStateHC(PVM pVM);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3HandleTrap(PVM pVM, PCPUMCTX pCtx, RTRCPTR pEip, RTGCPTR *ppNewEip);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3HandleMonitoredPage(PVM pVM);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3PatchWrite(PVM pVM, RTRCPTR GCPtr, uint32_t cbWrite);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3FlushPage(PVM pVM, RTRCPTR addr);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3InstallPatch(PVM pVM, RTRCPTR pInstrGC, uint64_t flags);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3AddHint(PVM pVM, RTRCPTR pInstrGC, uint32_t flags);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3DuplicateFunctionRequest(PVM pVM, PCPUMCTX pCtx);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(RTRCPTR) PATMR3PatchToGCPtr(PVM pVM, RTRCPTR pPatchGC, PATMTRANSSTATE *pEnmState);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3DECL(int) PATMR3QueryOpcode(PVM pVM, RTRCPTR pInstrGC, uint8_t *pByte);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3ReadOrgInstr(PVM pVM, RTGCPTR32 GCPtrInstr, uint8_t *pbDst, size_t cbToRead, size_t *pcbRead);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3DisablePatch(PVM pVM, RTRCPTR pInstrGC);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3EnablePatch(PVM pVM, RTRCPTR pInstrGC);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3RemovePatch(PVM pVM, RTRCPTR pInstrGC);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(int) PATMR3DetectConflict(PVM pVM, RTRCPTR pInstrGC, RTRCPTR pConflictGC);
1e29d016a09a61485fda74f7fca39e171ff5dda8vboxsyncVMMR3_INT_DECL(bool) PATMR3HasBeenPatched(PVM pVM, RTRCPTR pInstrGC);
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
31771163041e3661403a806eb3382d2a165c003bvboxsyncVMMR3_INT_DECL(void) PATMR3DbgPopulateAddrSpace(PVM pVM, RTDBGAS hDbgAs);
e3ddc294f1a80edb513f054d4c24ab79d7dfd3ddvboxsyncVMMR3_INT_DECL(void) PATMR3DbgAnnotatePatchedInstruction(PVM pVM, RTRCPTR RCPtr, uint8_t cbInstr,
e3ddc294f1a80edb513f054d4c24ab79d7dfd3ddvboxsync char *pszBuf, size_t cbBuf);
31771163041e3661403a806eb3382d2a165c003bvboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync/** @} */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsyncRT_C_DECLS_END
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
7220367ea1944fa8a7694534401321ad86eb70c6vboxsync#endif /* VBOX_WITH_RAW_MODE */
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync
0b74a2f80aba476dc8be8bc1c63891fc53945986vboxsync#endif