diff options
Diffstat (limited to 'arch/x86/include/asm/vmi.h')
| -rw-r--r-- | arch/x86/include/asm/vmi.h | 263 | 
1 files changed, 263 insertions, 0 deletions
diff --git a/arch/x86/include/asm/vmi.h b/arch/x86/include/asm/vmi.h new file mode 100644 index 00000000000..b7c0dea119f --- /dev/null +++ b/arch/x86/include/asm/vmi.h @@ -0,0 +1,263 @@ +/* + * 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 */ +extern void vmi_init(void); +extern void vmi_bringup(void); +extern void vmi_apply_boot_page_allocations(void); + +/* 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  | 
