270 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			270 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * 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
 | |
| #define VMI_CALL_IODelay		65
 | |
| #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 {
 | |
| 	unsigned char           *eip;
 | |
| 	unsigned char           type;
 | |
| 	unsigned char           reserved[3];
 | |
| };
 | |
| #endif
 | |
| 
 | |
| 
 | |
| /*
 | |
|  *---------------------------------------------------------------------
 | |
|  *
 | |
|  *  Generic ROM structures and definitions
 | |
|  *
 | |
|  *---------------------------------------------------------------------
 | |
|  */
 | |
| 
 | |
| #ifndef __ASSEMBLY__
 | |
| 
 | |
| struct vrom_header {
 | |
| 	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 */
 | |
| } __attribute__((packed));
 | |
| 
 | |
| struct pnp_header {
 | |
| 	char sig[4];
 | |
| 	char rev;
 | |
| 	char size;
 | |
| 	short next;
 | |
| 	short res;
 | |
| 	long devID;
 | |
| 	unsigned short manufacturer_offset;
 | |
| 	unsigned short product_offset;
 | |
| } __attribute__((packed));
 | |
| 
 | |
| struct pci_header {
 | |
| 	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;
 | |
| } __attribute__((packed));
 | |
| 
 | |
| /* Function prototypes for bootstrapping */
 | |
| #ifdef CONFIG_VMI
 | |
| extern void vmi_init(void);
 | |
| extern void vmi_activate(void);
 | |
| extern void vmi_bringup(void);
 | |
| #else
 | |
| static inline void vmi_init(void) {}
 | |
| static inline void vmi_activate(void) {}
 | |
| static inline void vmi_bringup(void) {}
 | |
| #endif
 | |
| 
 | |
| /* 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
 |