bsd port (Markus Niemisto)
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Wed, 12 May 2004 19:32:15 +0000 (19:32 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Wed, 12 May 2004 19:32:15 +0000 (19:32 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@800 c046a42c-6fe2-441c-8c8c-71466251a162

Makefile
configure
dyngen-exec.h
gdbstub.c
target-i386/cpu.h
target-i386/exec.h
target-i386/op.c
vl.c
vl.h

index 7645c0857d4e21b808047d3390308db5309d3205..0f64aae5a3c9ee83c699223696e2f0245eebfb91 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,7 @@ endif
 
 all: dyngen$(EXESUF) $(TOOLS) qemu-doc.html qemu-tech.html qemu.1
        for d in $(TARGET_DIRS); do \
-       make -C $$d $@ || exit 1 ; \
+       $(MAKE) -C $$d $@ || exit 1 ; \
         done
 
 qemu-mkcow: qemu-mkcow.c
@@ -29,9 +29,9 @@ clean:
 # avoid old build problems by removing potentially incorrect old files
        rm -f config.mak config.h op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h 
        rm -f *.o *.a $(TOOLS) dyngen$(EXESUF) TAGS qemu.pod
-       make -C tests clean
+       $(MAKE) -C tests clean
        for d in $(TARGET_DIRS); do \
-       make -C $$d $@ || exit 1 ; \
+       $(MAKE) -C $$d $@ || exit 1 ; \
         done
 
 distclean: clean
@@ -55,12 +55,12 @@ ifndef CONFIG_WIN32
        install qemu.1 qemu-mkcow.1 "$(mandir)/man1"
 endif
        for d in $(TARGET_DIRS); do \
-       make -C $$d $@ || exit 1 ; \
+       $(MAKE) -C $$d $@ || exit 1 ; \
         done
 
 # various test targets
 test speed test2: all
-       make -C tests $@
+       $(MAKE) -C tests $@
 
 TAGS: 
        etags *.[ch] tests/*.[ch]
index 765b23428f309c0d1a38a4fbf9fccd913e132a6d..055f50ee934c3f5670a3b9965cdbb0731a34d1e1 100755 (executable)
--- a/configure
+++ b/configure
@@ -79,9 +79,23 @@ case $targetos in
 MINGW32*)
 mingw32="yes"
 ;;
+FreeBSD)
+bsd="yes"
+;;
+NetBSD)
+bsd="yes"
+;;
+OpenBSD)
+bsd="yes"
+;;
 *) ;;
 esac
 
+if [ "$bsd" = "yes" ] ; then
+  make="gmake"
+  target_list="i386-softmmu"
+fi
+
 # find source path
 # XXX: we assume an absolute path is given when launching configure, 
 # except in './configure' case.
@@ -373,7 +387,7 @@ fi
 if test "$mingw32" = "yes" ; then
   echo "CONFIG_WIN32=yes" >> $config_mak
   echo "#define CONFIG_WIN32 1" >> $config_h
-else
+elif test -f "/usr/include/byteswap.h" ; then
   echo "#define HAVE_BYTESWAP_H 1" >> $config_h
 fi
 if test "$gdbstub" = "yes" ; then
@@ -402,6 +416,10 @@ echo "\"" >> $config_h
 echo "SRC_PATH=$source_path" >> $config_mak
 echo "TARGET_DIRS=$target_list" >> $config_mak
 
+if [ "$bsd" = "yes" ] ; then
+  echo "#define _BSD 1" >> $config_h
+fi
+
 for target in $target_list; do 
 
 target_dir="$target"
index ea20e395d6e383d87884d93388606a5fbb32e9ca..2d5209bc8907922871289d73791868f9994f63af 100644 (file)
@@ -59,7 +59,11 @@ extern int fprintf(FILE *, const char *, ...);
 extern int printf(const char *, ...);
 #undef NULL
 #define NULL 0
+#ifdef _BSD
+#include <ieeefp.h>
+#else
 #include <fenv.h>
+#endif
 
 #ifdef __i386__
 #define AREG0 "ebp"
index 3560b269b93dcf3c74b6d10385771848bec8d6e7..19623102ded716588d28011ec2f4d374a4ff639d 100644 (file)
--- a/gdbstub.c
+++ b/gdbstub.c
@@ -532,7 +532,7 @@ static void gdb_accept(void *opaque, const uint8_t *buf, int size)
 
     /* set short latency */
     val = 1;
-    setsockopt(fd, SOL_TCP, TCP_NODELAY, &val, sizeof(val));
+    setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val));
     
     s = qemu_mallocz(sizeof(GDBState));
     if (!s) {
index 6939a2c6e66e10fc2005a33cf2fb9caec3098c48..19340d25795e1812b0229a9519f3e8c19f3b40af 100644 (file)
@@ -259,7 +259,7 @@ enum {
     CC_OP_NB,
 };
 
-#if defined(__i386__) || defined(__x86_64__)
+#if (defined(__i386__) || defined(__x86_64__)) && !defined(_BSD)
 #define USE_X86LDOUBLE
 #endif
 
index fb9cc772f9654db94609251f2b0921acd9a2ccd1..f5b03fbe58246a44ee203f31255218cbc6f87878 100644 (file)
@@ -17,6 +17,7 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
+#include "config.h"
 #include "dyngen-exec.h"
 
 /* at least 4 register variables are defines */
@@ -307,8 +308,13 @@ static inline void stfl(void *ptr, float v)
 #define rint rintl
 #endif
 
+#if !defined(_BSD)
 extern int lrint(CPU86_LDouble x);
 extern int64_t llrint(CPU86_LDouble x);
+#else
+#define lrint(d)               ((int)rint(d))
+#define llrint(d)              ((int)rint(d))
+#endif
 extern CPU86_LDouble fabs(CPU86_LDouble x);
 extern CPU86_LDouble sin(CPU86_LDouble x);
 extern CPU86_LDouble cos(CPU86_LDouble x);
index 37823319d6c6a2faf89814fc953f7e3fb0454a19..fad8a730e7b3f81c86d0c04bf4d40c4a3bc06453 100644 (file)
@@ -1938,6 +1938,24 @@ void OPPROTO op_fldcw_A0(void)
     int rnd_type;
     env->fpuc = lduw((void *)A0);
     /* set rounding mode */
+#ifdef _BSD
+    switch(env->fpuc & RC_MASK) {
+    default:
+    case RC_NEAR:
+        rnd_type = FP_RN;
+        break;
+    case RC_DOWN:
+        rnd_type = FP_RM;
+        break;
+    case RC_UP:
+        rnd_type = FP_RP;
+        break;
+    case RC_CHOP:
+        rnd_type = FP_RZ;
+        break;
+    }
+    fpsetround(rnd_type);
+#else
     switch(env->fpuc & RC_MASK) {
     default:
     case RC_NEAR:
@@ -1954,6 +1972,7 @@ void OPPROTO op_fldcw_A0(void)
         break;
     }
     fesetround(rnd_type);
+#endif
 }
 
 void OPPROTO op_fclex(void)
