VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMAll/REMAll.cpp@ 4295

Last change on this file since 4295 was 4268, checked in by vboxsync, 17 years ago

Record invlpg occurrences in ring 0 too.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 5.6 KB
Line 
1/* $Id: REMAll.cpp 4268 2007-08-21 17:10:47Z vboxsync $ */
2/** @file
3 * REM - Recompiled Execution Monitor, all Contexts part.
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
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 as published by the Free Software Foundation,
13 * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
14 * distribution. VirtualBox OSE is distributed in the hope that it will
15 * be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19/*******************************************************************************
20* Global Variables *
21*******************************************************************************/
22#define LOG_GROUP LOG_GROUP_REM
23#include <VBox/rem.h>
24#include <VBox/vmm.h>
25#include "REMInternal.h"
26#include <VBox/vm.h>
27#include <VBox/err.h>
28#include <VBox/log.h>
29
30#include <iprt/assert.h>
31
32
33/**
34 * Records a invlpg instruction for replaying upon REM entry.
35 *
36 * @returns VINF_SUCCESS on success.
37 * @returns VERR_REM_FLUSHED_PAGES_OVERFLOW if a return to HC for flushing of
38 * recorded pages is required before the call can succeed.
39 * @param pVM The VM handle.
40 * @param GCPtrPage The
41 */
42REMDECL(int) REMNotifyInvalidatePage(PVM pVM, RTGCPTR GCPtrPage)
43{
44 if (pVM->rem.s.cInvalidatedPages < ELEMENTS(pVM->rem.s.aGCPtrInvalidatedPages))
45 {
46 /*
47 * We sync them back in REMR3State.
48 */
49 pVM->rem.s.aGCPtrInvalidatedPages[pVM->rem.s.cInvalidatedPages++] = GCPtrPage;
50 return VINF_SUCCESS;
51 }
52 /* Note: another option is to signal a TLB flush for the recompiler */
53 return VERR_REM_FLUSHED_PAGES_OVERFLOW;
54}
55
56
57/**
58 * Flushes the handler notifications by calling the host.
59 *
60 * @param pVM The VM handle.
61 */
62static void remFlushHandlerNotifications(PVM pVM)
63{
64#ifdef IN_GC
65 VMMGCCallHost(pVM, VMMCALLHOST_REM_REPLAY_HANDLER_NOTIFICATIONS, 0);
66#elif defined(IN_RING0)
67 /** @todo necessary? */
68 VMMR0CallHost(pVM, VMMCALLHOST_REM_REPLAY_HANDLER_NOTIFICATIONS, 0);
69#else
70 AssertReleaseMsgFailed(("Ring 3 call????.\n"));
71#endif
72 Assert(pVM->rem.s.cHandlerNotifications == 0);
73}
74
75
76/**
77 * Notification about a successful PGMR3HandlerPhysicalRegister() call.
78 *
79 * @param pVM VM Handle.
80 * @param enmType Handler type.
81 * @param GCPhys Handler range address.
82 * @param cb Size of the handler range.
83 * @param fHasHCHandler Set if the handler have a HC callback function.
84 */
85REMDECL(void) REMNotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler)
86{
87 if (pVM->rem.s.cHandlerNotifications >= ELEMENTS(pVM->rem.s.aHandlerNotifications))
88 remFlushHandlerNotifications(pVM);
89 PREMHANDLERNOTIFICATION pRec = &pVM->rem.s.aHandlerNotifications[pVM->rem.s.cHandlerNotifications++];
90 pRec->enmKind = REMHANDLERNOTIFICATIONKIND_PHYSICAL_REGISTER;
91 pRec->u.PhysicalRegister.enmType = enmType;
92 pRec->u.PhysicalRegister.GCPhys = GCPhys;
93 pRec->u.PhysicalRegister.cb = cb;
94 pRec->u.PhysicalRegister.fHasHCHandler = fHasHCHandler;
95}
96
97
98/**
99 * Notification about a successful PGMR3HandlerPhysicalDeregister() operation.
100 *
101 * @param pVM VM Handle.
102 * @param enmType Handler type.
103 * @param GCPhys Handler range address.
104 * @param cb Size of the handler range.
105 * @param fHasHCHandler Set if the handler have a HC callback function.
106 * @param pvHCPtr The HC virtual address corresponding to GCPhys if available.
107 */
108REMDECL(void) REMNotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, RTHCPTR pvHCPtr)
109{
110 if (pVM->rem.s.cHandlerNotifications >= ELEMENTS(pVM->rem.s.aHandlerNotifications))
111 remFlushHandlerNotifications(pVM);
112 PREMHANDLERNOTIFICATION pRec = &pVM->rem.s.aHandlerNotifications[pVM->rem.s.cHandlerNotifications++];
113 pRec->enmKind = REMHANDLERNOTIFICATIONKIND_PHYSICAL_DEREGISTER;
114 pRec->u.PhysicalDeregister.enmType = enmType;
115 pRec->u.PhysicalDeregister.GCPhys = GCPhys;
116 pRec->u.PhysicalDeregister.cb = cb;
117 pRec->u.PhysicalDeregister.fHasHCHandler = fHasHCHandler;
118 pRec->u.PhysicalDeregister.pvHCPtr = pvHCPtr;
119}
120
121
122/**
123 * Notification about a successful PGMR3HandlerPhysicalModify() call.
124 *
125 * @param pVM VM Handle.
126 * @param enmType Handler type.
127 * @param GCPhysOld Old handler range address.
128 * @param GCPhysNew New handler range address.
129 * @param cb Size of the handler range.
130 * @param fHasHCHandler Set if the handler have a HC callback function.
131 * @param pvHCPtr The HC virtual address corresponding to GCPhys if available.
132 */
133REMDECL(void) REMNotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, RTHCPTR pvHCPtr)
134{
135 if (pVM->rem.s.cHandlerNotifications >= ELEMENTS(pVM->rem.s.aHandlerNotifications))
136 remFlushHandlerNotifications(pVM);
137 PREMHANDLERNOTIFICATION pRec = &pVM->rem.s.aHandlerNotifications[pVM->rem.s.cHandlerNotifications++];
138 pRec->enmKind = REMHANDLERNOTIFICATIONKIND_PHYSICAL_MODIFY;
139 pRec->u.PhysicalModify.enmType = enmType;
140 pRec->u.PhysicalModify.GCPhysOld = GCPhysOld;
141 pRec->u.PhysicalModify.GCPhysNew = GCPhysNew;
142 pRec->u.PhysicalModify.cb = cb;
143 pRec->u.PhysicalModify.fHasHCHandler = fHasHCHandler;
144 pRec->u.PhysicalModify.pvHCPtr = pvHCPtr;
145}
146
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette