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