• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * VMI interface definition
3  *
4  * Copyright (C) 2005, VMware, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
14  * NON INFRINGEMENT.  See the GNU General Public License for more
15  * details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  *
21  * Maintained by: Zachary Amsden zach@vmware.com
22  *
23  */
24 #include <linux/types.h>
25 
26 /*
27  *---------------------------------------------------------------------
28  *
29  *  VMI Option ROM API
30  *
31  *---------------------------------------------------------------------
32  */
33 #define VMI_SIGNATURE 0x696d5663   /* "cVmi" */
34 
35 #define PCI_VENDOR_ID_VMWARE            0x15AD
36 #define PCI_DEVICE_ID_VMWARE_VMI        0x0801
37 
38 /*
39  * We use two version numbers for compatibility, with the major
40  * number signifying interface breakages, and the minor number
41  * interface extensions.
42  */
43 #define VMI_API_REV_MAJOR       3
44 #define VMI_API_REV_MINOR       0
45 
46 #define VMI_CALL_CPUID			0
47 #define VMI_CALL_WRMSR			1
48 #define VMI_CALL_RDMSR			2
49 #define VMI_CALL_SetGDT			3
50 #define VMI_CALL_SetLDT			4
51 #define VMI_CALL_SetIDT			5
52 #define VMI_CALL_SetTR			6
53 #define VMI_CALL_GetGDT			7
54 #define VMI_CALL_GetLDT			8
55 #define VMI_CALL_GetIDT			9
56 #define VMI_CALL_GetTR			10
57 #define VMI_CALL_WriteGDTEntry		11
58 #define VMI_CALL_WriteLDTEntry		12
59 #define VMI_CALL_WriteIDTEntry		13
60 #define VMI_CALL_UpdateKernelStack	14
61 #define VMI_CALL_SetCR0			15
62 #define VMI_CALL_SetCR2			16
63 #define VMI_CALL_SetCR3			17
64 #define VMI_CALL_SetCR4			18
65 #define VMI_CALL_GetCR0			19
66 #define VMI_CALL_GetCR2			20
67 #define VMI_CALL_GetCR3			21
68 #define VMI_CALL_GetCR4			22
69 #define VMI_CALL_WBINVD			23
70 #define VMI_CALL_SetDR			24
71 #define VMI_CALL_GetDR			25
72 #define VMI_CALL_RDPMC			26
73 #define VMI_CALL_RDTSC			27
74 #define VMI_CALL_CLTS			28
75 #define VMI_CALL_EnableInterrupts	29
76 #define VMI_CALL_DisableInterrupts	30
77 #define VMI_CALL_GetInterruptMask	31
78 #define VMI_CALL_SetInterruptMask	32
79 #define VMI_CALL_IRET			33
80 #define VMI_CALL_SYSEXIT		34
81 #define VMI_CALL_Halt			35
82 #define VMI_CALL_Reboot			36
83 #define VMI_CALL_Shutdown		37
84 #define VMI_CALL_SetPxE			38
85 #define VMI_CALL_SetPxELong		39
86 #define VMI_CALL_UpdatePxE		40
87 #define VMI_CALL_UpdatePxELong		41
88 #define VMI_CALL_MachineToPhysical	42
89 #define VMI_CALL_PhysicalToMachine	43
90 #define VMI_CALL_AllocatePage		44
91 #define VMI_CALL_ReleasePage		45
92 #define VMI_CALL_InvalPage		46
93 #define VMI_CALL_FlushTLB		47
94 #define VMI_CALL_SetLinearMapping	48
95 
96 #define VMI_CALL_SetIOPLMask		61
97 #define VMI_CALL_SetInitialAPState	62
98 #define VMI_CALL_APICWrite		63
99 #define VMI_CALL_APICRead		64
100 #define VMI_CALL_IODelay		65
101 #define VMI_CALL_SetLazyMode		73
102 
103 /*
104  *---------------------------------------------------------------------
105  *
106  * MMU operation flags
107  *
108  *---------------------------------------------------------------------
109  */
110 
111 /* Flags used by VMI_{Allocate|Release}Page call */
112 #define VMI_PAGE_PAE             0x10  /* Allocate PAE shadow */
113 #define VMI_PAGE_CLONE           0x20  /* Clone from another shadow */
114 #define VMI_PAGE_ZEROED          0x40  /* Page is pre-zeroed */
115 
116 
117 /* Flags shared by Allocate|Release Page and PTE updates */
118 #define VMI_PAGE_PT              0x01
119 #define VMI_PAGE_PD              0x02
120 #define VMI_PAGE_PDP             0x04
121 #define VMI_PAGE_PML4            0x08
122 
123 #define VMI_PAGE_NORMAL          0x00 /* for debugging */
124 
125 /* Flags used by PTE updates */
126 #define VMI_PAGE_CURRENT_AS      0x10 /* implies VMI_PAGE_VA_MASK is valid */
127 #define VMI_PAGE_DEFER           0x20 /* may queue update until TLB inval */
128 #define VMI_PAGE_VA_MASK         0xfffff000
129 
130 #ifdef CONFIG_X86_PAE
131 #define VMI_PAGE_L1		(VMI_PAGE_PT | VMI_PAGE_PAE | VMI_PAGE_ZEROED)
132 #define VMI_PAGE_L2		(VMI_PAGE_PD | VMI_PAGE_PAE | VMI_PAGE_ZEROED)
133 #else
134 #define VMI_PAGE_L1		(VMI_PAGE_PT | VMI_PAGE_ZEROED)
135 #define VMI_PAGE_L2		(VMI_PAGE_PD | VMI_PAGE_ZEROED)
136 #endif
137 
138 /* Flags used by VMI_FlushTLB call */
139 #define VMI_FLUSH_TLB            0x01
140 #define VMI_FLUSH_GLOBAL         0x02
141 
142 /*
143  *---------------------------------------------------------------------
144  *
145  *  VMI relocation definitions for ROM call get_reloc
146  *
147  *---------------------------------------------------------------------
148  */
149 
150 /* VMI Relocation types */
151 #define VMI_RELOCATION_NONE     0
152 #define VMI_RELOCATION_CALL_REL 1
153 #define VMI_RELOCATION_JUMP_REL 2
154 #define VMI_RELOCATION_NOP	3
155 
156 #ifndef __ASSEMBLY__
157 struct vmi_relocation_info {
158 	unsigned char           *eip;
159 	unsigned char           type;
160 	unsigned char           reserved[3];
161 };
162 #endif
163 
164 
165 /*
166  *---------------------------------------------------------------------
167  *
168  *  Generic ROM structures and definitions
169  *
170  *---------------------------------------------------------------------
171  */
172 
173 #ifndef __ASSEMBLY__
174 
175 struct vrom_header {
176 	u16     rom_signature;  /* option ROM signature */
177 	u8      rom_length;     /* ROM length in 512 byte chunks */
178 	u8      rom_entry[4];   /* 16-bit code entry point */
179 	u8      rom_pad0;       /* 4-byte align pad */
180 	u32     vrom_signature; /* VROM identification signature */
181 	u8      api_version_min;/* Minor version of API */
182 	u8      api_version_maj;/* Major version of API */
183 	u8      jump_slots;     /* Number of jump slots */
184 	u8      reserved1;      /* Reserved for expansion */
185 	u32     virtual_top;    /* Hypervisor virtual address start */
186 	u16     reserved2;      /* Reserved for expansion */
187 	u16	license_offs;	/* Offset to License string */
188 	u16     pci_header_offs;/* Offset to PCI OPROM header */
189 	u16     pnp_header_offs;/* Offset to PnP OPROM header */
190 	u32     rom_pad3;       /* PnP reserverd / VMI reserved */
191 	u8      reserved[96];   /* Reserved for headers */
192 	char    vmi_init[8];    /* VMI_Init jump point */
193 	char    get_reloc[8];   /* VMI_GetRelocationInfo jump point */
194 } __attribute__((packed));
195 
196 struct pnp_header {
197 	char sig[4];
198 	char rev;
199 	char size;
200 	short next;
201 	short res;
202 	long devID;
203 	unsigned short manufacturer_offset;
204 	unsigned short product_offset;
205 } __attribute__((packed));
206 
207 struct pci_header {
208 	char sig[4];
209 	short vendorID;
210 	short deviceID;
211 	short vpdData;
212 	short size;
213 	char rev;
214 	char class;
215 	char subclass;
216 	char interface;
217 	short chunks;
218 	char rom_version_min;
219 	char rom_version_maj;
220 	char codetype;
221 	char lastRom;
222 	short reserved;
223 } __attribute__((packed));
224 
225 /* Function prototypes for bootstrapping */
226 #ifdef CONFIG_VMI
227 extern void vmi_init(void);
228 extern void vmi_activate(void);
229 extern void vmi_bringup(void);
230 #else
vmi_init(void)231 static inline void vmi_init(void) {}
vmi_activate(void)232 static inline void vmi_activate(void) {}
vmi_bringup(void)233 static inline void vmi_bringup(void) {}
234 #endif
235 
236 /* State needed to start an application processor in an SMP system. */
237 struct vmi_ap_state {
238 	u32 cr0;
239 	u32 cr2;
240 	u32 cr3;
241 	u32 cr4;
242 
243 	u64 efer;
244 
245 	u32 eip;
246 	u32 eflags;
247 	u32 eax;
248 	u32 ebx;
249 	u32 ecx;
250 	u32 edx;
251 	u32 esp;
252 	u32 ebp;
253 	u32 esi;
254 	u32 edi;
255 	u16 cs;
256 	u16 ss;
257 	u16 ds;
258 	u16 es;
259 	u16 fs;
260 	u16 gs;
261 	u16 ldtr;
262 
263 	u16 gdtr_limit;
264 	u32 gdtr_base;
265 	u32 idtr_base;
266 	u16 idtr_limit;
267 };
268 
269 #endif
270