diff --git a/vl.c b/vl.c
index 05c6f0f1cfbcdc96fab26482e64b0964b1be4742..44890561082754ed2b0645a458095c92fb89e5a4 100644 (file)
--- a/vl.c
+++ b/vl.c
 #include <fcntl.h>
 #include <signal.h>
 #include <time.h>
-#include <malloc.h>
 #include <errno.h>
 #include <sys/time.h>
 
 #ifndef _WIN32
 #include <sys/times.h>
 #include <sys/wait.h>
-#include <pty.h>
 #include <termios.h>
 #include <sys/poll.h>
 #include <sys/mman.h>
 #include <sys/ioctl.h>
 #include <sys/socket.h>
+#ifdef _BSD
+#include <sys/stat.h>
+#include <libutil.h>
+#else
 #include <linux/if.h>
 #include <linux/if_tun.h>
+#include <pty.h>
+#include <malloc.h>
 #include <linux/rtc.h>
 #endif
+#endif
 
 #if defined(CONFIG_SLIRP)
 #include "libslirp.h"
 #endif
 
 #ifdef _WIN32
+#include <malloc.h>
 #include <sys/timeb.h>
 #include <windows.h>
 #define getopt_long_only getopt_long
 #endif
 
 #ifdef CONFIG_SDL
