From f15f5629368bc3b043d8dfbe6b60d8261e97874d Mon Sep 17 00:00:00 2001 From: grehan Date: Sat, 14 May 2011 18:37:24 +0000 Subject: bhyve import part 2 of 2, guest kernel changes. This branch is now considered frozen: future bhyve development will take place in a branch off -CURRENT. sys/dev/bvm/bvm_console.c sys/dev/bvm/bvm_dbg.c - simple console driver/gdb debug port used for bringup. supported by user-space bhyve executable sys/conf/options.amd64 sys/amd64/amd64/minidump_machdep.c - allow NKPT to be set in the kernel config file sys/amd64/conf/GENERIC - mptable config options; bhyve user-space executable creates an mptable with number of CPUs, and optional vendor extension - add bvm console/debug - set NKPT to 512 to allow loading of large RAM disks from the loader - include kdb/gdb sys/amd64/amd64/local_apic.c sys/amd64/amd64/apic_vector.S sys/amd64/include/specialreg.h - if x2apic mode available, use MSRs to access the local APIC, otherwise fall back to 'classic' MMIO mode sys/amd64/amd64/mp_machdep.c - support AP spinup on CPU models that don't have real-mode support by overwriting the real-mode page with a message that supplies the bhyve user-space executable with enough information to start the AP directly in 64-bit mode. sys/amd64/amd64/vm_machdep.c - insert pause statements into cpu shutdown busy-wait loops sys/dev/blackhole/blackhole.c sys/modules/blackhole/Makefile - boot-time loadable module that claims all PCI bus/slot/funcs specified in an env var that are to be used for PCI passthrough sys/amd64/amd64/intr_machdep.c - allow round-robin assignment of device interrupts to CPUs to be disabled from the loader sys/amd64/include/bus.h - convert string ins/outs instructions to loops of individual in/out since bhyve doesn't support these yet sys/kern/subr_bus.c - if the device was no created with a fixed devclass, then remove it's association with the devclass it was associated with during probe. Otherwise, new drivers do not get a chance to probe/attach since the device will stay married to the first driver that it probed successfully but failed to attach. Sponsored by: NetApp, Inc. --- sys/dev/bvm/bvm_console.c | 242 ++++++++++++++++++++++++++++++++++++++++++++++ sys/dev/bvm/bvm_dbg.c | 90 +++++++++++++++++ 2 files changed, 332 insertions(+) create mode 100644 sys/dev/bvm/bvm_console.c create mode 100644 sys/dev/bvm/bvm_dbg.c (limited to 'sys/dev/bvm') diff --git a/sys/dev/bvm/bvm_console.c b/sys/dev/bvm/bvm_console.c new file mode 100644 index 0000000..ac12b6f --- /dev/null +++ b/sys/dev/bvm/bvm_console.c @@ -0,0 +1,242 @@ +/*- + * Copyright (c) 2011 NetApp, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_comconsole.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#ifndef BVMCONS_POLL_HZ +#define BVMCONS_POLL_HZ 4 +#endif +#define BVMBURSTLEN 16 /* max number of bytes to write in one chunk */ + +static tsw_open_t bvm_tty_open; +static tsw_close_t bvm_tty_close; +static tsw_outwakeup_t bvm_tty_outwakeup; + +static struct ttydevsw bvm_ttydevsw = { + .tsw_flags = TF_NOPREFIX, + .tsw_open = bvm_tty_open, + .tsw_close = bvm_tty_close, + .tsw_outwakeup = bvm_tty_outwakeup, +}; + +static int polltime; +static struct callout_handle bvm_timeouthandle + = CALLOUT_HANDLE_INITIALIZER(&bvm_timeouthandle); + +#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) +static int alt_break_state; +#endif + +#define BVM_CONS_PORT 0x220 +static int bvm_cons_port = BVM_CONS_PORT; + +static void bvm_timeout(void *); + +static cn_probe_t bvm_cnprobe; +static cn_init_t bvm_cninit; +static cn_term_t bvm_cnterm; +static cn_getc_t bvm_cngetc; +static cn_putc_t bvm_cnputc; + +CONSOLE_DRIVER(bvm); + +static int +bvm_rcons(u_char *ch) +{ + int c; + + c = inl(bvm_cons_port); + if (c != -1) { + *ch = (u_char)c; + return (0); + } else + return (-1); +} + +static void +bvm_wcons(u_char ch) +{ + + outl(bvm_cons_port, ch); +} + +static void +cn_drvinit(void *unused) +{ + struct tty *tp; + + if (bvm_consdev.cn_pri != CN_DEAD && + bvm_consdev.cn_name[0] != '\0') { + tp = tty_alloc(&bvm_ttydevsw, NULL); + tty_makedev(tp, NULL, "bvmcons"); + } +} + +static int +bvm_tty_open(struct tty *tp) +{ + polltime = hz / BVMCONS_POLL_HZ; + if (polltime < 1) + polltime = 1; + bvm_timeouthandle = timeout(bvm_timeout, tp, polltime); + + return (0); +} + +static void +bvm_tty_close(struct tty *tp) +{ + + /* XXX Should be replaced with callout_stop(9) */ + untimeout(bvm_timeout, tp, bvm_timeouthandle); +} + +static void +bvm_tty_outwakeup(struct tty *tp) +{ + int len, written; + u_char buf[BVMBURSTLEN]; + + for (;;) { + len = ttydisc_getc(tp, buf, sizeof(buf)); + if (len == 0) + break; + + written = 0; + while (written < len) + bvm_wcons(buf[written++]); + } +} + +static void +bvm_timeout(void *v) +{ + struct tty *tp; + int c; + + tp = (struct tty *)v; + + tty_lock(tp); + while ((c = bvm_cngetc(NULL)) != -1) + ttydisc_rint(tp, c, 0); + ttydisc_rint_done(tp); + tty_unlock(tp); + + bvm_timeouthandle = timeout(bvm_timeout, tp, polltime); +} + +static void +bvm_cnprobe(struct consdev *cp) +{ + int disabled, port; + + disabled = 0; + resource_int_value("bvmconsole", 0, "disabled", &disabled); + if (disabled) + cp->cn_pri = CN_DEAD; + else + cp->cn_pri = CN_NORMAL; + + if (resource_int_value("bvmconsole", 0, "port", &port) == 0) + bvm_cons_port = port; +} + +static void +bvm_cninit(struct consdev *cp) +{ + int i; + const char *bootmsg = "Using bvm console.\n"; + + if (boothowto & RB_VERBOSE) { + for (i = 0; i < strlen(bootmsg); i++) + bvm_cnputc(cp, bootmsg[i]); + } + + strcpy(cp->cn_name, "bvmcons"); +} + +static void +bvm_cnterm(struct consdev *cp) +{ + +} + +static int +bvm_cngetc(struct consdev *cp) +{ + unsigned char ch; + + if (bvm_rcons(&ch) == 0) { +#if defined(KDB) && defined(ALT_BREAK_TO_DEBUGGER) + int kdb_brk; + + if ((kdb_brk = kdb_alt_break(ch, &alt_break_state)) != 0) { + switch (kdb_brk) { + case KDB_REQ_DEBUGGER: + kdb_enter(KDB_WHY_BREAK, + "Break sequence on console"); + break; + case KDB_REQ_PANIC: + kdb_panic("Panic sequence on console"); + break; + case KDB_REQ_REBOOT: + kdb_reboot(); + break; + + } + } +#endif + return (ch); + } + + return (-1); +} + +static void +bvm_cnputc(struct consdev *cp, int c) +{ + + bvm_wcons(c); +} + +SYSINIT(cndev, SI_SUB_CONFIGURE, SI_ORDER_MIDDLE, cn_drvinit, NULL); diff --git a/sys/dev/bvm/bvm_dbg.c b/sys/dev/bvm/bvm_dbg.c new file mode 100644 index 0000000..67f533e --- /dev/null +++ b/sys/dev/bvm/bvm_dbg.c @@ -0,0 +1,90 @@ +/*- + * Copyright (c) 2011 NetApp, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +#include + +#include + +static gdb_probe_f bvm_dbg_probe; +static gdb_init_f bvm_dbg_init; +static gdb_term_f bvm_dbg_term; +static gdb_getc_f bvm_dbg_getc; +static gdb_putc_f bvm_dbg_putc; + +GDB_DBGPORT(bvm, bvm_dbg_probe, bvm_dbg_init, bvm_dbg_term, + bvm_dbg_getc, bvm_dbg_putc); + +#define BVM_DBG_PORT 0x224 +static int bvm_dbg_port = BVM_DBG_PORT; + +static int +bvm_dbg_probe(void) +{ + int disabled, port; + + disabled = 0; + resource_int_value("bvmdbg", 0, "disabled", &disabled); + if (disabled) + return (-1); + + if (resource_int_value("bvmdbg", 0, "port", &port) == 0) + bvm_dbg_port = port; + + return (0); +} + +static void +bvm_dbg_init(void) +{ +} + +static void +bvm_dbg_term(void) +{ +} + +static void +bvm_dbg_putc(int c) +{ + + outl(bvm_dbg_port, c); +} + +static int +bvm_dbg_getc(void) +{ + + return (inl(bvm_dbg_port)); +} -- cgit v1.1