VirtualBox

source: vbox/trunk/src/VBox/VMM/VMMSwitcher/VMMSwitcher.h@ 17390

Last change on this file since 17390 was 16859, checked in by vboxsync, 16 years ago

Load hypervisor CR3 from CPUM (instead of hardcoded fixups in the switchers). Dangerous change. Watch for regressions.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 6.4 KB
Line 
1/* $Id: VMMSwitcher.h 16859 2009-02-17 16:19:51Z vboxsync $ */
2/** @file
3 * VMM - World Switchers.
4 */
5
6/*
7 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
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 (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22#ifndef ___VMMSwitcher_h
23#define ___VMMSwitcher_h
24
25#include <VBox/vmm.h>
26
27/** @name Fixup Types.
28 * @{
29 */
30/** @todo document what arguments these take and what they do. */
31#define FIX_HC_2_GC_NEAR_REL 1
32#define FIX_HC_2_ID_NEAR_REL 2
33#define FIX_GC_2_HC_NEAR_REL 3
34#define FIX_GC_2_ID_NEAR_REL 4
35#define FIX_ID_2_HC_NEAR_REL 5
36#define FIX_ID_2_GC_NEAR_REL 6
37#define FIX_GC_FAR32 7
38#define FIX_GC_CPUM_OFF 8
39#define FIX_GC_VM_OFF 9 /** @todo cleanup fixup names GC->RC, HC->R0. */
40#define FIX_HC_CPUM_OFF 10
41#define FIX_HC_VM_OFF 11
42#define FIX_INTER_32BIT_CR3 12
43#define FIX_INTER_PAE_CR3 13
44#define FIX_INTER_AMD64_CR3 14
45#define FIX_HYPER_CS 18
46#define FIX_HYPER_DS 19
47#define FIX_HYPER_TSS 20
48#define FIX_GC_TSS_GDTE_DW2 21
49#define FIX_CR4_MASK 22
50#define FIX_CR4_OSFSXR 23
51#define FIX_NO_FXSAVE_JMP 24
52#define FIX_NO_SYSENTER_JMP 25
53#define FIX_NO_SYSCALL_JMP 26
54#define FIX_HC_32BIT 27
55#define FIX_HC_64BIT 28
56#define FIX_HC_64BIT_CPUM 29
57#define FIX_HC_64BIT_CS 30
58#define FIX_ID_32BIT 31
59#define FIX_ID_64BIT 32
60#define FIX_ID_FAR32_TO_64BIT_MODE 33
61#define FIX_GC_APIC_BASE_32BIT 34
62#define FIX_HC_64BIT_NOCHECK 35
63#define FIX_GC_64_BIT_CPUM_OFF 36
64#define FIX_THE_END 255
65/** @} */
66
67
68/** Pointer to a switcher definition. */
69typedef struct VMMSWITCHERDEF *PVMMSWITCHERDEF;
70
71/**
72 * Callback function for relocating the core code belonging to a switcher.
73 *
74 * @param pVM VM handle.
75 * @param pSwitcher Pointer to the switcher structure.
76 * @param R0PtrCode Pointer to the first code byte in the ring-0 mapping.
77 * @param pu8CodeR3 Pointer to the first code byte in the ring-3 mapping.
78 * @param GCPtrCode The GC address of the first code byte.
79 * @param u32IDCode The address of the identity mapped code (first byte).
80 */
81typedef DECLCALLBACK(void) FNVMMSWITCHERRELOCATE(PVM pVM, PVMMSWITCHERDEF pSwitcher, RTR0PTR R0PtrCode, uint8_t *pu8CodeR3,
82 RTGCPTR GCPtrCode, uint32_t u32IDCode);
83/** Pointer to a FNVMMSWITCHERRELOCATE(). */
84typedef FNVMMSWITCHERRELOCATE *PFNVMMSWITCHERRELOCATE;
85
86/**
87 * VMM Switcher structure.
88 */
89#pragma pack(1)
90typedef struct VMMSWITCHERDEF
91{
92 /** Pointer to the code. */
93 void *pvCode;
94 /** Pointer to the fixup records. */
95 void *pvFixups;
96 /** Pointer to the description. */
97 const char *pszDesc;
98 /** Function which performs the necessary relocations. */
99 PFNVMMSWITCHERRELOCATE pfnRelocate;
100 /** The switcher type. */
101 VMMSWITCHER enmType;
102 /** Size of the entire code chunk. */
103 uint32_t cbCode;
104 /** vmmR0HostToGuest C entrypoint. */
105 uint32_t offR0HostToGuest;
106 /** vmmGCGuestToHost C entrypoint. */
107 uint32_t offGCGuestToHost;
108 /** vmmGCCallTrampoline address. */
109 uint32_t offGCCallTrampoline;
110 /** vmmGCGuestToHostAsm assembly entrypoint. */
111 uint32_t offGCGuestToHostAsm;
112 /** vmmGCGuestToHostAsmHyperCtx assembly entrypoint taking HyperCtx. */
113 uint32_t offGCGuestToHostAsmHyperCtx;
114 /** vmmGCGuestToHostAsmGuestCtx assembly entrypoint taking GuestCtx. */
115 uint32_t offGCGuestToHostAsmGuestCtx;
116 /** @name Disassembly Regions.
117 * @{ */
118 uint32_t offHCCode0;
119 uint32_t cbHCCode0;
120 uint32_t offHCCode1;
121 uint32_t cbHCCode1;
122 uint32_t offIDCode0;
123 uint32_t cbIDCode0;
124 uint32_t offIDCode1;
125 uint32_t cbIDCode1;
126 uint32_t offGCCode;
127 uint32_t cbGCCode;
128 /** @} */
129} VMMSWITCHERDEF;
130#pragma pack()
131
132__BEGIN_DECLS
133extern VMMSWITCHERDEF vmmR3Switcher32BitTo32Bit_Def;
134extern VMMSWITCHERDEF vmmR3Switcher32BitToPAE_Def;
135extern VMMSWITCHERDEF vmmR3Switcher32BitToAMD64_Def;
136extern VMMSWITCHERDEF vmmR3SwitcherPAETo32Bit_Def;
137extern VMMSWITCHERDEF vmmR3SwitcherPAEToPAE_Def;
138extern VMMSWITCHERDEF vmmR3SwitcherPAEToAMD64_Def;
139extern VMMSWITCHERDEF vmmR3SwitcherAMD64To32Bit_Def;
140extern VMMSWITCHERDEF vmmR3SwitcherAMD64ToPAE_Def;
141extern VMMSWITCHERDEF vmmR3SwitcherAMD64ToAMD64_Def;
142
143extern DECLCALLBACK(void) vmmR3Switcher32BitTo32Bit_Relocate(PVM pVM, PVMMSWITCHERDEF pSwitcher, RTR0PTR R0PtrCode, uint8_t *pu8CodeR3, RTGCPTR GCPtrCode, uint32_t u32IdCode);
144extern DECLCALLBACK(void) vmmR3Switcher32BitToPAE_Relocate(PVM pVM, PVMMSWITCHERDEF pSwitcher, RTR0PTR R0PtrCode, uint8_t *pu8CodeR3, RTGCPTR GCPtrCode, uint32_t u32IdCode);
145extern DECLCALLBACK(void) vmmR3Switcher32BitToAMD64_Relocate(PVM pVM, PVMMSWITCHERDEF pSwitcher, RTR0PTR R0PtrCode, uint8_t *pu8CodeR3, RTGCPTR GCPtrCode, uint32_t u32IdCode);
146extern DECLCALLBACK(void) vmmR3SwitcherPAETo32Bit_Relocate(PVM pVM, PVMMSWITCHERDEF pSwitcher, RTR0PTR R0PtrCode, uint8_t *pu8CodeR3, RTGCPTR GCPtrCode, uint32_t u32IdCode);
147extern DECLCALLBACK(void) vmmR3SwitcherPAEToPAE_Relocate(PVM pVM, PVMMSWITCHERDEF pSwitcher, RTR0PTR R0PtrCode, uint8_t *pu8CodeR3, RTGCPTR GCPtrCode, uint32_t u32IdCode);
148extern DECLCALLBACK(void) vmmR3SwitcherPAEToAMD64_Relocate(PVM pVM, PVMMSWITCHERDEF pSwitcher, RTR0PTR R0PtrCode, uint8_t *pu8CodeR3, RTGCPTR GCPtrCode, uint32_t u32IdCode);
149extern DECLCALLBACK(void) vmmR3SwitcherAMD64To32Bit_Relocate(PVM pVM, PVMMSWITCHERDEF pSwitcher, RTR0PTR R0PtrCode, uint8_t *pu8CodeR3, RTGCPTR GCPtrCode, uint32_t u32IdCode);
150extern DECLCALLBACK(void) vmmR3SwitcherAMD64ToPAE_Relocate(PVM pVM, PVMMSWITCHERDEF pSwitcher, RTR0PTR R0PtrCode, uint8_t *pu8CodeR3, RTGCPTR GCPtrCode, uint32_t u32IdCode);
151extern DECLCALLBACK(void) vmmR3SwitcherAMD64ToAMD64_Relocate(PVM pVM, PVMMSWITCHERDEF pSwitcher, RTR0PTR R0PtrCode, uint8_t *pu8CodeR3, RTGCPTR GCPtrCode, uint32_t u32IdCode);
152__END_DECLS
153
154#endif
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