Index: qemu/Makefile
@@ -13,7 +13,7 @@
 endif
 DOCS=qemu-doc.html qemu-tech.html qemu.1 qemu-img.1
 
-all: dyngen$(EXESUF) $(TOOLS) $(DOCS)
+all: bsd/libmath.a dyngen$(EXESUF) $(TOOLS) $(DOCS)
 	for d in $(TARGET_DIRS); do \
 	$(MAKE) -C $$d $@ || exit 1 ; \
         done
@@ -21,10 +21,13 @@
 ifdef CONFIG_WIN32
 	$(MAKE) -C kqemu -f Makefile.winnt
 else
-	$(MAKE) -C kqemu
+	( cd kqemu && $(BSD_MAKE) -f Makefile.freebsd )
 endif
 endif
 
+bsd/libmath.a:
+	( cd bsd ; $(BSD_MAKE) CC=$(CC) )
+
 qemu-img$(EXESUF): qemu-img.c block.c block-cow.c block-qcow.c aes.c block-vmdk.c block-cloop.c block-dmg.c block-bochs.c block-vpc.c block-vvfat.c
 	$(CC) -DQEMU_TOOL $(CFLAGS) $(LDFLAGS) $(DEFINES) -o $@ $^ -lz $(LIBS)
 
@@ -33,6 +36,7 @@
 
 clean:
 # avoid old build problems by removing potentially incorrect old files
+	( cd bsd ; $(BSD_MAKE) clean )
 	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 *.pod *~ */*~
 	$(MAKE) -C tests clean
@@ -40,7 +44,7 @@
 	$(MAKE) -C $$d $@ || exit 1 ; \
         done
 ifdef CONFIG_KQEMU
-	$(MAKE) -C kqemu clean
+	cd kqemu && $(BSD_MAKE) -f Makefile.freebsd clean
 endif
 
 distclean: clean
@@ -73,9 +77,6 @@
 	for d in $(TARGET_DIRS); do \
 	$(MAKE) -C $$d $@ || exit 1 ; \
         done
-ifdef CONFIG_KQEMU
-	cd kqemu ; ./install.sh
-endif
 
 # various test targets
 test speed test2: all
Index: qemu/Makefile.target
@@ -391,8 +391,8 @@
 VL_LDFLAGS+=-Wl,-G0 -Wl,-T,$(SRC_PATH)/ia64.ld
 endif
 
-$(QEMU_SYSTEM): $(VL_OBJS) libqemu.a
-	$(CC) $(VL_LDFLAGS) -o $@ $^ $(LIBS) $(SDL_LIBS) $(COCOA_LIBS) $(VL_LIBS)
+$(QEMU_SYSTEM): $(VL_OBJS) libqemu.a ../bsd/libmath.a
+	$(CC) $(VL_LDFLAGS) -o $@ $^ $(LIBS) $(SDL_LIBS) $(COCOA_LIBS) $(VL_LIBS) ../bsd/libmath.a
 
 cocoa.o: cocoa.m
 	$(CC) $(CFLAGS) $(DEFINES) -c -o $@ $<
Index: qemu/fpu/softfloat-native.c
@@ -2,11 +2,15 @@
    context is supported */
 #include "softfloat.h"
 #include <math.h>
+#if defined(__FreeBSD__) && __FreeBSD_version < 500000
+#include <ieeefp.h>
+#endif
 
 void set_float_rounding_mode(int val STATUS_PARAM)
 {
     STATUS(float_rounding_mode) = val;
-#if defined(_BSD) && !defined(__APPLE__)
+#if defined(_BSD) && !defined(__APPLE__) && \
+    (defined(__FreeBSD__) && __FreeBSD_version < 500000)
     fpsetround(val);
 #elif defined(__arm__)
     /* nothing to do */
@@ -22,7 +26,7 @@
 }
 #endif
 
-#if defined(_BSD)
+#if defined(_BSD) && !defined(__FreeBSD__)
 #define lrint(d)		((int32_t)rint(d))
 #define llrint(d)		((int64_t)rint(d))
 #endif
Index: qemu/fpu/softfloat-native.h
@@ -1,7 +1,17 @@
 /* Native implementation of soft float functions */
 #include <math.h>
-#if defined(_BSD) && !defined(__APPLE__)
+#if defined(_BSD) && !defined(__APPLE__) && \
+    (!defined(__FreeBSD__) || __FreeBSD_version < 500000)
 #include <ieeefp.h>
+#if defined(__FreeBSD__)
+#define isgreater(x, y)		__builtin_isgreater((x), (y))
+#define isgreaterequal(x, y)	__builtin_isgreaterequal((x), (y))
+#define isless(x, y)		__builtin_isless((x), (y))
+#define islessequal(x, y)	__builtin_islessequal((x), (y))
+#define islessgreater(x, y)	__builtin_islessgreater((x), (y))
+#define isunordered(x, y)	__builtin_isunordered((x), (y))
+long double fabsl(long double x);
+#endif
 #else
 #include <fenv.h>
 #endif
@@ -33,12 +43,13 @@
 /*----------------------------------------------------------------------------
 | Software IEC/IEEE floating-point rounding mode.
 *----------------------------------------------------------------------------*/
-#if defined(_BSD) && !defined(__APPLE__)
+#if defined(_BSD) && !defined(__APPLE__) && \
+    (!defined(__FreeBSD__) || __FreeBSD_version < 500000)
 enum {
     float_round_nearest_even = FP_RN,
-    float_round_down         = FE_RM,
-    float_round_up           = FE_RP,
-    float_round_to_zero      = FE_RZ
+    float_round_down         = FP_RM,
+    float_round_up           = FP_RP,
+    float_round_to_zero      = FP_RZ
 };
 #elif defined(__arm__)
 enum {
Index: qemu/fpu/softfloat.h
@@ -84,7 +84,8 @@
 #define FLOAT128
 #else
 /* native float support */
-#if (defined(__i386__) || defined(__x86_64__)) && !defined(_BSD)
+#if (defined(__i386__) || defined(__x86_64__)) && \
+    (!defined(_BSD) || defined(__FreeBSD__))
 #define FLOATX80
 #endif
 #endif /* !CONFIG_SOFTFLOAT */
Index: qemu/target-ppc/op_helper.c
@@ -303,6 +303,13 @@
     FT0 = sqrt(FT0);
 }
 
+#ifndef isnormal
+#define isnormal(x)					\
+    ((sizeof (x) == sizeof (float)) ? __isnormalf(x)	\
+    : (sizeof (x) == sizeof (double)) ? __isnormal(x)	\
+    : __isnormall(x))
+#endif
+
 void do_fres (void)
 {
     union {
Index: qemu/x86_64.ld
@@ -2,7 +2,7 @@
 OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
 OUTPUT_ARCH(i386:x86-64)
 ENTRY(_start)
-SEARCH_DIR("/lib64"); SEARCH_DIR("/usr/lib64"); SEARCH_DIR("/usr/local/lib64");
+SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/local/lib");
 SECTIONS
 {
   /* Read-only sections, merged into text segment: */
