-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

After more than 10 hours the article still didn't show up, so I'm resending
just in case



Some patches are present in pkgsrc that should be sent upstream, so I have
attached the patches and some information about the patches below.

patch-aa: some machines have <machine/bswap.h> instead of <byteswap.h>

patch-ab: qemu (op.c) shouldn't be compiled with the stack-protector turned on,
so this patch adds the needed -fno-stack-protector if it is used by default

patch-ac: on NetBSD some operations are not supported

patch-ad: on DragonFly <sys/disk.h> must not be included by userland programs

patch-ae: I was unable to compile slavio_serial.c using gcc 3.4.6 because of
some inlining errors, but just reordering the functions makes it compile
cleanly

patch-ag: DragonFly support is added, a check for <machine/bswap.h> and the
stack protector are added as well

patch-am: I'm not quite sure what this is for ... but this patch has existed
for a bit more than 3 years ... maybe ioctl needs 3 args on some systems?

patch-ao: as the comment added by the patch says, this is a work around some
ugly #defines in NetBSD 2.x

patch-au: defines some possibly missing functionality on NetBSD

patch-av: quoted ... "Provide trunc() implementation for NetBSD 3 and
Dragonfly"

patch-aw: quoted ... "Workaround for x86_64 target, patch from Hubert Feyrer."

patch-ax: quoted from cvs revision history ... "Apply patches from Tobyas
Nigren (PR pkg/32464) to make this build on NetBSD/amd64. Thank you Tobias!"

patch-ay: quoted from cvs revision history ... "Update to 0.9.0. Thanks to
Michael Van Elst for sending me the missing patch to let this build on systems
without POSIX AIO."

patch-ba: quoted from cvs revision history ... "Add patches/patch-ba:
  Emulate the speaker port's refresh clock bit.  This is supposed
  to toggle between 0 and 1<<4 every 15 microseconds.  XXX: We use
  gettimeofday() in the real machine instead of a monotonic clock
  in the virtual machine, and we are a bit sloppy about the 15
  microseconds.  This should be good enough for crude loops that
  measure approximate delays by counting how often this line toggles."
- -- 
Regards,
Rumko
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (DragonFly)

iD8DBQFHjcWTxV3ce2RZW70RArGaAKDKwmH1Aq4c0Xy9fLsIOi875bQaJACgmV+1
VMYqcjSZhd/uqTMmCulc+vA=
=0ftn
-----END PGP SIGNATURE-----
$NetBSD: patch-aa,v 1.3 2004/12/14 01:02:19 dbj Exp $

--- bswap.h.orig	Sun Nov 14 15:51:33 2004
+++ bswap.h
@@ -5,6 +5,12 @@
 
 #include <inttypes.h>
 
+#ifdef HAVE_MACHINE_BSWAP_H
+#include <sys/endian.h>
+#include <sys/types.h>
+#include <machine/bswap.h>
+#else
+
 #ifdef HAVE_BYTESWAP_H
 #include <byteswap.h>
 #else
