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__
157struct 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
175struct 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
196struct 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
207struct 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 */
226extern void vmi_init(void);
227extern void vmi_bringup(void);
228extern void vmi_apply_boot_page_allocations(void);
229
230/* State needed to start an application processor in an SMP system. */
231struct vmi_ap_state {
232	u32 cr0;
233	u32 cr2;
234	u32 cr3;
235	u32 cr4;
236
237	u64 efer;
238
239	u32 eip;
240	u32 eflags;
241	u32 eax;
242	u32 ebx;
243	u32 ecx;
244	u32 edx;
245	u32 esp;
246	u32 ebp;
247	u32 esi;
248	u32 edi;
249	u16 cs;
250	u16 ss;
251	u16 ds;
252	u16 es;
253	u16 fs;
254	u16 gs;
255	u16 ldtr;
256
257	u16 gdtr_limit;
258	u32 gdtr_base;
259	u32 idtr_base;
260	u16 idtr_limit;
261};
262
263#endif
264