From: Christopher Olsen <cwolsen@domainatlantic.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] FreeBSD Support
Date: Mon, 19 Feb 2007 22:26:45 -0500 [thread overview]
Message-ID: <200702192226.45410.cwolsen@domainatlantic.com> (raw)
In-Reply-To: <200702200241.26220.paul@codesourcery.com>
[-- Attachment #1: Type: text/plain, Size: 758 bytes --]
Ok FreeBSD Support round one..
Be gentle this is my first attempt at working with the rest of this
community..
Files it modifies and the reasons are as follows
configure - Adds HOST_FREEBSD type to alter included libraries FreeBSD does
not need -ltr
Makefile.target - Once again uses HOST_FREEBSD to avoid including -ltr
osdeps.c - FreeBSD does not have /dev/shm so it uses /tmp for kqemu_valloc
also sys/vfs.h is not part of freebsd stat information is part of
mount.h/param.h
vl.c - FreeBSD needs module if_tap for tap not default in kernel and fopen the
tap device with a workaround for FreeBSD related issues for incrementing the
tap device
-Christopher
--
Christopher Olsen
cwolsen@domainatlantic.com
Tel: 631-676-4877
Fax: 631-249-3036
[-- Attachment #2: qemu.freebsd.patch --]
[-- Type: text/x-diff, Size: 4093 bytes --]
--- configure Mon Feb 19 21:49:15 2007
+++ /home/reddawg/qemu-0.9.0/configure Mon Feb 19 21:00:11 2007
@@ -111,6 +111,7 @@
;;
FreeBSD)
bsd="yes"
+freebsd="yes"
oss="yes"
if [ "$cpu" = "i386" -o "$cpu" = "x86_64" ] ; then
kqemu="yes"
@@ -719,6 +720,10 @@
if test "$solaris" = "yes" ; then
echo "CONFIG_SOLARIS=yes" >> $config_mak
echo "#define HOST_SOLARIS $solarisrev" >> $config_h
+fi
+if test "$freebsd" = "yes" ; then
+ echo "CONFIG_FREEBSD=yes" >> $config_mak
+ echo "#define HOST_FREEBSD 1" >> $config_h
fi
if test "$gdbstub" = "yes" ; then
echo "CONFIG_GDBSTUB=yes" >> $config_mak
--- Makefile.target Mon Feb 19 21:49:15 2007
+++ /home/reddawg/qemu-0.9.0/Makefile.target Mon Feb 19 21:07:04 2007
@@ -440,7 +440,11 @@
ifndef CONFIG_DARWIN
ifndef CONFIG_WIN32
ifndef CONFIG_SOLARIS
+ifndef CONFIG_FREEBSD
VL_LIBS=-lutil -lrt
+else
+VL_LIBS=-lutil
+endif
endif
endif
endif
--- osdep.c Mon Feb 19 22:01:46 2007
+++ /home/reddawg/qemu-0.9.0/osdep.c Mon Feb 19 21:40:45 2007
@@ -79,7 +79,12 @@
#if defined(USE_KQEMU)
+#ifdef HOST_FREEBSD
+#include <sys/param.h>
+#include <sys/mount.h>
+#else
#include <sys/vfs.h>
+#endif
#include <sys/mman.h>
#include <fcntl.h>
@@ -102,6 +107,9 @@
#ifdef HOST_SOLARIS
tmpdir = "/tmp";
if (statvfs(tmpdir, &stfs) == 0) {
+#elif HOST_FREEBSD
+ tmpdir = "/tmp";
+ if (statfs(tmpdir, &stfs) == 0) {
#else
tmpdir = "/dev/shm";
if (statfs(tmpdir, &stfs) == 0) {
--- vl.c Mon Feb 19 22:01:46 2007
+++ /home/reddawg/qemu-0.9.0/vl.c Mon Feb 19 22:10:06 2007
@@ -47,6 +47,9 @@
#ifndef __APPLE__
#include <libutil.h>
#endif
+#ifdef HOST_FREEBSD
+#include <sys/module.h>
+#endif
#else
#ifndef __sun__
#include <linux/if.h>
@@ -3171,6 +3174,34 @@
#endif /* CONFIG_SLIRP */
+#ifdef HOST_FREEBSD
+
+#define LOAD_QUIETLY 1
+#define LOAD_VERBOSLY 2
+
+/* This function is used to load needed kernel modules for tap */
+int loadmodules(int how, const char *module, ...) {
+ int loaded = 0;
+ va_list ap;
+
+ va_start(ap, module);
+#ifndef NO_MODULES
+ while (module != NULL) {
+ if (modfind(module) == -1) {
+ if (kldload(module) == -1) {
+ if (how == LOAD_VERBOSLY)
+ fprintf(stderr, "%s: Cannot load module\n", module);
+ } else
+ loaded++;
+ }
+ module = va_arg(ap, const char *);
+ }
+ va_end(ap);
+#endif
+ return loaded;
+}
+#endif
+
#if !defined(_WIN32)
typedef struct TAPState {
@@ -3226,11 +3257,55 @@
char *dev;
struct stat s;
+#ifdef HOST_FREEBSD
+ int i, kldtried = 0, enoentcount = 0, err = 0;
+ char dname[100];
+#ifdef USE_DEVTAP
+ /*
+ * 5.x has /dev/tap, but that seems to just blindly increase its
+ * couter on every open() for some people(??), i.e. on every qemu run.
+ */
+ i = -1;
+#else
+ i = 0;
+#endif
+ for (; i < 10; i++) {
+ if (i == -1)
+ strcpy(dname, "/dev/tap");
+ else
+ snprintf(dname, sizeof dname, "%s%d",
+ "/dev/tap", i);
+ fd = open(dname, O_RDWR);
+ if (fd >= 0)
+ break;
+ else if (errno == ENXIO || errno == ENOENT) {
+ if (i == 0 && !kldtried++) {
+ /*
+ * Attempt to load the tunnel interface KLD if it isn't loaded
+ * already.
+ */
+ if (loadmodules(LOAD_VERBOSLY, "if_tap", NULL))
+ i = -1;
+ continue;
+ }
+ if (errno != ENOENT || ++enoentcount > 3) {
+ err = errno;
+ break;
+ }
+ } else
+ err = errno;
+ }
+ if (fd < 0) {
+ fprintf(stderr, "warning: could not open %s (%s): no virtual network emulation\n", dname, strerror(err));
+ return -1;
+ }
+#else
fd = open("/dev/tap", O_RDWR);
if (fd < 0) {
fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
return -1;
}
+#endif
fstat(fd, &s);
dev = devname(s.st_rdev, S_IFCHR);
next prev parent reply other threads:[~2007-02-20 3:27 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-02-16 19:02 [Qemu-devel] QEMU: VNC Christopher Olsen
2007-02-16 20:57 ` Anthony Liguori
2007-02-18 20:36 ` Christopher Olsen
2007-02-18 23:08 ` Anthony Liguori
2007-02-18 23:53 ` Christopher Olsen
2007-02-19 0:14 ` Johannes Schindelin
2007-02-19 0:30 ` Christopher Olsen
2007-02-19 0:41 ` Johannes Schindelin
2007-02-19 2:01 ` Anthony Liguori
2007-02-19 2:11 ` Johannes Schindelin
2007-02-19 2:48 ` Anthony Liguori
2007-02-19 12:19 ` Christopher Olsen
2007-02-19 14:53 ` Johannes Schindelin
2007-02-19 17:16 ` Christopher Olsen
2007-02-19 17:30 ` Daniel P. Berrange
2007-02-19 17:41 ` Christopher Olsen
2007-02-19 19:09 ` Daniel P. Berrange
2007-02-19 19:29 ` Christopher Olsen
2007-02-19 22:52 ` Fabrice Bellard
2007-02-19 23:37 ` Christopher Olsen
2007-02-20 0:36 ` Daniel P. Berrange
2007-02-20 0:45 ` Anthony Liguori
2007-02-20 0:53 ` Christopher Olsen
2007-02-20 1:05 ` Daniel P. Berrange
2007-02-20 1:11 ` Johannes Schindelin
2007-02-20 1:18 ` Christopher Olsen
2007-02-20 19:46 ` Joe Batt
2007-02-20 1:15 ` [Qemu-devel] FreeBSD Support Christopher Olsen
2007-02-20 1:46 ` Paul Brook
2007-02-20 2:10 ` Christopher Olsen
2007-02-20 2:41 ` Paul Brook
2007-02-20 3:26 ` Christopher Olsen [this message]
2007-02-24 19:08 ` Juergen Lock
2007-02-24 20:54 ` Leonardo Reiter
2007-02-26 0:12 ` andrzej zaborowski
2007-03-03 22:12 ` Thiemo Seufer
2007-03-05 7:38 ` andrzej zaborowski
2007-02-19 23:58 ` [Qemu-devel] QEMU: VNC Johannes Schindelin
2007-02-19 0:11 ` Johannes Schindelin
2007-02-19 0:25 ` Christopher Olsen
-- strict thread matches above, loose matches on Subject: below --
2007-02-20 2:08 [Qemu-devel] FreeBSD Support Ben Taylor
2007-02-20 2:15 ` Christopher Olsen
2007-02-20 5:14 ` M. Warner Losh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200702192226.45410.cwolsen@domainatlantic.com \
--to=cwolsen@domainatlantic.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).