@@ -57,6 +63,8 @@ static inline uint64_t bswap64(uint64_t 
 {
     return bswap_64(x);
 }
+
+#endif /* ! HAVE_MACHINE_BSWAP_H */
 
 static inline void bswap16s(uint16_t *s)
 {

$NetBSD: patch-ab,v 1.8 2007/12/30 17:12:44 joerg Exp $

--- Makefile.target.orig	2007-02-05 23:01:54 +0000
+++ Makefile.target
@@ -99,6 +99,10 @@ endif
 # We require -O2 to avoid the stack setup prologue in EXIT_TB
 OP_CFLAGS := -Wall -O2 -g -fno-strict-aliasing
 
+ifdef STACK_PROTECTOR_PRESENT
+OP_CFLAGS += -fno-stack-protector
+endif
+
 # cc-option
 # Usage: OP_CFLAGS+=$(call cc-option, -falign-functions=0, -malign-functions=0)
 

$NetBSD: patch-ac,v 1.9 2007/12/18 00:16:56 joerg Exp $

--- vl.c.orig	2007-05-02 01:56:26.000000000 +0200
+++ vl.c	2007-05-02 01:57:42.000000000 +0200
@@ -2385,6 +2385,9 @@
 
 static int pp_ioctl(CharDriverState *chr, int cmd, void *arg)
 {
+#ifdef __NetBSD__
+    return ENOTSUP;
+#endif
     ParallelCharDriver *drv = chr->opaque;
     int fd = drv->fd;
     uint8_t b;
@@ -2473,6 +2476,9 @@
 
 static CharDriverState *qemu_chr_open_pp(const char *filename)
 {
+#ifdef __NetBSD__
+    return ENOTSUP;
+#endif
     CharDriverState *chr;
     ParallelCharDriver *drv;
     int fd;

$NetBSD: patch-ad,v 1.3 2007/12/30 17:12:45 joerg Exp $

--- block.c.orig	2007-02-05 23:01:54 +0000
+++ block.c
@@ -29,8 +29,10 @@
 #include <sys/stat.h>
 #include <sys/ioctl.h>
 #include <sys/queue.h>
+#ifndef __DragonFly__
 #include <sys/disk.h>
 #endif
+#endif
 
 #define SECTOR_BITS 9
 #define SECTOR_SIZE (1 << SECTOR_BITS)

$NetBSD$

--- hw/slavio_serial.c.orig	2008-01-15 17:25:29 +0100
+++ hw/slavio_serial.c	2008-01-15 17:25:30 +0100
@@ -215,7 +215,6 @@
 static void handle_kbd_command(ChannelState *s, int val);
 static int serial_can_receive(void *opaque);
 static void serial_receive_byte(ChannelState *s, int ch);
-static inline void set_txint(ChannelState *s);
 
 static void clear_queue(void *opaque)
 {
@@ -321,28 +320,6 @@
     slavio_serial_reset_chn(&s->chn[1]);
 }
 
-static inline void clr_rxint(ChannelState *s)
-{
-    s->rxint = 0;
-    s->rxint_under_svc = 0;
-    if (s->chn == chn_a) {
-        if (s->wregs[W_MINTR] & MINTR_STATUSHI)
-            s->otherchn->rregs[R_IVEC] = IVEC_HINOINT;
-        else
-            s->otherchn->rregs[R_IVEC] = IVEC_LONOINT;
-        s->rregs[R_INTR] &= ~INTR_RXINTA;
-    } else {
-        if (s->wregs[W_MINTR] & MINTR_STATUSHI)
-            s->rregs[R_IVEC] = IVEC_HINOINT;
-        else
-            s->rregs[R_IVEC] = IVEC_LONOINT;
-        s->otherchn->rregs[R_INTR] &= ~INTR_RXINTB;
-    }
-    if (s->txint)
-        set_txint(s);
-    slavio_serial_update_irq(s);
-}
-
 static inline void set_rxint(ChannelState *s)
 {
     s->rxint = 1;
@@ -367,6 +344,49 @@
     slavio_serial_update_irq(s);
 }
 
+static inline void set_txint(ChannelState *s)
+{
+    s->txint = 1;
+    if (!s->rxint_under_svc) {
+        s->txint_under_svc = 1;
+        if (s->chn == chn_a) {
+            if (s->wregs[W_MINTR] & MINTR_STATUSHI)
+                s->otherchn->rregs[R_IVEC] = IVEC_HITXINTA;
+            else
+                s->otherchn->rregs[R_IVEC] = IVEC_LOTXINTA;
+        } else {
+            s->rregs[R_IVEC] = IVEC_TXINTB;
+        }
+    }
+    if (s->chn == chn_a)
+        s->rregs[R_INTR] |= INTR_TXINTA;
+    else
+        s->otherchn->rregs[R_INTR] |= INTR_TXINTB;
+    slavio_serial_update_irq(s);
+}
+
+static inline void clr_rxint(ChannelState *s)
+{
+    s->rxint = 0;
+    s->rxint_under_svc = 0;
+    if (s->chn == chn_a) {
+        if (s->wregs[W_MINTR] & MINTR_STATUSHI)
+            s->otherchn->rregs[R_IVEC] = IVEC_HINOINT;
+        else
+            s->otherchn->rregs[R_IVEC] = IVEC_LONOINT;
+        s->rregs[R_INTR] &= ~INTR_RXINTA;
+    } else {
+        if (s->wregs[W_MINTR] & MINTR_STATUSHI)
+            s->rregs[R_IVEC] = IVEC_HINOINT;
+        else
+            s->rregs[R_IVEC] = IVEC_LONOINT;
+        s->otherchn->rregs[R_INTR] &= ~INTR_RXINTB;
+    }
+    if (s->txint)
+        set_txint(s);
+    slavio_serial_update_irq(s);
+}
+
 static inline void clr_txint(ChannelState *s)
 {
     s->txint = 0;
@@ -389,27 +409,6 @@
     slavio_serial_update_irq(s);
 }
 
-static inline void set_txint(ChannelState *s)
-{
-    s->txint = 1;
-    if (!s->rxint_under_svc) {
-        s->txint_under_svc = 1;
-        if (s->chn == chn_a) {
-            if (s->wregs[W_MINTR] & MINTR_STATUSHI)
-                s->otherchn->rregs[R_IVEC] = IVEC_HITXINTA;
-            else
-                s->otherchn->rregs[R_IVEC] = IVEC_LOTXINTA;
-        } else {
-            s->rregs[R_IVEC] = IVEC_TXINTB;
-        }
-    }
-    if (s->chn == chn_a)
-        s->rregs[R_INTR] |= INTR_TXINTA;
-    else
-        s->otherchn->rregs[R_INTR] |= INTR_TXINTB;
-    slavio_serial_update_irq(s);
-}
-
 static void slavio_serial_update_parameters(ChannelState *s)
 {
     int speed, parity, data_bits, stop_bits;

$NetBSD: patch-ag,v 1.10 2008/01/04 21:37:07 sborrill Exp $

--- configure.orig	2007-02-05 23:01:54 +0000
+++ configure
@@ -44,7 +44,7 @@ case "$cpu" in
   alpha)
     cpu="alpha"
   ;;
-  "Power Macintosh"|ppc|ppc64)
+  "Power Macintosh"|ppc|ppc64|powerpc)
     cpu="powerpc"
   ;;
   mips)
@@ -136,6 +136,12 @@ if [ "$cpu" = "i386" -o "$cpu" = "x86_64
     kqemu="yes"
 fi
 ;;
+DragonFly)
+bsd="yes"
+oss="yes"
+dragonfly="yes"
+;;
+
 NetBSD)
 bsd="yes"
 oss="yes"
