Commit 7d3505c5 authored by bellard's avatar bellard

bsd port (Markus Niemisto)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@800 c046a42c-6fe2-441c-8c8c-71466251a162
parent fd872598
...@@ -16,7 +16,7 @@ endif ...@@ -16,7 +16,7 @@ endif
all: dyngen$(EXESUF) $(TOOLS) qemu-doc.html qemu-tech.html qemu.1 all: dyngen$(EXESUF) $(TOOLS) qemu-doc.html qemu-tech.html qemu.1
for d in $(TARGET_DIRS); do \ for d in $(TARGET_DIRS); do \
make -C $$d $@ || exit 1 ; \ $(MAKE) -C $$d $@ || exit 1 ; \
done done
qemu-mkcow: qemu-mkcow.c qemu-mkcow: qemu-mkcow.c
...@@ -29,9 +29,9 @@ clean: ...@@ -29,9 +29,9 @@ clean:
# avoid old build problems by removing potentially incorrect old files # 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 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 rm -f *.o *.a $(TOOLS) dyngen$(EXESUF) TAGS qemu.pod
make -C tests clean $(MAKE) -C tests clean
for d in $(TARGET_DIRS); do \ for d in $(TARGET_DIRS); do \
make -C $$d $@ || exit 1 ; \ $(MAKE) -C $$d $@ || exit 1 ; \
done done
distclean: clean distclean: clean
...@@ -55,12 +55,12 @@ ifndef CONFIG_WIN32 ...@@ -55,12 +55,12 @@ ifndef CONFIG_WIN32
install qemu.1 qemu-mkcow.1 "$(mandir)/man1" install qemu.1 qemu-mkcow.1 "$(mandir)/man1"
endif endif
for d in $(TARGET_DIRS); do \ for d in $(TARGET_DIRS); do \
make -C $$d $@ || exit 1 ; \ $(MAKE) -C $$d $@ || exit 1 ; \
done done
# various test targets # various test targets
test speed test2: all test speed test2: all
make -C tests $@ $(MAKE) -C tests $@
TAGS: TAGS:
etags *.[ch] tests/*.[ch] etags *.[ch] tests/*.[ch]
......
...@@ -79,9 +79,23 @@ case $targetos in ...@@ -79,9 +79,23 @@ case $targetos in
MINGW32*) MINGW32*)
mingw32="yes" mingw32="yes"
;; ;;
FreeBSD)
bsd="yes"
;;
NetBSD)
bsd="yes"
;;
OpenBSD)
bsd="yes"
;;
*) ;; *) ;;
esac esac
if [ "$bsd" = "yes" ] ; then
make="gmake"
target_list="i386-softmmu"
fi
# find source path # find source path
# XXX: we assume an absolute path is given when launching configure, # XXX: we assume an absolute path is given when launching configure,
# except in './configure' case. # except in './configure' case.
...@@ -373,7 +387,7 @@ fi ...@@ -373,7 +387,7 @@ fi
if test "$mingw32" = "yes" ; then if test "$mingw32" = "yes" ; then
echo "CONFIG_WIN32=yes" >> $config_mak echo "CONFIG_WIN32=yes" >> $config_mak
echo "#define CONFIG_WIN32 1" >> $config_h echo "#define CONFIG_WIN32 1" >> $config_h
else elif test -f "/usr/include/byteswap.h" ; then
echo "#define HAVE_BYTESWAP_H 1" >> $config_h echo "#define HAVE_BYTESWAP_H 1" >> $config_h
fi fi
if test "$gdbstub" = "yes" ; then if test "$gdbstub" = "yes" ; then
...@@ -402,6 +416,10 @@ echo "\"" >> $config_h ...@@ -402,6 +416,10 @@ echo "\"" >> $config_h
echo "SRC_PATH=$source_path" >> $config_mak echo "SRC_PATH=$source_path" >> $config_mak
echo "TARGET_DIRS=$target_list" >> $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 for target in $target_list; do
target_dir="$target" target_dir="$target"
......
...@@ -59,7 +59,11 @@ extern int fprintf(FILE *, const char *, ...); ...@@ -59,7 +59,11 @@ extern int fprintf(FILE *, const char *, ...);
extern int printf(const char *, ...); extern int printf(const char *, ...);
#undef NULL #undef NULL
#define NULL 0 #define NULL 0
#ifdef _BSD
#include <ieeefp.h>
#else
#include <fenv.h> #include <fenv.h>
#endif
#ifdef __i386__ #ifdef __i386__
#define AREG0 "ebp" #define AREG0 "ebp"
......
...@@ -532,7 +532,7 @@ static void gdb_accept(void *opaque, const uint8_t *buf, int size) ...@@ -532,7 +532,7 @@ static void gdb_accept(void *opaque, const uint8_t *buf, int size)
/* set short latency */ /* set short latency */
val = 1; 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)); s = qemu_mallocz(sizeof(GDBState));
if (!s) { if (!s) {
......
...@@ -259,7 +259,7 @@ enum { ...@@ -259,7 +259,7 @@ enum {
CC_OP_NB, CC_OP_NB,
}; };
#if defined(__i386__) || defined(__x86_64__) #if (defined(__i386__) || defined(__x86_64__)) && !defined(_BSD)
#define USE_X86LDOUBLE #define USE_X86LDOUBLE
#endif #endif
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include "config.h"
#include "dyngen-exec.h" #include "dyngen-exec.h"
/* at least 4 register variables are defines */ /* at least 4 register variables are defines */
...@@ -307,8 +308,13 @@ static inline void stfl(void *ptr, float v) ...@@ -307,8 +308,13 @@ static inline void stfl(void *ptr, float v)
#define rint rintl #define rint rintl
#endif #endif
#if !defined(_BSD)
extern int lrint(CPU86_LDouble x); extern int lrint(CPU86_LDouble x);
extern int64_t llrint(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 fabs(CPU86_LDouble x);
extern CPU86_LDouble sin(CPU86_LDouble x); extern CPU86_LDouble sin(CPU86_LDouble x);
extern CPU86_LDouble cos(CPU86_LDouble x); extern CPU86_LDouble cos(CPU86_LDouble x);
......
...@@ -1938,6 +1938,24 @@ void OPPROTO op_fldcw_A0(void) ...@@ -1938,6 +1938,24 @@ void OPPROTO op_fldcw_A0(void)
int rnd_type; int rnd_type;
env->fpuc = lduw((void *)A0); env->fpuc = lduw((void *)A0);
/* set rounding mode */ /* 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) { switch(env->fpuc & RC_MASK) {
default: default:
case RC_NEAR: case RC_NEAR:
...@@ -1954,6 +1972,7 @@ void OPPROTO op_fldcw_A0(void) ...@@ -1954,6 +1972,7 @@ void OPPROTO op_fldcw_A0(void)
break; break;
} }
fesetround(rnd_type); fesetround(rnd_type);
#endif
} }
void OPPROTO op_fclex(void) void OPPROTO op_fclex(void)
......
...@@ -28,29 +28,35 @@ ...@@ -28,29 +28,35 @@
#include <fcntl.h> #include <fcntl.h>
#include <signal.h> #include <signal.h>
#include <time.h> #include <time.h>
#include <malloc.h>
#include <errno.h> #include <errno.h>
#include <sys/time.h> #include <sys/time.h>
#ifndef _WIN32 #ifndef _WIN32
#include <sys/times.h> #include <sys/times.h>
#include <sys/wait.h> #include <sys/wait.h>
#include <pty.h>
#include <termios.h> #include <termios.h>
#include <sys/poll.h> #include <sys/poll.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/socket.h> #include <sys/socket.h>
#ifdef _BSD
#include <sys/stat.h>
#include <libutil.h>
#else
#include <linux/if.h> #include <linux/if.h>
#include <linux/if_tun.h> #include <linux/if_tun.h>
#include <pty.h>
#include <malloc.h>
#include <linux/rtc.h> #include <linux/rtc.h>
#endif #endif
#endif
#if defined(CONFIG_SLIRP) #if defined(CONFIG_SLIRP)
#include "libslirp.h" #include "libslirp.h"
#endif #endif
#ifdef _WIN32 #ifdef _WIN32
#include <malloc.h>
#include <sys/timeb.h> #include <sys/timeb.h>
#include <windows.h> #include <windows.h>
#define getopt_long_only getopt_long #define getopt_long_only getopt_long
...@@ -58,15 +64,17 @@ ...@@ -58,15 +64,17 @@
#endif #endif
#ifdef CONFIG_SDL #ifdef CONFIG_SDL
#if defined(__linux__)
/* SDL use the pthreads and they modify sigaction. We don't /* SDL use the pthreads and they modify sigaction. We don't
want that. */ want that. */
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) #if (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2))
extern void __libc_sigaction(); extern void __libc_sigaction();
#define sigaction(sig, act, oact) __libc_sigaction(sig, act, oact) #define sigaction(sig, act, oact) __libc_sigaction(sig, act, oact)
#else #else
extern void __sigaction(); extern void __sigaction();
#define sigaction(sig, act, oact) __sigaction(sig, act, oact) #define sigaction(sig, act, oact) __sigaction(sig, act, oact)
#endif #endif
#endif /* __linux__ */
#endif /* CONFIG_SDL */ #endif /* CONFIG_SDL */
#include "disas.h" #include "disas.h"
...@@ -637,11 +645,17 @@ int64_t qemu_get_clock(QEMUClock *clock) ...@@ -637,11 +645,17 @@ int64_t qemu_get_clock(QEMUClock *clock)
#ifdef _WIN32 #ifdef _WIN32
return GetTickCount(); return GetTickCount();
#else #else
/* XXX: portability among Linux hosts */ {
if (timer_freq == 100) { struct tms tp;
return times(NULL) * 10;
} else { /* Note that using gettimeofday() is not a good solution
return ((int64_t)times(NULL) * 1000) / timer_freq; 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 #endif
default: default:
...@@ -964,7 +978,27 @@ static int net_slirp_init(NetDriverState *nd) ...@@ -964,7 +978,27 @@ static int net_slirp_init(NetDriverState *nd)
#endif /* CONFIG_SLIRP */ #endif /* CONFIG_SLIRP */
#if !defined(_WIN32) #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) static int tun_open(char *ifname, int ifname_size)
{ {
struct ifreq ifr; struct ifreq ifr;
...@@ -989,6 +1023,7 @@ static int tun_open(char *ifname, int ifname_size) ...@@ -989,6 +1023,7 @@ static int tun_open(char *ifname, int ifname_size)
fcntl(fd, F_SETFL, O_NONBLOCK); fcntl(fd, F_SETFL, O_NONBLOCK);
return fd; return fd;
} }
#endif
static void tun_send_packet(NetDriverState *nd, const uint8_t *buf, int size) static void tun_send_packet(NetDriverState *nd, const uint8_t *buf, int size)
{ {
...@@ -2248,7 +2283,12 @@ int main(int argc, char **argv) ...@@ -2248,7 +2283,12 @@ int main(int argc, char **argv)
phys_ram_size = ram_size + vga_ram_size; phys_ram_size = ram_size + vga_ram_size;
#ifdef CONFIG_SOFTMMU #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); phys_ram_base = memalign(TARGET_PAGE_SIZE, phys_ram_size);
#endif
if (!phys_ram_base) { if (!phys_ram_base) {
fprintf(stderr, "Could not allocate physical memory\n"); fprintf(stderr, "Could not allocate physical memory\n");
exit(1); exit(1);
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/stat.h>
#ifndef O_LARGEFILE #ifndef O_LARGEFILE
#define O_LARGEFILE 0 #define O_LARGEFILE 0
...@@ -49,6 +50,13 @@ ...@@ -49,6 +50,13 @@
#include "cpu.h" #include "cpu.h"
#ifdef _BSD
#define lseek64 lseek
#define ftruncate64 ftruncate
#define mkstemp64 mkstemp
#define MAP_ANONYMOUS MAP_ANON
#endif
#ifndef glue #ifndef glue
#define xglue(x, y) x ## y #define xglue(x, y) x ## y
#define glue(x, y) xglue(x, y) #define glue(x, y) xglue(x, y)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment