Skip to content

Instantly share code, notes, and snippets.

@syuu1228
Created July 28, 2012 09:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save syuu1228/3192604 to your computer and use it in GitHub Desktop.
Save syuu1228/3192604 to your computer and use it in GitHub Desktop.
bvtest
diff --git a/sys/conf/files.amd64 b/sys/conf/files.amd64
index 1769a17..b0c3f0f 100644
--- a/sys/conf/files.amd64
+++ b/sys/conf/files.amd64
@@ -454,6 +454,7 @@ contrib/x86emu/x86emu.c optional x86bios | atkbd | dpms | vesa
#
dev/bvm/bvm_console.c optional bvmconsole
dev/bvm/bvm_dbg.c optional bvmdebug
+dev/bvtest/bvtest.c optional bvtest
#
# x86 shared code between IA32, AMD64 and PC98 architectures
#
diff --git a/sys/dev/bvtest/bvtest.c b/sys/dev/bvtest/bvtest.c
new file mode 100644
index 0000000..e0a8392
--- /dev/null
+++ b/sys/dev/bvtest/bvtest.c
@@ -0,0 +1,119 @@
+/*-
+ * Copyright (c) 2007 Peter Wemm
+ * 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 <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/conf.h>
+#include <sys/fcntl.h>
+#include <sys/lock.h>
+#include <sys/proc.h>
+#include <sys/sx.h>
+#include <sys/uio.h>
+#include <sys/module.h>
+
+#define BVTEST_IO_PORT 0x230
+#define BVTEST_OFF_PORT 0x234
+#define BVTEST_LEN_PORT 0x238
+
+static d_open_t bvtest_open;
+static d_read_t bvtest_read;
+static d_write_t bvtest_write;
+
+static struct cdev *bvtest_dev;
+static struct sx bvtest_lock;
+
+static struct cdevsw bvtest_cdevsw = {
+ .d_version = D_VERSION,
+ .d_open = bvtest_open,
+ .d_read = bvtest_read,
+ .d_write = bvtest_write,
+ .d_name = "bvtest",
+};
+
+static int
+bvtest_open(struct cdev *dev __unused, int flags, int fmt __unused,
+ struct thread *td)
+{
+ int error = 0;
+
+ if (flags & FWRITE)
+ error = securelevel_gt(td->td_ucred, 0);
+
+ return (error);
+}
+
+static int
+bvtest_read(struct cdev *dev, struct uio *uio, int flags)
+{
+ int err = 0;
+ int len = inl(BVTEST_LEN_PORT);
+ char buf[len];
+ int amt = MIN(uio->uio_resid, (len - uio->uio_offset > 0) ?
+ len - uio->uio_offset : 0);
+
+ for (int i = 0; i < len; i++) {
+ outl(BVTEST_OFF_PORT, i);
+ buf[i] = inl(BVTEST_IO_PORT);
+ }
+
+ if ((err = uiomove(buf + uio->uio_offset, amt, uio)) != 0) {
+ uprintf("uiomove failed!\n");
+ }
+
+ return (err);
+}
+
+static int
+bvtest_write(struct cdev *dev, struct uio *uio, int flags)
+{
+ uio->uio_resid = 0;
+
+ return (0);
+}
+
+static int
+bvtest_modevent(module_t mod __unused, int type, void *data __unused)
+{
+ switch (type) {
+ case MOD_LOAD:
+ sx_init(&bvtest_lock, "bvtest");
+ bvtest_dev = make_dev(&bvtest_cdevsw, 0,
+ UID_ROOT, GID_KMEM, 0640, "bvtest");
+ break;
+ case MOD_UNLOAD:
+ case MOD_SHUTDOWN:
+ destroy_dev(bvtest_dev);
+ sx_destroy(&bvtest_lock);
+ break;
+ default:
+ return (EOPNOTSUPP);
+ }
+ return (0);
+}
+DEV_MODULE(bvtest, bvtest_modevent, NULL);
diff --git a/sys/modules/Makefile b/sys/modules/Makefile
index 8f4e948..8b28bf4 100644
--- a/sys/modules/Makefile
+++ b/sys/modules/Makefile
@@ -721,6 +721,7 @@ _wpifw= wpifw
.if ${MK_ZFS} != "no" || defined(ALL_MODULES)
_zfs= zfs
.endif
+_bvtest= bvtest
.endif
.if ${MACHINE_CPUARCH} == "arm"
diff --git a/usr.sbin/bhyve/Makefile b/usr.sbin/bhyve/Makefile
index b381b8c..2a80471 100644
--- a/usr.sbin/bhyve/Makefile
+++ b/usr.sbin/bhyve/Makefile
@@ -8,6 +8,7 @@ SRCS= atpic.c consport.c dbgport.c elcr.c fbsdrun.c inout.c
SRCS+= instruction_emul.c mevent.c
SRCS+= pci_emul.c pci_hostbridge.c pci_passthru.c pci_virtio_block.c
SRCS+= pci_virtio_net.c pci_uart.c pit_8254.c post.c rtc.c uart.c xmsr.c
+SRCS+= bvtest.c
NO_MAN=
diff --git a/usr.sbin/bhyve/bvtest.c b/usr.sbin/bhyve/bvtest.c
new file mode 100644
index 0000000..16880a1
--- /dev/null
+++ b/usr.sbin/bhyve/bvtest.c
@@ -0,0 +1,83 @@
+/*-
+ * Copyright (c) 2011 NetApp, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/select.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <termios.h>
+#include <unistd.h>
+#include <stdbool.h>
+#include <string.h>
+
+#include "inout.h"
+
+#define BVTEST_IO_PORT 0x230
+#define BVTEST_OFF_PORT 0x234
+#define BVTEST_LEN_PORT 0x238
+
+static const char *buf = "Hello from BHyVe\n";
+static int off = 0;
+
+static int
+bvtest_io_handler(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
+ uint32_t *eax, void *arg)
+{
+ if (!(in && bytes == 4))
+ return (-1);
+ *eax = buf[off];
+ return (0);
+}
+
+static int
+bvtest_off_handler(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
+ uint32_t *eax, void *arg)
+{
+ if (!(!in && bytes == 4))
+ return (-1);
+ off = *eax;
+ return (0);
+}
+
+static int
+bvtest_len_handler(struct vmctx *ctx, int vcpu, int in, int port, int bytes,
+ uint32_t *eax, void *arg)
+{
+ if (!(in && bytes == 4))
+ return (-1);
+ *eax = strlen(buf);
+ return (0);
+}
+
+INOUT_PORT(bvtest_io, BVTEST_IO_PORT, IOPORT_F_IN, bvtest_io_handler);
+INOUT_PORT(bvtest_off, BVTEST_OFF_PORT, IOPORT_F_OUT, bvtest_off_handler);
+INOUT_PORT(bvtest_len, BVTEST_LEN_PORT, IOPORT_F_IN, bvtest_len_handler);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment