vmi.h 7.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
/*
 * VMI interface definition
 *
 * Copyright (C) 2005, VMware, Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 * NON INFRINGEMENT.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 * Maintained by: Zachary Amsden zach@vmware.com
 *
 */
#include <linux/types.h>

/*
 *---------------------------------------------------------------------
 *
 *  VMI Option ROM API
 *
 *---------------------------------------------------------------------
 */
#define VMI_SIGNATURE 0x696d5663   /* "cVmi" */

#define PCI_VENDOR_ID_VMWARE            0x15AD
#define PCI_DEVICE_ID_VMWARE_VMI        0x0801

/*
 * We use two version numbers for compatibility, with the major
 * number signifying interface breakages, and the minor number
 * interface extensions.
 */
#define VMI_API_REV_MAJOR       3
#define VMI_API_REV_MINOR       0

#define VMI_CALL_CPUID			0
#define VMI_CALL_WRMSR			1
#define VMI_CALL_RDMSR			2
#define VMI_CALL_SetGDT			3
#define VMI_CALL_SetLDT			4
#define VMI_CALL_SetIDT			5
#define VMI_CALL_SetTR			6
#define VMI_CALL_GetGDT			7
#define VMI_CALL_GetLDT			8
#define VMI_CALL_GetIDT			9
#define VMI_CALL_GetTR			10
#define VMI_CALL_WriteGDTEntry		11
#define VMI_CALL_WriteLDTEntry		12
#define VMI_CALL_WriteIDTEntry		13
#define VMI_CALL_UpdateKernelStack	14
#define VMI_CALL_SetCR0			15
#define VMI_CALL_SetCR2			16
#define VMI_CALL_SetCR3			17
#define VMI_CALL_SetCR4			18
#define VMI_CALL_GetCR0			19
#define VMI_CALL_GetCR2			20
#define VMI_CALL_GetCR3			21
#define VMI_CALL_GetCR4			22
#define VMI_CALL_WBINVD			23
#define VMI_CALL_SetDR			24
#define VMI_CALL_GetDR			25
#define VMI_CALL_RDPMC			26
#define VMI_CALL_RDTSC			27
#define VMI_CALL_CLTS			28
#define VMI_CALL_EnableInterrupts	29
#define VMI_CALL_DisableInterrupts	30
#define VMI_CALL_GetInterruptMask	31
#define VMI_CALL_SetInterruptMask	32
#define VMI_CALL_IRET			33
#define VMI_CALL_SYSEXIT		34
#define VMI_CALL_Halt			35
#define VMI_CALL_Reboot			36
#define VMI_CALL_Shutdown		37
#define VMI_CALL_SetPxE			38
#define VMI_CALL_SetPxELong		39
#define VMI_CALL_UpdatePxE		40
#define VMI_CALL_UpdatePxELong		41
#define VMI_CALL_MachineToPhysical	42
#define VMI_CALL_PhysicalToMachine	43
#define VMI_CALL_AllocatePage		44
#define VMI_CALL_ReleasePage		45
#define VMI_CALL_InvalPage		46
#define VMI_CALL_FlushTLB		47
#define VMI_CALL_SetLinearMapping	48

#define VMI_CALL_SetIOPLMask		61
#define VMI_CALL_SetInitialAPState	62
#define VMI_CALL_APICWrite		63
#define VMI_CALL_APICRead		64
Z
Zachary Amsden 已提交
100
#define VMI_CALL_IODelay		65
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
#define VMI_CALL_SetLazyMode		73

/*
 *---------------------------------------------------------------------
 *
 * MMU operation flags
 *
 *---------------------------------------------------------------------
 */

/* Flags used by VMI_{Allocate|Release}Page call */
#define VMI_PAGE_PAE             0x10  /* Allocate PAE shadow */
#define VMI_PAGE_CLONE           0x20  /* Clone from another shadow */
#define VMI_PAGE_ZEROED          0x40  /* Page is pre-zeroed */


/* Flags shared by Allocate|Release Page and PTE updates */
#define VMI_PAGE_PT              0x01
#define VMI_PAGE_PD              0x02
#define VMI_PAGE_PDP             0x04
#define VMI_PAGE_PML4            0x08

#define VMI_PAGE_NORMAL          0x00 /* for debugging */

