arch/x86/include/asm/vmi.h
changeset 0 aa628870c1d3
equal deleted inserted replaced
-1:000000000000 0:aa628870c1d3
       
     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
       
   231 static inline void vmi_init(void) {}
       
   232 static inline void vmi_activate(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