@@ -478,6 +484,16 @@ EOF
     fi
 fi
 
+# Check for stack protector
+cat > $TMPC <<EOF
+extern int foo;
+EOF
+if ! "$cc" -o $TMPE $TMPC -fno-stack-protector 2> /dev/null ; then
+  stack_protector_present="yes"
+else
+  stack_protector_present="no"
+fi
+
 #
 # Solaris specific configure tool chain decisions
 #
@@ -848,6 +864,14 @@ if test "$mingw32" = "yes" ; then
 EOF
   if $cc -o $TMPE $TMPC 2> /dev/null ; then
     echo "#define HAVE_BYTESWAP_H 1" >> $config_h
+  else
+    cat > $TMPC << EOF
+#include <machine/bswap.h>
+int main(void) { return bswap_32(0); }
+EOF
+    if $cc -o $TMPE $TMPC 2> /dev/null ; then
+      echo "#define HAVE_MACHINE_BSWAP_H 1" >> $config_h
+    fi
   fi
 fi
 if test "$darwin" = "yes" ; then
@@ -960,6 +984,10 @@ if [ "$bsd" = "yes" ] ; then
   echo "#define _BSD 1" >> $config_h
 fi
 
+if [ "$stack_protector_present" = "yes" ] ; then
+  echo "STACK_PROTECTOR_PRESENT=yes" >> $config_mak
+fi
+
 echo "#define CONFIG_UNAME_RELEASE \"$uname_release\"" >> $config_h
 
 tools=