/* Flags used by PTE updates */
#define VMI_PAGE_CURRENT_AS      0x10 /* implies VMI_PAGE_VA_MASK is valid */
#define VMI_PAGE_DEFER           0x20 /* may queue update until TLB inval */
#define VMI_PAGE_VA_MASK         0xfffff000

#ifdef CONFIG_X86_PAE
#define VMI_PAGE_L1		(VMI_PAGE_PT | VMI_PAGE_PAE | VMI_PAGE_ZEROED)
#define VMI_PAGE_L2		(VMI_PAGE_PD | VMI_PAGE_PAE | VMI_PAGE_ZEROED)
#else
#define VMI_PAGE_L1		(VMI_PAGE_PT | VMI_PAGE_ZEROED)
#define VMI_PAGE_L2		(VMI_PAGE_PD | VMI_PAGE_ZEROED)
#endif

/* Flags used by VMI_FlushTLB call */
#define VMI_FLUSH_TLB            0x01
#define VMI_FLUSH_GLOBAL         0x02

/*
 *---------------------------------------------------------------------
 *
 *  VMI relocation definitions for ROM call get_reloc
 *
 *---------------------------------------------------------------------
 */

/* VMI Relocation types */
#define VMI_RELOCATION_NONE     0
#define VMI_RELOCATION_CALL_REL 1
#define VMI_RELOCATION_JUMP_REL 2
#define VMI_RELOCATION_NOP	3

#ifndef __ASSEMBLY__
struct vmi_relocation_info {
158 159 160
	unsigned char           *eip;
	unsigned char           type;
	unsigned char           reserved[3];
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
};
#endif


/*
 *---------------------------------------------------------------------
 *
 *  Generic ROM structures and definitions
 *
 *---------------------------------------------------------------------
 */

#ifndef __ASSEMBLY__

struct vrom_header {
176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
	u16     rom_signature;  /* option ROM signature */
	u8      rom_length;     /* ROM length in 512 byte chunks */
	u8      rom_entry[4];   /* 16-bit code entry point */
	u8      rom_pad0;       /* 4-byte align pad */
	u32     vrom_signature; /* VROM identification signature */
	u8      api_version_min;/* Minor version of API */
	u8      api_version_maj;/* Major version of API */
	u8      jump_slots;     /* Number of jump slots */
	u8      reserved1;      /* Reserved for expansion */
	u32     virtual_top;    /* Hypervisor virtual address start */
	u16     reserved2;      /* Reserved for expansion */
	u16	license_offs;	/* Offset to License string */
	u16     pci_header_offs;/* Offset to PCI OPROM header */
	u16     pnp_header_offs;/* Offset to PnP OPROM header */
	u32     rom_pad3;       /* PnP reserverd / VMI reserved */
	u8      reserved[96];   /* Reserved for headers */
	char    vmi_init[8];    /* VMI_Init jump point */
	char    get_reloc[8];   /* VMI_GetRelocationInfo jump point */
194 195 196
} __attribute__((packed));

struct pnp_header {
197 198 199 200 201 202 203 204
	char sig[4];
	char rev;
	char size;
	short next;
	short res;
	long devID;
	unsigned short manufacturer_offset;
	unsigned short product_offset;
205 206 207
} __attribute__((packed));

struct pci_header {
208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
	char sig[4];
	short vendorID;
	short deviceID;
	short vpdData;
	short size;
	char rev;
	char class;
	char subclass;
	char interface;
	short chunks;
	char rom_version_min;
	char rom_version_maj;
	char codetype;
	char lastRom;
	short reserved;
223 224 225
} __attribute__((packed));

/* 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 231 232 233 234
#else
static inline void vmi_init(void) {}
static inline void vmi_activate(void) {}
static inline void vmi_bringup(void) {}
#endif
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269

/* State needed to start an application processor in an SMP system. */
struct vmi_ap_state {
	u32 cr0;
	u32 cr2;
	u32 cr3;
	u32 cr4;

	u64 efer;

	u32 eip;
	u32 eflags;
	u32 eax;
	u32 ebx;
	u32 ecx;
	u32 edx;
	u32 esp;
	u32 ebp;
	u32 esi;
	u32 edi;
	u16 cs;
	u16 ss;
	u16 ds;
	u16 es;
	u16 fs;
	u16 gs;
	u16 ldtr;

	u16 gdtr_limit;
	u32 gdtr_base;
	u32 idtr_base;
	u16 idtr_limit;
};

#endif