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