MMRamRC.cpp revision 683371bbf37760161d1b8454ce978acf89bbb04f
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * MMRamGC - Guest Context Ram access Routines, pair for MMRamGCA.asm.
77bbd3327e8130eb01de6c1c1d1ef54e0ab48be8vboxsync * Copyright (C) 2006-2007 Oracle Corporation
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * available from http://www.virtualbox.org. This file is free software;
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * you can redistribute it and/or modify it under the terms of the GNU
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * General Public License (GPL) as published by the Free Software
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/*******************************************************************************
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync* Header Files *
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync*******************************************************************************/
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync/*******************************************************************************
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync* Internal Functions *
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync*******************************************************************************/
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsyncstatic DECLCALLBACK(int) mmGCRamTrap0eHandler(PVM pVM, PCPUMCTXCORE pRegFrame);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsyncDECLASM(void) MMGCRamReadNoTrapHandler_EndProc(void);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsyncDECLASM(void) MMGCRamWriteNoTrapHandler_EndProc(void);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Install MMGCRam Hypervisor page fault handler for normal working
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * of MMGCRamRead and MMGCRamWrite calls.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * This handler will be automatically removed at page fault.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * In other case it must be removed by MMGCRamDeregisterTrapHandler call.
1e9377d042fa2ea3e2cd78805678f23f64db55f6vboxsync * @param pVM VM handle.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync TRPMGCSetTempHandler(pVM, 0xe, mmGCRamTrap0eHandler);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Remove MMGCRam Hypervisor page fault handler.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * See description of MMGCRamRegisterTrapHandler call.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * @param pVM VM handle.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsyncVMMRCDECL(void) MMGCRamDeregisterTrapHandler(PVM pVM)
710a6316a22868b04400caf79719f96c18163cd3vboxsync * Read data in guest context with #PF control.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * @returns VBox status.
174f11bbd5c277153742aa5e6c3bd640bf379547vboxsync * @param pVM The VM handle.
41b3442e21c3a79f3bc61ce67e3445757a83f281vboxsync * @param pDst Where to store the read data.
06782e19f5e2144408396dcec922c423c5ef9da8vboxsync * @param pSrc Pointer to the data to read.
80e46f984efd827517661c0e081a36014ca41af8vboxsync * @param cb Size of data to read, only 1/2/4/8 is valid.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsyncVMMRCDECL(int) MMGCRamRead(PVM pVM, void *pDst, void *pSrc, size_t cb)
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync TRPMSaveTrap(pVCpu); /* save the current trap info, because it will get trashed if our access failed. */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Write data in guest context with #PF control.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * @returns VBox status.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * @param pVM The VM handle.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * @param pDst Where to write the data.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * @param pSrc Pointer to the data to write.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * @param cb Size of data to write, only 1/2/4 is valid.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * @deprecated Don't use this as it doesn't check the page state.
fb1975a6972d89de9e515bed0248db93f04ec9d8vboxsyncVMMRCDECL(int) MMGCRamWrite(PVM pVM, void *pDst, void *pSrc, size_t cb)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync TRPMSaveTrap(pVCpu); /* save the current trap info, because it will get trashed if our access failed. */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync int rc = MMGCRamWriteNoTrapHandler(pDst, pSrc, cb);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * And mark the relevant guest page as accessed and dirty.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync PGMGstModifyPage(VMMGetCpu0(pVM), (RTGCPTR)(RTRCUINTPTR)pDst, cb, X86_PTE_A | X86_PTE_D, ~(uint64_t)(X86_PTE_A | X86_PTE_D));
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * \#PF Handler for servicing traps inside MMGCRamReadNoTrapHandler and MMGCRamWriteNoTrapHandler functions.
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync * @internal
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsyncDECLCALLBACK(int) mmGCRamTrap0eHandler(PVM pVM, PCPUMCTXCORE pRegFrame)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Page fault inside MMGCRamRead()? Resume at *_Error.
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync if ( (uintptr_t)&MMGCRamReadNoTrapHandler < (uintptr_t)pRegFrame->eip
a425b5e790c27d6a1a2cf738802e9034f0764a00vboxsync && (uintptr_t)pRegFrame->eip < (uintptr_t)&MMGCRamReadNoTrapHandler_EndProc)
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync /* Must be a read violation. */
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync AssertReturn(!(TRPMGetErrorCode(VMMGetCpu0(pVM)) & X86_TRAP_PF_RW), VERR_MM_BAD_TRAP_TYPE_IPE);
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync * Page fault inside MMGCRamWrite()? Resume at _Error.
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync if ( (uintptr_t)&MMGCRamWriteNoTrapHandler < (uintptr_t)pRegFrame->eip
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync && (uintptr_t)pRegFrame->eip < (uintptr_t)&MMGCRamWriteNoTrapHandler_EndProc)
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync /* Must be a write violation. */
aeb9498c4d9854ed42b271541d34c7bad97b4c77vboxsync AssertReturn(TRPMGetErrorCode(VMMGetCpu0(pVM)) & X86_TRAP_PF_RW, VERR_MM_BAD_TRAP_TYPE_IPE);
bddad5eeab93a98d4ea571ccdf016531bb4318advboxsync * #PF is not handled - cause guru meditation.