From 4dbc6a77385b220b157c6a605629fbab33ad34c4 Mon Sep 17 00:00:00 2001 From: todd Date: Wed, 8 Feb 2006 13:44:17 +0000 Subject: [PATCH] o from the qemu mailing list, prompted by brad@, improve userland networking througput since otherwise the emulated NICs didn't have a way of indicating the receive queue is full and would drop packets. o bump PKGNAME o inttypes.h made irrelevent a few chunks of patches, so use it instead --- emulators/qemu/Makefile | 3 +- emulators/qemu/patches/patch-audio_audio_c | 16 --- emulators/qemu/patches/patch-configure | 7 +- emulators/qemu/patches/patch-hw_lance_c | 24 +++++ emulators/qemu/patches/patch-hw_ne2000_c | 71 ++++++++++++++ emulators/qemu/patches/patch-hw_smc91c111_c | 30 ++++++ emulators/qemu/patches/patch-vl_c | 102 ++++++++++++++++++-- emulators/qemu/patches/patch-vl_h | 38 ++++++-- emulators/qemu/pkg/MESSAGE | 7 +- 9 files changed, 260 insertions(+), 38 deletions(-) delete mode 100644 emulators/qemu/patches/patch-audio_audio_c create mode 100644 emulators/qemu/patches/patch-hw_lance_c create mode 100644 emulators/qemu/patches/patch-hw_ne2000_c create mode 100644 emulators/qemu/patches/patch-hw_smc91c111_c diff --git a/emulators/qemu/Makefile b/emulators/qemu/Makefile index 185da1a92bd..69814e9fc7e 100644 --- a/emulators/qemu/Makefile +++ b/emulators/qemu/Makefile @@ -1,10 +1,11 @@ -# $OpenBSD: Makefile,v 1.10 2006/01/04 21:47:39 brad Exp $ +# $OpenBSD: Makefile,v 1.11 2006/02/08 13:44:17 todd Exp $ # no success building on other archs yet ONLY_FOR_ARCHS= amd64 arm i386 powerpc COMMENT= "multi system emulator" DISTNAME= qemu-0.8.0 +PKGNAME= ${DISTNAME}p1 CATEGORIES= emulators HOMEPAGE= http://fabrice.bellard.free.fr/qemu/ diff --git a/emulators/qemu/patches/patch-audio_audio_c b/emulators/qemu/patches/patch-audio_audio_c deleted file mode 100644 index a073ba6947b..00000000000 --- a/emulators/qemu/patches/patch-audio_audio_c +++ /dev/null @@ -1,16 +0,0 @@ -$OpenBSD: patch-audio_audio_c,v 1.2 2005/12/27 07:56:15 todd Exp $ ---- audio/audio.c.orig Mon Dec 19 16:51:53 2005 -+++ audio/audio.c Tue Dec 20 10:59:25 2005 -@@ -55,6 +55,12 @@ static struct audio_driver *drvtab[] = { - &wav_audio_driver - }; - -+#ifdef __OpenBSD__ -+#include -+#define INT16_MAX SHRT_MAX -+#define UINT64_MAX ULONG_MAX -+#endif -+ - struct fixed_settings { - int enabled; - int nb_voices; diff --git a/emulators/qemu/patches/patch-configure b/emulators/qemu/patches/patch-configure index d6fac65df40..a6ae81bcabd 100644 --- a/emulators/qemu/patches/patch-configure +++ b/emulators/qemu/patches/patch-configure @@ -1,6 +1,6 @@ -$OpenBSD: patch-configure,v 1.3 2005/12/27 07:56:15 todd Exp $ +$OpenBSD: patch-configure,v 1.4 2006/02/08 13:44:17 todd Exp $ --- configure.orig Mon Dec 19 16:51:53 2005 -+++ configure Tue Dec 20 08:06:20 2005 ++++ configure Wed Feb 8 06:05:57 2006 @@ -21,8 +21,8 @@ prefix="" interp_prefix="/usr/gnemul/qemu-%M" static="no" @@ -79,14 +79,13 @@ $OpenBSD: patch-configure,v 1.3 2005/12/27 07:56:15 todd Exp $ fi if test "$coreaudio" = "yes" ; then echo "CONFIG_COREAUDIO=yes" >> $config_mak -@@ -655,6 +663,14 @@ if [ "$bsd" = "yes" ] ; then +@@ -655,6 +663,13 @@ if [ "$bsd" = "yes" ] ; then echo "#define MAP_ANONYMOUS MAP_ANON" >> $config_h echo "#define _BSD 1" >> $config_h fi + +if [ "$openbsd" = "yes" ] ; then + echo "#define ENOTSUP 4096" >> $config_h -+ echo "#define PRIx64 \"llX\"" >> $config_h + echo "#define qemu_siginfo siginfo_t" >> $config_h +else + echo "#define qemu_siginfo struct siginfo" >> $config_h diff --git a/emulators/qemu/patches/patch-hw_lance_c b/emulators/qemu/patches/patch-hw_lance_c new file mode 100644 index 00000000000..cc85baf2ebe --- /dev/null +++ b/emulators/qemu/patches/patch-hw_lance_c @@ -0,0 +1,24 @@ +$OpenBSD: patch-hw_lance_c,v 1.1 2006/02/08 13:44:17 todd Exp $ +--- hw/lance.c.orig Mon Dec 19 17:51:53 2005 ++++ hw/lance.c Sat Jan 28 22:10:33 2006 +@@ -283,6 +283,11 @@ static CPUWriteMemoryFunc *lance_mem_wri + + #define MIN_BUF_SIZE 60 + ++static void lance_can_receive(void *opaque) ++{ ++ return 1; ++} ++ + static void lance_receive(void *opaque, const uint8_t *buf, int size) + { + LANCEState *s = opaque; +@@ -440,7 +445,7 @@ void lance_init(NICInfo *nd, int irq, ui + + lance_reset(s); + +- s->vc = qemu_new_vlan_client(nd->vlan, lance_receive, s); ++ s->vc = qemu_new_vlan_client(nd->vlan, lance_receive, lance_can_receive, s); + + snprintf(s->vc->info_str, sizeof(s->vc->info_str), + "lance macaddr=%02x:%02x:%02x:%02x:%02x:%02x", diff --git a/emulators/qemu/patches/patch-hw_ne2000_c b/emulators/qemu/patches/patch-hw_ne2000_c new file mode 100644 index 00000000000..023cdfe3153 --- /dev/null +++ b/emulators/qemu/patches/patch-hw_ne2000_c @@ -0,0 +1,71 @@ +$OpenBSD: patch-hw_ne2000_c,v 1.1 2006/02/08 13:44:17 todd Exp $ +--- hw/ne2000.c.orig Mon Dec 19 17:51:53 2005 ++++ hw/ne2000.c Sat Jan 28 22:10:33 2006 +@@ -200,14 +200,10 @@ static int compute_mcast_idx(const uint8 + return (crc >> 26); + } + +-/* return the max buffer size if the NE2000 can receive more data */ +-static int ne2000_can_receive(void *opaque) ++static int ne2000_buffer_full(NE2000State *s) + { +- NE2000State *s = opaque; + int avail, index, boundary; +- +- if (s->cmd & E8390_STOP) +- return 0; ++ + index = s->curpag << 8; + boundary = s->boundary << 8; + if (index < boundary) +@@ -215,10 +211,19 @@ static int ne2000_can_receive(void *opaq + else + avail = (s->stop - s->start) - (index - boundary); + if (avail < (MAX_ETH_FRAME_SIZE + 4)) +- return 0; +- return MAX_ETH_FRAME_SIZE; ++ return 1; ++ return 0; + } + ++static int ne2000_can_receive(void *opaque) ++{ ++ NE2000State *s = opaque; ++ ++ if (s->cmd & E8390_STOP) ++ return 1; ++ return !ne2000_buffer_full(s); ++} ++ + #define MIN_BUF_SIZE 60 + + static void ne2000_receive(void *opaque, const uint8_t *buf, int size) +@@ -234,7 +239,7 @@ static void ne2000_receive(void *opaque, + printf("NE2000: received len=%d\n", size); + #endif + +- if (!ne2000_can_receive(s)) ++ if (s->cmd & E8390_STOP || ne2000_buffer_full(s)) + return; + + /* XXX: check this */ +@@ -715,7 +720,8 @@ void isa_ne2000_init(int base, int irq, + + ne2000_reset(s); + +- s->vc = qemu_new_vlan_client(nd->vlan, ne2000_receive, s); ++ s->vc = qemu_new_vlan_client(nd->vlan, ne2000_receive, ++ ne2000_can_receive, s); + + snprintf(s->vc->info_str, sizeof(s->vc->info_str), + "ne2000 macaddr=%02x:%02x:%02x:%02x:%02x:%02x", +@@ -784,7 +790,8 @@ void pci_ne2000_init(PCIBus *bus, NICInf + s->pci_dev = (PCIDevice *)d; + memcpy(s->macaddr, nd->macaddr, 6); + ne2000_reset(s); +- s->vc = qemu_new_vlan_client(nd->vlan, ne2000_receive, s); ++ s->vc = qemu_new_vlan_client(nd->vlan, ne2000_receive, ++ ne2000_can_receive, s); + + snprintf(s->vc->info_str, sizeof(s->vc->info_str), + "ne2000 pci macaddr=%02x:%02x:%02x:%02x:%02x:%02x", diff --git a/emulators/qemu/patches/patch-hw_smc91c111_c b/emulators/qemu/patches/patch-hw_smc91c111_c new file mode 100644 index 00000000000..641281bb029 --- /dev/null +++ b/emulators/qemu/patches/patch-hw_smc91c111_c @@ -0,0 +1,30 @@ +$OpenBSD: patch-hw_smc91c111_c,v 1.1 2006/02/08 13:44:17 todd Exp $ +--- hw/smc91c111.c.orig Mon Dec 19 17:51:53 2005 ++++ hw/smc91c111.c Sat Jan 28 22:10:33 2006 +@@ -593,6 +593,17 @@ static uint32_t smc91c111_readl(void *op + return val; + } + ++static int smc91c111_can_receive(void *opaque) ++{ ++ smc91c111_state *s = (smc91c111_state *)opaque; ++ ++ if ((s->rcr & RCR_RXEN) == 0 || (s->rcr & RCR_SOFT_RST)) ++ return 1; ++ if (s->allocated == (1 << NUM_PACKETS) - 1) ++ return 0; ++ return 1; ++} ++ + static void smc91c111_receive(void *opaque, const uint8_t *buf, int size) + { + smc91c111_state *s = (smc91c111_state *)opaque; +@@ -697,6 +708,7 @@ void smc91c111_init(NICInfo *nd, uint32_ + + smc91c111_reset(s); + +- s->vc = qemu_new_vlan_client(nd->vlan, smc91c111_receive, s); ++ s->vc = qemu_new_vlan_client(nd->vlan, smc91c111_receive, ++ smc91c111_can_receive, s); + /* ??? Save/restore. */ + } diff --git a/emulators/qemu/patches/patch-vl_c b/emulators/qemu/patches/patch-vl_c index 51898ddc93f..404b1260012 100644 --- a/emulators/qemu/patches/patch-vl_c +++ b/emulators/qemu/patches/patch-vl_c @@ -1,6 +1,6 @@ -$OpenBSD: patch-vl_c,v 1.5 2005/12/27 07:56:15 todd Exp $ ---- vl.c.orig Mon Dec 19 16:51:53 2005 -+++ vl.c Tue Dec 20 10:53:26 2005 +$OpenBSD: patch-vl_c,v 1.6 2006/02/08 13:44:17 todd Exp $ +--- vl.c.orig Mon Dec 19 17:51:53 2005 ++++ vl.c Sat Jan 28 22:10:33 2006 @@ -43,7 +43,7 @@ #include #ifdef _BSD @@ -43,7 +43,73 @@ $OpenBSD: patch-vl_c,v 1.5 2005/12/27 07:56:15 todd Exp $ #endif static int64_t cpu_ticks_offset; -@@ -2037,11 +2054,35 @@ static int tap_open(char *ifname, int if +@@ -1768,13 +1785,16 @@ VLANState *qemu_find_vlan(int id) + } + + VLANClientState *qemu_new_vlan_client(VLANState *vlan, +- IOReadHandler *fd_read, void *opaque) ++ IOReadHandler *fd_read, ++ IOCanRWHandler *fd_can_read, ++ void *opaque) + { + VLANClientState *vc, **pvc; + vc = qemu_mallocz(sizeof(VLANClientState)); + if (!vc) + return NULL; + vc->fd_read = fd_read; ++ vc->fd_can_read = fd_can_read; + vc->opaque = opaque; + vc->vlan = vlan; + +@@ -1786,6 +1806,20 @@ VLANClientState *qemu_new_vlan_client(VL + return vc; + } + ++int qemu_can_send_packet(VLANClientState *vc1) ++{ ++ VLANState *vlan = vc1->vlan; ++ VLANClientState *vc; ++ ++ for(vc = vlan->first_client; vc != NULL; vc = vc->next) { ++ if (vc != vc1) { ++ if (vc->fd_can_read && !vc->fd_can_read(vc->opaque)) ++ return 0; ++ } ++ } ++ return 1; ++} ++ + void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size) + { + VLANState *vlan = vc1->vlan; +@@ -1811,7 +1845,7 @@ static VLANClientState *slirp_vc; + + int slirp_can_output(void) + { +- return 1; ++ qemu_can_send_packet(slirp_vc); + } + + void slirp_output(const uint8_t *pkt, int pkt_len) +@@ -1839,7 +1873,7 @@ static int net_slirp_init(VLANState *vla + slirp_init(); + } + slirp_vc = qemu_new_vlan_client(vlan, +- slirp_receive, NULL); ++ slirp_receive, NULL, NULL); + snprintf(slirp_vc->info_str, sizeof(slirp_vc->info_str), "user redirector"); + return 0; + } +@@ -2024,7 +2058,7 @@ static TAPState *net_tap_fd_init(VLANSta + if (!s) + return NULL; + s->fd = fd; +- s->vc = qemu_new_vlan_client(vlan, tap_receive, s); ++ s->vc = qemu_new_vlan_client(vlan, tap_receive, NULL, s); + qemu_set_fd_handler(s->fd, tap_send, NULL, s); + snprintf(s->vc->info_str, sizeof(s->vc->info_str), "tap: fd=%d", fd); + return s; +@@ -2037,11 +2071,35 @@ static int tap_open(char *ifname, int if char *dev; struct stat s; @@ -79,7 +145,25 @@ $OpenBSD: patch-vl_c,v 1.5 2005/12/27 07:56:15 todd Exp $ fstat(fd, &s); dev = devname(s.st_rdev, S_IFCHR); -@@ -3986,6 +4027,7 @@ void help(void) +@@ -2327,7 +2385,7 @@ static NetSocketState *net_socket_fd_ini + return NULL; + s->fd = fd; + +- s->vc = qemu_new_vlan_client(vlan, net_socket_receive_dgram, s); ++ s->vc = qemu_new_vlan_client(vlan, net_socket_receive_dgram, NULL, s); + qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s); + + /* mcast: save bound address as dst */ +@@ -2355,7 +2413,7 @@ static NetSocketState *net_socket_fd_ini + return NULL; + s->fd = fd; + s->vc = qemu_new_vlan_client(vlan, +- net_socket_receive, s); ++ net_socket_receive, NULL, s); + snprintf(s->vc->info_str, sizeof(s->vc->info_str), + "socket: fd=%d", fd); + if (is_connected) { +@@ -3986,6 +4044,7 @@ void help(void) #if defined(TARGET_PPC) || defined(TARGET_SPARC) "-g WxH[xDEPTH] Set the initial graphical resolution and depth\n" #endif @@ -87,7 +171,7 @@ $OpenBSD: patch-vl_c,v 1.5 2005/12/27 07:56:15 todd Exp $ "\n" "Network options:\n" "-net nic[,vlan=n][,macaddr=addr]\n" -@@ -4093,6 +4135,7 @@ enum { +@@ -4093,6 +4152,7 @@ enum { QEMU_OPTION_audio_help, QEMU_OPTION_soundhw, #endif @@ -95,7 +179,7 @@ $OpenBSD: patch-vl_c,v 1.5 2005/12/27 07:56:15 todd Exp $ QEMU_OPTION_net, QEMU_OPTION_tftp, -@@ -4195,6 +4238,7 @@ const QEMUOption qemu_options[] = { +@@ -4195,6 +4255,7 @@ const QEMUOption qemu_options[] = { /* temporary options */ { "usb", 0, QEMU_OPTION_usb }, @@ -103,7 +187,7 @@ $OpenBSD: patch-vl_c,v 1.5 2005/12/27 07:56:15 todd Exp $ { "cirrusvga", 0, QEMU_OPTION_cirrusvga }, { NULL }, }; -@@ -4441,7 +4485,7 @@ int main(int argc, char **argv) +@@ -4441,7 +4502,7 @@ int main(int argc, char **argv) serial_devices[i][0] = '\0'; serial_device_index = 0; @@ -112,7 +196,7 @@ $OpenBSD: patch-vl_c,v 1.5 2005/12/27 07:56:15 todd Exp $ for(i = 1; i < MAX_PARALLEL_PORTS; i++) parallel_devices[i][0] = '\0'; parallel_device_index = 0; -@@ -4601,6 +4645,9 @@ int main(int argc, char **argv) +@@ -4601,6 +4662,9 @@ int main(int argc, char **argv) optarg); nb_net_clients++; break; diff --git a/emulators/qemu/patches/patch-vl_h b/emulators/qemu/patches/patch-vl_h index 756fe641a48..665946c68f5 100644 --- a/emulators/qemu/patches/patch-vl_h +++ b/emulators/qemu/patches/patch-vl_h @@ -1,16 +1,40 @@ -$OpenBSD: patch-vl_h,v 1.2 2005/12/27 07:56:15 todd Exp $ ---- vl.h.orig Mon Dec 19 16:51:53 2005 -+++ vl.h Tue Dec 20 10:55:04 2005 -@@ -729,6 +729,12 @@ int fdctrl_get_drive_type(fdctrl_t *fdct +$OpenBSD: patch-vl_h,v 1.3 2006/02/08 13:44:17 todd Exp $ +--- vl.h.orig Mon Dec 19 17:51:53 2005 ++++ vl.h Sat Jan 28 22:10:33 2006 +@@ -279,6 +279,9 @@ typedef struct VLANClientState VLANClien + + struct VLANClientState { + IOReadHandler *fd_read; ++ /* Packets may still be sent if this returns zero. It's used to ++ rate-limit the slirp code. */ ++ IOCanRWHandler *fd_can_read; + void *opaque; + struct VLANClientState *next; + struct VLANState *vlan; +@@ -293,8 +296,12 @@ typedef struct VLANState { + + VLANState *qemu_find_vlan(int id); + VLANClientState *qemu_new_vlan_client(VLANState *vlan, +- IOReadHandler *fd_read, void *opaque); ++ IOReadHandler *fd_read, ++ IOCanRWHandler *fd_can_read, ++ void *opaque); ++int qemu_can_send_packet(VLANClientState *vc); + void qemu_send_packet(VLANClientState *vc, const uint8_t *buf, int size); ++void qemu_handler_true(void *opaque); + + void do_info_network(void); + +@@ -728,6 +735,12 @@ int fdctrl_get_drive_type(fdctrl_t *fdct + void isa_ne2000_init(int base, int irq, NICInfo *nd); void pci_ne2000_init(PCIBus *bus, NICInfo *nd); - ++ +/* pcnet.c */ + +extern int nic_pcnet; + +void pci_pcnet_init(PCIBus *bus, NICInfo *nd); -+ + /* pckbd.c */ - void kbd_init(void); diff --git a/emulators/qemu/pkg/MESSAGE b/emulators/qemu/pkg/MESSAGE index 76ed58ba797..7eb694e7edc 100644 --- a/emulators/qemu/pkg/MESSAGE +++ b/emulators/qemu/pkg/MESSAGE @@ -2,6 +2,11 @@ | Quick Start: | 1. get a bootable floppy image | 2. qemu-img create -f qcow virtual.hd 10G -| 3. qemu -m 32 -fda floppy.fs -boot a virtual.hd +| 3. qemu -m 32 -fda floppy.fs -boot a -monitor stdio virtual.hd +| (initial install to hard drive) +| 4. qemu-img convert -c -O qcow virtual.hd tmp && mv tmp virtual.hd +| (compress hard drive while qemu is not running) +| 5. qemu -m 32 -monitor stdio virtual.hd +| (normal boot from hard drive) +---------------