$NetBSD: patch-am,v 1.2 2006/01/01 13:48:45 xtraeme Exp $

--- audio/ossaudio.c.orig	2005-12-19 17:51:53.000000000 -0500
+++ audio/ossaudio.c
@@ -229,7 +229,7 @@ static int oss_open (int in, struct oss_
         goto err;
     }
 
-    if (ioctl (fd, SNDCTL_DSP_NONBLOCK)) {
+    if (ioctl (fd, SNDCTL_DSP_NONBLOCK, NULL)) {
         oss_logerr2 (errno, typ, "Failed to set non-blocking mode\n");
         goto err;
     }

$NetBSD: patch-ao,v 1.2 2006/01/01 13:48:45 xtraeme Exp $

--- audio/mixeng.c.orig	2005-12-19 17:51:53.000000000 -0500
+++ audio/mixeng.c
@@ -145,56 +145,64 @@
 #undef IN_T
 #undef SHIFT
 
+/*
+ * Work around ugly XX_t #defines in NetBSD 2.x,
+ * fixed as typedefs in NetBSD 3.x. Two macros needed to
+ * get CPP defines expanded properly. - HF
+ */
+#define _NBglue(x,y,z) x ## y ## z
+#define NBglue(x,y,z) _NBglue(x,y,z)
+
 t_sample *mixeng_conv[2][2][2][3] = {
     {
         {
             {
-                conv_natural_uint8_t_to_mono,
-                conv_natural_uint16_t_to_mono,
-                conv_natural_uint32_t_to_mono
+		 NBglue(conv_natural_, uint8_t, _to_mono), 
+                NBglue(conv_natural_, uint16_t, _to_mono),
+                NBglue(conv_natural_, uint32_t, _to_mono)
             },
             {
-                conv_natural_uint8_t_to_mono,
-                conv_swap_uint16_t_to_mono,
-                conv_swap_uint32_t_to_mono,
+                NBglue(conv_natural_, uint8_t, _to_mono),
+                NBglue(conv_swap_, uint16_t, _to_mono),
+                NBglue(conv_swap_, uint32_t, _to_mono)
             }
         },
         {
             {
-                conv_natural_int8_t_to_mono,
-                conv_natural_int16_t_to_mono,
-                conv_natural_int32_t_to_mono
+                NBglue(conv_natural_, int8_t, _to_mono),
+                NBglue(conv_natural_, int16_t, _to_mono),
+                NBglue(conv_natural_, int32_t, _to_mono)
             },
             {
-                conv_natural_int8_t_to_mono,
-                conv_swap_int16_t_to_mono,
-                conv_swap_int32_t_to_mono
+                NBglue(conv_natural_, int8_t, _to_mono),
+                NBglue(conv_swap_, int16_t, _to_mono),
+                NBglue(conv_swap_, int32_t, _to_mono)
             }
         }
     },
     {
         {
             {
-                conv_natural_uint8_t_to_stereo,
-                conv_natural_uint16_t_to_stereo,
-                conv_natural_uint32_t_to_stereo
+                NBglue(conv_natural_, uint8_t, _to_stereo),
+                NBglue(conv_natural_, uint16_t, _to_stereo),
+                NBglue(conv_natural_, uint32_t, _to_stereo)
             },
             {
-                conv_natural_uint8_t_to_stereo,
-                conv_swap_uint16_t_to_stereo,
-                conv_swap_uint32_t_to_stereo
+                NBglue(conv_natural_, uint8_t, _to_stereo),
+                NBglue(conv_swap_, uint16_t, _to_stereo),
+                NBglue(conv_swap_, uint32_t, _to_stereo)
             }
         },
         {
             {
-                conv_natural_int8_t_to_stereo,
-                conv_natural_int16_t_to_stereo,
-                conv_natural_int32_t_to_stereo
+                NBglue(conv_natural_, int8_t, _to_stereo),
+                NBglue(conv_natural_, int16_t, _to_stereo),
+                NBglue(conv_natural_, int32_t, _to_stereo)
             },
             {
-                conv_natural_int8_t_to_stereo,
-                conv_swap_int16_t_to_stereo,
-                conv_swap_int32_t_to_stereo,
+                NBglue(conv_natural_, int8_t, _to_stereo),
+                NBglue(conv_swap_, int16_t, _to_stereo),
+                NBglue(conv_swap_, int32_t, _to_stereo)
             }
         }
     }
@@ -212,52 +220,52 @@ f_sample *mixeng_clip[2][2][2][3] = {
     {
         {
             {
-                clip_natural_uint8_t_from_mono,
-                clip_natural_uint16_t_from_mono,
-                clip_natural_uint32_t_from_mono
+                NBglue(clip_natural_, uint8_t, _from_mono),
+                NBglue(clip_natural_, uint16_t, _from_mono),
+                NBglue(clip_natural_, uint32_t, _from_mono)
             },
             {
-                clip_natural_uint8_t_from_mono,
-                clip_swap_uint16_t_from_mono,
-                clip_swap_uint32_t_from_mono
+                NBglue(clip_natural_, uint8_t, _from_mono),
+                NBglue(clip_swap_, uint16_t, _from_mono),
+                NBglue(clip_swap_, uint32_t, _from_mono)
             }
         },
         {
             {
-                clip_natural_int8_t_from_mono,
-                clip_natural_int16_t_from_mono,
-                clip_natural_int32_t_from_mono
+                NBglue(clip_natural_, int8_t, _from_mono),
+                NBglue(clip_natural_, int16_t, _from_mono),
+                NBglue(clip_natural_, int32_t, _from_mono)
             },
             {
-                clip_natural_int8_t_from_mono,
-                clip_swap_int16_t_from_mono,
-                clip_swap_int32_t_from_mono
+                NBglue(clip_natural_, int8_t, _from_mono),
+                NBglue(clip_swap_, int16_t, _from_mono),
+                NBglue(clip_swap_, int32_t, _from_mono)
             }
         }
     },
     {
         {
             {
-                clip_natural_uint8_t_from_stereo,
-                clip_natural_uint16_t_from_stereo,
-                clip_natural_uint32_t_from_stereo
+                NBglue(clip_natural_, uint8_t, _from_stereo),
+                NBglue(clip_natural_, uint16_t, _from_stereo),
+                NBglue(clip_natural_, uint32_t, _from_stereo)
             },
             {
-                clip_natural_uint8_t_from_stereo,
-                clip_swap_uint16_t_from_stereo,
-                clip_swap_uint32_t_from_stereo
+                NBglue(clip_natural_, uint8_t, _from_stereo),
+                NBglue(clip_swap_, uint16_t, _from_stereo),
+                NBglue(clip_swap_, uint32_t, _from_stereo)
             }
         },
         {
             {
-                clip_natural_int8_t_from_stereo,
-                clip_natural_int16_t_from_stereo,
-                clip_natural_int32_t_from_stereo
+                NBglue(clip_natural_, int8_t, _from_stereo),
+                NBglue(clip_natural_, int16_t, _from_stereo),
+                NBglue(clip_natural_, int32_t, _from_stereo)
             },
             {
-                clip_natural_int8_t_from_stereo,
-                clip_swap_int16_t_from_stereo,
-                clip_swap_int32_t_from_stereo
+                NBglue(clip_natural_, int8_t, _from_stereo),
+                NBglue(clip_swap_, int16_t, _from_stereo),
+                NBglue(clip_swap_, int32_t, _from_stereo)
             }
         }
     }

$NetBSD: patch-au,v 1.4 2007/12/18 00:16:56 joerg Exp $

--- fpu/softfloat-native.h.orig	2007-02-06 00:01:54.000000000 +0100
+++ fpu/softfloat-native.h	2007-05-02 01:54:50.000000000 +0200
@@ -33,6 +33,24 @@
 #define isunordered(x,y)        unordered(x, y)
 #endif
 
+#ifdef __NetBSD__
+#ifndef isgreater
+#define isgreater(x, y)		__builtin_isgreater(x, y)
+#endif
+#ifndef isgreaterequal
+#define isgreaterequal(x, y)	__builtin_isgreaterequal(x, y)
+#endif
+#ifndef isless
+#define isless(x, y)		__builtin_isless(x, y)
+#endif
+#ifndef islessequal
+#define islessequal(x, y)	__builtin_islessequal(x, y)
+#endif
+#ifndef isunordered
+#define isunordered(x, y)	__builtin_isunordered(x, y)
+#endif
+#endif
+
 #if defined(__sun__) && !defined(NEED_LIBSUNMATH)
 
 #ifndef isnan

$NetBSD: patch-av,v 1.3 2007/10/07 21:21:00 heinz Exp $

  Provide trunc() implementation for NetBSD 3 and Dragonfly

--- fpu/softfloat-native.c.orig	2007-02-06 00:01:54.000000000 +0100
+++ fpu/softfloat-native.c
@@ -3,6 +3,20 @@
 #include "softfloat.h"
 #include <math.h>
 
+#if defined(__DragonFly__) || defined(__NetBSD__)
+# include <sys/param.h>
+#endif
+
+#if (defined(__DragonFly__) && __DragonFly_version < 195000) || (defined(__NetBSD__) && __NetBSD_Version__ <= 399001700)
+static double trunc( double val )
+{
+    if (val > 0)
+        return floor(val);
+    else
+        return ceil(val);
+}
+#endif
+
 void set_float_rounding_mode(int val STATUS_PARAM)
 {
     STATUS(float_rounding_mode) = val;

$NetBSD: patch-aw,v 1.2 2007/01/06 21:21:35 xtraeme Exp $

Workaround for x86_64 target, patch from Hubert Feyrer.

Index: dyngen.c
===================================================================
RCS file: /cvsroot/qemu/qemu/dyngen.c,v
retrieving revision 1.40
diff -u -r1.40 dyngen.c
--- dyngen.c.orig	2007-01-05 20:32:17.000000000 +0000
+++ dyngen.c	2007-01-05 20:36:45.000000000 +0000
@@ -1738,6 +1738,7 @@
                 if(!sym_name)
                     continue;
                 if (*sym_name &&
+                    !strstart(sym_name, "bswap64", NULL) && /* HF hack */
                     !strstart(sym_name, "__op_param", NULL) &&
                     !strstart(sym_name, "__op_jmp", NULL) &&
                     !strstart(sym_name, "__op_gen_label", NULL)) {

$NetBSD: patch-ax,v 1.3 2006/01/06 09:17:03 xtraeme Exp $

--- target-i386/op.c.orig	2006-01-06 05:10:30.000000000 +0100
+++ target-i386/op.c
@@ -2099,14 +2099,17 @@ void OPPROTO op_fdivr_STN_ST0(void)
 }
 
 /* misc FPU operations */
+
+void fchs_dummy() {ST0 = floatx_chs(ST0);}
 void OPPROTO op_fchs_ST0(void)
 {
-    ST0 = floatx_chs(ST0);
+    fchs_dummy();
 }
 
+void fabs_dummy() {ST0 = floatx_abs(ST0);}
 void OPPROTO op_fabs_ST0(void)
 {
-    ST0 = floatx_abs(ST0);
+    fabs_dummy();
 }
 
 void OPPROTO op_fxam_ST0(void)

$NetBSD: patch-ay,v 1.7 2007/05/21 20:24:48 xtraeme Exp $

--- block-raw-posix.c.orig	2007-02-06 00:01:54.000000000 +0100
+++ block-raw-posix.c
@@ -28,7 +28,9 @@
 #endif
 #include "block_int.h"
 #include <assert.h>
+#ifdef _POSIX_ASYNCHRONOUS_IO
 #include <aio.h>
+#endif
 
 #ifdef CONFIG_COCOA
 #include <paths.h>
@@ -230,6 +232,7 @@ static int raw_pwrite(BlockDriverState *
     return ret;
 }
 
+#ifdef _POSIX_ASYNCHRONOUS_IO
 /***********************************************************/
 /* Unix AIO using POSIX AIO */
 
@@ -455,6 +458,7 @@ static void raw_aio_cancel(BlockDriverAI
         pacb = &acb->next;
     }
 }
+#endif
 
 static void raw_close(BlockDriverState *bs)
 {
@@ -545,6 +549,35 @@ static void raw_flush(BlockDriverState *
     fsync(s->fd);
 }
 
+#ifndef _POSIX_ASYNCHRONOUS_IO
+void qemu_aio_init(void)
+{
+}
+
+void qemu_aio_poll(void)
+{
+}
+
+void qemu_aio_flush(void)
+{
+}
+
+void qemu_aio_wait_start(void)
+{
+}
+
+void qemu_aio_wait(void)
+{
+#ifndef QEMU_IMG
+    qemu_bh_poll();
+#endif
+}
+
+void qemu_aio_wait_end(void)
+{
+}
+#endif
+
 BlockDriver bdrv_raw = {
     "raw",
     sizeof(BDRVRawState),
@@ -556,10 +589,12 @@ BlockDriver bdrv_raw = {
     raw_create,
     raw_flush,

+#ifdef _POSIX_ASYNCHRONOUS_IO
     .bdrv_aio_read = raw_aio_read,
     .bdrv_aio_write = raw_aio_write,
     .bdrv_aio_cancel = raw_aio_cancel,
     .aiocb_size = sizeof(RawAIOCB),
+#endif
     .protocol_name = "file",
     .bdrv_pread = raw_pread,
     .bdrv_pwrite = raw_pwrite,
@@ -908,10 +943,12 @@ BlockDriver bdrv_host_device = {
     NULL,
     raw_flush,

+#ifdef _POSIX_ASYNCHRONOUS_IO
     .bdrv_aio_read = raw_aio_read,
     .bdrv_aio_write = raw_aio_write,
     .bdrv_aio_cancel = raw_aio_cancel,
     .aiocb_size = sizeof(RawAIOCB),
+#endif
     .bdrv_pread = raw_pread,
     .bdrv_pwrite = raw_pwrite,
     .bdrv_getlength = raw_getlength,

$NetBSD: patch-ba,v 1.1 2007/12/24 10:18:22 apb Exp $

--- hw/pcspk.c.orig	2007-02-06 01:01:54.000000000 +0200
+++ hw/pcspk.c
@@ -38,7 +38,6 @@ typedef struct {
     unsigned int samples;
     unsigned int play_pos;
     int data_on;
-    int dummy_refresh_clock;
 } PCSpkState;
 
 static const char *s_spk = "pcspk";
@@ -112,15 +111,32 @@ int pcspk_audio_init(AudioState *audio)
     return 0;
 }
 
+/*
+ * Emulate the speaker port's refresh clock bit.  This is supposed
+ * to toggle between 0 and 1<<4 every 15 microseconds.  XXX: We use
+ * gettimeofday() in the real machine instead of a monotonic clock
+ * in the virtual machine, and we are a bit sloppy about the 15
+ * microseconds.  This should be good enough for crude loops that
+ * measure approximate delays by counting how often this line toggles.
+ */
+static uint32_t pcspk_dummy_refresh_clock(void)
+{
+    struct timeval tv;
+
+    gettimeofday(&tv, NULL);
+    return ((tv.tv_sec ^ (tv.tv_usec / 15)) & 1) << 4;
+}
+
 static uint32_t pcspk_ioport_read(void *opaque, uint32_t addr)
 {
     PCSpkState *s = opaque;
     int out;
+    int dummy_refresh_clock;
 
-    s->dummy_refresh_clock ^= (1 << 4);
     out = pit_get_out(s->pit, 2, qemu_get_clock(vm_clock)) << 5;
 
-    return pit_get_gate(s->pit, 2) | (s->data_on << 1) | s->dummy_refresh_clock | out;
+    return pit_get_gate(s->pit, 2) | (s->data_on << 1) |
+	pcspk_dummy_refresh_clock() | out;
 }
 
 static void pcspk_ioport_write(void *opaque, uint32_t addr, uint32_t val)

Reply via email to