| /* |
| * 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_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 |