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 */ 226#ifdef CONFIG_VMI 227extern void vmi_init(void); 228extern void vmi_activate(void); 229extern void vmi_bringup(void); 230#else 231static inline void vmi_init(void) {} 232static inline void vmi_activate(void) {} 233static inline void vmi_bringup(void) {} 234#endif 235 236/* State needed to start an application processor in an SMP system. */ 237struct 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