diff options
| author | Peter Grehan <grehan@FreeBSD.org> | 2012-10-26 13:40:12 +0000 |
|---|---|---|
| committer | Peter Grehan <grehan@FreeBSD.org> | 2012-10-26 13:40:12 +0000 |
| commit | fbfc1c763c4ea184722b7ff3314e81c3f6bd0df2 (patch) | |
| tree | 30ac51b1ff13c133148c0f32361982bc2c0ec0a2 /lib/libvmmapi | |
| parent | bd8572e0bea40093c0be13d9544328644cbc7376 (diff) | |
Notes
Diffstat (limited to 'lib/libvmmapi')
| -rw-r--r-- | lib/libvmmapi/Makefile | 2 | ||||
| -rw-r--r-- | lib/libvmmapi/mptable.c | 342 | ||||
| -rw-r--r-- | lib/libvmmapi/mptable.h | 170 | ||||
| -rw-r--r-- | lib/libvmmapi/vmmapi.c | 13 | ||||
| -rw-r--r-- | lib/libvmmapi/vmmapi.h | 2 |
5 files changed, 1 insertions, 528 deletions
diff --git a/lib/libvmmapi/Makefile b/lib/libvmmapi/Makefile index 82dde083d0b7..93d3c85d1566 100644 --- a/lib/libvmmapi/Makefile +++ b/lib/libvmmapi/Makefile @@ -1,7 +1,7 @@ # $FreeBSD$ LIB= vmmapi -SRCS= vmmapi.c vmmapi_freebsd.c mptable.c +SRCS= vmmapi.c vmmapi_freebsd.c INCS= vmmapi.h WARNS?= 2 diff --git a/lib/libvmmapi/mptable.c b/lib/libvmmapi/mptable.c deleted file mode 100644 index 048ea2dbc61f..000000000000 --- a/lib/libvmmapi/mptable.c +++ /dev/null @@ -1,342 +0,0 @@ -/*- - * Copyright (c) 2011 NetApp, Inc. - * All rights reserved. - * - * 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. - * - * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``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 NETAPP, INC 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. - * - * $FreeBSD$ - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> -#include <sys/mman.h> - -#include <stdio.h> -#include <string.h> -#include <machine/vmm.h> -#include <machine/vmm_dev.h> - -#include "vmmapi.h" -#include "mptable.h" - -#define LAPIC_PADDR (0xFEE00000) -#define LAPIC_VERSION (16) - -#define IOAPIC_PADDR (0xFEC00000) -#define IOAPIC_VERSION (0x11) - -extern int errno; - -static uint8_t -mp_compute_checksum(void *base, size_t len) -{ - uint8_t *bytes = base; - uint8_t sum = 0; - for(; len > 0; len--) { - sum += *bytes++; - } - return 256 - sum; -} - -static void -mp_build_mpfp(struct mp_floating_pointer *mpfp, vm_paddr_t mpfp_gpa) -{ - memset(mpfp, 0, sizeof(*mpfp)); - memcpy(mpfp->signature, MPFP_SIGNATURE, MPFP_SIGNATURE_LEN); - mpfp->mptable_paddr = mpfp_gpa + sizeof(*mpfp); - mpfp->specrev = MP_SPECREV; - mpfp->feature2 = 0; - mpfp->checksum = mp_compute_checksum(mpfp, sizeof(*mpfp)); -} - -static void -mp_build_mpch(struct mp_config_hdr *mpch) -{ - memset(mpch, 0, sizeof(*mpch)); - mpch->specrev = MP_SPECREV; - memcpy(mpch->signature, MPCH_SIGNATURE, MPCH_SIGNATURE_LEN); - memcpy(mpch->oemid, MPCH_OEMID, MPCH_OEMID_LEN); - memcpy(mpch->prodid, MPCH_PRODID, MPCH_PRODID_LEN); - mpch->lapic_paddr = LAPIC_PADDR; - - -} - -static void -mp_build_proc_entries(struct mpe_proc *mpep, int num_proc) -{ - int i; - - for (i = 0; i < num_proc; i++) { - memset(mpep, 0, sizeof(*mpep)); - mpep->entry_type = MP_ENTRY_PROC; - mpep->lapic_id = i; // XXX - mpep->lapic_version = LAPIC_VERSION; - mpep->proc_flags = (i == 0)?MPEP_FLAGS_BSP:0; - mpep->proc_flags |= MPEP_FLAGS_EN; - mpep->proc_signature = MPEP_SIGNATURE; - mpep->feature_flags = MPEP_FEATURES; - mpep++; - } - -} - -static void -mp_build_bus_entries(struct mpe_bus *mpeb) -{ - memset(mpeb, 0, sizeof(*mpeb)); - mpeb->entry_type = MP_ENTRY_BUS; - mpeb->busid = MPE_BUSID_ISA; - memcpy(mpeb->busname, MPE_BUSNAME_ISA, MPE_BUSNAME_LEN); - mpeb++; - - memset(mpeb, 0, sizeof(*mpeb)); - mpeb->entry_type = MP_ENTRY_BUS; - mpeb->busid = MPE_BUSID_PCI; - memcpy(mpeb->busname, MPE_BUSNAME_PCI, MPE_BUSNAME_LEN); - -} - -static void -mp_build_ioapic_entries(struct mpe_ioapic *mpei, int id) -{ - memset(mpei, 0, sizeof(*mpei)); - mpei->entry_type = MP_ENTRY_IOAPIC; - mpei->ioapic_id = id; - mpei->ioapic_version = IOAPIC_VERSION; - mpei->ioapic_flags = MPE_IOAPIC_FLAG_EN; - mpei->ioapic_paddr = IOAPIC_PADDR; -} - -#ifdef notyet -static void -mp_build_ioint_entries(struct mpe_ioint *mpeii, int num_pins, int id) -{ - int pin; - - /* - * The following config is taken from kernel mptable.c - * mptable_parse_default_config_ints(...), for now - * just use the default config, tweek later if needed. - */ - - - /* Run through all 16 pins. */ - for (pin = 0; pin < num_pins; pin++) { - memset(mpeii, 0, sizeof(*mpeii)); - mpeii->entry_type = MP_ENTRY_IOINT; - mpeii->src_bus_id = MPE_BUSID_ISA; - mpeii->dst_apic_id = id; - - /* - * All default configs route IRQs from bus 0 to the first 16 pins - * of the first I/O APIC with an APIC ID of 2. - */ - mpeii->dst_apic_intin = pin; - switch (pin) { - case 0: - /* Pin 0 is an ExtINT pin. */ - mpeii->intr_type = MPEII_INTR_EXTINT; - break; - case 2: - /* IRQ 0 is routed to pin 2. */ - mpeii->intr_type = MPEII_INTR_INT; - mpeii->src_bus_irq = 0; - break; - case 5: - case 10: - case 11: - /* - * PCI Irqs set to level triggered. - */ - mpeii->intr_flags = MPEII_FLAGS_TRIGMODE_LEVEL; - mpeii->src_bus_id = MPE_BUSID_PCI; - default: - /* All other pins are identity mapped. */ - mpeii->intr_type = MPEII_INTR_INT; - mpeii->src_bus_irq = pin; - break; - } - mpeii++; - } - -} - -#define COPYSTR(dest, src, bytes) \ - memcpy(dest, src, bytes); \ - str[bytes] = 0; - - -static void -mptable_dump(struct mp_floating_pointer *mpfp, struct mp_config_hdr *mpch) -{ - static char str[16]; - int i; - char *cur; - - union mpe { - struct mpe_proc *proc; - struct mpe_bus *bus; - struct mpe_ioapic *ioapic; - struct mpe_ioint *ioint; - struct mpe_lint *lnit; - char *p; - }; - - union mpe mpe; - - printf(" MP Floating Pointer :\n"); - COPYSTR(str, mpfp->signature, 4); - printf(" signature: %s\n", str); - printf(" mpch paddr: %x\n", mpfp->mptable_paddr); - printf(" length: %x\n", mpfp->length); - printf(" specrec: %x\n", mpfp->specrev); - printf(" checksum: %x\n", mpfp->checksum); - printf(" feature1: %x\n", mpfp->feature1); - printf(" feature2: %x\n", mpfp->feature2); - printf(" feature3: %x\n", mpfp->feature3); - printf(" feature4: %x\n", mpfp->feature4); - - printf(" MP Configuration Header :\n"); - COPYSTR(str, mpch->signature, 4); - printf(" signature: %s\n", str); - printf(" length: %x\n", mpch->length); - printf(" specrec: %x\n", mpch->specrev); - printf(" checksum: %x\n", mpch->checksum); - COPYSTR(str, mpch->oemid, MPCH_OEMID_LEN); - printf(" oemid: %s\n", str); - COPYSTR(str, mpch->prodid, MPCH_PRODID_LEN); - printf(" prodid: %s\n", str); - printf(" oem_ptr: %x\n", mpch->oem_ptr); - printf(" oem_sz: %x\n", mpch->oem_sz); - printf(" nr_entries: %x\n", mpch->nr_entries); - printf(" apic paddr: %x\n", mpch->lapic_paddr); - printf(" ext_length: %x\n", mpch->ext_length); - printf(" ext_checksum: %x\n", mpch->ext_checksum); - - cur = (char *)mpch + sizeof(*mpch); - for (i = 0; i < mpch->nr_entries; i++) { - mpe.p = cur; - switch(*mpe.p) { - case MP_ENTRY_PROC: - printf(" MP Processor Entry :\n"); - printf(" lapic_id: %x\n", mpe.proc->lapic_id); - printf(" lapic_version: %x\n", mpe.proc->lapic_version); - printf(" proc_flags: %x\n", mpe.proc->proc_flags); - printf(" proc_signature: %x\n", mpe.proc->proc_signature); - printf(" feature_flags: %x\n", mpe.proc->feature_flags); - cur += sizeof(struct mpe_proc); - break; - case MP_ENTRY_BUS: - printf(" MP Bus Entry :\n"); - printf(" busid: %x\n", mpe.bus->busid); - COPYSTR(str, mpe.bus->busname, MPE_BUSNAME_LEN); - printf(" busname: %s\n", str); - cur += sizeof(struct mpe_bus); - break; - case MP_ENTRY_IOAPIC: - printf(" MP IOAPIC Entry :\n"); - printf(" ioapi_id: %x\n", mpe.ioapic->ioapic_id); - printf(" ioapi_version: %x\n", mpe.ioapic->ioapic_version); - printf(" ioapi_flags: %x\n", mpe.ioapic->ioapic_flags); - printf(" ioapi_paddr: %x\n", mpe.ioapic->ioapic_paddr); - cur += sizeof(struct mpe_ioapic); - break; - case MP_ENTRY_IOINT: - printf(" MP IO Interrupt Entry :\n"); - printf(" intr_type: %x\n", mpe.ioint->intr_type); - printf(" intr_flags: %x\n", mpe.ioint->intr_flags); - printf(" src_bus_id: %x\n", mpe.ioint->src_bus_id); - printf(" src_bus_irq: %x\n", mpe.ioint->src_bus_irq); - printf(" dst_apic_id: %x\n", mpe.ioint->dst_apic_id); - printf(" dst_apic_intin: %x\n", mpe.ioint->dst_apic_intin); - cur += sizeof(struct mpe_ioint); - break; - case MP_ENTRY_LINT: - printf(" MP Local Interrupt Entry :\n"); - cur += sizeof(struct mpe_lint); - break; - } - - } -} -#endif - -int -vm_build_mptable(struct vmctx *ctx, vm_paddr_t gpa, int len, int ncpu, - int ioapic, void *oemp, int oemsz) -{ - struct mp_config_hdr *mpch; - char *mapaddr; - char *startaddr; - int error; - - mapaddr = vm_map_memory(ctx, gpa, len); - if (mapaddr == MAP_FAILED) { - printf("%s\n", strerror(errno)); - goto err; - } - startaddr = mapaddr; - - mp_build_mpfp((struct mp_floating_pointer*) mapaddr, gpa); - mapaddr += sizeof(struct mp_floating_pointer); - - mpch = (struct mp_config_hdr*)mapaddr; - mp_build_mpch(mpch); - mapaddr += sizeof(struct mp_config_hdr); - - mp_build_proc_entries((struct mpe_proc*) mapaddr, ncpu); - mapaddr += (sizeof(struct mpe_proc)*ncpu); - mpch->nr_entries += ncpu; - - mp_build_bus_entries((struct mpe_bus*)mapaddr); - mapaddr += (sizeof(struct mpe_bus)*MPE_NUM_BUSES); - mpch->nr_entries += MPE_NUM_BUSES; - - if (ioapic) { - mp_build_ioapic_entries((struct mpe_ioapic*)mapaddr, ncpu + 1); - mapaddr += sizeof(struct mpe_ioapic); - mpch->nr_entries++; - } - -#ifdef notyet - mp_build_ioint_entries((struct mpe_ioint*)mapaddr, MPEII_MAX_IRQ, - ncpu + 1); - mapaddr += sizeof(struct mpe_ioint)*MPEII_MAX_IRQ; - mpch->nr_entries += MPEII_MAX_IRQ; - -#endif - if (oemp) { - mpch->oem_ptr = mapaddr - startaddr + gpa; - mpch->oem_sz = oemsz; - memcpy(mapaddr, oemp, oemsz); - } - mpch->length = (mapaddr) - ((char*) mpch); - mpch->checksum = mp_compute_checksum(mpch, sizeof(*mpch)); - - - // mptable_dump((struct mp_floating_pointer*)startaddr, mpch); -err: - return (error); -} diff --git a/lib/libvmmapi/mptable.h b/lib/libvmmapi/mptable.h deleted file mode 100644 index 51c7bc16d66f..000000000000 --- a/lib/libvmmapi/mptable.h +++ /dev/null @@ -1,170 +0,0 @@ -/*- - * Copyright (c) 2011 NetApp, Inc. - * All rights reserved. - * - * 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. - * - * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``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 NETAPP, INC 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. - * - * $FreeBSD$ - */ - -#ifndef _MPTABLE_h_ -#define _MPTABLE_h_ - -#define MP_SPECREV (4) // MP spec revision 1.1 - -/* - * MP Floating Pointer Structure - */ -#define MPFP_SIGNATURE "_MP_" -#define MPFP_SIGNATURE_LEN (4) -#define MPFP_FEATURE2 (0x80) // IMCR is present -struct mp_floating_pointer { - uint8_t signature[MPFP_SIGNATURE_LEN]; - uint32_t mptable_paddr; - uint8_t length; - uint8_t specrev; - uint8_t checksum; - uint8_t feature1; - uint8_t feature2; - uint8_t feature3; - uint8_t feature4; - uint8_t feature5; -}; - - -/* - * MP Configuration Table Header - */ -#define MPCH_SIGNATURE "PCMP" -#define MPCH_SIGNATURE_LEN (4) - -#define MPCH_OEMID "NETAPP " -#define MPCH_OEMID_LEN (8) -#define MPCH_PRODID "vFiler " -#define MPCH_PRODID_LEN (12) - -struct mp_config_hdr { - uint8_t signature[MPCH_SIGNATURE_LEN]; - uint16_t length; - uint8_t specrev; - uint8_t checksum; - uint8_t oemid[MPCH_OEMID_LEN]; - uint8_t prodid[MPCH_PRODID_LEN]; - uint32_t oem_ptr; - uint16_t oem_sz; - uint16_t nr_entries; - uint32_t lapic_paddr; - uint16_t ext_length; - uint8_t ext_checksum; - uint8_t reserved; -}; - -#define MP_ENTRY_PROC (0) -#define MP_ENTRY_BUS (1) -#define MP_ENTRY_IOAPIC (2) -#define MP_ENTRY_IOINT (3) -#define MP_ENTRY_LINT (4) - -/* - * MP Processor Entry - */ - -#define MPEP_FLAGS_EN (0x1) -#define MPEP_FLAGS_BSP (0x2) - -#define MPEP_SIG_FAMILY (6) -#define MPEP_SIG_MODEL (26) -#define MPEP_SIG_STEPPING (5) -#define MPEP_SIGNATURE ((MPEP_SIG_FAMILY << 8) | (MPEP_SIG_MODEL << 4) \ - | (MPEP_SIG_STEPPING)) - -#define MPEP_FEATURES (0xBFEBFBFF) // Value from Intel i7 CPUID - -struct mpe_proc { - uint8_t entry_type; - uint8_t lapic_id; - uint8_t lapic_version; - uint8_t proc_flags; - uint32_t proc_signature; - uint32_t feature_flags; - uint8_t reserved[8]; -}; - -/* - * MP Bus Entry - */ - -#define MPE_NUM_BUSES (2) -#define MPE_BUSNAME_LEN (6) -#define MPE_BUSID_ISA (0) -#define MPE_BUSID_PCI (1) -#define MPE_BUSNAME_ISA "ISA " -#define MPE_BUSNAME_PCI "PCI " -struct mpe_bus { - uint8_t entry_type; - uint8_t busid; - uint8_t busname[MPE_BUSNAME_LEN]; -}; - -/* - * MP IO APIC Entry - */ -#define MPE_IOAPIC_FLAG_EN (1) -struct mpe_ioapic { - uint8_t entry_type; - uint8_t ioapic_id; - uint8_t ioapic_version; - uint8_t ioapic_flags; - uint32_t ioapic_paddr; - -}; - -/* - * MP IO Interrupt Assignment Entry - */ -#define MPEII_INTR_INT (0) -#define MPEII_INTR_NMI (1) -#define MPEII_INTR_SMI (2) -#define MPEII_INTR_EXTINT (3) -#define MPEII_PCI_IRQ_MASK (0x0c20U) /* IRQ 5,10,11 are PCI connected */ -#define MPEII_MAX_IRQ (16) -#define MPEII_FLAGS_TRIGMODE_LEVEL (0x3) -struct mpe_ioint { - uint8_t entry_type; - uint8_t intr_type; - uint16_t intr_flags; - uint8_t src_bus_id; - uint8_t src_bus_irq; - uint8_t dst_apic_id; - uint8_t dst_apic_intin; -}; - -/* - * MP Local Interrupt Assignment Entry - */ -struct mpe_lint { - uint8_t entry_type; -}; - -int vm_build_mptable(struct vmctx *ctxt, vm_paddr_t gpa, int len, - int ncpu, int ioapic, void *oemp, int oemsz); -#endif /* _MPTABLE_h_ */ diff --git a/lib/libvmmapi/vmmapi.c b/lib/libvmmapi/vmmapi.c index fdbbbcbe7b26..cfb42d09605e 100644 --- a/lib/libvmmapi/vmmapi.c +++ b/lib/libvmmapi/vmmapi.c @@ -47,10 +47,6 @@ __FBSDID("$FreeBSD$"); #include <machine/vmm_dev.h> #include "vmmapi.h" -#include "mptable.h" - -#define BIOS_ROM_BASE (0xf0000) -#define BIOS_ROM_SIZE (0x10000) struct vmctx { int fd; @@ -329,15 +325,6 @@ vm_inject_event2(struct vmctx *ctx, int vcpu, enum vm_event_type type, } int -vm_build_tables(struct vmctx *ctxt, int ncpu, int ioapic, - void *oemtbl, int oemtblsz) -{ - - return (vm_build_mptable(ctxt, BIOS_ROM_BASE, BIOS_ROM_SIZE, ncpu, - ioapic, oemtbl, oemtblsz)); -} - -int vm_apicid2vcpu(struct vmctx *ctx, int apicid) { /* diff --git a/lib/libvmmapi/vmmapi.h b/lib/libvmmapi/vmmapi.h index fe5116e1e178..de042521aa61 100644 --- a/lib/libvmmapi/vmmapi.h +++ b/lib/libvmmapi/vmmapi.h @@ -60,8 +60,6 @@ int vm_get_pinning(struct vmctx *ctx, int vcpu, int *host_cpuid); int vm_set_pinning(struct vmctx *ctx, int vcpu, int host_cpuid); int vm_run(struct vmctx *ctx, int vcpu, uint64_t rip, struct vm_exit *ret_vmexit); -int vm_build_tables(struct vmctx *ctxt, int ncpus, int ioapic, - void *oemtbl, int oemtblsz); int vm_apicid2vcpu(struct vmctx *ctx, int apicid); int vm_inject_event(struct vmctx *ctx, int vcpu, enum vm_event_type type, int vector); |