+#if defined(__linux__)
 /* SDL use the pthreads and they modify sigaction. We don't
    want that. */
-#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+#if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2))
 extern void __libc_sigaction();
 #define sigaction(sig, act, oact) __libc_sigaction(sig, act, oact)
 #else
 extern void __sigaction();
 #define sigaction(sig, act, oact) __sigaction(sig, act, oact)
 #endif
+#endif /* __linux__ */
 #endif /* CONFIG_SDL */
 
 #include "disas.h"
@@ -637,11 +645,17 @@ int64_t qemu_get_clock(QEMUClock *clock)
 #ifdef _WIN32
         return GetTickCount();
 #else
-        /* XXX: portability among Linux hosts */
-        if (timer_freq == 100) {
-            return times(NULL) * 10;
-        } else {
-            return ((int64_t)times(NULL) * 1000) / timer_freq;
+        {
+            struct tms tp;
+
+            /* Note that using gettimeofday() is not a good solution
+               for timers because its value change when the date is
+               modified. */
+            if (timer_freq == 100) {
+                return times(&tp) * 10;
+            } else {
+                return ((int64_t)times(&tp) * 1000) / timer_freq;
+            }
         }
 #endif
     default:
@@ -964,7 +978,27 @@ static int net_slirp_init(NetDriverState *nd)
 #endif /* CONFIG_SLIRP */
 
 #if !defined(_WIN32)
+#ifdef _BSD
+static int tun_open(char *ifname, int ifname_size)
+{
+    int fd;
+    char *dev;
+    struct stat s;
 
+    fd = open("/dev/tap", O_RDWR);
+    if (fd < 0) {
+        fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
+        return -1;
+    }
+
+    fstat(fd, &s);
+    dev = devname(s.st_rdev, S_IFCHR);
+    pstrcpy(ifname, ifname_size, dev);
+
+    fcntl(fd, F_SETFL, O_NONBLOCK);
+    return fd;
+}
+#else
 static int tun_open(char *ifname, int ifname_size)
 {
     struct ifreq ifr;
@@ -989,6 +1023,7 @@ static int tun_open(char *ifname, int ifname_size)
     fcntl(fd, F_SETFL, O_NONBLOCK);
     return fd;
 }
+#endif
 
 static void tun_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
 {
@@ -2248,7 +2283,12 @@ int main(int argc, char **argv)
     phys_ram_size = ram_size + vga_ram_size;
 
 #ifdef CONFIG_SOFTMMU
+#ifdef _BSD
+    /* mallocs are always aligned on BSD. */
+    phys_ram_base = malloc(phys_ram_size);
+#else
     phys_ram_base = memalign(TARGET_PAGE_SIZE, phys_ram_size);
+#endif
     if (!phys_ram_base) {
         fprintf(stderr, "Could not allocate physical memory\n");
         exit(1);
diff --git a/vl.h b/vl.h
index 639b473cd5509293b2fe383496bd16c268efa502..b640ad4e72dce9f9b1fcf2e9ee5810b42532b742 100644 (file)
--- a/vl.h
+++ b/vl.h
@@ -35,6 +35,7 @@
 #include <errno.h>
 #include <unistd.h>
 #include <fcntl.h>
+#include <sys/stat.h>
 
 #ifndef O_LARGEFILE
 #define O_LARGEFILE 0
 
 #include "cpu.h"
 
+#ifdef _BSD
+#define lseek64 lseek
+#define ftruncate64 ftruncate
+#define mkstemp64 mkstemp
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+
 #ifndef glue
 #define xglue(x, y) x ## y
 #define glue(x, y) xglue(x, y)