Goto sanos source index
//
// vmi.h
//
// VMWare Virtual Machine Interface (VMI)
//
// Copyright (C) 2002 Michael Ringgaard. All rights reserved.
// Copyright (C) 2005 VMWare, Inc.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// 3. Neither the name of the project nor the names of its contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE.
//
#ifndef VMI_H
#define VMI_H
//
// VMI call numbers
//
#define VMI_CALL_RESERVED0 0
#define VMI_CALL_RESERVED1 1
#define VMI_CALL_RESERVED2 2
#define VMI_CALL_RESERVED3 3
#define VMI_CALL_Init 4
#define VMI_CALL_CPUID 5
#define VMI_CALL_WRMSR 6
#define VMI_CALL_RDMSR 7
#define VMI_CALL_SetGDT 8
#define VMI_CALL_SetLDT 9
#define VMI_CALL_SetIDT 10
#define VMI_CALL_SetTR 11
#define VMI_CALL_GetGDT 12
#define VMI_CALL_GetLDT 13
#define VMI_CALL_GetIDT 14
#define VMI_CALL_GetTR 15
#define VMI_CALL_WriteGDTEntry 16
#define VMI_CALL_WriteLDTEntry 17
#define VMI_CALL_WriteIDTEntry 18
#define VMI_CALL_UpdateKernelStack 19
#define VMI_CALL_SetCR0 20
#define VMI_CALL_SetCR2 21
#define VMI_CALL_SetCR3 22
#define VMI_CALL_SetCR4 23
#define VMI_CALL_GetCR0 24
#define VMI_CALL_GetCR2 25
#define VMI_CALL_GetCR3 26
#define VMI_CALL_GetCR4 27
#define VMI_CALL_INVD 28
#define VMI_CALL_WBINVD 29
#define VMI_CALL_SetDR 30
#define VMI_CALL_GetDR 31
#define VMI_CALL_RDPMC 32
#define VMI_CALL_RDTSC 33
#define VMI_CALL_CLTS 34
#define VMI_CALL_EnableInterrupts 35
#define VMI_CALL_DisableInterrupts 36
#define VMI_CALL_GetInterruptMask 37
#define VMI_CALL_SetInterruptMask 38
#define VMI_CALL_IRET 39
#define VMI_CALL_SYSEXIT 40
#define VMI_CALL_Pause 41
#define VMI_CALL_Halt 42
#define VMI_CALL_Reboot 43
#define VMI_CALL_Shutdown 44
#define VMI_CALL_SetPxE0 45
#define VMI_CALL_GetPxE 46
#define VMI_CALL_SwapPxE 47
#define VMI_CALL_SetPxELong0 48
#define VMI_CALL_GetPxELong 49
#define VMI_CALL_SwapPxELongAtomic 50
#define VMI_CALL_TestAndSetPxEBit 51
#define VMI_CALL_TestAndClearPxEBit 52
#define VMI_CALL_AllocatePage 53
#define VMI_CALL_ReleasePage 54
#define VMI_CALL_InvalPage 55
#define VMI_CALL_FlushTLB 56
#define VMI_CALL_FlushDeferredCalls 57
#define VMI_CALL_SetLinearMapping 58
#define VMI_CALL_IN 59
#define VMI_CALL_INB 60
#define VMI_CALL_INW 61
#define VMI_CALL_INS 62
#define VMI_CALL_INSB 63
#define VMI_CALL_INSW 64
#define VMI_CALL_OUT 65
#define VMI_CALL_OUTB 66
#define VMI_CALL_OUTW 67
#define VMI_CALL_OUTS 68
#define VMI_CALL_OUTSB 69
#define VMI_CALL_OUTSW 70
#define VMI_CALL_SetIOPLMask 71
#define VMI_CALL_DeactivatePxELongAtomic 72
#define VMI_CALL_TestAndSetPxELongBit 73
#define VMI_CALL_TestAndClearPxELongBit 74
#define VMI_CALL_SetInitialAPState 75
#define VMI_CALL_APICWrite 76
#define VMI_CALL_APICRead 77
#define VMI_CALL_IODelay 78
#define VMI_CALL_GetCycleFrequency 79
#define VMI_CALL_GetCycleCounter 80
#define VMI_CALL_SetAlarm 81
#define VMI_CALL_CancelAlarm 82
#define VMI_CALL_GetWallclockTime 83
#define VMI_CALL_WallclockUpdated 84
#define VMI_CALL_GetRelocationInfo 85
#define VMI_CALL_SetPxE 86
#define VMI_CALL_SetPxELong 87
#define NUM_VMI_CALLS 88
//
// VMI Option ROM API
//
#define VMI_SIGNATURE 0x696d5663 // "cVmi"
#define VMI_API_REV_MAJOR 13
#define VMI_API_REV_MINOR 3
// VMI Relocation types
#define VMI_RELOCATION_NONE 0
#define VMI_RELOCATION_CALL_REL 1
#define VMI_RELOCATION_JUMP_REL 2
struct vmi_relocation_info {
unsigned long eip;
unsigned char type;
unsigned char reserved[3];
};
// Flags used by VMI_Reboot call
#define VMI_REBOOT_SOFT 0x0
#define VMI_REBOOT_HARD 0x1
// Flags used by MMU calls
#define VMI_PAGE_PT 0x01
#define VMI_PAGE_PD 0x02
#define VMI_PAGE_PAE 0x04
#define VMI_PAGE_PDP 0x04
#define VMI_PAGE_PML4 0x08
// VMI_PAGE_CURRENT_AS implies VMI_PAGE_VA_MASK field is valid
#define VMI_PAGE_CURRENT_AS 0x10
#define VMI_PAGE_DEFER 0x20
#define VMI_PAGE_VA_MASK 0xfffff000
// Flags used by VMI_FlushTLB call
#define VMI_FLUSH_TLB 0x01
#define VMI_FLUSH_GLOBAL 0x02
// Flags used by VMI_FlushSync call
#define VMI_FLUSH_PT_UPDATES 0x80
#define VMI_FLUSH_CPU_STATE 0x40
// The number of VMI address translation slot
#define VMI_LINEAR_MAP_SLOTS 4
// The cycle counters
#define VMI_CYCLES_REAL 0
#define VMI_CYCLES_AVAILABLE 1
#define VMI_CYCLES_STOLEN 2
// The alarm interface 'flags' bits
#define VMI_ALARM_COUNTERS 2
#define VMI_ALARM_COUNTER_MASK 0x000000ff
#define VMI_ALARM_WIRED_IRQ0 0x00000000
#define VMI_ALARM_WIRED_LVTT 0x00010000
#define VMI_ALARM_IS_ONESHOT 0x00000000
#define VMI_ALARM_IS_PERIODIC 0x00000100
//
// VROM call table definitions
//
#pragma pack(push, 1)
#define VROM_CALL_LEN 32
struct vrom_call_slot {
char f[VROM_CALL_LEN];
};
struct vrom_header {
unsigned short romSignature; // option ROM signature
unsigned char romLength; // ROM length in 512 byte chunks
unsigned char romEntry[4]; // 16-bit code entry point
unsigned char romPad0; // 4-byte align pad
unsigned long vRomSignature; // VROM identification signature
unsigned char APIVersionMinor; // Minor version of API
unsigned char APIVersionMajor; // Major version of API
unsigned char reserved0; // Reserved for expansion
unsigned char reserved1; // Reserved for expansion
unsigned long reserved2; // Reserved for expansion
unsigned long reserved3; // Reserved for private use
unsigned short pciHeaderOffset; // Offset to PCI OPROM header
unsigned short pnpHeaderOffset; // Offset to PnP OPROM header
unsigned long romPad3; // PnP reserverd / VMI reserved
};
//
// State needed to start an application processor in an SMP system
//
struct vmi_ap_state {
unsigned long cr0;
unsigned long cr2;
unsigned long cr3;
unsigned long cr4;
unsigned __int64 efer;
unsigned long eip;
unsigned long eflags;
unsigned long eax;
unsigned long ebx;
unsigned long ecx;
unsigned long edx;
unsigned long esp;
unsigned long ebp;
unsigned long esi;
unsigned long edi;
unsigned short cs;
unsigned short ss;
unsigned short ds;
unsigned short es;
unsigned short fs;
unsigned short gs;
unsigned short ldtr;
unsigned short gdtr_limit;
unsigned long gdtr_base;
unsigned long idtr_base;
unsigned short idtr_limit;
};
#pragma pack(pop)
#endif