Commit 7ce0bcfd authored by Zachary Amsden's avatar Zachary Amsden Committed by Andi Kleen

[PATCH] i386: vMI backend for paravirt-ops

Fairly straightforward implementation of VMI backend for paravirt-ops.

[Adrian Bunk: some cleanups]
Signed-off-by: default avatarZachary Amsden <zach@vmware.com>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Cc: Andi Kleen <ak@suse.de>
Cc: Jeremy Fitzhardinge <jeremy@xensource.com>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Chris Wright <chrisw@sous-sol.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
parent ae5da273
...@@ -203,6 +203,15 @@ config PARAVIRT ...@@ -203,6 +203,15 @@ config PARAVIRT
However, when run without a hypervisor the kernel is However, when run without a hypervisor the kernel is
theoretically slower. If in doubt, say N. theoretically slower. If in doubt, say N.
config VMI
bool "VMI Paravirt-ops support"
depends on PARAVIRT
default y
help
VMI provides a paravirtualized interface to multiple hypervisors
include VMware ESX server and Xen by connecting to a ROM module
provided by the hypervisor.
config ACPI_SRAT config ACPI_SRAT
bool bool
default y default y
......
...@@ -40,6 +40,8 @@ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o ...@@ -40,6 +40,8 @@ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
obj-$(CONFIG_HPET_TIMER) += hpet.o obj-$(CONFIG_HPET_TIMER) += hpet.o
obj-$(CONFIG_K8_NB) += k8.o obj-$(CONFIG_K8_NB) += k8.o
obj-$(CONFIG_VMI) += vmi.o
# Make sure this is linked after any other paravirt_ops structs: see head.S # Make sure this is linked after any other paravirt_ops structs: see head.S
obj-$(CONFIG_PARAVIRT) += paravirt.o obj-$(CONFIG_PARAVIRT) += paravirt.o
......
...@@ -360,7 +360,7 @@ check_x87: ...@@ -360,7 +360,7 @@ check_x87:
* cpu_gdt_table and boot_pda; for secondary CPUs, these will be * cpu_gdt_table and boot_pda; for secondary CPUs, these will be
* that CPU's GDT and PDA. * that CPU's GDT and PDA.
*/ */
setup_pda: ENTRY(setup_pda)
/* get the PDA pointer */ /* get the PDA pointer */
movl start_pda, %eax movl start_pda, %eax
......
...@@ -1920,7 +1920,7 @@ static void __init setup_ioapic_ids_from_mpc(void) ...@@ -1920,7 +1920,7 @@ static void __init setup_ioapic_ids_from_mpc(void)
static void __init setup_ioapic_ids_from_mpc(void) { } static void __init setup_ioapic_ids_from_mpc(void) { }
#endif #endif
static int no_timer_check __initdata; int no_timer_check __initdata;
static int __init notimercheck(char *s) static int __init notimercheck(char *s)
{ {
......
...@@ -60,6 +60,7 @@ ...@@ -60,6 +60,7 @@
#include <asm/io_apic.h> #include <asm/io_apic.h>
#include <asm/ist.h> #include <asm/ist.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/vmi.h>
#include <setup_arch.h> #include <setup_arch.h>
#include <bios_ebda.h> #include <bios_ebda.h>
...@@ -581,6 +582,14 @@ void __init setup_arch(char **cmdline_p) ...@@ -581,6 +582,14 @@ void __init setup_arch(char **cmdline_p)
max_low_pfn = setup_memory(); max_low_pfn = setup_memory();
#ifdef CONFIG_VMI
/*
* Must be after max_low_pfn is determined, and before kernel
* pagetables are setup.
*/
vmi_init();
#endif
/* /*
* NOTE: before this point _nobody_ is allowed to allocate * NOTE: before this point _nobody_ is allowed to allocate
* any memory using the bootmem allocator. Although the * any memory using the bootmem allocator. Although the
......
...@@ -63,6 +63,7 @@ ...@@ -63,6 +63,7 @@
#include <mach_apic.h> #include <mach_apic.h>
#include <mach_wakecpu.h> #include <mach_wakecpu.h>
#include <smpboot_hooks.h> #include <smpboot_hooks.h>
#include <asm/vmi.h>
/* Set if we find a B stepping CPU */ /* Set if we find a B stepping CPU */
static int __devinitdata smp_b_stepping; static int __devinitdata smp_b_stepping;
...@@ -545,6 +546,9 @@ static void __cpuinit start_secondary(void *unused) ...@@ -545,6 +546,9 @@ static void __cpuinit start_secondary(void *unused)
* booting is too fragile that we want to limit the * booting is too fragile that we want to limit the
* things done here to the most necessary things. * things done here to the most necessary things.
*/ */
#ifdef CONFIG_VMI
vmi_bringup();
#endif
secondary_cpu_init(); secondary_cpu_init();
preempt_disable(); preempt_disable();
smp_callin(); smp_callin();
......
This diff is collapsed.
...@@ -171,6 +171,8 @@ void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags) ...@@ -171,6 +171,8 @@ void __set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t flags)
void reserve_top_address(unsigned long reserve) void reserve_top_address(unsigned long reserve)
{ {
BUG_ON(fixmaps > 0); BUG_ON(fixmaps > 0);
printk(KERN_INFO "Reserving virtual address space above 0x%08x\n",
(int)-reserve);
#ifdef CONFIG_COMPAT_VDSO #ifdef CONFIG_COMPAT_VDSO
BUG_ON(reserve != 0); BUG_ON(reserve != 0);
#else #else
......
...@@ -8,6 +8,7 @@ void setup_pit_timer(void); ...@@ -8,6 +8,7 @@ void setup_pit_timer(void);
/* Modifiers for buggy PIT handling */ /* Modifiers for buggy PIT handling */
extern int pit_latch_buggy; extern int pit_latch_buggy;
extern int timer_ack; extern int timer_ack;
extern int no_timer_check;
extern int recalibrate_cpu_khz(void); extern int recalibrate_cpu_khz(void);
#endif #endif
/*
* 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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment