From 0e9d07db34b2d44618cf1e0f273ef199dbe82030 Mon Sep 17 00:00:00 2001 From: xez Date: Fri, 26 Jun 2015 23:41:00 -0700 Subject: [PATCH] Add support for FreeBSD guests. --- Makefile | 5 +- README.md | 8 +- include/xhyve/acpi.h | 5 + include/xhyve/firmware/fbsd.h | 102 +++ include/xhyve/support/segments.h | 45 +- src/acpitbl.c | 1076 ++++++++++++++++++++++++++++++ src/dsdt.asl | 841 +++++++++++++++++++++++ src/firmware/fbsd.c | 1006 ++++++++++++++++++++++++++++ src/pci_emul.c | 39 ++ src/xhyve.c | 66 +- test/userboot.so | Bin 0 -> 351852 bytes test/userboot.txt | 8 + xhyverun.sh | 10 + 13 files changed, 3155 insertions(+), 56 deletions(-) create mode 100644 include/xhyve/firmware/fbsd.h create mode 100644 src/acpitbl.c create mode 100644 src/dsdt.asl create mode 100644 src/firmware/fbsd.c create mode 100755 test/userboot.so create mode 100644 test/userboot.txt diff --git a/Makefile b/Makefile index 587b409..232b590 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ VMM_SRC := \ src/vmm/io/vrtc.c XHYVE_SRC := \ - src/acpi.c \ + src/acpitbl.c \ src/atkbdc.c \ src/block_if.c \ src/consport.c \ @@ -61,7 +61,8 @@ XHYVE_SRC := \ src/xmsr.c FIRMWARE_SRC := \ - src/firmware/kexec.c + src/firmware/kexec.c \ + src/firmware/fbsd.c SRC := \ $(VMM_SRC) \ diff --git a/README.md b/README.md index 557df5d..c16b899 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ About ----- -The *xhyve hypervisor* is a port of [bhyve](http://www.bhyve.org) to OS X. It is built on top of Hypervisor.framework in OS X 10.10 Yosemite and higher, runs entirely in userspace, and has no other dependencies. It can run vanilla Linux distributions and may gain support for other guest operating systems in the future. +The *xhyve hypervisor* is a port of [bhyve](http://www.bhyve.org) to OS X. It is built on top of Hypervisor.framework in OS X 10.10 Yosemite and higher, runs entirely in userspace, and has no other dependencies. It can run FreeBSD and vanilla Linux distributions and may gain support for other guest operating systems in the future. License: BSD @@ -184,12 +184,6 @@ TODO - make it not require root - unify TAP and vmnet backends - performance: send/receive more than a single packet at a time -- ACPI tables don't work - - bhyve creates ASL on the fly and then calls out to an ASL compiler (iasl) on - every VM boot to create the DSDT: - - remove dependency on iasl by creating AML bytecode directly - - shouldn't be to hard since we we are only interested in a very small - subset of ASL - virtio_rnd: - is untested - remove explicit state transitions: diff --git a/include/xhyve/acpi.h b/include/xhyve/acpi.h index ebfb611..11969af 100644 --- a/include/xhyve/acpi.h +++ b/include/xhyve/acpi.h @@ -30,6 +30,9 @@ #include +/* if set, create AML instead of ASL and calling out to iasl */ +#define ACPITBL_AML 1 + #define SCI_INT 9 #define SMI_CMD 0xb2 @@ -49,4 +52,6 @@ void dsdt_fixed_irq(uint8_t irq); void dsdt_fixed_mem32(uint32_t base, uint32_t length); void dsdt_indent(int levels); void dsdt_unindent(int levels); +void dsdt_fixup(int bus, uint16_t iobase, uint16_t iolimit, uint32_t membase32, + uint32_t memlimit32, uint64_t membase64, uint64_t memlimit64); void sci_init(void); diff --git a/include/xhyve/firmware/fbsd.h b/include/xhyve/firmware/fbsd.h new file mode 100644 index 0000000..30d4388 --- /dev/null +++ b/include/xhyve/firmware/fbsd.h @@ -0,0 +1,102 @@ +#pragma once + +#include + +/* + * USERBOOT interface versions + */ +#define USERBOOT_VERSION_1 1 +#define USERBOOT_VERSION_2 2 +#define USERBOOT_VERSION_3 3 + +/* + * Exit codes from the loader + */ +#define USERBOOT_EXIT_QUIT 1 +#define USERBOOT_EXIT_REBOOT 2 + +struct loader_callbacks { + /* Console i/o */ + + /* Wait until a key is pressed on the console and then return it */ + int (*getc)(void *arg); + /* Write the character ch to the console */ + void (*putc)(void *arg, int ch); + /* Return non-zero if a key can be read from the console */ + int (*poll)(void *arg); + + /* Host filesystem i/o */ + + /* Open a file in the host filesystem */ + int (*open)(void *arg, const char *filename, void **h_return); + /* Close a file */ + int (*close)(void *arg, void *h); + /* Return non-zero if the file is a directory */ + int (*isdir)(void *arg, void *h); + /* Read size bytes from a file. The number of bytes remaining in dst after + * reading is returned in *resid_return + */ + int (*read)(void *arg, void *h, void *dst, size_t size, + size_t *resid_return); + /* Read an entry from a directory. The entry's inode number is returned in + * fileno_return, its type in *type_return and the name length in + * *namelen_return. The name itself is copied to the buffer name which must + * be at least PATH_MAX in size. + */ + int (*readdir)(void *arg, void *h, uint32_t *fileno_return, + uint8_t *type_return, size_t *namelen_return, char *name); + /* Seek to a location within an open file */ + int (*seek)(void *arg, void *h, uint64_t offset, int whence); + /* Return some stat(2) related information about the file */ + int (*stat)(void *arg, void *h, int *mode_return, int *uid_return, + int *gid_return, uint64_t *size_return); + + /* Disk image i/o */ + + /* Read from a disk image at the given offset */ + int (*diskread)(void *arg, int unit, uint64_t offset, void *dst, + size_t size, size_t *resid_return); + + /* Guest virtual machine i/o */ + + /* Copy to the guest address space */ + int (*copyin)(void *arg, const void *from, uint64_t to, size_t size); + /* Copy from the guest address space */ + int (*copyout)(void *arg, uint64_t from, void *to, size_t size); + /* Set a guest register value */ + void (*setreg)(void *arg, int, uint64_t); + /* Set a guest MSR value */ + void (*setmsr)(void *arg, int, uint64_t); + /* Set a guest CR value */ + void (*setcr)(void *arg, int, uint64_t); + /* Set the guest GDT address */ + void (*setgdt)(void *arg, uint64_t, size_t); + /* Transfer control to the guest at the given address */ + void (*exec)(void *arg, uint64_t pc); + + /* Misc */ + + /* Sleep for usec microseconds */ + void (*delay)(void *arg, int usec); + /* Exit with the given exit code */ + void (*exit)(void); + /* Return guest physical memory map details */ + void (*getmem)(void *arg, uint64_t *lowmem, uint64_t *highmem); + /* ioctl interface to the disk device */ + int (*diskioctl)(void *arg, int unit, u_long cmd, void *data); + /* + * Returns an environment variable in the form "name=value". + * + * If there are no more variables that need to be set in the + * loader environment then return NULL. + * + * 'num' is used as a handle for the callback to identify which + * environment variable to return next. It will begin at 0 and + * each invocation will add 1 to the previous value of 'num'. + */ + const char * (*getenv)(void *arg, int num); +}; + +void fbsd_init(char *userboot_path, char *bootvolume_path, char *kernelenv, + char *cons); +uint64_t fbsd_load(void); diff --git a/include/xhyve/support/segments.h b/include/xhyve/support/segments.h index 4a75c9b..f91c4a3 100644 --- a/include/xhyve/support/segments.h +++ b/include/xhyve/support/segments.h @@ -54,23 +54,26 @@ #define LSEL(s,r) (((s)<<3) | SEL_LDT | r) /* a local selector */ #define GSEL(s,r) (((s)<<3) | r) /* a global selector */ -// /* -// * User segment descriptors (%cs, %ds etc for i386 apps. 64 bit wide) -// * For long-mode apps, %cs only has the conforming bit in sd_type, the sd_dpl, -// * sd_p, sd_l and sd_def32 which must be zero). %ds only has sd_p. -// */ -// struct segment_descriptor { -// unsigned sd_lolimit:16; /* segment extent (lsb) */ -// unsigned sd_lobase:24; /* segment base address (lsb) */ -// unsigned sd_type:5; /* segment type */ -// unsigned sd_dpl:2; /* segment descriptor priority level */ -// unsigned sd_p:1; /* segment descriptor present */ -// unsigned sd_hilimit:4; /* segment extent (msb) */ -// unsigned sd_xx:2; /* unused */ -// unsigned sd_def32:1; /* default 32 vs 16 bit size */ -// unsigned sd_gran:1; /* limit granularity (byte/page units)*/ -// unsigned sd_hibase:8; /* segment base address (msb) */ -// } __packed; +/* + * User segment descriptors (%cs, %ds etc for i386 apps. 64 bit wide) + * For long-mode apps, %cs only has the conforming bit in sd_type, the sd_dpl, + * sd_p, sd_l and sd_def32 which must be zero). %ds only has sd_p. + */ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpacked" +struct segment_descriptor { + unsigned sd_lolimit:16; /* segment extent (lsb) */ + unsigned sd_lobase:24; /* segment base address (lsb) */ + unsigned sd_type:5; /* segment type */ + unsigned sd_dpl:2; /* segment descriptor priority level */ + unsigned sd_p:1; /* segment descriptor present */ + unsigned sd_hilimit:4; /* segment extent (msb) */ + unsigned sd_xx:2; /* unused */ + unsigned sd_def32:1; /* default 32 vs 16 bit size */ + unsigned sd_gran:1; /* limit granularity (byte/page units)*/ + unsigned sd_hibase:8; /* segment base address (msb) */ +} __packed; +#pragma clang diagnostic pop struct user_segment_descriptor { uint64_t sd_lolimit:16; /* segment extent (lsb) */ @@ -167,16 +170,16 @@ struct user_segment_descriptor { // /* memory segment types */ // #define SDT_MEMRO 16 memory read only // #define SDT_MEMROA 17 /* memory read only accessed */ -// #define SDT_MEMRW 18 /* memory read write */ -// #define SDT_MEMRWA 19 /* memory read write accessed */ +#define SDT_MEMRW 18 /* memory read write */ +#define SDT_MEMRWA 19 /* memory read write accessed */ // #define SDT_MEMROD 20 /* memory read only expand dwn limit */ // #define SDT_MEMRODA 21 /* memory read only expand dwn limit accessed */ // #define SDT_MEMRWD 22 /* memory read write expand dwn limit */ // #define SDT_MEMRWDA 23 /* memory read write expand dwn limit accessed*/ // #define SDT_MEME 24 /* memory execute only */ // #define SDT_MEMEA 25 /* memory execute only accessed */ -// #define SDT_MEMER 26 /* memory execute read */ -// #define SDT_MEMERA 27 /* memory execute read accessed */ +#define SDT_MEMER 26 /* memory execute read */ +#define SDT_MEMERA 27 /* memory execute read accessed */ // #define SDT_MEMEC 28 /* memory execute only conforming */ // #define SDT_MEMEAC 29 /* memory execute only accessed conforming */ // #define SDT_MEMERC 30 /* memory execute read conforming */ diff --git a/src/acpitbl.c b/src/acpitbl.c new file mode 100644 index 0000000..48bfd74 --- /dev/null +++ b/src/acpitbl.c @@ -0,0 +1,1076 @@ +/*- + * Copyright (c) 2012 NetApp, Inc. + * Copyright (c) 2015 xhyve developers + * 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$ + */ + +/* + * xhyve ACPI table generator. + * + * Does not require iasl but DSDT is limited to 1 PCI bus (0) and 8 devices. + * + * slot 0 hostbridge + * slot 31 lpc + */ + +/* + * The tables are placed in the guest's ROM area just below 1MB physical, + * above the MPTable. + * + * Layout + * ------ + * RSDP -> 0xf2400 (36 bytes fixed) + * RSDT -> 0xf2440 (36 bytes + 4*7 table addrs, 4 used) + * XSDT -> 0xf2480 (36 bytes + 8*7 table addrs, 4 used) + * MADT -> 0xf2500 (depends on #CPUs) + * FADT -> 0xf2600 (268 bytes) + * HPET -> 0xf2740 (56 bytes) + * MCFG -> 0xf2780 (60 bytes) + * FACS -> 0xf27C0 (64 bytes) + * DSDT -> 0xf2800 (variable - can go up to 0x100000) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define XHYVE_ACPI_BASE 0xf2400 +#define XHYVE_ACPI_SIZE 0xdc00 +#define RSDT_OFFSET 0x040 +#define XSDT_OFFSET 0x080 +#define MADT_OFFSET 0x100 +#define FADT_OFFSET 0x200 +#define HPET_OFFSET 0x340 +#define MCFG_OFFSET 0x380 +#define FACS_OFFSET 0x3C0 +#define DSDT_OFFSET 0x400 + +/* ACPI table base in guest memory */ +static void *tb; +static int acpi_ncpu; +static uint32_t hpet_capabilities; +static void *dsdt; + +void +dsdt_line(UNUSED const char *fmt, ...) +{ +} + +void +dsdt_fixed_ioport(UNUSED uint16_t iobase, UNUSED uint16_t length) +{ +} + +void +dsdt_fixed_irq(UNUSED uint8_t irq) +{ +} + +void +dsdt_fixed_mem32(UNUSED uint32_t base, UNUSED uint32_t length) +{ +} + +void +dsdt_indent(UNUSED int levels) +{ +} + +void dsdt_unindent(UNUSED int levels) +{ +} + +static uint8_t +acpitbl_checksum(void *table, size_t length) { + unsigned int i; + uint8_t sum; + + for (sum = 0, i = 0; i < length; i++) { + sum += ((uint8_t *) table)[i]; + } + + return (((uint8_t) 0) - sum); +} + +static void +acpitbl_write8(void *base, uint64_t offset, uint8_t val) { + memcpy(((void *) (((uintptr_t) base) + offset)), &val, 1); +} + +static void +acpitbl_write16(void *base, uint64_t offset, uint16_t val) { + memcpy(((void *) (((uintptr_t) base) + offset)), &val, 2); +} + +static void +acpitbl_write32(void *base, uint64_t offset, uint32_t val) { + memcpy(((void *) (((uintptr_t) base) + offset)), &val, 4); +} + +static void +acpitbl_write64(void *base, uint64_t offset, uint64_t val) { + memcpy(((void *) (((uintptr_t) base) + offset)), &val, 8); +} + +static void +acpitbl_build_rdsp(void) { + void *rdsp; + /* + * [000h 0000 8] Signature : "RSD PTR " + * [008h 0008 1] Checksum : 00 + * [009h 0009 6] Oem ID : "BHYVE " + * [00Fh 0015 1] Revision : 02 + * [010h 0016 4] RSDT Address : 00000000 + * [014h 0020 4] Length : 00000024 + * [018h 0024 8] XSDT Address : 0000000000000000 + * [020h 0032 1] Extended Checksum : 00 + * [021h 0033 3] Reserved : 000000 + */ + static const uint8_t rdsp_tmpl[36] = { + 0x52, 0x53, 0x44, 0x20, 0x50, 0x54, 0x52, 0x20, + 0x00, 0x42, 0x48, 0x59, 0x56, 0x45, 0x20, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + + rdsp = (void *) (((uintptr_t) tb) + 0); + /* copy RDSP template to guest memory */ + memcpy(rdsp, rdsp_tmpl, 36); + /* fixup table */ + acpitbl_write32(rdsp, 0x10, ((uint32_t) (XHYVE_ACPI_BASE + RSDT_OFFSET))); + acpitbl_write64(rdsp, 0x18, ((uint64_t) (XHYVE_ACPI_BASE + XSDT_OFFSET))); + /* write checksum */ + acpitbl_write8(rdsp, 0x8, acpitbl_checksum(rdsp, 20)); + /* write extended checksum */ + acpitbl_write8(rdsp, 0x20, acpitbl_checksum(rdsp, 36)); +} + +static void +acpitbl_build_rsdt(void) { + void *rsdt; + /* + * [000h 0000 4] Signature : "RSDT" + * [004h 0004 4] Table Length : 00000034 + * [008h 0008 1] Revision : 01 + * [009h 0009 1] Checksum : 00 + * [00Ah 0010 6] Oem ID : "BHYVE " + * [010h 0016 8] Oem Table ID : "BVRSDT " + * [018h 0024 4] Oem Revision : 00000001 + * [01Ch 0028 4] Asl Compiler ID : "INTL" + * [020h 0032 4] Asl Compiler Revision : 20140828 + * [024h 0036 4] ACPI Table Address 0 : 00000000 + * [028h 0040 4] ACPI Table Address 1 : 00000000 + * [02Ch 0044 4] ACPI Table Address 2 : 00000000 + * [030h 0048 4] ACPI Table Address 3 : 00000000 + */ + static const uint8_t rsdt_tmpl[52] = { + 0x52, 0x53, 0x44, 0x54, 0x34, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x42, 0x48, 0x59, 0x56, 0x45, 0x20, + 0x42, 0x56, 0x52, 0x53, 0x44, 0x54, 0x20, 0x20, + 0x01, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x54, 0x4C, + 0x28, 0x08, 0x14, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + + rsdt = (void *) (((uintptr_t) tb) + RSDT_OFFSET); + /* copy RSDT template to guest memory */ + memcpy(rsdt, rsdt_tmpl, 52); + /* fixup table */ + acpitbl_write32(rsdt, 0x24, ((uint32_t) (XHYVE_ACPI_BASE + MADT_OFFSET))); + acpitbl_write32(rsdt, 0x28, ((uint32_t) (XHYVE_ACPI_BASE + FADT_OFFSET))); + acpitbl_write32(rsdt, 0x2c, ((uint32_t) (XHYVE_ACPI_BASE + HPET_OFFSET))); + acpitbl_write32(rsdt, 0x30, ((uint32_t) (XHYVE_ACPI_BASE + MCFG_OFFSET))); + /* write checksum */ + acpitbl_write8(rsdt, 0x9, acpitbl_checksum(rsdt, 52)); +} + +static void +acpitbl_build_xsdt(void) { + void *xsdt; + /* + * [000h 0000 4] Signature : "XSDT" + * [004h 0004 4] Table Length : 00000044 + * [008h 0008 1] Revision : 01 + * [009h 0009 1] Checksum : 00 + * [00Ah 0010 6] Oem ID : "BHYVE " + * [010h 0016 8] Oem Table ID : "BVXSDT " + * [018h 0024 4] Oem Revision : 00000001 + * [01Ch 0028 4] Asl Compiler ID : "INTL" + * [020h 0032 4] Asl Compiler Revision : 20140828 + * [024h 0036 8] ACPI Table Address 0 : 0000000000000000 + * [02Ch 0044 8] ACPI Table Address 1 : 0000000000000000 + * [034h 0052 8] ACPI Table Address 2 : 0000000000000000 + * [03Ch 0060 8] ACPI Table Address 3 : 0000000000000000 + */ + static const uint8_t xsdt_tmpl[68] = { + 0x58, 0x53, 0x44, 0x54, 0x44, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x42, 0x48, 0x59, 0x56, 0x45, 0x20, + 0x42, 0x56, 0x58, 0x53, 0x44, 0x54, 0x20, 0x20, + 0x01, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x54, 0x4C, + 0x28, 0x08, 0x14, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + + xsdt = (void *) (((uintptr_t) tb) + XSDT_OFFSET); + /* copy XSDT template to guest memory */ + memcpy(xsdt, xsdt_tmpl, 68); + /* fixup table */ + acpitbl_write64(xsdt, 0x24, ((uint64_t) (XHYVE_ACPI_BASE + MADT_OFFSET))); + acpitbl_write64(xsdt, 0x2c, ((uint64_t) (XHYVE_ACPI_BASE + FADT_OFFSET))); + acpitbl_write64(xsdt, 0x34, ((uint64_t) (XHYVE_ACPI_BASE + HPET_OFFSET))); + acpitbl_write64(xsdt, 0x3c, ((uint64_t) (XHYVE_ACPI_BASE + MCFG_OFFSET))); + /* write checksum */ + acpitbl_write8(xsdt, 0x9, acpitbl_checksum(xsdt, 68)); +} + +static void +acpitbl_build_madt(void) { + void *madt_head, *madt_apic, *madt_tail; + int i; + /* + * [000h 0000 4] Signature : "APIC" + * [004h 0004 4] Table Length : 00000000 + * [008h 0008 1] Revision : 01 + * [009h 0009 1] Checksum : 4E + * [00Ah 0010 6] Oem ID : "BHYVE " + * [010h 0016 8] Oem Table ID : "BVMADT " + * [018h 0024 4] Oem Revision : 00000001 + * [01Ch 0028 4] Asl Compiler ID : "INTL" + * [020h 0032 4] Asl Compiler Revision : 20140828 + * [024h 0036 4] Local Apic Address : FEE00000 + * [028h 0040 4] Flags (decoded below) : 00000001 + * PC-AT Compatibility : 1 + */ + static const uint8_t madt_head_tmpl[44] = { + 0x41, 0x50, 0x49, 0x43, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x42, 0x48, 0x59, 0x56, 0x45, 0x20, + 0x42, 0x56, 0x4D, 0x41, 0x44, 0x54, 0x20, 0x20, + 0x01, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x54, 0x4C, + 0x28, 0x08, 0x14, 0x20, 0x00, 0x00, 0xE0, 0xFE, + 0x01, 0x00, 0x00, 0x00, + }; + /* + * [+000h +0000 1] Subtable Type : 00 + * [+001h +0001 1] Length : 08 + * [+002h +0002 1] Processor ID : 00 + * [+003h +0003 1] Local Apic ID : 00 + * [+004h +0004 4] Flags (decoded below) : 00000001 + * Processor Enabled : 1 + */ + static const uint8_t madt_apic_tmpl[8] = { + 0x00, 0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + }; + /* + * [+000h +0000 1] Subtable Type : 01 + * [+001h +0001 1] Length : 0C + * [+002h +0002 1] I/O Apic ID : 00 + * [+003h +0003 1] Reserved : 00 + * [+004h +0004 4] Address : FEC00000 + * [+008h +0008 4] Interrupt : 00000000 + * [+00Ch +0012 1] Subtable Type : 02 + * [+00Dh +0013 1] Length : 0A + * [+00Eh +0014 1] Bus : 00 + * [+00Fh +0015 1] Source : 00 + * [+010h +0016 4] Interrupt : 00000002 + * [+014h +0020 2] Flags (decoded below) : 0005 + * Polarity : 1 + * Trigger Mode : 1 + * [+016h +0022 1] Subtable Type : 02 + * [+017h +0023 1] Length : 0A + * [+018h +0024 1] Bus : 00 + * [+019h +0025 1] Source : 00 + * [+01Ah +0026 4] Interrupt : 00000000 + * [+01Eh +0030 2] Flags (decoded below) : 000F + * Polarity : 3 + * Trigger Mode : 3 + * [+020h +0032 1] Subtable Type : 04 + * [+021h +0033 1] Length : 06 + * [+022h +0034 1] Processor ID : FF + * [+023h +0035 2] Flags (decoded below) : 0005 + * Polarity : 1 + * Trigger Mode : 1 + * [+025h +0037 1] Interrupt Input LINT : 01 + */ + static const uint8_t madt_tail_tmpl[38] = { + 0x01, 0x0C, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x0A, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x0A, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x04, 0x06, 0xFF, 0x05, 0x00, 0x01 + }; + + madt_head = (void *) (((uintptr_t) tb) + MADT_OFFSET); + /* copy MADT head template to guest memory */ + memcpy(madt_head, madt_head_tmpl, 44); + + for (i = 0; i < acpi_ncpu; i++) { + madt_apic = (void *) (((uintptr_t) tb) + + ((size_t) ((MADT_OFFSET + 44) + (8 * i)))); + /* copy MADT APIC template to guest memory */ + memcpy(madt_apic, madt_apic_tmpl, 8); + /* fixup table */ + acpitbl_write8(madt_apic, 0x2, ((uint8_t) i)); + acpitbl_write8(madt_apic, 0x3, ((uint8_t) i)); + } + + madt_tail = (void *) (((uintptr_t) tb) + + ((size_t) ((MADT_OFFSET + 44) + (8 * acpi_ncpu)))); + /* copy MADT tail template to guest memory */ + memcpy(madt_tail, madt_tail_tmpl, 38); + /* fixup table */ + acpitbl_write8(madt_tail, 0x2, 0); + acpitbl_write8(madt_tail, 0x19, SCI_INT); + acpitbl_write32(madt_tail, 0x1a, SCI_INT); + /* write checksum */ + acpitbl_write32(madt_head, 0x4, ((uint32_t) (44 + (8 * acpi_ncpu) + 38))); + acpitbl_write8(madt_head, 0x9, + acpitbl_checksum(madt_head, ((size_t) (44 + (8 * acpi_ncpu) + 38)))); +} + +static void +acpitbl_build_fadt(void) { + void *fadt; + /* + * [000h 0000 4] Signature : "FACP" + * [004h 0004 4] Table Length : 0000010C + * [008h 0008 1] Revision : 05 + * [009h 0009 1] Checksum : 00 + * [00Ah 0010 6] Oem ID : "BHYVE " + * [010h 0016 8] Oem Table ID : "BVFACP " + * [018h 0024 4] Oem Revision : 00000001 + * [01Ch 0028 4] Asl Compiler ID : "INTL" + * [020h 0032 4] Asl Compiler Revision : 20140828 + * [024h 0036 4] FACS Address : 00000000 + * [028h 0040 4] DSDT Address : 00000000 + * [02Ch 0044 1] Model : 01 + * [02Dh 0045 1] PM Profile : 00 (Unspecified) + * [02Eh 0046 2] SCI Interrupt : 0000 + * [030h 0048 4] SMI Command Port : 00000000 + * [034h 0052 1] ACPI Enable Value : 00 + * [035h 0053 1] ACPI Disable Value : 00 + * [036h 0054 1] S4BIOS Command : 00 + * [037h 0055 1] P-State Control : 00 + * [038h 0056 4] PM1A Event Block Address : 00000000 + * [03Ch 0060 4] PM1B Event Block Address : 00000000 + * [040h 0064 4] PM1A Control Block Address : 00000000 + * [044h 0068 4] PM1B Control Block Address : 00000000 + * [048h 0072 4] PM2 Control Block Address : 00000000 + * [04Ch 0076 4] PM Timer Block Address : 00000000 + * [050h 0080 4] GPE0 Block Address : 00000000 + * [054h 0084 4] GPE1 Block Address : 00000000 + * [058h 0088 1] PM1 Event Block Length : 04 + * [059h 0089 1] PM1 Control Block Length : 02 + * [05Ah 0090 1] PM2 Control Block Length : 00 + * [05Bh 0091 1] PM Timer Block Length : 04 + * [05Ch 0092 1] GPE0 Block Length : 00 + * [05Dh 0093 1] GPE1 Block Length : 00 + * [05Eh 0094 1] GPE1 Base Offset : 00 + * [05Fh 0095 1] _CST Support : 00 + * [060h 0096 2] C2 Latency : 0000 + * [062h 0098 2] C3 Latency : 0000 + * [064h 0100 2] CPU Cache Size : 0000 + * [066h 0102 2] Cache Flush Stride : 0000 + * [068h 0104 1] Duty Cycle Offset : 00 + * [069h 0105 1] Duty Cycle Width : 00 + * [06Ah 0106 1] RTC Day Alarm Index : 00 + * [06Bh 0107 1] RTC Month Alarm Index : 00 + * [06Ch 0108 1] RTC Century Index : 32 + * [06Dh 0109 2] Boot Flags (decoded below) : 0014 + * Legacy Devices Supported (V2) : 0 + * 8042 Present on ports 60/64 (V2) : 0 + * VGA Not Present (V4) : 1 + * MSI Not Supported (V4) : 0 + * PCIe ASPM Not Supported (V4) : 1 + * [06Fh 0111 1] Reserved : 00 + * [070h 0112 4] Flags (decoded below) : 00081525 + * WBINVD instruction is operational (V1) : 1 + * WBINVD flushes all caches (V1) : 0 + * All CPUs support C1 (V1) : 1 + * C2 works on MP system (V1) : 0 + * Control Method Power Button (V1) : 0 + * Control Method Sleep Button (V1) : 1 + * RTC wake not in fixed reg space (V1) : 0 + * RTC can wake system from S4 (V1) : 0 + * 32-bit PM Timer (V1) : 1 + * Docking Supported (V1) : 0 + * Reset Register Supported (V2) : 1 + * Sealed Case (V3) : 0 + * Headless - No Video (V3) : 1 + * Use native instr after SLP_TYPx (V3) : 0 + * PCIEXP_WAK Bits Supported (V4) : 0 + * Use Platform Timer (V4) : 0 + * RTC_STS valid on S4 wake (V4) : 0 + * Remote Power-on capable (V4) : 0 + * Use APIC Cluster Model (V4) : 0 + * Use APIC Physical Destination Mode (V4) : 1 + * [074h 0116 12] Reset Register : + * [074h 0116 1] Space ID : 01 (SystemIO) + * [075h 0117 1] Bit Width : 08 + * [076h 0118 1] Bit Offset : 00 + * [077h 0119 1] Access Width : 01 + * [078h 0120 8] Address : 0000000000000CF9 + * [080h 0128 1] Value to cause reset : 06 + * [081h 0129 3] Reserved : 000001 + * [084h 0132 8] FACS Address : 0000000000000000 + * [08Ch 0140 8] DSDT Address : 0000000000000000 + * [094h 0148 12] PM1A Event Block : + * [094h 0148 1] Space ID : 01 (SystemIO) + * [095h 0149 1] Bit Width : 20 + * [096h 0150 1] Bit Offset : 00 + * [097h 0151 1] Access Width : 02 + * [098h 0152 8] Address : 0000000000000000 + * [0A0h 0160 12] PM1B Event Block : + * [0A0h 0160 1] Space ID : 01 (SystemIO) + * [0A1h 0161 1] Bit Width : 00 + * [0A2h 0162 1] Bit Offset : 00 + * [0A3h 0163 1] Access Width : 00 + * [0A4h 0164 8] Address : 0000000000000000 + * [0ACh 0172 12] PM1A Control Block : + * [0ACh 0172 1] Space ID : 01 (SystemIO) + * [0ADh 0173 1] Bit Width : 10 + * [0AEh 0174 1] Bit Offset : 00 + * [0AFh 0175 1] Access Width : 02 + * [0B0h 0176 8] Address : 0000000000000000 + * [0B8h 0184 12] PM1B Control Block : + * [0B8h 0184 1] Space ID : 01 (SystemIO) + * [0B9h 0185 1] Bit Width : 00 + * [0BAh 0186 1] Bit Offset : 00 + * [0BBh 0187 1] Access Width : 00 + * [0BCh 0188 8] Address : 0000000000000000 + * [0C4h 0196 12] PM2 Control Block : + * [0C4h 0196 1] Space ID : 01 (SystemIO) + * [0C5h 0197 1] Bit Width : 08 + * [0C6h 0198 1] Bit Offset : 00 + * [0C7h 0199 1] Access Width : 00 + * [0C8h 0200 8] Address : 0000000000000000 + * [0D0h 0208 12] PM Timer Block : + * [0D0h 0208 1] Space ID : 01 (SystemIO) + * [0D1h 0209 1] Bit Width : 20 + * [0D2h 0210 1] Bit Offset : 00 + * [0D3h 0211 1] Access Width : 03 + * [0D4h 0212 8] Address : 0000000000000000 + * [0DCh 0220 12] GPE0 Block : + * [0DCh 0220 1] Space ID : 01 (SystemIO) + * [0DDh 0221 1] Bit Width : 00 + * [0DEh 0222 1] Bit Offset : 00 + * [0DFh 0223 1] Access Width : 01 + * [0E0h 0224 8] Address : 0000000000000000 + * [0E8h 0232 12] GPE1 Block : + * [0E8h 0232 1] Space ID : 01 (SystemIO) + * [0E9h 0233 1] Bit Width : 00 + * [0EAh 0234 1] Bit Offset : 00 + * [0EBh 0235 1] Access Width : 00 + * [0ECh 0236 8] Address : 0000000000000000 + * [0F4h 0244 12] Sleep Control Register : + * [0F4h 0244 1] Space ID : 01 (SystemIO) + * [0F5h 0245 1] Bit Width : 08 + * [0F6h 0246 1] Bit Offset : 00 + * [0F7h 0247 1] Access Width : 01 + * [0F8h 0248 8] Address : 0000000000000000 + * [100h 0256 12] Sleep Status Register : + * [100h 0256 01] Space ID : 01 (SystemIO) + * [101h 0257 01] Bit Width : 08 + * [102h 0258 01] Bit Offset : 00 + * [103h 0259 01] Access Width : 01 + * [104h 0260 08] Address : 0000000000000000 + */ + static const uint8_t fadt_tmpl[268] = { + 0x46, 0x41, 0x43, 0x50, 0x0C, 0x01, 0x00, 0x00, + 0x05, 0x00, 0x42, 0x48, 0x59, 0x56, 0x45, 0x20, + 0x42, 0x56, 0x46, 0x41, 0x43, 0x50, 0x20, 0x20, + 0x01, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x54, 0x4C, + 0x28, 0x08, 0x14, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x32, 0x14, 0x00, 0x00, + 0x25, 0x15, 0x08, 0x00, 0x01, 0x08, 0x00, 0x01, + 0xF9, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x20, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 + }; + + fadt = (void *) (((uintptr_t) tb) + FADT_OFFSET); + /* copy FADT template to guest memory */ + memcpy(fadt, fadt_tmpl, 268); + /* fixup table */ + acpitbl_write32(fadt, 0x24, ((uint32_t) (XHYVE_ACPI_BASE + FACS_OFFSET))); + acpitbl_write32(fadt, 0x28, ((uint32_t) (XHYVE_ACPI_BASE + DSDT_OFFSET))); + acpitbl_write16(fadt, 0x2e, SCI_INT); + acpitbl_write32(fadt, 0x30, SMI_CMD); + acpitbl_write8(fadt, 0x34, BHYVE_ACPI_ENABLE); + acpitbl_write8(fadt, 0x35, BHYVE_ACPI_DISABLE); + acpitbl_write32(fadt, 0x38, PM1A_EVT_ADDR); + acpitbl_write32(fadt, 0x40, PM1A_CNT_ADDR); + acpitbl_write32(fadt, 0x4c, IO_PMTMR); + acpitbl_write64(fadt, 0x84, ((uint64_t) (XHYVE_ACPI_BASE + FACS_OFFSET))); + acpitbl_write64(fadt, 0x8c, ((uint64_t) (XHYVE_ACPI_BASE + DSDT_OFFSET))); + acpitbl_write64(fadt, 0x98, ((uint64_t) PM1A_EVT_ADDR)); + acpitbl_write64(fadt, 0xb0, ((uint64_t) PM1A_CNT_ADDR)); + acpitbl_write64(fadt, 0xd4, ((uint64_t) IO_PMTMR)); + /* write checksum */ + acpitbl_write8(fadt, 0x9, acpitbl_checksum(fadt, 268)); +} + +static void +acpitbl_build_hpet(void) { + void *hpet; + /* + * [000h 0000 4] Signature : "HPET" + * [004h 0004 4] Table Length : 00000038 + * [008h 0008 1] Revision : 01 + * [009h 0009 1] Checksum : 00 + * [00Ah 0010 6] Oem ID : "BHYVE " + * [010h 0016 8] Oem Table ID : "BVHPET " + * [018h 0024 4] Oem Revision : 00000001 + * [01Ch 0028 4] Asl Compiler ID : "INTL" + * [020h 0032 4] Asl Compiler Revision : 20140828 + * [024h 0036 4] Hardware Block ID : 00000000 + * [028h 0040 12] Timer Block Register : + * [028h 0040 1] Space ID : 00 (SystemMemory) + * [029h 0041 1] Bit Width : 00 + * [02Ah 0042 1] Bit Offset : 00 + * [02Bh 0043 1] Access Width : 00 + * [02Ch 0044 8] Address : 00000000FED00000 + * [034h 0052 1] Sequence Number : 00 + * [035h 0053 2] Minimum Clock Ticks : 0000 + * [037h 0055 1] Flags (decoded below) : 01 + * 4K Page Protect : 1 + * 64K Page Protect : 0 + */ + static const uint8_t hpet_tmpl[56] = { + 0x48, 0x50, 0x45, 0x54, 0x38, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x42, 0x48, 0x59, 0x56, 0x45, 0x20, + 0x42, 0x56, 0x48, 0x50, 0x45, 0x54, 0x20, 0x20, + 0x01, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x54, 0x4C, + 0x28, 0x08, 0x14, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 + }; + + hpet = (void *) (((uintptr_t) tb) + HPET_OFFSET); + /* copy HPET template to guest memory */ + memcpy(hpet, hpet_tmpl, 56); + /* fixup table */ + acpitbl_write32(hpet, 0x24, hpet_capabilities); + /* write checksum */ + acpitbl_write8(hpet, 0x9, acpitbl_checksum(hpet, 56)); +} + +static void +acpitbl_build_mcfg(void) { + void *mcfg; + /* + * [000h 0000 4] Signature : "MCFG" + * [004h 0004 4] Table Length : 0000003C + * [008h 0008 1] Revision : 01 + * [009h 0009 1] Checksum : 00 + * [00Ah 0010 6] Oem ID : "BHYVE " + * [010h 0016 8] Oem Table ID : "BVMCFG " + * [018h 0024 4] Oem Revision : 00000001 + * [01Ch 0028 4] Asl Compiler ID : "INTL" + * [020h 0032 4] Asl Compiler Revision : 20140828 + * [024h 0036 8] Reserved : 0000000000000000 + * [02Ch 0044 8] Base Address : 0000000000000000 + * [034h 0052 2] Segment Group Number : 0000 + * [036h 0054 1] Start Bus Number : 00 + * [037h 0055 1] End Bus Number : FF + * [038h 0056 4] Reserved : 00000000 + */ + static const uint8_t mcfg_tmpl[60] = { + 0x4D, 0x43, 0x46, 0x47, 0x3C, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x42, 0x48, 0x59, 0x56, 0x45, 0x20, + 0x42, 0x56, 0x4D, 0x43, 0x46, 0x47, 0x20, 0x20, + 0x01, 0x00, 0x00, 0x00, 0x49, 0x4E, 0x54, 0x4C, + 0x28, 0x08, 0x14, 0x20, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, + 0x00, 0x00, 0x00, 0x00 + }; + + mcfg = (void *) (((uintptr_t) tb) + MCFG_OFFSET); + /* copy MCFG template to guest memory */ + memcpy(mcfg, mcfg_tmpl, 60); + /* fixup table */ + acpitbl_write64(mcfg, 0x2c, pci_ecfg_base()); + /* write checksum */ + acpitbl_write8(mcfg, 0x9, acpitbl_checksum(mcfg, 60)); +} + +static void +acpitbl_build_facs(void) { + void *facs; + /* + * [000h 0000 4] Signature : "FACS" + * [004h 0004 4] Length : 00000040 + * [008h 0008 4] Hardware Signature : 00000000 + * [00Ch 0012 4] 32 Firmware Waking Vector : 00000000 + * [010h 0016 4] Global Lock : 00000000 + * [014h 0020 4] Flags (decoded below) : 00000000 + * S4BIOS Support Present : 0 + * 64-bit Wake Supported (V2) : 0 + * [018h 0024 8] 64 Firmware Waking Vector : 0000000000000000 + * [020h 0032 1] Version : 02 + * [021h 0033 3] Reserved : 000000 + * [024h 0036 4] OspmFlags (decoded below) : 00000000 + * 64-bit Wake Env Required (V2) : 0 + */ + static const uint8_t facs_tmpl[64] = { + 0x46, 0x41, 0x43, 0x53, 0x40, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + facs = (void *) (((uintptr_t) tb) + FACS_OFFSET); + /* copy MCFG template to guest memory */ + memcpy(facs, facs_tmpl, 64); +} + +void dsdt_fixup(int bus, uint16_t iobase, uint16_t iolimit, uint32_t membase32, + uint32_t memlimit32, uint64_t membase64, uint64_t memlimit64) +{ + if (bus != 0) { + fprintf(stderr, "DSDT, unsupported PCI bus (%d)\n", bus); + exit(-1); + } + + acpitbl_write16(dsdt, 0xb6, iobase); + acpitbl_write16(dsdt, 0xb8, (iolimit - 1)); + acpitbl_write16(dsdt, 0xbc, (iolimit - iobase)); + acpitbl_write32(dsdt, 0xc8, membase32); + acpitbl_write32(dsdt, 0xcc, (memlimit32 - 1)); + acpitbl_write32(dsdt, 0xd4, (memlimit32 - membase32)); + acpitbl_write64(dsdt, 0xe6, membase64); + acpitbl_write64(dsdt, 0xee, (memlimit64 - 1)); + acpitbl_write64(dsdt, 0xfe, (memlimit64 - membase64)); +} + +static void +acpitbl_build_dsdt(void) { + static const uint8_t dsdt_tmpl[2604] = { + 0x44, 0x53, 0x44, 0x54, 0x2d, 0x0a, 0x00, 0x00, + 0x02, 0x5d, 0x42, 0x48, 0x59, 0x56, 0x45, 0x20, + 0x42, 0x56, 0x44, 0x53, 0x44, 0x54, 0x20, 0x20, + 0x01, 0x00, 0x00, 0x00, 0x49, 0x4e, 0x54, 0x4c, + 0x28, 0x08, 0x14, 0x20, 0x08, 0x5f, 0x53, 0x35, + 0x5f, 0x12, 0x05, 0x02, 0x0a, 0x05, 0x00, 0x08, + 0x50, 0x49, 0x43, 0x4d, 0x0a, 0x00, 0x14, 0x0c, + 0x5f, 0x50, 0x49, 0x43, 0x01, 0x70, 0x68, 0x50, + 0x49, 0x43, 0x4d, 0x10, 0x4f, 0x9a, 0x5f, 0x53, + 0x42, 0x5f, 0x5b, 0x82, 0x47, 0x9a, 0x50, 0x43, + 0x30, 0x30, 0x08, 0x5f, 0x48, 0x49, 0x44, 0x0c, + 0x41, 0xd0, 0x0a, 0x03, 0x08, 0x5f, 0x41, 0x44, + 0x52, 0x00, 0x14, 0x09, 0x5f, 0x42, 0x42, 0x4e, + 0x00, 0xa4, 0x0a, 0x00, 0x08, 0x5f, 0x43, 0x52, + 0x53, 0x11, 0x46, 0x09, 0x0a, 0x92, 0x88, 0x0d, + 0x00, 0x02, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x47, 0x01, + 0xf8, 0x0c, 0xf8, 0x0c, 0x01, 0x08, 0x88, 0x0d, + 0x00, 0x01, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, + 0xf7, 0x0c, 0x00, 0x00, 0xf8, 0x0c, 0x88, 0x0d, + 0x00, 0x01, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x0d, + 0xff, 0x1f, 0x00, 0x00, 0x00, 0x13, 0x88, 0x0d, + 0x00, 0x01, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x20, + 0x1f, 0x20, 0x00, 0x00, 0x20, 0x00, 0x87, 0x17, + 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x1f, 0xc0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x8a, 0x2b, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x0f, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x79, 0x00, + 0x08, 0x50, 0x50, 0x52, 0x54, 0x12, 0x4b, 0x0f, + 0x08, 0x12, 0x1e, 0x04, 0x0c, 0xff, 0xff, 0x01, + 0x00, 0x0a, 0x00, 0x5c, 0x2f, 0x04, 0x5f, 0x53, + 0x42, 0x5f, 0x50, 0x43, 0x30, 0x30, 0x49, 0x53, + 0x41, 0x5f, 0x4c, 0x4e, 0x4b, 0x41, 0x0a, 0x00, + 0x12, 0x1e, 0x04, 0x0c, 0xff, 0xff, 0x02, 0x00, + 0x0a, 0x00, 0x5c, 0x2f, 0x04, 0x5f, 0x53, 0x42, + 0x5f, 0x50, 0x43, 0x30, 0x30, 0x49, 0x53, 0x41, + 0x5f, 0x4c, 0x4e, 0x4b, 0x42, 0x0a, 0x00, 0x12, + 0x1e, 0x04, 0x0c, 0xff, 0xff, 0x03, 0x00, 0x0a, + 0x00, 0x5c, 0x2f, 0x04, 0x5f, 0x53, 0x42, 0x5f, + 0x50, 0x43, 0x30, 0x30, 0x49, 0x53, 0x41, 0x5f, + 0x4c, 0x4e, 0x4b, 0x43, 0x0a, 0x00, 0x12, 0x1e, + 0x04, 0x0c, 0xff, 0xff, 0x04, 0x00, 0x0a, 0x00, + 0x5c, 0x2f, 0x04, 0x5f, 0x53, 0x42, 0x5f, 0x50, + 0x43, 0x30, 0x30, 0x49, 0x53, 0x41, 0x5f, 0x4c, + 0x4e, 0x4b, 0x44, 0x0a, 0x00, 0x12, 0x1e, 0x04, + 0x0c, 0xff, 0xff, 0x05, 0x00, 0x0a, 0x00, 0x5c, + 0x2f, 0x04, 0x5f, 0x53, 0x42, 0x5f, 0x50, 0x43, + 0x30, 0x30, 0x49, 0x53, 0x41, 0x5f, 0x4c, 0x4e, + 0x4b, 0x45, 0x0a, 0x00, 0x12, 0x1e, 0x04, 0x0c, + 0xff, 0xff, 0x06, 0x00, 0x0a, 0x00, 0x5c, 0x2f, + 0x04, 0x5f, 0x53, 0x42, 0x5f, 0x50, 0x43, 0x30, + 0x30, 0x49, 0x53, 0x41, 0x5f, 0x4c, 0x4e, 0x4b, + 0x46, 0x0a, 0x00, 0x12, 0x1e, 0x04, 0x0c, 0xff, + 0xff, 0x07, 0x00, 0x0a, 0x00, 0x5c, 0x2f, 0x04, + 0x5f, 0x53, 0x42, 0x5f, 0x50, 0x43, 0x30, 0x30, + 0x49, 0x53, 0x41, 0x5f, 0x4c, 0x4e, 0x4b, 0x47, + 0x0a, 0x00, 0x12, 0x1e, 0x04, 0x0c, 0xff, 0xff, + 0x08, 0x00, 0x0a, 0x00, 0x5c, 0x2f, 0x04, 0x5f, + 0x53, 0x42, 0x5f, 0x50, 0x43, 0x30, 0x30, 0x49, + 0x53, 0x41, 0x5f, 0x4c, 0x4e, 0x4b, 0x48, 0x0a, + 0x00, 0x08, 0x41, 0x50, 0x52, 0x54, 0x12, 0x4b, + 0x06, 0x08, 0x12, 0x0c, 0x04, 0x0c, 0xff, 0xff, + 0x01, 0x00, 0x0a, 0x00, 0x00, 0x0a, 0x10, 0x12, + 0x0c, 0x04, 0x0c, 0xff, 0xff, 0x02, 0x00, 0x0a, + 0x00, 0x00, 0x0a, 0x11, 0x12, 0x0c, 0x04, 0x0c, + 0xff, 0xff, 0x03, 0x00, 0x0a, 0x00, 0x00, 0x0a, + 0x12, 0x12, 0x0c, 0x04, 0x0c, 0xff, 0xff, 0x04, + 0x00, 0x0a, 0x00, 0x00, 0x0a, 0x13, 0x12, 0x0c, + 0x04, 0x0c, 0xff, 0xff, 0x05, 0x00, 0x0a, 0x00, + 0x00, 0x0a, 0x14, 0x12, 0x0c, 0x04, 0x0c, 0xff, + 0xff, 0x06, 0x00, 0x0a, 0x00, 0x00, 0x0a, 0x15, + 0x12, 0x0c, 0x04, 0x0c, 0xff, 0xff, 0x07, 0x00, + 0x0a, 0x00, 0x00, 0x0a, 0x16, 0x12, 0x0c, 0x04, + 0x0c, 0xff, 0xff, 0x08, 0x00, 0x0a, 0x00, 0x00, + 0x0a, 0x17, 0x14, 0x18, 0x5f, 0x50, 0x52, 0x54, + 0x00, 0xa0, 0x0a, 0x50, 0x49, 0x43, 0x4d, 0xa4, + 0x41, 0x50, 0x52, 0x54, 0xa1, 0x06, 0xa4, 0x50, + 0x50, 0x52, 0x54, 0x5b, 0x82, 0x4e, 0x75, 0x49, + 0x53, 0x41, 0x5f, 0x08, 0x5f, 0x41, 0x44, 0x52, + 0x0c, 0x00, 0x00, 0x1f, 0x00, 0x5b, 0x80, 0x4c, + 0x50, 0x43, 0x52, 0x02, 0x0a, 0x00, 0x0b, 0x00, + 0x01, 0x5b, 0x81, 0x33, 0x4c, 0x50, 0x43, 0x52, + 0x00, 0x00, 0x40, 0x30, 0x50, 0x49, 0x52, 0x41, + 0x08, 0x50, 0x49, 0x52, 0x42, 0x08, 0x50, 0x49, + 0x52, 0x43, 0x08, 0x50, 0x49, 0x52, 0x44, 0x08, + 0x00, 0x20, 0x50, 0x49, 0x52, 0x45, 0x08, 0x50, + 0x49, 0x52, 0x46, 0x08, 0x50, 0x49, 0x52, 0x47, + 0x08, 0x50, 0x49, 0x52, 0x48, 0x08, 0x14, 0x33, + 0x50, 0x49, 0x52, 0x56, 0x01, 0xa0, 0x09, 0x7b, + 0x68, 0x0a, 0x80, 0x00, 0xa4, 0x0a, 0x00, 0x7b, + 0x68, 0x0a, 0x0f, 0x60, 0xa0, 0x08, 0x95, 0x60, + 0x0a, 0x03, 0xa4, 0x0a, 0x00, 0xa0, 0x08, 0x93, + 0x60, 0x0a, 0x08, 0xa4, 0x0a, 0x00, 0xa0, 0x08, + 0x93, 0x60, 0x0a, 0x0d, 0xa4, 0x0a, 0x00, 0xa4, + 0x0a, 0x01, 0x5b, 0x82, 0x4f, 0x0a, 0x4c, 0x4e, + 0x4b, 0x41, 0x08, 0x5f, 0x48, 0x49, 0x44, 0x0c, + 0x41, 0xd0, 0x0c, 0x0f, 0x08, 0x5f, 0x55, 0x49, + 0x44, 0x0a, 0x01, 0x14, 0x18, 0x5f, 0x53, 0x54, + 0x41, 0x00, 0xa0, 0x0c, 0x50, 0x49, 0x52, 0x56, + 0x50, 0x49, 0x52, 0x41, 0xa4, 0x0a, 0x0b, 0xa1, + 0x04, 0xa4, 0x0a, 0x09, 0x08, 0x5f, 0x50, 0x52, + 0x53, 0x11, 0x09, 0x0a, 0x06, 0x23, 0xf8, 0xde, + 0x18, 0x79, 0x00, 0x08, 0x43, 0x42, 0x30, 0x31, + 0x11, 0x09, 0x0a, 0x06, 0x23, 0x00, 0x00, 0x18, + 0x79, 0x00, 0x8b, 0x43, 0x42, 0x30, 0x31, 0x0a, + 0x01, 0x43, 0x49, 0x52, 0x41, 0x14, 0x2b, 0x5f, + 0x43, 0x52, 0x53, 0x00, 0x7b, 0x50, 0x49, 0x52, + 0x41, 0x0a, 0x8f, 0x60, 0xa0, 0x0e, 0x50, 0x49, + 0x52, 0x56, 0x60, 0x79, 0x0a, 0x01, 0x60, 0x43, + 0x49, 0x52, 0x41, 0xa1, 0x08, 0x70, 0x0a, 0x00, + 0x43, 0x49, 0x52, 0x41, 0xa4, 0x43, 0x42, 0x30, + 0x31, 0x14, 0x0d, 0x5f, 0x44, 0x49, 0x53, 0x00, + 0x70, 0x0a, 0x80, 0x50, 0x49, 0x52, 0x41, 0x14, + 0x1b, 0x5f, 0x53, 0x52, 0x53, 0x01, 0x8b, 0x68, + 0x0a, 0x01, 0x53, 0x49, 0x52, 0x41, 0x82, 0x53, + 0x49, 0x52, 0x41, 0x60, 0x70, 0x76, 0x60, 0x50, + 0x49, 0x52, 0x41, 0x5b, 0x82, 0x4f, 0x0a, 0x4c, + 0x4e, 0x4b, 0x42, 0x08, 0x5f, 0x48, 0x49, 0x44, + 0x0c, 0x41, 0xd0, 0x0c, 0x0f, 0x08, 0x5f, 0x55, + 0x49, 0x44, 0x0a, 0x02, 0x14, 0x18, 0x5f, 0x53, + 0x54, 0x41, 0x00, 0xa0, 0x0c, 0x50, 0x49, 0x52, + 0x56, 0x50, 0x49, 0x52, 0x42, 0xa4, 0x0a, 0x0b, + 0xa1, 0x04, 0xa4, 0x0a, 0x09, 0x08, 0x5f, 0x50, + 0x52, 0x53, 0x11, 0x09, 0x0a, 0x06, 0x23, 0xf8, + 0xde, 0x18, 0x79, 0x00, 0x08, 0x43, 0x42, 0x30, + 0x32, 0x11, 0x09, 0x0a, 0x06, 0x23, 0x00, 0x00, + 0x18, 0x79, 0x00, 0x8b, 0x43, 0x42, 0x30, 0x32, + 0x0a, 0x01, 0x43, 0x49, 0x52, 0x42, 0x14, 0x2b, + 0x5f, 0x43, 0x52, 0x53, 0x00, 0x7b, 0x50, 0x49, + 0x52, 0x42, 0x0a, 0x8f, 0x60, 0xa0, 0x0e, 0x50, + 0x49, 0x52, 0x56, 0x60, 0x79, 0x0a, 0x01, 0x60, + 0x43, 0x49, 0x52, 0x42, 0xa1, 0x08, 0x70, 0x0a, + 0x00, 0x43, 0x49, 0x52, 0x42, 0xa4, 0x43, 0x42, + 0x30, 0x32, 0x14, 0x0d, 0x5f, 0x44, 0x49, 0x53, + 0x00, 0x70, 0x0a, 0x80, 0x50, 0x49, 0x52, 0x42, + 0x14, 0x1b, 0x5f, 0x53, 0x52, 0x53, 0x01, 0x8b, + 0x68, 0x0a, 0x01, 0x53, 0x49, 0x52, 0x42, 0x82, + 0x53, 0x49, 0x52, 0x42, 0x60, 0x70, 0x76, 0x60, + 0x50, 0x49, 0x52, 0x42, 0x5b, 0x82, 0x4f, 0x0a, + 0x4c, 0x4e, 0x4b, 0x43, 0x08, 0x5f, 0x48, 0x49, + 0x44, 0x0c, 0x41, 0xd0, 0x0c, 0x0f, 0x08, 0x5f, + 0x55, 0x49, 0x44, 0x0a, 0x03, 0x14, 0x18, 0x5f, + 0x53, 0x54, 0x41, 0x00, 0xa0, 0x0c, 0x50, 0x49, + 0x52, 0x56, 0x50, 0x49, 0x52, 0x43, 0xa4, 0x0a, + 0x0b, 0xa1, 0x04, 0xa4, 0x0a, 0x09, 0x08, 0x5f, + 0x50, 0x52, 0x53, 0x11, 0x09, 0x0a, 0x06, 0x23, + 0xf8, 0xde, 0x18, 0x79, 0x00, 0x08, 0x43, 0x42, + 0x30, 0x33, 0x11, 0x09, 0x0a, 0x06, 0x23, 0x00, + 0x00, 0x18, 0x79, 0x00, 0x8b, 0x43, 0x42, 0x30, + 0x33, 0x0a, 0x01, 0x43, 0x49, 0x52, 0x43, 0x14, + 0x2b, 0x5f, 0x43, 0x52, 0x53, 0x00, 0x7b, 0x50, + 0x49, 0x52, 0x43, 0x0a, 0x8f, 0x60, 0xa0, 0x0e, + 0x50, 0x49, 0x52, 0x56, 0x60, 0x79, 0x0a, 0x01, + 0x60, 0x43, 0x49, 0x52, 0x43, 0xa1, 0x08, 0x70, + 0x0a, 0x00, 0x43, 0x49, 0x52, 0x43, 0xa4, 0x43, + 0x42, 0x30, 0x33, 0x14, 0x0d, 0x5f, 0x44, 0x49, + 0x53, 0x00, 0x70, 0x0a, 0x80, 0x50, 0x49, 0x52, + 0x43, 0x14, 0x1b, 0x5f, 0x53, 0x52, 0x53, 0x01, + 0x8b, 0x68, 0x0a, 0x01, 0x53, 0x49, 0x52, 0x43, + 0x82, 0x53, 0x49, 0x52, 0x43, 0x60, 0x70, 0x76, + 0x60, 0x50, 0x49, 0x52, 0x43, 0x5b, 0x82, 0x4f, + 0x0a, 0x4c, 0x4e, 0x4b, 0x44, 0x08, 0x5f, 0x48, + 0x49, 0x44, 0x0c, 0x41, 0xd0, 0x0c, 0x0f, 0x08, + 0x5f, 0x55, 0x49, 0x44, 0x0a, 0x04, 0x14, 0x18, + 0x5f, 0x53, 0x54, 0x41, 0x00, 0xa0, 0x0c, 0x50, + 0x49, 0x52, 0x56, 0x50, 0x49, 0x52, 0x44, 0xa4, + 0x0a, 0x0b, 0xa1, 0x04, 0xa4, 0x0a, 0x09, 0x08, + 0x5f, 0x50, 0x52, 0x53, 0x11, 0x09, 0x0a, 0x06, + 0x23, 0xf8, 0xde, 0x18, 0x79, 0x00, 0x08, 0x43, + 0x42, 0x30, 0x34, 0x11, 0x09, 0x0a, 0x06, 0x23, + 0x00, 0x00, 0x18, 0x79, 0x00, 0x8b, 0x43, 0x42, + 0x30, 0x34, 0x0a, 0x01, 0x43, 0x49, 0x52, 0x44, + 0x14, 0x2b, 0x5f, 0x43, 0x52, 0x53, 0x00, 0x7b, + 0x50, 0x49, 0x52, 0x44, 0x0a, 0x8f, 0x60, 0xa0, + 0x0e, 0x50, 0x49, 0x52, 0x56, 0x60, 0x79, 0x0a, + 0x01, 0x60, 0x43, 0x49, 0x52, 0x44, 0xa1, 0x08, + 0x70, 0x0a, 0x00, 0x43, 0x49, 0x52, 0x44, 0xa4, + 0x43, 0x42, 0x30, 0x34, 0x14, 0x0d, 0x5f, 0x44, + 0x49, 0x53, 0x00, 0x70, 0x0a, 0x80, 0x50, 0x49, + 0x52, 0x44, 0x14, 0x1b, 0x5f, 0x53, 0x52, 0x53, + 0x01, 0x8b, 0x68, 0x0a, 0x01, 0x53, 0x49, 0x52, + 0x44, 0x82, 0x53, 0x49, 0x52, 0x44, 0x60, 0x70, + 0x76, 0x60, 0x50, 0x49, 0x52, 0x44, 0x5b, 0x82, + 0x4f, 0x0a, 0x4c, 0x4e, 0x4b, 0x45, 0x08, 0x5f, + 0x48, 0x49, 0x44, 0x0c, 0x41, 0xd0, 0x0c, 0x0f, + 0x08, 0x5f, 0x55, 0x49, 0x44, 0x0a, 0x05, 0x14, + 0x18, 0x5f, 0x53, 0x54, 0x41, 0x00, 0xa0, 0x0c, + 0x50, 0x49, 0x52, 0x56, 0x50, 0x49, 0x52, 0x45, + 0xa4, 0x0a, 0x0b, 0xa1, 0x04, 0xa4, 0x0a, 0x09, + 0x08, 0x5f, 0x50, 0x52, 0x53, 0x11, 0x09, 0x0a, + 0x06, 0x23, 0xf8, 0xde, 0x18, 0x79, 0x00, 0x08, + 0x43, 0x42, 0x30, 0x35, 0x11, 0x09, 0x0a, 0x06, + 0x23, 0x00, 0x00, 0x18, 0x79, 0x00, 0x8b, 0x43, + 0x42, 0x30, 0x35, 0x0a, 0x01, 0x43, 0x49, 0x52, + 0x45, 0x14, 0x2b, 0x5f, 0x43, 0x52, 0x53, 0x00, + 0x7b, 0x50, 0x49, 0x52, 0x45, 0x0a, 0x8f, 0x60, + 0xa0, 0x0e, 0x50, 0x49, 0x52, 0x56, 0x60, 0x79, + 0x0a, 0x01, 0x60, 0x43, 0x49, 0x52, 0x45, 0xa1, + 0x08, 0x70, 0x0a, 0x00, 0x43, 0x49, 0x52, 0x45, + 0xa4, 0x43, 0x42, 0x30, 0x35, 0x14, 0x0d, 0x5f, + 0x44, 0x49, 0x53, 0x00, 0x70, 0x0a, 0x80, 0x50, + 0x49, 0x52, 0x45, 0x14, 0x1b, 0x5f, 0x53, 0x52, + 0x53, 0x01, 0x8b, 0x68, 0x0a, 0x01, 0x53, 0x49, + 0x52, 0x45, 0x82, 0x53, 0x49, 0x52, 0x45, 0x60, + 0x70, 0x76, 0x60, 0x50, 0x49, 0x52, 0x45, 0x5b, + 0x82, 0x4f, 0x0a, 0x4c, 0x4e, 0x4b, 0x46, 0x08, + 0x5f, 0x48, 0x49, 0x44, 0x0c, 0x41, 0xd0, 0x0c, + 0x0f, 0x08, 0x5f, 0x55, 0x49, 0x44, 0x0a, 0x06, + 0x14, 0x18, 0x5f, 0x53, 0x54, 0x41, 0x00, 0xa0, + 0x0c, 0x50, 0x49, 0x52, 0x56, 0x50, 0x49, 0x52, + 0x46, 0xa4, 0x0a, 0x0b, 0xa1, 0x04, 0xa4, 0x0a, + 0x09, 0x08, 0x5f, 0x50, 0x52, 0x53, 0x11, 0x09, + 0x0a, 0x06, 0x23, 0xf8, 0xde, 0x18, 0x79, 0x00, + 0x08, 0x43, 0x42, 0x30, 0x36, 0x11, 0x09, 0x0a, + 0x06, 0x23, 0x00, 0x00, 0x18, 0x79, 0x00, 0x8b, + 0x43, 0x42, 0x30, 0x36, 0x0a, 0x01, 0x43, 0x49, + 0x52, 0x46, 0x14, 0x2b, 0x5f, 0x43, 0x52, 0x53, + 0x00, 0x7b, 0x50, 0x49, 0x52, 0x46, 0x0a, 0x8f, + 0x60, 0xa0, 0x0e, 0x50, 0x49, 0x52, 0x56, 0x60, + 0x79, 0x0a, 0x01, 0x60, 0x43, 0x49, 0x52, 0x46, + 0xa1, 0x08, 0x70, 0x0a, 0x00, 0x43, 0x49, 0x52, + 0x46, 0xa4, 0x43, 0x42, 0x30, 0x36, 0x14, 0x0d, + 0x5f, 0x44, 0x49, 0x53, 0x00, 0x70, 0x0a, 0x80, + 0x50, 0x49, 0x52, 0x46, 0x14, 0x1b, 0x5f, 0x53, + 0x52, 0x53, 0x01, 0x8b, 0x68, 0x0a, 0x01, 0x53, + 0x49, 0x52, 0x46, 0x82, 0x53, 0x49, 0x52, 0x46, + 0x60, 0x70, 0x76, 0x60, 0x50, 0x49, 0x52, 0x46, + 0x5b, 0x82, 0x4f, 0x0a, 0x4c, 0x4e, 0x4b, 0x47, + 0x08, 0x5f, 0x48, 0x49, 0x44, 0x0c, 0x41, 0xd0, + 0x0c, 0x0f, 0x08, 0x5f, 0x55, 0x49, 0x44, 0x0a, + 0x07, 0x14, 0x18, 0x5f, 0x53, 0x54, 0x41, 0x00, + 0xa0, 0x0c, 0x50, 0x49, 0x52, 0x56, 0x50, 0x49, + 0x52, 0x47, 0xa4, 0x0a, 0x0b, 0xa1, 0x04, 0xa4, + 0x0a, 0x09, 0x08, 0x5f, 0x50, 0x52, 0x53, 0x11, + 0x09, 0x0a, 0x06, 0x23, 0xf8, 0xde, 0x18, 0x79, + 0x00, 0x08, 0x43, 0x42, 0x30, 0x37, 0x11, 0x09, + 0x0a, 0x06, 0x23, 0x00, 0x00, 0x18, 0x79, 0x00, + 0x8b, 0x43, 0x42, 0x30, 0x37, 0x0a, 0x01, 0x43, + 0x49, 0x52, 0x47, 0x14, 0x2b, 0x5f, 0x43, 0x52, + 0x53, 0x00, 0x7b, 0x50, 0x49, 0x52, 0x47, 0x0a, + 0x8f, 0x60, 0xa0, 0x0e, 0x50, 0x49, 0x52, 0x56, + 0x60, 0x79, 0x0a, 0x01, 0x60, 0x43, 0x49, 0x52, + 0x47, 0xa1, 0x08, 0x70, 0x0a, 0x00, 0x43, 0x49, + 0x52, 0x47, 0xa4, 0x43, 0x42, 0x30, 0x37, 0x14, + 0x0d, 0x5f, 0x44, 0x49, 0x53, 0x00, 0x70, 0x0a, + 0x80, 0x50, 0x49, 0x52, 0x47, 0x14, 0x1b, 0x5f, + 0x53, 0x52, 0x53, 0x01, 0x8b, 0x68, 0x0a, 0x01, + 0x53, 0x49, 0x52, 0x47, 0x82, 0x53, 0x49, 0x52, + 0x47, 0x60, 0x70, 0x76, 0x60, 0x50, 0x49, 0x52, + 0x47, 0x5b, 0x82, 0x4f, 0x0a, 0x4c, 0x4e, 0x4b, + 0x48, 0x08, 0x5f, 0x48, 0x49, 0x44, 0x0c, 0x41, + 0xd0, 0x0c, 0x0f, 0x08, 0x5f, 0x55, 0x49, 0x44, + 0x0a, 0x08, 0x14, 0x18, 0x5f, 0x53, 0x54, 0x41, + 0x00, 0xa0, 0x0c, 0x50, 0x49, 0x52, 0x56, 0x50, + 0x49, 0x52, 0x48, 0xa4, 0x0a, 0x0b, 0xa1, 0x04, + 0xa4, 0x0a, 0x09, 0x08, 0x5f, 0x50, 0x52, 0x53, + 0x11, 0x09, 0x0a, 0x06, 0x23, 0xf8, 0xde, 0x18, + 0x79, 0x00, 0x08, 0x43, 0x42, 0x30, 0x38, 0x11, + 0x09, 0x0a, 0x06, 0x23, 0x00, 0x00, 0x18, 0x79, + 0x00, 0x8b, 0x43, 0x42, 0x30, 0x38, 0x0a, 0x01, + 0x43, 0x49, 0x52, 0x48, 0x14, 0x2b, 0x5f, 0x43, + 0x52, 0x53, 0x00, 0x7b, 0x50, 0x49, 0x52, 0x48, + 0x0a, 0x8f, 0x60, 0xa0, 0x0e, 0x50, 0x49, 0x52, + 0x56, 0x60, 0x79, 0x0a, 0x01, 0x60, 0x43, 0x49, + 0x52, 0x48, 0xa1, 0x08, 0x70, 0x0a, 0x00, 0x43, + 0x49, 0x52, 0x48, 0xa4, 0x43, 0x42, 0x30, 0x38, + 0x14, 0x0d, 0x5f, 0x44, 0x49, 0x53, 0x00, 0x70, + 0x0a, 0x80, 0x50, 0x49, 0x52, 0x48, 0x14, 0x1b, + 0x5f, 0x53, 0x52, 0x53, 0x01, 0x8b, 0x68, 0x0a, + 0x01, 0x53, 0x49, 0x52, 0x48, 0x82, 0x53, 0x49, + 0x52, 0x48, 0x60, 0x70, 0x76, 0x60, 0x50, 0x49, + 0x52, 0x48, 0x5b, 0x82, 0x48, 0x07, 0x53, 0x49, + 0x4f, 0x5f, 0x08, 0x5f, 0x48, 0x49, 0x44, 0x0c, + 0x41, 0xd0, 0x0c, 0x02, 0x08, 0x5f, 0x43, 0x52, + 0x53, 0x11, 0x42, 0x06, 0x0a, 0x5e, 0x47, 0x01, + 0x60, 0x00, 0x60, 0x00, 0x01, 0x01, 0x47, 0x01, + 0x64, 0x00, 0x64, 0x00, 0x01, 0x01, 0x47, 0x01, + 0x20, 0x02, 0x20, 0x02, 0x01, 0x04, 0x47, 0x01, + 0x24, 0x02, 0x24, 0x02, 0x01, 0x04, 0x86, 0x09, + 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, + 0x00, 0x10, 0x47, 0x01, 0xd0, 0x04, 0xd0, 0x04, + 0x01, 0x02, 0x47, 0x01, 0x61, 0x00, 0x61, 0x00, + 0x01, 0x01, 0x47, 0x01, 0x00, 0x04, 0x00, 0x04, + 0x01, 0x08, 0x47, 0x01, 0xb2, 0x00, 0xb2, 0x00, + 0x01, 0x01, 0x47, 0x01, 0x84, 0x00, 0x84, 0x00, + 0x01, 0x01, 0x47, 0x01, 0x72, 0x00, 0x72, 0x00, + 0x01, 0x06, 0x79, 0x00, 0x5b, 0x82, 0x2c, 0x43, + 0x4f, 0x4d, 0x31, 0x08, 0x5f, 0x48, 0x49, 0x44, + 0x0c, 0x41, 0xd0, 0x05, 0x01, 0x08, 0x5f, 0x55, + 0x49, 0x44, 0x0a, 0x01, 0x08, 0x5f, 0x43, 0x52, + 0x53, 0x11, 0x10, 0x0a, 0x0d, 0x47, 0x01, 0xf8, + 0x03, 0xf8, 0x03, 0x01, 0x08, 0x22, 0x10, 0x00, + 0x79, 0x00, 0x5b, 0x82, 0x2c, 0x43, 0x4f, 0x4d, + 0x32, 0x08, 0x5f, 0x48, 0x49, 0x44, 0x0c, 0x41, + 0xd0, 0x05, 0x01, 0x08, 0x5f, 0x55, 0x49, 0x44, + 0x0a, 0x02, 0x08, 0x5f, 0x43, 0x52, 0x53, 0x11, + 0x10, 0x0a, 0x0d, 0x47, 0x01, 0xf8, 0x02, 0xf8, + 0x02, 0x01, 0x08, 0x22, 0x08, 0x00, 0x79, 0x00, + 0x5b, 0x82, 0x25, 0x52, 0x54, 0x43, 0x5f, 0x08, + 0x5f, 0x48, 0x49, 0x44, 0x0c, 0x41, 0xd0, 0x0b, + 0x00, 0x08, 0x5f, 0x43, 0x52, 0x53, 0x11, 0x10, + 0x0a, 0x0d, 0x47, 0x01, 0x70, 0x00, 0x70, 0x00, + 0x01, 0x02, 0x22, 0x00, 0x01, 0x79, 0x00, 0x5b, + 0x82, 0x2b, 0x50, 0x49, 0x43, 0x5f, 0x08, 0x5f, + 0x48, 0x49, 0x44, 0x0b, 0x41, 0xd0, 0x08, 0x5f, + 0x43, 0x52, 0x53, 0x11, 0x18, 0x0a, 0x15, 0x47, + 0x01, 0x20, 0x00, 0x20, 0x00, 0x01, 0x02, 0x47, + 0x01, 0xa0, 0x00, 0xa0, 0x00, 0x01, 0x02, 0x22, + 0x04, 0x00, 0x79, 0x00, 0x5b, 0x82, 0x25, 0x54, + 0x49, 0x4d, 0x52, 0x08, 0x5f, 0x48, 0x49, 0x44, + 0x0c, 0x41, 0xd0, 0x01, 0x00, 0x08, 0x5f, 0x43, + 0x52, 0x53, 0x11, 0x10, 0x0a, 0x0d, 0x47, 0x01, + 0x40, 0x00, 0x40, 0x00, 0x01, 0x04, 0x22, 0x01, + 0x00, 0x79, 0x00, 0x10, 0x39, 0x2e, 0x5f, 0x53, + 0x42, 0x5f, 0x50, 0x43, 0x30, 0x30, 0x5b, 0x82, + 0x2d, 0x48, 0x50, 0x45, 0x54, 0x08, 0x5f, 0x48, + 0x49, 0x44, 0x0c, 0x41, 0xd0, 0x01, 0x03, 0x08, + 0x5f, 0x55, 0x49, 0x44, 0x0a, 0x00, 0x08, 0x5f, + 0x43, 0x52, 0x53, 0x11, 0x11, 0x0a, 0x0e, 0x86, + 0x09, 0x00, 0x01, 0x00, 0x00, 0xd0, 0xfe, 0x00, + 0x04, 0x00, 0x00, 0x79 + }; + + dsdt = (void *) (((uintptr_t) tb) + DSDT_OFFSET); + /* copy DSDT template to guest memory */ + memcpy(dsdt, dsdt_tmpl, 2604); + + pci_write_dsdt(); + + /* write checksum */ + acpitbl_write8(dsdt, 0x9, acpitbl_checksum(dsdt, 2604)); +} + +int +acpi_build(int ncpu) +{ + int err; + + acpi_ncpu = ncpu; + tb = paddr_guest2host(XHYVE_ACPI_BASE, XHYVE_ACPI_SIZE); + if (tb == NULL) { + return (EFAULT); + } + + err = xh_vm_get_hpet_capabilities(&hpet_capabilities); + if (err != 0) { + return (err); + } + + acpitbl_build_rdsp(); + acpitbl_build_rsdt(); + acpitbl_build_xsdt(); + acpitbl_build_madt(); + acpitbl_build_fadt(); + acpitbl_build_hpet(); + acpitbl_build_mcfg(); + acpitbl_build_facs(); + acpitbl_build_dsdt(); + + return 0; +} diff --git a/src/dsdt.asl b/src/dsdt.asl new file mode 100644 index 0000000..387951d --- /dev/null +++ b/src/dsdt.asl @@ -0,0 +1,841 @@ +/* + * bhyve DSDT template + */ +DefinitionBlock ("bhyve_dsdt.aml", "DSDT", 2,"BHYVE ", "BVDSDT ", 0x00000001) +{ + Name (_S5, Package () + { + 0x05, + Zero, + }) + Name (PICM, 0x00) + Method (_PIC, 1, NotSerialized) + { + Store (Arg0, PICM) + } + + Scope (_SB) + { + Device (PC00) + { + Name (_HID, EisaId ("PNP0A03")) + Name (_ADR, Zero) + Method (_BBN, 0, NotSerialized) + { + Return (0x00000000) + } + Name (_CRS, ResourceTemplate () + { + WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode, + 0x0000, // Granularity + 0x0000, // Range Minimum + 0x0000, // Range Maximum + 0x0000, // Translation Offset + 0x0001, // Length + ,, ) + IO (Decode16, + 0x0CF8, // Range Minimum + 0x0CF8, // Range Maximum + 0x01, // Alignment + 0x08, // Length + ) + WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, + 0x0000, // Granularity + 0x0000, // Range Minimum + 0x0CF7, // Range Maximum + 0x0000, // Translation Offset + 0x0CF8, // Length + ,, , TypeStatic) + WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, + 0x0000, // Granularity + 0x0D00, // Range Minimum + 0x1FFF, // Range Maximum + 0x0000, // Translation Offset + 0x1300, // Length + ,, , TypeStatic) + WordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, + 0x0000, // Granularity + 0x0000, // Range Minimum + 0x0000, // Range Maximum + 0x0000, // Translation Offset + 0x0020, // Length + ,, , TypeStatic) + DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite, + 0x00000000, // Granularity + 0x00000000, // Range Minimum + + 0x00000000, // Range Maximum + + 0x00000000, // Translation Offset + 0x00000000, // Length + + ,, , AddressRangeMemory, TypeStatic) + QWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite, + 0x0000000000000000, // Granularity + 0x0000000000000000, // Range Minimum + + 0x0000000000000000, // Range Maximum + + 0x0000000000000000, // Translation Offset + 0x0000000000000000, // Length + + ,, , AddressRangeMemory, TypeStatic) + }) + Name (PPRT, Package () + { + Package () + { + 0x1FFFF, + 0x00, + \_SB.PC00.ISA.LNKA,, + 0x00 + }, + Package () + { + 0x2FFFF, + 0x00, + \_SB.PC00.ISA.LNKB,, + 0x00 + }, + Package () + { + 0x3FFFF, + 0x00, + \_SB.PC00.ISA.LNKC,, + 0x00 + }, + Package () + { + 0x4FFFF, + 0x00, + \_SB.PC00.ISA.LNKD,, + 0x00 + }, + Package () + { + 0x5FFFF, + 0x00, + \_SB.PC00.ISA.LNKE,, + 0x00 + }, + Package () + { + 0x6FFFF, + 0x00, + \_SB.PC00.ISA.LNKF,, + 0x00 + }, + Package () + { + 0x7FFFF, + 0x00, + \_SB.PC00.ISA.LNKG,, + 0x00 + }, + Package () + { + 0x8FFFF, + 0x00, + \_SB.PC00.ISA.LNKH,, + 0x00 + }, + }) + Name (APRT, Package () + { + Package () + { + 0x1FFFF, + 0x00, + Zero, + 0x10 + }, + Package () + { + 0x2FFFF, + 0x00, + Zero, + 0x11 + }, + Package () + { + 0x3FFFF, + 0x00, + Zero, + 0x12 + }, + Package () + { + 0x4FFFF, + 0x00, + Zero, + 0x13 + }, + Package () + { + 0x5FFFF, + 0x00, + Zero, + 0x14 + }, + Package () + { + 0x6FFFF, + 0x00, + Zero, + 0x15 + }, + Package () + { + 0x7FFFF, + 0x00, + Zero, + 0x16 + }, + Package () + { + 0x8FFFF, + 0x00, + Zero, + 0x17 + }, + }) + Method (_PRT, 0, NotSerialized) + { + If (PICM) + { + Return (APRT) + } + Else + { + Return (PPRT) + } + } + + Device (ISA) + { + Name (_ADR, 0x001F0000) + OperationRegion (LPCR, PCI_Config, 0x00, 0x100) + Field (LPCR, AnyAcc, NoLock, Preserve) + { + Offset (0x60), + PIRA, 8, + PIRB, 8, + PIRC, 8, + PIRD, 8, + Offset (0x68), + PIRE, 8, + PIRF, 8, + PIRG, 8, + PIRH, 8 + } + + + Method (PIRV, 1, NotSerialized) + { + If (And (Arg0, 0x80)) + { + Return (0x00) + } + And (Arg0, 0x0F, Local0) + If (LLess (Local0, 0x03)) + { + Return (0x00) + } + If (LEqual (Local0, 0x08)) + { + Return (0x00) + } + If (LEqual (Local0, 0x0D)) + { + Return (0x00) + } + Return (0x01) + } + + Device (LNKA) + { + Name (_HID, EisaId ("PNP0C0F")) + Name (_UID, 0x01) + Method (_STA, 0, NotSerialized) + { + If (PIRV (PIRA)) + { + Return (0x0B) + } + Else + { + Return (0x09) + } + } + Name (_PRS, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {3,4,5,6,7,9,10,11,12,14,15} + }) + Name (CB01, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {} + }) + CreateWordField (CB01, 0x01, CIRA) + Method (_CRS, 0, NotSerialized) + { + And (PIRA, 0x8F, Local0) + If (PIRV (Local0)) + { + ShiftLeft (0x01, Local0, CIRA) + } + Else + { + Store (0x00, CIRA) + } + Return (CB01) + } + Method (_DIS, 0, NotSerialized) + { + Store (0x80, PIRA) + } + Method (_SRS, 1, NotSerialized) + { + CreateWordField (Arg0, 0x01, SIRA) + FindSetRightBit (SIRA, Local0) + Store (Decrement (Local0), PIRA) + } + } + + Device (LNKB) + { + Name (_HID, EisaId ("PNP0C0F")) + Name (_UID, 0x02) + Method (_STA, 0, NotSerialized) + { + If (PIRV (PIRB)) + { + Return (0x0B) + } + Else + { + Return (0x09) + } + } + Name (_PRS, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {3,4,5,6,7,9,10,11,12,14,15} + }) + Name (CB02, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {} + }) + CreateWordField (CB02, 0x01, CIRB) + Method (_CRS, 0, NotSerialized) + { + And (PIRB, 0x8F, Local0) + If (PIRV (Local0)) + { + ShiftLeft (0x01, Local0, CIRB) + } + Else + { + Store (0x00, CIRB) + } + Return (CB02) + } + Method (_DIS, 0, NotSerialized) + { + Store (0x80, PIRB) + } + Method (_SRS, 1, NotSerialized) + { + CreateWordField (Arg0, 0x01, SIRB) + FindSetRightBit (SIRB, Local0) + Store (Decrement (Local0), PIRB) + } + } + + Device (LNKC) + { + Name (_HID, EisaId ("PNP0C0F")) + Name (_UID, 0x03) + Method (_STA, 0, NotSerialized) + { + If (PIRV (PIRC)) + { + Return (0x0B) + } + Else + { + Return (0x09) + } + } + Name (_PRS, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {3,4,5,6,7,9,10,11,12,14,15} + }) + Name (CB03, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {} + }) + CreateWordField (CB03, 0x01, CIRC) + Method (_CRS, 0, NotSerialized) + { + And (PIRC, 0x8F, Local0) + If (PIRV (Local0)) + { + ShiftLeft (0x01, Local0, CIRC) + } + Else + { + Store (0x00, CIRC) + } + Return (CB03) + } + Method (_DIS, 0, NotSerialized) + { + Store (0x80, PIRC) + } + Method (_SRS, 1, NotSerialized) + { + CreateWordField (Arg0, 0x01, SIRC) + FindSetRightBit (SIRC, Local0) + Store (Decrement (Local0), PIRC) + } + } + + Device (LNKD) + { + Name (_HID, EisaId ("PNP0C0F")) + Name (_UID, 0x04) + Method (_STA, 0, NotSerialized) + { + If (PIRV (PIRD)) + { + Return (0x0B) + } + Else + { + Return (0x09) + } + } + Name (_PRS, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {3,4,5,6,7,9,10,11,12,14,15} + }) + Name (CB04, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {} + }) + CreateWordField (CB04, 0x01, CIRD) + Method (_CRS, 0, NotSerialized) + { + And (PIRD, 0x8F, Local0) + If (PIRV (Local0)) + { + ShiftLeft (0x01, Local0, CIRD) + } + Else + { + Store (0x00, CIRD) + } + Return (CB04) + } + Method (_DIS, 0, NotSerialized) + { + Store (0x80, PIRD) + } + Method (_SRS, 1, NotSerialized) + { + CreateWordField (Arg0, 0x01, SIRD) + FindSetRightBit (SIRD, Local0) + Store (Decrement (Local0), PIRD) + } + } + + Device (LNKE) + { + Name (_HID, EisaId ("PNP0C0F")) + Name (_UID, 0x05) + Method (_STA, 0, NotSerialized) + { + If (PIRV (PIRE)) + { + Return (0x0B) + } + Else + { + Return (0x09) + } + } + Name (_PRS, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {3,4,5,6,7,9,10,11,12,14,15} + }) + Name (CB05, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {} + }) + CreateWordField (CB05, 0x01, CIRE) + Method (_CRS, 0, NotSerialized) + { + And (PIRE, 0x8F, Local0) + If (PIRV (Local0)) + { + ShiftLeft (0x01, Local0, CIRE) + } + Else + { + Store (0x00, CIRE) + } + Return (CB05) + } + Method (_DIS, 0, NotSerialized) + { + Store (0x80, PIRE) + } + Method (_SRS, 1, NotSerialized) + { + CreateWordField (Arg0, 0x01, SIRE) + FindSetRightBit (SIRE, Local0) + Store (Decrement (Local0), PIRE) + } + } + + Device (LNKF) + { + Name (_HID, EisaId ("PNP0C0F")) + Name (_UID, 0x06) + Method (_STA, 0, NotSerialized) + { + If (PIRV (PIRF)) + { + Return (0x0B) + } + Else + { + Return (0x09) + } + } + Name (_PRS, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {3,4,5,6,7,9,10,11,12,14,15} + }) + Name (CB06, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {} + }) + CreateWordField (CB06, 0x01, CIRF) + Method (_CRS, 0, NotSerialized) + { + And (PIRF, 0x8F, Local0) + If (PIRV (Local0)) + { + ShiftLeft (0x01, Local0, CIRF) + } + Else + { + Store (0x00, CIRF) + } + Return (CB06) + } + Method (_DIS, 0, NotSerialized) + { + Store (0x80, PIRF) + } + Method (_SRS, 1, NotSerialized) + { + CreateWordField (Arg0, 0x01, SIRF) + FindSetRightBit (SIRF, Local0) + Store (Decrement (Local0), PIRF) + } + } + + Device (LNKG) + { + Name (_HID, EisaId ("PNP0C0F")) + Name (_UID, 0x07) + Method (_STA, 0, NotSerialized) + { + If (PIRV (PIRG)) + { + Return (0x0B) + } + Else + { + Return (0x09) + } + } + Name (_PRS, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {3,4,5,6,7,9,10,11,12,14,15} + }) + Name (CB07, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {} + }) + CreateWordField (CB07, 0x01, CIRG) + Method (_CRS, 0, NotSerialized) + { + And (PIRG, 0x8F, Local0) + If (PIRV (Local0)) + { + ShiftLeft (0x01, Local0, CIRG) + } + Else + { + Store (0x00, CIRG) + } + Return (CB07) + } + Method (_DIS, 0, NotSerialized) + { + Store (0x80, PIRG) + } + Method (_SRS, 1, NotSerialized) + { + CreateWordField (Arg0, 0x01, SIRG) + FindSetRightBit (SIRG, Local0) + Store (Decrement (Local0), PIRG) + } + } + + Device (LNKH) + { + Name (_HID, EisaId ("PNP0C0F")) + Name (_UID, 0x08) + Method (_STA, 0, NotSerialized) + { + If (PIRV (PIRH)) + { + Return (0x0B) + } + Else + { + Return (0x09) + } + } + Name (_PRS, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {3,4,5,6,7,9,10,11,12,14,15} + }) + Name (CB08, ResourceTemplate () + { + IRQ (Level, ActiveLow, Shared, ) + {} + }) + CreateWordField (CB08, 0x01, CIRH) + Method (_CRS, 0, NotSerialized) + { + And (PIRH, 0x8F, Local0) + If (PIRV (Local0)) + { + ShiftLeft (0x01, Local0, CIRH) + } + Else + { + Store (0x00, CIRH) + } + Return (CB08) + } + Method (_DIS, 0, NotSerialized) + { + Store (0x80, PIRH) + } + Method (_SRS, 1, NotSerialized) + { + CreateWordField (Arg0, 0x01, SIRH) + FindSetRightBit (SIRH, Local0) + Store (Decrement (Local0), PIRH) + } + } + + Device (SIO) + { + Name (_HID, EisaId ("PNP0C02")) + Name (_CRS, ResourceTemplate () + { + IO (Decode16, + 0x0060, // Range Minimum + 0x0060, // Range Maximum + 0x01, // Alignment + 0x01, // Length + ) + IO (Decode16, + 0x0064, // Range Minimum + 0x0064, // Range Maximum + 0x01, // Alignment + 0x01, // Length + ) + IO (Decode16, + 0x0220, // Range Minimum + 0x0220, // Range Maximum + 0x01, // Alignment + 0x04, // Length + ) + IO (Decode16, + 0x0224, // Range Minimum + 0x0224, // Range Maximum + 0x01, // Alignment + 0x04, // Length + ) + Memory32Fixed (ReadWrite, + 0xE0000000, // Address Base + 0x10000000, // Address Length + ) + IO (Decode16, + 0x04D0, // Range Minimum + 0x04D0, // Range Maximum + 0x01, // Alignment + 0x02, // Length + ) + IO (Decode16, + 0x0061, // Range Minimum + 0x0061, // Range Maximum + 0x01, // Alignment + 0x01, // Length + ) + IO (Decode16, + 0x0400, // Range Minimum + 0x0400, // Range Maximum + 0x01, // Alignment + 0x08, // Length + ) + IO (Decode16, + 0x00B2, // Range Minimum + 0x00B2, // Range Maximum + 0x01, // Alignment + 0x01, // Length + ) + IO (Decode16, + 0x0084, // Range Minimum + 0x0084, // Range Maximum + 0x01, // Alignment + 0x01, // Length + ) + IO (Decode16, + 0x0072, // Range Minimum + 0x0072, // Range Maximum + 0x01, // Alignment + 0x06, // Length + ) + }) + } + + Device (COM1) + { + Name (_HID, EisaId ("PNP0501")) + Name (_UID, 1) + Name (_CRS, ResourceTemplate () + { + IO (Decode16, + 0x03F8, // Range Minimum + 0x03F8, // Range Maximum + 0x01, // Alignment + 0x08, // Length + ) + IRQNoFlags () + {4} + }) + } + + Device (COM2) + { + Name (_HID, EisaId ("PNP0501")) + Name (_UID, 2) + Name (_CRS, ResourceTemplate () + { + IO (Decode16, + 0x02F8, // Range Minimum + 0x02F8, // Range Maximum + 0x01, // Alignment + 0x08, // Length + ) + IRQNoFlags () + {3} + }) + } + + Device (RTC) + { + Name (_HID, EisaId ("PNP0B00")) + Name (_CRS, ResourceTemplate () + { + IO (Decode16, + 0x0070, // Range Minimum + 0x0070, // Range Maximum + 0x01, // Alignment + 0x02, // Length + ) + IRQNoFlags () + {8} + }) + } + + Device (PIC) + { + Name (_HID, EisaId ("PNP0000")) + Name (_CRS, ResourceTemplate () + { + IO (Decode16, + 0x0020, // Range Minimum + 0x0020, // Range Maximum + 0x01, // Alignment + 0x02, // Length + ) + IO (Decode16, + 0x00A0, // Range Minimum + 0x00A0, // Range Maximum + 0x01, // Alignment + 0x02, // Length + ) + IRQNoFlags () + {2} + }) + } + + Device (TIMR) + { + Name (_HID, EisaId ("PNP0100")) + Name (_CRS, ResourceTemplate () + { + IO (Decode16, + 0x0040, // Range Minimum + 0x0040, // Range Maximum + 0x01, // Alignment + 0x04, // Length + ) + IRQNoFlags () + {0} + }) + } + } + } + } + + Scope (_SB.PC00) + { + Device (HPET) + { + Name (_HID, EISAID("PNP0103")) + Name (_UID, 0) + Name (_CRS, ResourceTemplate () + { + Memory32Fixed (ReadWrite, + 0xFED00000, // Address Base + 0x00000400, // Address Length + ) + }) + } + } +} diff --git a/src/firmware/fbsd.c b/src/firmware/fbsd.c new file mode 100644 index 0000000..6a2d2bc --- /dev/null +++ b/src/firmware/fbsd.c @@ -0,0 +1,1006 @@ +/*- + * Copyright (c) 2011 NetApp, Inc. + * Copyright (c) 2015 xhyve developers + * 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$ + */ + +/*- + * Copyright (c) 2011 Google, 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 THE AUTHOR 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 AUTHOR 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define I386_TSS_SIZE 104 + +#define DESC_PRESENT 0x00000080 +#define DESC_DEF32 0x00004000 +#define DESC_GRAN 0x00008000 +#define DESC_UNUSABLE 0x00010000 + +#define GUEST_CODE_SEL 1 +#define GUEST_DATA_SEL 2 +#define GUEST_TSS_SEL 3 +#define GUEST_GDTR_LIMIT64 (3 * 8 - 1) + +#define BSP 0 +#define NDISKS 32 + +static struct { + char *userboot; + char *bootvolume; + char *kernelenv; + char *cons; +} config; + +static char *host_base; +static struct termios term, oldterm; +static int disk_fd[NDISKS]; +static int ndisks; +static int consin_fd, consout_fd; +static jmp_buf exec_done; + +static uint64_t vcpu_gdt_base, vcpu_cr3, vcpu_rsp, vcpu_rip; + +typedef void (*func_t)(struct loader_callbacks *, void *, int, int); + +static void cb_exit(void); + +static struct segment_descriptor i386_gdt[] = { + { .sd_lolimit = 0, .sd_type = 0, /* NULL */ + .sd_p = 0, .sd_hilimit = 0, .sd_def32 = 0, .sd_gran = 0}, + + { .sd_lolimit = 0xffff, .sd_type = SDT_MEMER, /* CODE */ + .sd_p = 1, .sd_hilimit = 0xf, .sd_def32 = 1, .sd_gran = 1 }, + + { .sd_lolimit = 0xffff, .sd_type = SDT_MEMRW, /* DATA */ + .sd_p = 1, .sd_hilimit = 0xf, .sd_def32 = 1, .sd_gran = 1 }, + + { .sd_lolimit = I386_TSS_SIZE - 1, /* TSS */ + .sd_type = SDT_SYS386TSS, .sd_p = 1 } +}; + +static int +fbsd_set_regs_i386(uint32_t eip, uint32_t gdt_base, uint32_t esp) +{ + uint64_t cr0, rflags, desc_base; + uint32_t desc_access, desc_limit, tss_base; + uint16_t gsel; + struct segment_descriptor *gdt; + int error; + + cr0 = CR0_PE | CR0_NE; + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_CR0, cr0)) != 0) + goto done; + + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_CR4, 0)) != 0) + goto done; + + /* + * Forcing EFER to 0 causes bhyve to clear the "IA-32e guest + * mode" entry control. + */ + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_EFER, 0))) + goto done; + + gdt = xh_vm_map_gpa(gdt_base, 0x1000); + if (gdt == NULL) + return (EFAULT); + memcpy(gdt, i386_gdt, sizeof(i386_gdt)); + desc_base = gdt_base; + desc_limit = sizeof(i386_gdt) - 1; + error = xh_vm_set_desc(BSP, VM_REG_GUEST_GDTR, desc_base, desc_limit, 0); + if (error != 0) + goto done; + + /* Place the TSS one page above the GDT. */ + tss_base = gdt_base + 0x1000; + gdt[3].sd_lobase = tss_base; + + rflags = 0x2; + error = xh_vm_set_register(BSP, VM_REG_GUEST_RFLAGS, rflags); + if (error) + goto done; + + desc_base = 0; + desc_limit = 0xffffffff; + desc_access = DESC_GRAN | DESC_DEF32 | DESC_PRESENT | SDT_MEMERA; + error = xh_vm_set_desc(BSP, VM_REG_GUEST_CS, desc_base, desc_limit, + desc_access); + + desc_access = DESC_GRAN | DESC_DEF32 | DESC_PRESENT | SDT_MEMRWA; + error = xh_vm_set_desc(BSP, VM_REG_GUEST_DS, desc_base, desc_limit, + desc_access); + + if (error) + goto done; + + error = xh_vm_set_desc(BSP, VM_REG_GUEST_ES, desc_base, desc_limit, + desc_access); + + if (error) + goto done; + + error = xh_vm_set_desc(BSP, VM_REG_GUEST_FS, desc_base, desc_limit, + desc_access); + + if (error) + goto done; + + error = xh_vm_set_desc(BSP, VM_REG_GUEST_GS, desc_base, desc_limit, + desc_access); + + if (error) + goto done; + + error = xh_vm_set_desc(BSP, VM_REG_GUEST_SS, desc_base, desc_limit, + desc_access); + + if (error) + goto done; + + desc_base = tss_base; + desc_limit = I386_TSS_SIZE - 1; + desc_access = DESC_PRESENT | SDT_SYS386BSY; + error = xh_vm_set_desc(BSP, VM_REG_GUEST_TR, desc_base, desc_limit, + desc_access); + + if (error) + goto done; + + + error = xh_vm_set_desc(BSP, VM_REG_GUEST_LDTR, 0, 0, DESC_UNUSABLE); + if (error) + goto done; + + gsel = GSEL(GUEST_CODE_SEL, SEL_KPL); + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_CS, gsel)) != 0) + goto done; + + gsel = GSEL(GUEST_DATA_SEL, SEL_KPL); + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_DS, gsel)) != 0) + goto done; + + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_ES, gsel)) != 0) + goto done; + + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_FS, gsel)) != 0) + goto done; + + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_GS, gsel)) != 0) + goto done; + + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_SS, gsel)) != 0) + goto done; + + gsel = GSEL(GUEST_TSS_SEL, SEL_KPL); + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_TR, gsel)) != 0) + goto done; + + /* LDTR is pointing to the null selector */ + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_LDTR, 0)) != 0) + goto done; + + /* entry point */ + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_RIP, eip)) != 0) + goto done; + + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_RSP, esp)) != 0) + goto done; + + error = 0; +done: + return (error); +} + +static int +fbsd_set_regs(uint64_t rip, uint64_t cr3, uint64_t gdt_base, uint64_t rsp) +{ + int error; + uint64_t cr0, cr4, efer, rflags, desc_base; + uint32_t desc_access, desc_limit; + uint16_t gsel; + + cr0 = CR0_PE | CR0_PG | CR0_NE; + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_CR0, cr0)) != 0) + goto done; + + cr4 = CR4_PAE; + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_CR4, cr4)) != 0) + goto done; + + efer = EFER_LME | EFER_LMA; + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_EFER, efer))) + goto done; + + rflags = 0x2; + error = xh_vm_set_register(BSP, VM_REG_GUEST_RFLAGS, rflags); + if (error) + goto done; + + desc_base = 0; + desc_limit = 0; + desc_access = 0x0000209B; + error = xh_vm_set_desc(BSP, VM_REG_GUEST_CS, desc_base, desc_limit, + desc_access); + + if (error) + goto done; + + desc_access = 0x00000093; + error = xh_vm_set_desc(BSP, VM_REG_GUEST_DS, desc_base, desc_limit, + desc_access); + + if (error) + goto done; + + error = xh_vm_set_desc(BSP, VM_REG_GUEST_ES, desc_base, desc_limit, + desc_access); + + if (error) + goto done; + + error = xh_vm_set_desc(BSP, VM_REG_GUEST_FS, desc_base, desc_limit, + desc_access); + + if (error) + goto done; + + error = xh_vm_set_desc(BSP, VM_REG_GUEST_GS, desc_base, desc_limit, + desc_access); + + if (error) + goto done; + + error = xh_vm_set_desc(BSP, VM_REG_GUEST_SS, desc_base, desc_limit, + desc_access); + + if (error) + goto done; + + /* + * XXX TR is pointing to null selector even though we set the + * TSS segment to be usable with a base address and limit of 0. + */ + desc_access = 0x0000008b; + error = xh_vm_set_desc(BSP, VM_REG_GUEST_TR, 0, 0, desc_access); + if (error) + goto done; + + error = xh_vm_set_desc(BSP, VM_REG_GUEST_LDTR, 0, 0, DESC_UNUSABLE); + if (error) + goto done; + + gsel = GSEL(GUEST_CODE_SEL, SEL_KPL); + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_CS, gsel)) != 0) + goto done; + + gsel = GSEL(GUEST_DATA_SEL, SEL_KPL); + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_DS, gsel)) != 0) + goto done; + + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_ES, gsel)) != 0) + goto done; + + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_FS, gsel)) != 0) + goto done; + + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_GS, gsel)) != 0) + goto done; + + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_SS, gsel)) != 0) + goto done; + + /* XXX TR is pointing to the null selector */ + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_TR, 0)) != 0) + goto done; + + /* LDTR is pointing to the null selector */ + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_LDTR, 0)) != 0) + goto done; + + /* entry point */ + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_RIP, rip)) != 0) + goto done; + + /* page table base */ + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_CR3, cr3)) != 0) + goto done; + + desc_base = gdt_base; + desc_limit = GUEST_GDTR_LIMIT64; + error = xh_vm_set_desc(BSP, VM_REG_GUEST_GDTR, desc_base, desc_limit, 0); + if (error != 0) + goto done; + + if ((error = xh_vm_set_register(BSP, VM_REG_GUEST_RSP, rsp)) != 0) + goto done; + + error = 0; +done: + return (error); +} + +/* + * Console i/o callbacks + */ + +static void +cb_putc(UNUSED void *arg, int ch) +{ + char c = (char) ch; + + (void) write(consout_fd, &c, 1); +} + +static int +cb_getc(UNUSED void *arg) +{ + char c; + + if (read(consin_fd, &c, 1) == 1) + return (c); + return (-1); +} + +static int +cb_poll(UNUSED void *arg) +{ + int n; + + if (ioctl(consin_fd, FIONREAD, &n) >= 0) + return (n > 0); + return (0); +} + +/* + * Host filesystem i/o callbacks + */ + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpadded" +struct cb_file { + int cf_isdir; + size_t cf_size; + struct stat cf_stat; + union { + int fd; + DIR *dir; + } cf_u; +}; +#pragma clang diagnostic pop + +static int +cb_open(UNUSED void *arg, const char *filename, void **hp) +{ + struct stat st; + struct cb_file *cf; + char path[PATH_MAX]; + + if (!host_base) + return (ENOENT); + + strlcpy(path, host_base, PATH_MAX); + if (path[strlen(path) - 1] == '/') + path[strlen(path) - 1] = 0; + strlcat(path, filename, PATH_MAX); + cf = malloc(sizeof(struct cb_file)); + if (stat(path, &cf->cf_stat) < 0) { + free(cf); + return (errno); + } + + cf->cf_size = (size_t) st.st_size; + if (S_ISDIR(cf->cf_stat.st_mode)) { + cf->cf_isdir = 1; + cf->cf_u.dir = opendir(path); + if (!cf->cf_u.dir) + goto out; + *hp = cf; + return (0); + } + if (S_ISREG(cf->cf_stat.st_mode)) { + cf->cf_isdir = 0; + cf->cf_u.fd = open(path, O_RDONLY); + if (cf->cf_u.fd < 0) + goto out; + *hp = cf; + return (0); + } + +out: + free(cf); + return (EINVAL); +} + +// static int +// cb_close(UNUSED void *arg, void *h) +// { +// struct cb_file *cf = h; +// +// if (cf->cf_isdir) +// closedir(cf->cf_u.dir); +// else +// close(cf->cf_u.fd); +// free(cf); +// +// return (0); +// } + +// static int +// cb_isdir(UNUSED void *arg, void *h) +// { +// struct cb_file *cf = h; +// +// return (cf->cf_isdir); +// } + +// static int +// cb_read(UNUSED void *arg, void *h, void *buf, size_t size, size_t *resid) +// { +// struct cb_file *cf = h; +// ssize_t sz; +// +// if (cf->cf_isdir) +// return (EINVAL); +// sz = read(cf->cf_u.fd, buf, size); +// if (sz < 0) +// return (EINVAL); +// *resid = size - ((size_t) sz); +// return (0); +// } + +//static int +//cb_readdir(UNUSED void *arg, void *h, uint32_t *fileno_return, +// uint8_t *type_return, size_t *namelen_return, char *name) +//{ +// struct cb_file *cf = h; +// struct dirent *dp; +// +// if (!cf->cf_isdir) +// return (EINVAL); +// +// dp = readdir(cf->cf_u.dir); +// if (!dp) +// return (ENOENT); +// +// /* +// * Note: d_namlen is in the range 0..255 and therefore less +// * than PATH_MAX so we don't need to test before copying. +// */ +// *fileno_return = dp->d_fileno; +// *type_return = dp->d_type; +// *namelen_return = dp->d_namlen; +// memcpy(name, dp->d_name, dp->d_namlen); +// name[dp->d_namlen] = 0; +// +// return (0); +//} + +// static int +// cb_seek(UNUSED void *arg, void *h, uint64_t offset, int whence) +// { +// struct cb_file *cf = h; +// +// if (cf->cf_isdir) +// return (EINVAL); +// if (lseek(cf->cf_u.fd, ((off_t) offset), whence) < 0) +// return (errno); +// return (0); +// } + +// static int +// cb_stat(UNUSED void *arg, void *h, int *mode, int *uid, int *gid, +// uint64_t *size) +// { +// struct cb_file *cf = h; +// +// *mode = cf->cf_stat.st_mode; +// *uid = (int) cf->cf_stat.st_uid; +// *gid = (int) cf->cf_stat.st_gid; +// *size = (uint64_t) cf->cf_stat.st_size; +// return (0); +// } + +/* + * Disk image i/o callbacks + */ + +static int +cb_diskread(UNUSED void *arg, int unit, uint64_t from, void *to, size_t size, + size_t *resid) +{ + ssize_t n; + + if (unit < 0 || unit >= ndisks ) + return (EIO); + n = pread(disk_fd[unit], to, size, ((off_t) from)); + if (n < 0) + return (errno); + *resid = size - ((size_t) n); + return (0); +} + +#define DIOCGSECTORSIZE _IOR('d', 128, u_int) +#define DIOCGMEDIASIZE _IOR('d', 129, off_t) + +static int +cb_diskioctl(UNUSED void *arg, int unit, u_long cmd, void *data) +{ + struct stat sb; + + if (unit < 0 || unit >= ndisks) + return (EBADF); + + switch (cmd) { + case DIOCGSECTORSIZE: + *(u_int *)data = 512; + break; + case DIOCGMEDIASIZE: + if (fstat(disk_fd[unit], &sb) == 0) + *(off_t *)data = sb.st_size; + else + return (ENOTTY); + break; + default: + abort(); + return (ENOTTY); + } + + return (0); +} + +/* + * Guest virtual machine i/o callbacks + */ +static int +cb_copyin(UNUSED void *arg, const void *from, uint64_t to, size_t size) +{ + char *ptr; + + to &= 0x7fffffff; + + ptr = xh_vm_map_gpa(to, size); + if (ptr == NULL) + return (EFAULT); + + memcpy(ptr, from, size); + return (0); +} + +static int +cb_copyout(UNUSED void *arg, uint64_t from, void *to, size_t size) +{ + char *ptr; + + from &= 0x7fffffff; + + ptr = xh_vm_map_gpa(from, size); + if (ptr == NULL) + return (EFAULT); + + memcpy(to, ptr, size); + return (0); +} + +static void +cb_setreg(UNUSED void *arg, int r, uint64_t v) +{ + int error; + enum vm_reg_name vmreg; + + vmreg = VM_REG_LAST; + + switch (r) { + case 4: + vmreg = VM_REG_GUEST_RSP; + vcpu_rsp = v; + break; + default: + break; + } + + if (vmreg == VM_REG_LAST) { + abort(); + } + + error = xh_vm_set_register(BSP, vmreg, v); + if (error) { + perror("xh_vm_set_register"); + cb_exit(); + } +} + +static void +cb_setmsr(UNUSED void *arg, int r, uint64_t v) +{ + int error; + enum vm_reg_name vmreg; + + vmreg = VM_REG_LAST; + + switch (r) { + case MSR_EFER: + vmreg = VM_REG_GUEST_EFER; + break; + default: + break; + } + + if (vmreg == VM_REG_LAST) { + abort(); + } + + error = xh_vm_set_register(BSP, vmreg, v); + if (error) { + perror("xh_vm_set_msr"); + cb_exit(); + } +} + +static void +cb_setcr(UNUSED void *arg, int r, uint64_t v) +{ + int error; + enum vm_reg_name vmreg; + + vmreg = VM_REG_LAST; + + switch (r) { + case 0: + vmreg = VM_REG_GUEST_CR0; + break; + case 3: + vmreg = VM_REG_GUEST_CR3; + vcpu_cr3 = v; + break; + case 4: + vmreg = VM_REG_GUEST_CR4; + break; + default: + break; + } + + if (vmreg == VM_REG_LAST) { + fprintf(stderr, "test_setcr(%d): not implemented\n", r); + cb_exit(); + } + + error = xh_vm_set_register(BSP, vmreg, v); + if (error) { + perror("vm_set_cr"); + cb_exit(); + } +} + +static void +cb_setgdt(UNUSED void *arg, uint64_t base, size_t size) +{ + int error; + + error = xh_vm_set_desc(BSP, VM_REG_GUEST_GDTR, base, + ((uint32_t) (size - 1)), 0); + + if (error != 0) { + perror("vm_set_desc(gdt)"); + cb_exit(); + } + + vcpu_gdt_base = base; +} + +__attribute__ ((noreturn)) static void +cb_exec(UNUSED void *arg, uint64_t rip) +{ + int error; + + if (vcpu_cr3 == 0) { + error = fbsd_set_regs_i386(((uint32_t) rip), ((uint32_t) vcpu_gdt_base), + ((uint32_t) vcpu_rsp)); + } else { + error = fbsd_set_regs(rip, vcpu_cr3, vcpu_gdt_base, vcpu_rsp); + } + + if (error) { + perror("fbsd_set_regs"); + cb_exit(); + } + + vcpu_rip = rip; + + longjmp(exec_done, 1); +} + +/* + * Misc + */ + +static void +cb_delay(UNUSED void *arg, int usec) +{ + usleep((useconds_t) usec); +} + +__attribute__ ((noreturn)) static void +cb_exit(void) +{ + tcsetattr(consout_fd, TCSAFLUSH, &oldterm); + fprintf(stderr, "fbsd: error\n"); + exit(-1); +} + +static void +cb_getmem(UNUSED void *arg, uint64_t *ret_lowmem, uint64_t *ret_highmem) +{ + *ret_lowmem = xh_vm_get_lowmem_size(); + *ret_highmem = xh_vm_get_highmem_size(); +} + +struct env { + const char *str; /* name=value */ + SLIST_ENTRY(env) next; +}; + +static SLIST_HEAD(envhead, env) envhead; + +static void +addenv(const char *str) +{ + struct env *env; + + env = malloc(sizeof(struct env)); + env->str = str; + SLIST_INSERT_HEAD(&envhead, env, next); +} + +static const char * +cb_getenv(UNUSED void *arg, int num) +{ + int i; + struct env *env; + + i = 0; + SLIST_FOREACH(env, &envhead, next) { + if (i == num) + return (env->str); + i++; + } + + return (NULL); +} + +static struct loader_callbacks cb = { + .getc = cb_getc, + .putc = cb_putc, + .poll = cb_poll, + + // .open = cb_open, + // .close = cb_close, + // .isdir = cb_isdir, + // .read = cb_read, + // .readdir = cb_readdir, + // .seek = cb_seek, + // .stat = cb_stat, + + .open = cb_open, + .close = NULL, + .isdir = NULL, + .read = NULL, + .readdir = NULL, + .seek = NULL, + .stat = NULL, + + .diskread = cb_diskread, + .diskioctl = cb_diskioctl, + + .copyin = cb_copyin, + .copyout = cb_copyout, + .setreg = cb_setreg, + .setmsr = cb_setmsr, + .setcr = cb_setcr, + .setgdt = cb_setgdt, + .exec = cb_exec, + + .delay = cb_delay, + .exit = cb_exit, + .getmem = cb_getmem, + + .getenv = cb_getenv, +}; + +static int +altcons_open(char *path) +{ + struct stat sb; + int err; + int fd; + + /* + * Allow stdio to be passed in so that the same string + * can be used for the bhyveload console and bhyve com-port + * parameters + */ + if (!strcmp(path, "stdio")) + return (0); + + err = stat(path, &sb); + if (err == 0) { + if (!S_ISCHR(sb.st_mode)) + err = ENOTSUP; + else { + fd = open(path, O_RDWR | O_NONBLOCK); + if (fd < 0) + err = errno; + else + consin_fd = consout_fd = fd; + } + } + + return (err); +} + +static int +disk_open(char *path) +{ + int err, fd; + + if (ndisks >= NDISKS) + return (ERANGE); + + err = 0; + fd = open(path, O_RDONLY); + + if (fd > 0) { + disk_fd[ndisks] = fd; + ndisks++; + } else + err = errno; + + return (err); +} + +void +fbsd_init(char *userboot_path, char *bootvolume_path, char *kernelenv, + char *cons) +{ + config.userboot = userboot_path; + config.bootvolume = bootvolume_path; + config.kernelenv = kernelenv; + config.cons = cons; +} + +uint64_t +fbsd_load(void) +{ + void *h; + int i; + func_t func; + + host_base = NULL; + consin_fd = STDIN_FILENO; + consout_fd = STDOUT_FILENO; + + if (config.cons) { + altcons_open(config.cons); + } + + if (config.bootvolume) { + disk_open(config.bootvolume); + } else { + fprintf(stderr, "fbsd: no boot volume\n"); + exit(-1); + } + + if (config.kernelenv) { + addenv(config.kernelenv); + } + + //host_base = optarg h + + tcgetattr(consout_fd, &term); + oldterm = term; + cfmakeraw(&term); + term.c_cflag |= CLOCAL; + + tcsetattr(consout_fd, TCSAFLUSH, &term); + + h = dlopen(config.userboot, RTLD_LOCAL); + if (!h) { + fprintf(stderr, "%s\n", dlerror()); + exit(-1); + } + + func = (func_t) dlsym(h, "loader_main"); + if (!func) { + fprintf(stderr, "%s\n", dlerror()); + exit(-1); + } + + addenv("smbios.bios.vendor=BHYVE"); + addenv("boot_serial=1"); + + if (!setjmp(exec_done)) { + func(&cb, NULL, USERBOOT_VERSION_3, ndisks); + } + + for (i = 0; i < ndisks; i++) { + close(disk_fd[i]); + } + + if (config.cons) { + assert(consin_fd == consout_fd); + close(consin_fd); + } + + return vcpu_rip; +} diff --git a/src/pci_emul.c b/src/pci_emul.c index 10a09f9..5b34694 100644 --- a/src/pci_emul.c +++ b/src/pci_emul.c @@ -1217,6 +1217,32 @@ pci_pirq_prt_entry(UNUSED int bus, int slot, int pin, int pirq_pin, * A bhyve virtual machine has a flat PCI hierarchy with a root port * corresponding to each PCI bus. */ +#if ACPITBL_AML +static void +pci_bus_write_dsdt(int bus) +{ + struct businfo *bi; + + /* + * If there are no devices on this 'bus' then just return. + */ + if ((bi = pci_businfo[bus]) == NULL) { + /* + * Bus 0 is special because it decodes the I/O ports used + * for PCI config space access even if there are no devices + * on it. + */ + if (bus != 0) + return; + } + + dsdt_fixup(bus, bi->iobase, bi->iolimit, bi->membase32, bi->memlimit32, + bi->membase64, bi->memlimit64); + + (void) pci_pirq_prt_entry; + (void) pci_apic_prt_entry; +} +#else static void pci_bus_write_dsdt(int bus) { @@ -1365,7 +1391,19 @@ pci_bus_write_dsdt(int bus) done: dsdt_line(" }"); } +#endif +#if ACPITBL_AML +void +pci_write_dsdt(void) +{ + int bus; + + for (bus = 0; bus < MAXBUSES; bus++) { + pci_bus_write_dsdt(bus); + } +} +#else void pci_write_dsdt(void) { @@ -1385,6 +1423,7 @@ pci_write_dsdt(void) dsdt_line("}"); dsdt_unindent(1); } +#endif int pci_bus_configured(int bus) diff --git a/src/xhyve.c b/src/xhyve.c index 0348219..79cd767 100644 --- a/src/xhyve.c +++ b/src/xhyve.c @@ -66,6 +66,7 @@ #include #include +#include #define GUEST_NIO_PORT 0x488 /* guest upcalls via i/o port */ @@ -116,6 +117,8 @@ static struct mt_vmm_info { } mt_vmm_info[VM_MAXCPU]; #pragma clang diagnostic pop +static uint64_t (*fw_func)(void); + __attribute__ ((noreturn)) static void usage(int code) { @@ -237,7 +240,7 @@ vcpu_thread(void *param) assert(error == 0); if (vcpu == BSP) { - rip_entry = kexec(); + rip_entry = fw_func(); } else { rip_entry = vmexit[vcpu].rip; spinup_ap_realmode(vcpu, &rip_entry); @@ -703,45 +706,57 @@ parse_memsize(const char *opt, size_t *ret_memsize) static int firmware_parse(const char *opt) { - char *fw, *kernel, *initrd, *cmdline, *cp; + char *fw, *opt1, *opt2, *opt3, *cp; fw = strdup(opt); - if (strncmp(fw, "kexec", strlen("kexec")) != 0) { - goto fail; - } - - if ((cp = strchr(fw, ',')) != NULL) { - *cp = '\0'; - kernel = cp + 1; + if (strncmp(fw, "kexec", strlen("kexec")) == 0) { + fw_func = kexec; + } else if (strncmp(fw, "fbsd", strlen("fbsd")) == 0) { + fw_func = fbsd_load; } else { goto fail; } - if ((cp = strchr(kernel, ',')) != NULL) { - *cp = '\0'; - initrd = cp + 1; + if ((cp = strchr(fw, ',')) != NULL) { + *cp = '\0'; + opt1 = cp + 1; + } else { + goto fail; + } + + if ((cp = strchr(opt1, ',')) != NULL) { + *cp = '\0'; + opt2 = cp + 1; + } else { + goto fail; + } + + if ((cp = strchr(opt2, ',')) != NULL) { + *cp = '\0'; + opt3 = cp + 1; + } else { + goto fail; + } + + opt2 = strlen(opt2) ? opt2 : NULL; + opt3 = strlen(opt3) ? opt3 : NULL; + + if (fw_func == kexec) { + kexec_init(opt1, opt2, opt3); + } else if (fw_func == fbsd_load) { + /* FIXME: let user set boot-loader serial device */ + fbsd_init(opt1, opt2, opt3, NULL); } else { goto fail; } - if ((cp = strchr(initrd, ',')) != NULL) { - *cp = '\0'; - cmdline = cp + 1; - } else { - goto fail; - } - - initrd = strlen(initrd) ? initrd : NULL; - cmdline = strlen(cmdline) ? cmdline : NULL; - - kexec_init(kernel, initrd, cmdline); - return 0; fail: fprintf(stderr, "Invalid firmare argument\n" - " -f kexec,'kernel','initrd','\"cmdline\"'\n"); + " -f kexec,'kernel','initrd','\"cmdline\"'\n" + " -f fbsd,'userboot','boot volume','\"kernel env\"'\n"); return -1; } @@ -908,7 +923,6 @@ main(int argc, char *argv[]) error = acpi_build(guest_ncpus); assert(error == 0); } - rip = 0; diff --git a/test/userboot.so b/test/userboot.so new file mode 100755 index 0000000000000000000000000000000000000000..75833f8ebc5feb1195d1f3aefbecaf20382c07d4 GIT binary patch literal 351852 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 uzr>obIiwUjNLjfDnyL~HD3~N(;%0b_uw|oU3 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%0A)VpVM>Y7LcsRrZM3-4f*eM%_{ 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�y0 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 KfCUg8?IfK>(pPZyp+yXm8%186W{noY7~llPD&C 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

|p@r=ACUlX#{)B~O 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 literal 0 HcmV?d00001 diff --git a/test/userboot.txt b/test/userboot.txt new file mode 100644 index 0000000..20aa597 --- /dev/null +++ b/test/userboot.txt @@ -0,0 +1,8 @@ +userboot.so is the FreeBSD user-mode bootloader + +So, this is a bit horrible but it works: + + - userboot is compiled on FreeBSD with '-target x86_64-apple-darwin14' CFLAGS + - same for the dependencies of userboot (stand, ficl, zfs) + - you have to use the MachO linker set header (include/xhyve/support/linker_set.h) + - the resulting object files are linked on OS X with 'clang -dead_strip -shared -o userboot.so *.o *.So' diff --git a/xhyverun.sh b/xhyverun.sh index 5d2e147..b9fb8f1 100755 --- a/xhyverun.sh +++ b/xhyverun.sh @@ -1,9 +1,15 @@ #!/bin/sh +# Linux KERNEL="test/vmlinuz" INITRD="test/initrd.gz" CMDLINE="earlyprintk=serial console=ttyS0 acpi=off" +# FreeBSD +#USERBOOT="test/userboot.so" +#BOOTVOLUME="/somepath/somefile.{img | iso}" +#KERNELENV="" + MEM="-m 1G" #SMP="-c 2" #NET="-s 2:0,virtio-net" @@ -13,4 +19,8 @@ PCI_DEV="-s 0:0,hostbridge -s 31,lpc" LPC_DEV="-l com1,stdio" #UUID="-U deadbeef-dead-dead-dead-deaddeafbeef" +# Linux build/xhyve $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD $UUID -f kexec,$KERNEL,$INITRD,"$CMDLINE" + +# FreeBSD +#build/xhyve -A $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD $UUID -f fbsd,$USERBOOT,$BOOTVOLUME,"$KERNELENV"