[funini.com] -> [kei@sodan] -> Kernel Reading

root/include/asm-x86/vmi.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */

[funini.com] -> [kei@sodan] -> Kernel Reading