add pcnet nic support
This commit is contained in:
todd 2005-08-11 01:15:17 +00:00
parent 3a793e5c14
commit fc1ebc4565
24 changed files with 2271 additions and 186 deletions

View File

@ -1,9 +1,9 @@
# $OpenBSD: Makefile,v 1.2 2005/03/08 16:29:43 todd Exp $
# $OpenBSD: Makefile,v 1.3 2005/08/11 01:15:17 todd Exp $
ONLY_FOR_ARCHS= i386 macppc # no success building on other archs yet
COMMENT= "multi system emulator"
DISTNAME= qemu-20050227
DISTNAME= qemu-0.7.1
CATEGORIES= emulators
HOMEPAGE= http://fabrice.bellard.free.fr/qemu/
@ -15,7 +15,7 @@ PERMIT_PACKAGE_FTP= Yes
PERMIT_DISTFILES_CDROM= Yes
PERMIT_DISTFILES_FTP= Yes
MASTER_SITES= ftp://ftp.FreeDaemonHosting.com/pub/users/todd/
MASTER_SITES= ${HOMEPAGE}
BUILD_DEPENDS= ::textproc/texi2html
LIB_DEPENDS= SDL::devel/sdl

View File

@ -1,4 +1,4 @@
MD5 (qemu-20050227.tar.gz) = d1bf3565aae1a28ab30d942f67b19638
RMD160 (qemu-20050227.tar.gz) = 5ada7c35e540a3df0383f4038a51826a58e8138c
SHA1 (qemu-20050227.tar.gz) = b78fbf6e5c9fda5e0366148e1ad97dee73f74619
SIZE (qemu-20050227.tar.gz) = 1120987
MD5 (qemu-0.7.1.tar.gz) = b0c80d2c082049a5b8ccbc7f55fe165b
RMD160 (qemu-0.7.1.tar.gz) = a1e8a9e934f6a7e585aed5ba99cbf3208f24bc6a
SHA1 (qemu-0.7.1.tar.gz) = 88388d41ed232df4b9d76688814c64cb58b08c9d
SIZE (qemu-0.7.1.tar.gz) = 1338521

View File

@ -1,46 +1,59 @@
$OpenBSD: patch-Makefile,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
--- Makefile.orig Thu Feb 10 15:48:51 2005
+++ Makefile Sun Feb 27 17:18:43 2005
@@ -1,10 +1,10 @@
-include config-host.mak
$OpenBSD: patch-Makefile,v 1.2 2005/08/11 01:15:17 todd Exp $
--- Makefile.orig Wed Apr 27 15:52:05 2005
+++ Makefile Thu Apr 28 15:49:11 2005
@@ -15,7 +15,7 @@ DOCS=qemu-doc.html qemu-tech.html qemu.1
-CFLAGS=-Wall -O2 -g -fno-strict-aliasing
+#CFLAGS=-Wall -O2 -g -fno-strict-aliasing
ifdef CONFIG_DARWIN
CFLAGS+= -mdynamic-no-pic
endif
-LDFLAGS=-g
+#LDFLAGS=-g
LIBS=
DEFINES+=-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
TOOLS=qemu-img$(EXESUF)
@@ -50,21 +50,19 @@ ar de en-us fi fr-be hr
all: dyngen$(EXESUF) $(TOOLS) $(DOCS)
for d in $(TARGET_DIRS); do \
- $(MAKE) -C $$d $@ || exit 1 ; \
+ $(MAKE) -C $$d $@ || exit $$? ; \
done
ifdef CONFIG_KQEMU
ifdef CONFIG_WIN32
@@ -37,7 +37,7 @@ clean:
rm -f *.o *.a $(TOOLS) dyngen$(EXESUF) TAGS *.pod *~ */*~
$(MAKE) -C tests clean
for d in $(TARGET_DIRS); do \
- $(MAKE) -C $$d $@ || exit 1 ; \
+ $(MAKE) -C $$d $@ || exit $$? ; \
done
ifdef CONFIG_KQEMU
$(MAKE) -C kqemu clean
@@ -46,13 +46,18 @@ endif
distclean: clean
rm -f config-host.mak config-host.h
for d in $(TARGET_DIRS); do \
- rm -rf $$d || exit 1 ; \
+ rm -rf $$d || exit $$? ; \
done
KEYMAPS=da en-gb et fr fr-ch is lt modifiers no pt-br sv \
ar de en-us fi fr-be hr it lv nl pl ru th \
common de-ch es fo fr-ca hu ja mk nl-be pt sl tr
+bindir=${PREFIX}/bin
+docdir=${PREFIX}/share/doc/qemu
+datadir=${PREFIX}/share/qemu
+mandir=${PREFIX}/man
+
install: all
- mkdir -p "$(bindir)"
- install -m 755 -s $(TOOLS) "$(bindir)"
- mkdir -p "$(datadir)"
+ mkdir -p $(PREFIX)/share/qemu
+ install -m 755 -s $(TOOLS) $(PREFIX)/bin
install -m 644 pc-bios/bios.bin pc-bios/vgabios.bin \
pc-bios/vgabios-cirrus.bin \
pc-bios/ppc_rom.bin \
pc-bios/proll.elf \
- pc-bios/linux_boot.bin "$(datadir)"
- mkdir -p "$(docdir)"
- install -m 644 qemu-doc.html qemu-tech.html "$(docdir)"
+ pc-bios/linux_boot.bin $(PREFIX)/share/qemu
+ mkdir -p $(PREFIX)/share/doc/qemu
+ install -m 644 qemu-doc.html qemu-tech.html $(PREFIX)/share/doc/qemu
ifndef CONFIG_WIN32
- mkdir -p "$(mandir)/man1"
- install qemu.1 qemu-img.1 "$(mandir)/man1"
- mkdir -p "$(datadir)/keymaps"
- install -m 644 $(addprefix keymaps/,$(KEYMAPS)) "$(datadir)/keymaps"
+ install qemu.1 qemu-img.1 $(PREFIX)/man/man1
+ mkdir -p $(PREFIX)/share/qemu/keymaps
+ install -m 644 $(addprefix keymaps/,$(KEYMAPS)) $(PREFIX)/share/qemu/keymaps
mkdir -p "$(bindir)"
install -m 755 -s $(TOOLS) "$(bindir)"
@@ -71,7 +76,7 @@ ifndef CONFIG_WIN32
install -m 644 $(addprefix keymaps/,$(KEYMAPS)) "$(datadir)/keymaps"
endif
for d in $(TARGET_DIRS); do \
$(MAKE) -C $$d $@ || exit 1 ; \
- $(MAKE) -C $$d $@ || exit 1 ; \
+ $(MAKE) -C $$d $@ || exit $$? ; \
done
ifdef CONFIG_KQEMU
cd kqemu ; ./install.sh
@@ -86,7 +91,7 @@ TAGS:
# documentation
%.html: %.texi
- texi2html -monolithic -number $<
+ -texi2html -monolithic -number $<
qemu.1: qemu-doc.texi
./texi2pod.pl $< qemu.pod

View File

@ -1,7 +1,7 @@
$OpenBSD: patch-Makefile_target,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
--- Makefile.target.orig Tue Feb 22 13:27:14 2005
+++ Makefile.target Tue Mar 1 17:22:05 2005
@@ -14,7 +14,7 @@ ifdef CONFIG_USER_ONLY
$OpenBSD: patch-Makefile_target,v 1.2 2005/08/11 01:15:17 todd Exp $
--- Makefile.target.orig Sun Jul 24 13:52:08 2005
+++ Makefile.target Wed Aug 10 16:00:09 2005
@@ -17,7 +17,7 @@ ifdef CONFIG_USER_ONLY
VPATH+=:$(SRC_PATH)/linux-user
DEFINES+=-I$(SRC_PATH)/linux-user -I$(SRC_PATH)/linux-user/$(TARGET_ARCH)
endif
@ -10,19 +10,27 @@ $OpenBSD: patch-Makefile_target,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
#CFLAGS+=-Werror
LDFLAGS=-g
LIBS=
@@ -127,6 +127,11 @@ else
@@ -66,6 +66,10 @@ else
OP_CFLAGS+= -malign-functions=0
endif
+ifeq ($(shell uname -s),OpenBSD)
+OP_CFLAGS+= -fno-stack-protector
+endif
+
+
ifdef TARGET_GPROF
USE_I386_LD=y
endif
@@ -312,7 +317,10 @@ AUDIODRV += sdlaudio.o
@@ -151,6 +155,8 @@ endif
#########################################################
DEFINES+=-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
+
+DEFINES+= #-DDEBUG_GDB -DDEBUG -DDEBUG_KBD -DDEBUG_MOUSE
LIBS+=-lm
ifndef CONFIG_USER_ONLY
LIBS+=-lz
@@ -269,7 +275,10 @@ AUDIODRV += sdlaudio.o
endif
ifdef CONFIG_OSS
AUDIODRV += ossaudio.o
@ -33,21 +41,20 @@ $OpenBSD: patch-Makefile_target,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
pc.o: DEFINES := -DUSE_SB16 $(DEFINES)
@@ -404,7 +412,7 @@ gen-op.h: op.o $(DYNGEN)
$(DYNGEN) -g -o $@ $<
op.o: op.c
- $(CC) $(OP_CFLAGS) $(DEFINES) -c -o $@ $<
+ $(CC) $(OP_CFLAGS) $(DEFINES) -fno-stack-protector -c -o $@ $<
helper.o: helper.c
$(CC) $(HELPER_CFLAGS) $(DEFINES) -c -o $@ $<
@@ -439,7 +447,7 @@ clean:
@@ -288,6 +297,7 @@ ifeq ($(TARGET_BASE_ARCH), i386)
VL_OBJS+= ide.o ne2000.o pckbd.o vga.o $(SOUND_HW) dma.o $(AUDIODRV)
VL_OBJS+= fdc.o mc146818rtc.o serial.o i8259.o i8254.o pc.o
VL_OBJS+= cirrus_vga.o mixeng.o apic.o parallel.o
+VL_OBJS+= pcnet.o
endif
ifeq ($(TARGET_BASE_ARCH), ppc)
VL_OBJS+= ppc.o ide.o ne2000.o pckbd.o vga.o $(SOUND_HW) dma.o $(AUDIODRV)
@@ -427,7 +437,7 @@ clean:
install: all
ifneq ($(PROGS),)
- install -m 755 -s $(PROGS) "$(bindir)"
+ install -m 755 -s $(PROGS) $(PREFIX)/bin/
+ install -m 755 -s $(PROGS) "$(PREFIX)/bin/"
endif
ifneq ($(wildcard .depend),)

View File

@ -1,6 +1,17 @@
$OpenBSD: patch-configure,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
--- configure.orig Sat Feb 19 11:24:28 2005
+++ configure Sun Feb 27 15:47:13 2005
$OpenBSD: patch-configure,v 1.2 2005/08/11 01:15:17 todd Exp $
--- configure.orig Sun Jul 24 13:52:08 2005
+++ configure Tue Aug 9 22:34:48 2005
@@ -21,8 +21,8 @@ prefix=""
interp_prefix="/usr/gnemul/qemu-%M"
static="no"
cross_prefix=""
-cc="gcc"
-host_cc="gcc"
+cc="${CC:-cc}"
+host_cc="${CC:-cc}"
ar="ar"
make="make"
strip="strip"
@@ -41,7 +41,7 @@ case "$cpu" in
alpha)
cpu="alpha"
@ -10,7 +21,7 @@ $OpenBSD: patch-configure,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
cpu="powerpc"
;;
mips)
@@ -100,6 +100,7 @@ oss="yes"
@@ -109,6 +109,7 @@ oss="yes"
;;
OpenBSD)
bsd="yes"
@ -18,7 +29,7 @@ $OpenBSD: patch-configure,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
oss="yes"
;;
Darwin)
@@ -341,7 +342,7 @@ else
@@ -366,7 +367,7 @@ else
if test -z "$prefix" ; then
prefix="/usr/local"
fi
@ -27,17 +38,28 @@ $OpenBSD: patch-configure,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
datadir="$prefix/share/qemu"
docdir="$prefix/share/doc/qemu"
bindir="$prefix/bin"
@@ -533,6 +534,9 @@ fi
@@ -434,9 +435,7 @@ if test "$darwin" = "yes" ; then
echo "Cocoa support $cocoa"
fi
echo "SDL support $sdl"
-if test "$sdl" != "no" ; then
- echo "SDL static link $sdl_static"
-fi
+echo "SDL static link $sdl_static"
echo "mingw32 support $mingw32"
echo "Adlib support $adlib"
echo -n "FMOD support $fmod"
@@ -567,6 +566,9 @@ fi
if test "$oss" = "yes" ; then
echo "CONFIG_OSS=yes" >> $config_mak
echo "#define CONFIG_OSS 1" >> $config_h
+ if test "$openbsd"="yes" ; then
+ echo "CONFIG_OSS_LIBRARY=yes" >> $config_mak
+ echo "CONFIG_OSS_LIBRARY=yes" >> $config_mak
+ fi
fi
if test "$fmod" = "yes" ; then
echo "CONFIG_FMOD=yes" >> $config_mak
@@ -563,6 +567,15 @@ if [ "$bsd" = "yes" ] ; then
@@ -599,6 +601,14 @@ if [ "$bsd" = "yes" ] ; then
echo "#define MAP_ANONYMOUS MAP_ANON" >> $config_h
echo "#define _BSD 1" >> $config_h
fi
@ -49,7 +71,6 @@ $OpenBSD: patch-configure,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
+else
+ echo "#define qemu_siginfo struct siginfo" >> $config_h
+fi
+
for target in $target_list; do

View File

@ -1,6 +1,6 @@
$OpenBSD: patch-dyngen-exec_h,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
--- dyngen-exec.h.orig Sun Nov 14 14:51:33 2004
+++ dyngen-exec.h Sat Feb 26 03:21:02 2005
$OpenBSD: patch-dyngen-exec_h,v 1.2 2005/08/11 01:15:17 todd Exp $
--- dyngen-exec.h.orig Wed Apr 27 10:09:39 2005
+++ dyngen-exec.h Wed Apr 27 10:23:02 2005
@@ -20,11 +20,15 @@
#if !defined(__DYNGEN_EXEC_H__)
#define __DYNGEN_EXEC_H__
@ -39,14 +39,6 @@ $OpenBSD: patch-dyngen-exec_h,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
#undef NULL
#define NULL 0
+#endif
#if defined(_BSD) && !defined(__APPLE__)
#include <ieeefp.h>
@@ -70,6 +79,7 @@ extern int printf(const char *, ...);
#define FE_UPWARD FP_RP
#define FE_TOWARDZERO FP_RZ
#define fesetround(x) fpsetround(x)
+#define fegetround() fpgetround()
#else
#include <fenv.h>
#endif
#ifdef __i386__
#define AREG0 "ebp"

View File

@ -0,0 +1,39 @@
$OpenBSD: patch-exec_c,v 1.1 2005/08/11 01:15:17 todd Exp $
--- exec.c.orig Sun Jul 24 13:52:08 2005
+++ exec.c Tue Aug 9 22:34:49 2005
@@ -2168,7 +2168,7 @@ void cpu_physical_memory_rw(target_phys_
target_phys_addr_t page;
unsigned long pd;
PhysPageDesc *p;
-
+
while (len > 0) {
page = addr & TARGET_PAGE_MASK;
l = (page + TARGET_PAGE_SIZE) - addr;
@@ -2180,22 +2180,22 @@ void cpu_physical_memory_rw(target_phys_
} else {
pd = p->phys_offset;
}
-
+
if (is_write) {
if ((pd & ~TARGET_PAGE_MASK) != 0) {
io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
if (l >= 4 && ((addr & 3) == 0)) {
- /* 32 bit read access */
+ /* 32 bit write access */
val = ldl_p(buf);
io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
l = 4;
} else if (l >= 2 && ((addr & 1) == 0)) {
- /* 16 bit read access */
+ /* 16 bit write access */
val = lduw_p(buf);
io_mem_write[io_index][1](io_mem_opaque[io_index], addr, val);
l = 2;
} else {
- /* 8 bit access */
+ /* 8 bit write access */
val = ldub_p(buf);
io_mem_write[io_index][0](io_mem_opaque[io_index], addr, val);
l = 1;

View File

@ -0,0 +1,11 @@
$OpenBSD: patch-fpu_softfloat-native_c,v 1.1 2005/08/11 01:15:17 todd Exp $
--- fpu/softfloat-native.c.orig Wed Apr 27 13:53:34 2005
+++ fpu/softfloat-native.c Wed Apr 27 14:26:20 2005
@@ -1,6 +1,7 @@
/* Native implementation of soft float functions. Only a single status
context is supported */
#include "softfloat.h"
+#include "gnu-c99-math.h"
#include <math.h>
void set_float_rounding_mode(int val STATUS_PARAM)

View File

@ -0,0 +1,21 @@
$OpenBSD: patch-fpu_softfloat-native_h,v 1.1 2005/08/11 01:15:17 todd Exp $
--- fpu/softfloat-native.h.orig Sun Mar 20 04:33:58 2005
+++ fpu/softfloat-native.h Wed Apr 27 14:27:41 2005
@@ -1,4 +1,5 @@
/* Native implementation of soft float functions */
+#include "gnu-c99-math.h"
#include <math.h>
#if defined(_BSD) && !defined(__APPLE__)
#include <ieeefp.h>
@@ -34,6 +35,11 @@ typedef union {
| Software IEC/IEEE floating-point rounding mode.
*----------------------------------------------------------------------------*/
#if defined(_BSD) && !defined(__APPLE__)
+#if defined(__OpenBSD__)
+#define FE_RM FP_RM
+#define FE_RP FP_RP
+#define FE_RZ FP_RZ
+#endif
enum {
float_round_nearest_even = FP_RN,
float_round_down = FE_RM,

View File

@ -0,0 +1,28 @@
$OpenBSD: patch-gnu-c99-math_h,v 1.1 2005/08/11 01:15:17 todd Exp $
--- gnu-c99-math.h.orig Thu Apr 28 15:16:19 2005
+++ gnu-c99-math.h Thu Apr 28 15:38:01 2005
@@ -0,0 +1,24 @@
+#if (defined(__sun__) || defined(__OpenBSD__)) && defined(__GNUC__)
+
+/*
+ * C99 7.12.3 classification macros
+ * and
+ * C99 7.12.14 comparison macros
+ *
+ * ... do not work on Solaris 10 using GNU CC 3.4.x.
+ * Try to workaround the missing / broken C99 math macros.
+ */
+#include <ieeefp.h>
+
+#define isnormal(x) (fabs(x) < DBL_EPSILON && !isnan(x) && !isinf(x))
+
+#define isgreater(x, y) ((x) > (y))
+#define isgreaterequal(x, y) ((x) >= (y))
+#define isless(x, y) ((x) < (y))
+#define islessequal(x, y) ((x) <= (y))
+
+#define isunordered(x,y) (isnan(x) || isnan(y))
+#define lrintf(x) ((long)rintf(x))
+#define llrintf(x) ((long long)rintf(x))
+
+#endif

View File

@ -0,0 +1,38 @@
$OpenBSD: patch-hw_pc_c,v 1.1 2005/08/11 01:15:17 todd Exp $
--- hw/pc.c.orig Sun Jul 24 13:52:08 2005
+++ hw/pc.c Wed Aug 10 15:48:42 2005
@@ -414,7 +414,7 @@ static void pc_init1(int ram_size, int v
char buf[1024];
int ret, linux_boot, initrd_size, i, nb_nics1;
unsigned long bios_offset, vga_bios_offset;
- int bios_size, isa_bios_size;
+ int bios_size, isa_bios_size, vga_bios_size;
PCIBus *pci_bus;
linux_boot = (kernel_filename != NULL);
@@ -446,8 +446,12 @@ static void pc_init1(int ram_size, int v
} else {
snprintf(buf, sizeof(buf), "%s/%s", bios_dir, VGABIOS_FILENAME);
}
+ vga_bios_size = get_image_size(buf);
+ if (vga_bios_size != 32768)
+ goto bios_error;
+
ret = load_image(buf, phys_ram_base + vga_bios_offset);
-
+
/* setup basic memory access */
cpu_register_physical_memory(0xc0000, 0x10000,
vga_bios_offset | IO_MEM_ROM);
@@ -580,7 +584,10 @@ static void pc_init1(int ram_size, int v
if (pci_enabled) {
for(i = 0; i < nb_nics; i++) {
- pci_ne2000_init(pci_bus, &nd_table[i]);
+ if (nic_pcnet)
+ pci_pcnet_init(pci_bus, &nd_table[i]);
+ else
+ pci_ne2000_init(pci_bus, &nd_table[i]);
}
pci_piix3_ide_init(pci_bus, bs_table);
} else {

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,587 @@
$OpenBSD: patch-hw_pcnet_h,v 1.1 2005/08/11 01:15:17 todd Exp $
--- hw/pcnet.h.orig Wed Aug 10 15:48:42 2005
+++ hw/pcnet.h Wed Aug 10 15:48:42 2005
@@ -0,0 +1,583 @@
+/*
+ * QEMU AMD PC-Net II (Am79C970A) emulation
+ *
+ * Copyright (c) 2004 Antony T Curtis
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/* This software was written to be compatible with the specification:
+ * AMD Am79C970A PCnet-PCI II Ethernet Controller Data-Sheet
+ * AMD Publication# 19436 Rev:E Amendment/0 Issue Date: June 2000
+ */
+
+#ifdef __GNUC__
+#define PACKED(A) A __attribute__ ((packed))
+#else
+#error FixMe
+#endif
+
+/* BUS CONFIGURATION REGISTERS */
+#define BCR_MSRDA 0
+#define BCR_MSWRA 1
+#define BCR_MC 2
+#define BCR_LNKST 4
+#define BCR_LED1 5
+#define BCR_LED2 6
+#define BCR_LED3 7
+#define BCR_FDC 9
+#define BCR_BSBC 18
+#define BCR_EECAS 19
+#define BCR_SWS 20
+#define BCR_PLAT 22
+
+#define BCR_DWIO(S) !!((S)->bcr[BCR_BSBC] & 0x0080)
+#define BCR_SSIZE32(S) !!((S)->bcr[BCR_SWS ] & 0x0100)
+#define BCR_SWSTYLE(S) ((S)->bcr[BCR_SWS ] & 0x00FF)
+
+#define CSR_INIT(S) !!(((S)->csr[0])&0x0001)
+#define CSR_STRT(S) !!(((S)->csr[0])&0x0002)
+#define CSR_STOP(S) !!(((S)->csr[0])&0x0004)
+#define CSR_TDMD(S) !!(((S)->csr[0])&0x0008)
+#define CSR_TXON(S) !!(((S)->csr[0])&0x0010)
+#define CSR_RXON(S) !!(((S)->csr[0])&0x0020)
+#define CSR_INEA(S) !!(((S)->csr[0])&0x0040)
+#define CSR_LAPPEN(S) !!(((S)->csr[3])&0x0020)
+#define CSR_DXSUFLO(S) !!(((S)->csr[3])&0x0040)
+#define CSR_ASTRP_RCV(S) !!(((S)->csr[4])&0x0800)
+#define CSR_DPOLL(S) !!(((S)->csr[4])&0x1000)
+#define CSR_SPND(S) !!(((S)->csr[5])&0x0001)
+#define CSR_LTINTEN(S) !!(((S)->csr[5])&0x4000)
+#define CSR_TOKINTD(S) !!(((S)->csr[5])&0x8000)
+#define CSR_DRX(S) !!(((S)->csr[15])&0x0001)
+#define CSR_DTX(S) !!(((S)->csr[15])&0x0002)
+#define CSR_LOOP(S) !!(((S)->csr[15])&0x0004)
+#define CSR_DRCVPA(S) !!(((S)->csr[15])&0x2000)
+#define CSR_DRCVBC(S) !!(((S)->csr[15])&0x4000)
+#define CSR_PROM(S) !!(((S)->csr[15])&0x8000)
+
+#define CSR_CRBC(S) ((S)->csr[40])
+#define CSR_CRST(S) ((S)->csr[41])
+#define CSR_CXBC(S) ((S)->csr[42])
+#define CSR_CXST(S) ((S)->csr[43])
+#define CSR_NRBC(S) ((S)->csr[44])
+#define CSR_NRST(S) ((S)->csr[45])
+#define CSR_POLL(S) ((S)->csr[46])
+#define CSR_PINT(S) ((S)->csr[47])
+#define CSR_RCVRC(S) ((S)->csr[72])
+#define CSR_XMTRC(S) ((S)->csr[74])
+#define CSR_RCVRL(S) ((S)->csr[76])
+#define CSR_XMTRL(S) ((S)->csr[78])
+#define CSR_MISSC(S) ((S)->csr[112])
+
+#define CSR_IADR(S) ((S)->csr[ 1] | ((S)->csr[ 2] << 16))
+#define CSR_CRBA(S) ((S)->csr[18] | ((S)->csr[19] << 16))
+#define CSR_CXBA(S) ((S)->csr[20] | ((S)->csr[21] << 16))
+#define CSR_NRBA(S) ((S)->csr[22] | ((S)->csr[23] << 16))
+#define CSR_BADR(S) ((S)->csr[24] | ((S)->csr[25] << 16))
+#define CSR_NRDA(S) ((S)->csr[26] | ((S)->csr[27] << 16))
+#define CSR_CRDA(S) ((S)->csr[28] | ((S)->csr[29] << 16))
+#define CSR_BADX(S) ((S)->csr[30] | ((S)->csr[31] << 16))
+#define CSR_NXDA(S) ((S)->csr[32] | ((S)->csr[33] << 16))
+#define CSR_CXDA(S) ((S)->csr[34] | ((S)->csr[35] << 16))
+#define CSR_NNRD(S) ((S)->csr[36] | ((S)->csr[37] << 16))
+#define CSR_NNXD(S) ((S)->csr[38] | ((S)->csr[39] << 16))
+#define CSR_PXDA(S) ((S)->csr[60] | ((S)->csr[61] << 16))
+#define CSR_NXBA(S) ((S)->csr[64] | ((S)->csr[65] << 16))
+
+#define PHYSADDR(S,A) \
+ (BCR_SSIZE32(S) ? (A) : (A) | ((0xff00 & (uint32_t)(s)->csr[2])<<16))
+
+struct pcnet_initblk16 {
+ uint16_t mode;
+ uint16_t padr1;
+ uint16_t padr2;
+ uint16_t padr3;
+ uint16_t ladrf1;
+ uint16_t ladrf2;
+ uint16_t ladrf3;
+ uint16_t ladrf4;
+ unsigned PACKED(rdra:24);
+ unsigned PACKED(res1:5);
+ unsigned PACKED(rlen:3);
+ unsigned PACKED(tdra:24);
+ unsigned PACKED(res2:5);
+ unsigned PACKED(tlen:3);
+};
+
+struct pcnet_initblk32 {
+ uint16_t mode;
+ unsigned PACKED(res1:4);
+ unsigned PACKED(rlen:4);
+ unsigned PACKED(res2:4);
+ unsigned PACKED(tlen:4);
+ uint16_t padr1;
+ uint16_t padr2;
+ uint16_t padr3;
+ uint16_t _res;
+ uint16_t ladrf1;
+ uint16_t ladrf2;
+ uint16_t ladrf3;
+ uint16_t ladrf4;
+ uint32_t rdra;
+ uint32_t tdra;
+};
+
+struct pcnet_TMD {
+ struct {
+ unsigned tbadr:32;
+ } tmd0;
+ struct {
+ unsigned PACKED(bcnt:12), PACKED(ones:4), PACKED(res:7), PACKED(bpe:1);
+ unsigned PACKED(enp:1), PACKED(stp:1), PACKED(def:1), PACKED(one:1);
+ unsigned PACKED(ltint:1), PACKED(nofcs:1), PACKED(err:1), PACKED(own:1);
+ } tmd1;
+ struct {
+ unsigned PACKED(trc:4), PACKED(res:12);
+ unsigned PACKED(tdr:10), PACKED(rtry:1), PACKED(lcar:1);
+ unsigned PACKED(lcol:1), PACKED(exdef:1), PACKED(uflo:1), PACKED(buff:1);
+ } tmd2;
+ struct {
+ unsigned res:32;
+ } tmd3;
+};
+
+struct pcnet_RMD {
+ struct {
+ unsigned rbadr:32;
+ } rmd0;
+ struct {
+ unsigned PACKED(bcnt:12), PACKED(ones:4), PACKED(res:4);
+ unsigned PACKED(bam:1), PACKED(lafm:1), PACKED(pam:1), PACKED(bpe:1);
+ unsigned PACKED(enp:1), PACKED(stp:1), PACKED(buff:1), PACKED(crc:1);
+ unsigned PACKED(oflo:1), PACKED(fram:1), PACKED(err:1), PACKED(own:1);
+ } rmd1;
+ struct {
+ unsigned PACKED(mcnt:12), PACKED(zeros:4);
+ unsigned PACKED(rpc:8), PACKED(rcc:8);
+ } rmd2;
+ struct {
+ unsigned res:32;
+ } rmd3;
+};
+
+
+#define PRINT_TMD(T) printf( \
+ "TMD0 : TBADR=0x%08x\n" \
+ "TMD1 : OWN=%d, ERR=%d, FCS=%d, LTI=%d, " \
+ "ONE=%d, DEF=%d, STP=%d, ENP=%d,\n" \
+ " BPE=%d, BCNT=%d\n" \
+ "TMD2 : BUF=%d, UFL=%d, EXD=%d, LCO=%d, " \
+ "LCA=%d, RTR=%d,\n" \
+ " TDR=%d, TRC=%d\n", \
+ (T)->tmd0.tbadr, \
+ (T)->tmd1.own, (T)->tmd1.err, (T)->tmd1.nofcs, \
+ (T)->tmd1.ltint, (T)->tmd1.one, (T)->tmd1.def, \
+ (T)->tmd1.stp, (T)->tmd1.enp, (T)->tmd1.bpe, \
+ 4096-(T)->tmd1.bcnt, \
+ (T)->tmd2.buff, (T)->tmd2.uflo, (T)->tmd2.exdef,\
+ (T)->tmd2.lcol, (T)->tmd2.lcar, (T)->tmd2.rtry, \
+ (T)->tmd2.tdr, (T)->tmd2.trc)
+
+#define PRINT_RMD(R) printf( \
+ "RMD0 : RBADR=0x%08x\n" \
+ "RMD1 : OWN=%d, ERR=%d, FRAM=%d, OFLO=%d, " \
+ "CRC=%d, BUFF=%d, STP=%d, ENP=%d,\n " \
+ "BPE=%d, PAM=%d, LAFM=%d, BAM=%d, ONES=%d, BCNT=%d\n" \
+ "RMD2 : RCC=%d, RPC=%d, MCNT=%d, ZEROS=%d\n", \
+ (R)->rmd0.rbadr, \
+ (R)->rmd1.own, (R)->rmd1.err, (R)->rmd1.fram, \
+ (R)->rmd1.oflo, (R)->rmd1.crc, (R)->rmd1.buff, \
+ (R)->rmd1.stp, (R)->rmd1.enp, (R)->rmd1.bpe, \
+ (R)->rmd1.pam, (R)->rmd1.lafm, (R)->rmd1.bam, \
+ (R)->rmd1.ones, 4096-(R)->rmd1.bcnt, \
+ (R)->rmd2.rcc, (R)->rmd2.rpc, (R)->rmd2.mcnt, \
+ (R)->rmd2.zeros)
+
+static inline void pcnet_tmd_load(PCNetState *s, struct pcnet_TMD *tmd, target_phys_addr_t addr)
+{
+ if (!BCR_SWSTYLE(s)) {
+ uint16_t xda[4];
+ cpu_physical_memory_read(addr,
+ (void *)&xda[0], sizeof(xda));
+ ((uint32_t *)tmd)[0] = (xda[0]&0xffff) |
+ ((xda[1]&0x00ff) << 16);
+ ((uint32_t *)tmd)[1] = (xda[2]&0xffff)|
+ ((xda[1] & 0xff00) << 16);
+ ((uint32_t *)tmd)[2] =
+ (xda[3] & 0xffff) << 16;
+ ((uint32_t *)tmd)[3] = 0;
+ }
+ else
+ if (BCR_SWSTYLE(s) != 3)
+ cpu_physical_memory_read(addr, (void *)tmd, 16);
+ else {
+ uint32_t xda[4];
+ cpu_physical_memory_read(addr,
+ (void *)&xda[0], sizeof(xda));
+ ((uint32_t *)tmd)[0] = xda[2];
+ ((uint32_t *)tmd)[1] = xda[1];
+ ((uint32_t *)tmd)[2] = xda[0];
+ ((uint32_t *)tmd)[3] = xda[3];
+ }
+}
+
+static inline void pcnet_tmd_store(PCNetState *s, struct pcnet_TMD *tmd, target_phys_addr_t addr)
+{
+ cpu_physical_memory_set_dirty(addr);
+ if (!BCR_SWSTYLE(s)) {
+ uint16_t xda[4];
+ xda[0] = ((uint32_t *)tmd)[0] & 0xffff;
+ xda[1] = ((((uint32_t *)tmd)[0]>>16)&0x00ff) |
+ ((((uint32_t *)tmd)[1]>>16)&0xff00);
+ xda[2] = ((uint32_t *)tmd)[1] & 0xffff;
+ xda[3] = ((uint32_t *)tmd)[2] >> 16;
+ cpu_physical_memory_write(addr,
+ (void *)&xda[0], sizeof(xda));
+ cpu_physical_memory_set_dirty(addr+7);
+ }
+ else {
+ if (BCR_SWSTYLE(s) != 3)
+ cpu_physical_memory_write(addr, (void *)tmd, 16);
+ else {
+ uint32_t xda[4];
+ xda[0] = ((uint32_t *)tmd)[2];
+ xda[1] = ((uint32_t *)tmd)[1];
+ xda[2] = ((uint32_t *)tmd)[0];
+ xda[3] = ((uint32_t *)tmd)[3];
+ cpu_physical_memory_write(addr,
+ (void *)&xda[0], sizeof(xda));
+ }
+ cpu_physical_memory_set_dirty(addr+15);
+ }
+}
+
+static inline void pcnet_rmd_load(PCNetState *s, struct pcnet_RMD *rmd, target_phys_addr_t addr)
+{
+ if (!BCR_SWSTYLE(s)) {
+ uint16_t rda[4];
+ cpu_physical_memory_read(addr,
+ (void *)&rda[0], sizeof(rda));
+ ((uint32_t *)rmd)[0] = (rda[0]&0xffff)|
+ ((rda[1] & 0x00ff) << 16);
+ ((uint32_t *)rmd)[1] = (rda[2]&0xffff)|
+ ((rda[1] & 0xff00) << 16);
+ ((uint32_t *)rmd)[2] = rda[3] & 0xffff;
+ ((uint32_t *)rmd)[3] = 0;
+ }
+ else
+ if (BCR_SWSTYLE(s) != 3)
+ cpu_physical_memory_read(addr, (void *)rmd, 16);
+ else {
+ uint32_t rda[4];
+ cpu_physical_memory_read(addr,
+ (void *)&rda[0], sizeof(rda));
+ ((uint32_t *)rmd)[0] = rda[2];
+ ((uint32_t *)rmd)[1] = rda[1];
+ ((uint32_t *)rmd)[2] = rda[0];
+ ((uint32_t *)rmd)[3] = rda[3];
+ }
+}
+
+static inline void pcnet_rmd_store(PCNetState *s, struct pcnet_RMD *rmd, target_phys_addr_t addr)
+{
+ cpu_physical_memory_set_dirty(addr);
+ if (!BCR_SWSTYLE(s)) {
+ uint16_t rda[4]; \
+ rda[0] = ((uint32_t *)rmd)[0] & 0xffff; \
+ rda[1] = ((((uint32_t *)rmd)[0]>>16)&0xff)|\
+ ((((uint32_t *)rmd)[1]>>16)&0xff00);\
+ rda[2] = ((uint32_t *)rmd)[1] & 0xffff; \
+ rda[3] = ((uint32_t *)rmd)[2] & 0xffff; \
+ cpu_physical_memory_write(addr, \
+ (void *)&rda[0], sizeof(rda)); \
+ cpu_physical_memory_set_dirty(addr+7);
+ }
+ else {
+ if (BCR_SWSTYLE(s) != 3)
+ cpu_physical_memory_write(addr, (void *)rmd, 16);
+ else {
+ uint32_t rda[4];
+ rda[0] = ((uint32_t *)rmd)[2];
+ rda[1] = ((uint32_t *)rmd)[1];
+ rda[2] = ((uint32_t *)rmd)[0];
+ rda[3] = ((uint32_t *)rmd)[3];
+ cpu_physical_memory_write(addr,
+ (void *)&rda[0], sizeof(rda));
+ }
+ cpu_physical_memory_set_dirty(addr+15);
+ }
+}
+
+
+#define TMDLOAD(TMD,ADDR) pcnet_tmd_load(s,TMD,ADDR)
+
+#define TMDSTORE(TMD,ADDR) pcnet_tmd_store(s,TMD,ADDR)
+
+#define RMDLOAD(RMD,ADDR) pcnet_rmd_load(s,RMD,ADDR)
+
+#define RMDSTORE(RMD,ADDR) pcnet_rmd_store(s,RMD,ADDR)
+
+#if 1
+
+#define CHECK_RMD(ADDR,RES) do { \
+ struct pcnet_RMD rmd; \
+ RMDLOAD(&rmd,(ADDR)); \
+ (RES) |= (rmd.rmd1.ones != 15) \
+ || (rmd.rmd2.zeros != 0); \
+} while (0)
+
+#define CHECK_TMD(ADDR,RES) do { \
+ struct pcnet_TMD tmd; \
+ TMDLOAD(&tmd,(ADDR)); \
+ (RES) |= (tmd.tmd1.ones != 15); \
+} while (0)
+
+#else
+
+#define CHECK_RMD(ADDR,RES) do { \
+ switch (BCR_SWSTYLE(s)) { \
+ case 0x00: \
+ do { \
+ uint16_t rda[4]; \
+ cpu_physical_memory_read((ADDR), \
+ (void *)&rda[0], sizeof(rda)); \
+ (RES) |= (rda[2] & 0xf000)!=0xf000; \
+ (RES) |= (rda[3] & 0xf000)!=0x0000; \
+ } while (0); \
+ break; \
+ case 0x01: \
+ case 0x02: \
+ do { \
+ uint32_t rda[4]; \
+ cpu_physical_memory_read((ADDR), \
+ (void *)&rda[0], sizeof(rda)); \
+ (RES) |= (rda[1] & 0x0000f000L)!=0x0000f000L; \
+ (RES) |= (rda[2] & 0x0000f000L)!=0x00000000L; \
+ } while (0); \
+ break; \
+ case 0x03: \
+ do { \
+ uint32_t rda[4]; \
+ cpu_physical_memory_read((ADDR), \
+ (void *)&rda[0], sizeof(rda)); \
+ (RES) |= (rda[0] & 0x0000f000L)!=0x00000000L; \
+ (RES) |= (rda[1] & 0x0000f000L)!=0x0000f000L; \
+ } while (0); \
+ break; \
+ } \
+} while (0)
+
+#define CHECK_TMD(ADDR,RES) do { \
+ switch (BCR_SWSTYLE(s)) { \
+ case 0x00: \
+ do { \
+ uint16_t xda[4]; \
+ cpu_physical_memory_read((ADDR), \
+ (void *)&xda[0], sizeof(xda)); \
+ (RES) |= (xda[2] & 0xf000)!=0xf000;\
+ } while (0); \
+ break; \
+ case 0x01: \
+ case 0x02: \
+ case 0x03: \
+ do { \
+ uint32_t xda[4]; \
+ cpu_physical_memory_read((ADDR), \
+ (void *)&xda[0], sizeof(xda)); \
+ (RES) |= (xda[1] & 0x0000f000L)!=0x0000f000L; \
+ } while (0); \
+ break; \
+ } \
+} while (0)
+
+#endif
+
+#define PRINT_PKTHDR(BUF) do { \
+ struct ether_header *hdr = (void *)(BUF); \
+ printf("packet dhost=%02x:%02x:%02x:%02x:%02x:%02x, " \
+ "shost=%02x:%02x:%02x:%02x:%02x:%02x, " \
+ "type=0x%04x (bcast=%d)\n", \
+ hdr->ether_dhost[0],hdr->ether_dhost[1],hdr->ether_dhost[2], \
+ hdr->ether_dhost[3],hdr->ether_dhost[4],hdr->ether_dhost[5], \
+ hdr->ether_shost[0],hdr->ether_shost[1],hdr->ether_shost[2], \
+ hdr->ether_shost[3],hdr->ether_shost[4],hdr->ether_shost[5], \
+ htons(hdr->ether_type), \
+ !!ETHER_IS_MULTICAST(hdr->ether_dhost)); \
+} while (0)
+
+#define MULTICAST_FILTER_LEN 8
+
+static inline uint32_t lnc_mchash(const uint8_t *ether_addr)
+{
+#define LNC_POLYNOMIAL 0xEDB88320UL
+ uint32_t crc = 0xFFFFFFFF;
+ int idx, bit;
+ uint8_t data;
+
+ for (idx = 0; idx < ETHER_ADDR_LEN; idx++) {
+ for (data = *ether_addr++, bit = 0; bit < MULTICAST_FILTER_LEN; bit++) {
+ crc = (crc >> 1) ^ (((crc ^ data) & 1) ? LNC_POLYNOMIAL : 0);
+ data >>= 1;
+ }
+ }
+ return crc;
+#undef LNC_POLYNOMIAL
+}
+
+#define MIN(X,Y) ((X>Y) ? (Y) : (X))
+
+#define CRC(crc, ch) (crc = (crc >> 8) ^ crctab[(crc ^ (ch)) & 0xff])
+
+/* generated using the AUTODIN II polynomial
+ * x^32 + x^26 + x^23 + x^22 + x^16 +
+ * x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1
+ */
+static const uint32_t crctab[256] = {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
+ 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
+ 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
+ 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
+ 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
+ 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
+ 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
+ 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
+ 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
+ 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
+ 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
+ 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
+ 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
+ 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
+ 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
+ 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
+ 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
+ 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
+ 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
+ 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
+ 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
+ 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
+ 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
+ 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
+ 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
+ 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
+ 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
+ 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
+ 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
+ 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
+ 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
+ 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
+ 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
+ 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
+ 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
+ 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
+ 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
+ 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
+ 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
+ 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
+ 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
+ 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
+ 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
+};
+
+static inline int padr_match(PCNetState *s, const uint8_t *buf, int size)
+{
+ struct ether_header *hdr = (void *)buf;
+ uint8_t padr[6] = {
+ s->csr[12] & 0xff, s->csr[12] >> 8,
+ s->csr[13] & 0xff, s->csr[13] >> 8,
+ s->csr[14] & 0xff, s->csr[14] >> 8
+ };
+ int result = (!CSR_DRCVPA(s)) && !bcmp(hdr->ether_dhost, padr, 6);
+#ifdef PCNET_DEBUG_MATCH
+ printf("packet dhost=%02x:%02x:%02x:%02x:%02x:%02x, "
+ "padr=%02x:%02x:%02x:%02x:%02x:%02x\n",
+ hdr->ether_dhost[0],hdr->ether_dhost[1],hdr->ether_dhost[2],
+ hdr->ether_dhost[3],hdr->ether_dhost[4],hdr->ether_dhost[5],
+ padr[0],padr[1],padr[2],padr[3],padr[4],padr[5]);
+ printf("padr_match result=%d\n", result);
+#endif
+ return result;
+}
+
+static inline int padr_bcast(PCNetState *s, const uint8_t *buf, int size)
+{
+ static uint8_t BCAST[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+ struct ether_header *hdr = (void *)buf;
+ int result = !CSR_DRCVBC(s) && !bcmp(hdr->ether_dhost, BCAST, 6);
+#ifdef PCNET_DEBUG_MATCH
+ printf("padr_bcast result=%d\n", result);
+#endif
+ return result;
+}
+
+static inline int ladr_match(PCNetState *s, const uint8_t *buf, int size)
+{
+ struct ether_header *hdr = (void *)buf;
+ if ((*(hdr->ether_dhost)&0x01) &&
+ ((uint64_t *)&s->csr[8])[0] != 0LL) {
+ uint8_t ladr[8] = {
+ s->csr[8] & 0xff, s->csr[8] >> 8,
+ s->csr[9] & 0xff, s->csr[9] >> 8,
+ s->csr[10] & 0xff, s->csr[10] >> 8,
+ s->csr[11] & 0xff, s->csr[11] >> 8
+ };
+ int index = lnc_mchash(hdr->ether_dhost) >> 26;
+ return !!(ladr[index >> 3] & (1 << (index & 7)));
+ }
+ return 0;
+}
+
+static inline target_phys_addr_t pcnet_rdra_addr(PCNetState *s, int idx)
+{
+ while (idx < 1) idx += CSR_RCVRL(s);
+ return s->rdra + ((CSR_RCVRL(s) - idx) * (BCR_SWSTYLE(s) ? 16 : 8));
+}
+
+static inline int64_t pcnet_get_next_poll_time(PCNetState *s, int64_t current_time)
+{
+ int64_t next_time = current_time +
+ muldiv64(65536 - (CSR_SPND(s) ? 0 : CSR_POLL(s)),
+ ticks_per_sec, 33000000L);
+ if (next_time <= current_time)
+ next_time = current_time + 1;
+ return next_time;
+}
+
+

View File

@ -1,6 +1,6 @@
$OpenBSD: patch-slirp_slirp_config_h,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
--- slirp/slirp_config.h.orig Sat Feb 26 03:13:57 2005
+++ slirp/slirp_config.h Sat Feb 26 03:15:10 2005
$OpenBSD: patch-slirp_slirp_config_h,v 1.2 2005/08/11 01:15:17 todd Exp $
--- slirp/slirp_config.h.orig Sun Jul 24 13:52:08 2005
+++ slirp/slirp_config.h Tue Aug 9 22:34:49 2005
@@ -92,7 +92,7 @@
#undef BAD_SPRINTF
@ -28,7 +28,7 @@ $OpenBSD: patch-slirp_slirp_config_h,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
/* Define if you have sys/stropts.h */
#undef HAVE_SYS_STROPTS_H
@@ -198,7 +198,7 @@
@@ -197,7 +197,7 @@
#undef HAVE_GRANTPT
/* Define if you have fchmod */

View File

@ -1,7 +1,7 @@
$OpenBSD: patch-target-arm_cpu_h,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
--- target-arm/cpu.h.orig Tue Feb 22 13:27:29 2005
+++ target-arm/cpu.h Sun Feb 27 15:47:13 2005
@@ -97,7 +97,7 @@ void cpu_arm_close(CPUARMState *s);
$OpenBSD: patch-target-arm_cpu_h,v 1.2 2005/08/11 01:15:17 todd Exp $
--- target-arm/cpu.h.orig Wed Apr 27 10:10:47 2005
+++ target-arm/cpu.h Wed Apr 27 10:17:26 2005
@@ -104,7 +104,7 @@ void cpu_arm_close(CPUARMState *s);
signal handlers to inform the virtual CPU of exceptions. non zero
is returned if the signal was handled by the virtual CPU. */
struct siginfo;

View File

@ -1,7 +1,7 @@
$OpenBSD: patch-target-i386_cpu_h,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
--- target-i386/cpu.h.orig Sat Feb 12 12:58:00 2005
+++ target-i386/cpu.h Sun Feb 27 15:47:13 2005
@@ -609,8 +609,7 @@ void cpu_x86_frstor(CPUX86State *s, uint
$OpenBSD: patch-target-i386_cpu_h,v 1.2 2005/08/11 01:15:17 todd Exp $
--- target-i386/cpu.h.orig Sun Jul 24 13:52:08 2005
+++ target-i386/cpu.h Tue Aug 9 22:34:49 2005
@@ -630,8 +630,7 @@ void cpu_x86_frstor(CPUX86State *s, uint
/* you can call this signal handler from your SIGBUS and SIGSEGV
signal handlers to inform the virtual CPU of exceptions. non zero
is returned if the signal was handled by the virtual CPU. */

View File

@ -1,7 +1,7 @@
$OpenBSD: patch-target-ppc_cpu_h,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
--- target-ppc/cpu.h.orig Tue Feb 15 17:06:19 2005
+++ target-ppc/cpu.h Sun Feb 27 15:47:13 2005
@@ -163,8 +163,7 @@ void cpu_ppc_close(CPUPPCState *s);
$OpenBSD: patch-target-ppc_cpu_h,v 1.2 2005/08/11 01:15:17 todd Exp $
--- target-ppc/cpu.h.orig Sun Jul 24 13:52:08 2005
+++ target-ppc/cpu.h Tue Aug 9 22:34:49 2005
@@ -589,8 +589,7 @@ void cpu_ppc_close(CPUPPCState *s);
/* you can call this signal handler from your SIGBUS and SIGSEGV
signal handlers to inform the virtual CPU of exceptions. non zero
is returned if the signal was handled by the virtual CPU. */

View File

@ -1,57 +1,11 @@
$OpenBSD: patch-target-ppc_op_helper_c,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
--- target-ppc/op_helper.c.orig Tue Feb 15 17:06:19 2005
+++ target-ppc/op_helper.c Sun Feb 27 15:47:13 2005
@@ -226,6 +226,18 @@ void do_store_fpscr (uint32_t mask)
/* Set rounding mode */
switch (env->fpscr[0] & 0x3) {
case 0:
+#ifdef _BSD
+ fpsetround(FP_RN);
+ break;
+ case 1:
+ fpsetround(FP_RZ);
+ break;
+ case 2:
+ fpsetround(FP_RP);
+ break;
+ case 3:
+ fpsetround(FP_RM);
+#else
/* Best approximation (round to nearest) */
fesetround(FE_TONEAREST);
break;
@@ -240,6 +252,7 @@ void do_store_fpscr (uint32_t mask)
case 3:
/* Round toward -infinite */
fesetround(FE_DOWNWARD);
+#endif
break;
}
}
@@ -267,9 +280,14 @@ void do_fctiwz (void)
double d;
uint64_t i;
} *p = (void *)&FT1;
+#ifdef _BSD
+ int cround = fpgetround();
+ fpsetround(FP_RZ);
+#else
int cround = fegetround();
$OpenBSD: patch-target-ppc_op_helper_c,v 1.2 2005/08/11 01:15:17 todd Exp $
--- target-ppc/op_helper.c.orig Sun Jul 24 13:52:08 2005
+++ target-ppc/op_helper.c Tue Aug 9 22:34:49 2005
@@ -18,6 +18,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <math.h>
+#include <float.h>
#include "exec.h"
fesetround(FE_TOWARDZERO);
+#endif
if (FT0 > (double)0x7FFFFFFF)
p->i = 0x7FFFFFFFULL << 32;
else if (FT0 < -(double)0x80000000)
@@ -278,7 +296,11 @@ void do_fctiwz (void)
p->i = 0;
p->i |= (uint32_t)FT0;
FT0 = p->d;
+#ifdef _BSD
+ fpsetround(cround);
+#else
fesetround(cround);
+#endif
}
void do_fnmadd (void)
#define MEMSUFFIX _raw

View File

@ -1,9 +1,9 @@
$OpenBSD: patch-target-sparc_cpu_h,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
--- target-sparc/cpu.h.orig Tue Feb 22 13:08:57 2005
+++ target-sparc/cpu.h Sun Feb 27 17:05:36 2005
@@ -189,8 +189,12 @@ void cpu_set_cwp(CPUSPARCState *env1, in
cpu_set_cwp(env, _tmp & PSR_CWP & (NWINDOWS - 1)); \
$OpenBSD: patch-target-sparc_cpu_h,v 1.2 2005/08/11 01:15:17 todd Exp $
--- target-sparc/cpu.h.orig Sun Jul 24 13:52:08 2005
+++ target-sparc/cpu.h Tue Aug 9 22:34:49 2005
@@ -284,8 +284,12 @@ void cpu_set_cwp(CPUSPARCState *env1, in
} while (0)
#endif
+#ifdef _BSD
+int cpu_sparc_signal_handler(int hostsignum, qemu_siginfo *info, void *puc);
@ -12,5 +12,5 @@ $OpenBSD: patch-target-sparc_cpu_h,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
int cpu_sparc_signal_handler(int hostsignum, struct siginfo *info, void *puc);
+#endif
#define TARGET_PAGE_BITS 12 /* 4k */
#include "cpu-all.h"

View File

@ -1,11 +0,0 @@
$OpenBSD: patch-target-sparc_op_helper_c,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
--- target-sparc/op_helper.c.orig Tue Feb 22 13:14:33 2005
+++ target-sparc/op_helper.c Sun Feb 27 17:15:09 2005
@@ -1,5 +1,7 @@
#include <math.h>
+#if !defined(_BSD) && !defined(__OpenBSD__)
#include <fenv.h>
+#endif
#include "exec.h"
//#define DEBUG_MMU

View File

@ -1,6 +1,6 @@
$OpenBSD: patch-vl_c,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
--- vl.c.orig Thu Feb 10 16:00:06 2005
+++ vl.c Tue Mar 1 15:53:26 2005
$OpenBSD: patch-vl_c,v 1.2 2005/08/11 01:15:17 todd Exp $
--- vl.c.orig Sun Jul 24 13:52:08 2005
+++ vl.c Wed Aug 10 17:49:15 2005
@@ -42,7 +42,7 @@
#include <dirent.h>
#ifdef _BSD
@ -10,7 +10,15 @@ $OpenBSD: patch-vl_c,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
#include <libutil.h>
#endif
#else
@@ -1574,11 +1574,34 @@ static int tun_open(char *ifname, int if
@@ -128,6 +128,7 @@ NetDriverState nd_table[MAX_NICS];
QEMUTimer *gui_timer;
int vm_running;
int audio_enabled = 0;
+int nic_pcnet = 0;
int sb16_enabled = 1;
int adlib_enabled = 1;
int gus_enabled = 1;
@@ -1610,11 +1611,35 @@ static int tun_open(char *ifname, int if
char *dev;
struct stat s;
@ -19,21 +27,22 @@ $OpenBSD: patch-vl_c,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
+ char dname[100];
+
+ for (; i < 10; i++) {
+ snprintf(dname, sizeof dname, "%s%d", "/dev/tun", i);
+ snprintf(dname, sizeof dname, "/dev/tun%d", i);
+ fd = open(dname, O_RDWR);
+ if (fd >= 0)
+ break;
+ else if (errno != ENOENT || ++enoentcount > 3) {
+ if (errno != EBUSY) {
+ err = errno;
+ break;
+ err = errno;
+ break;
+ }
+ } else
+ err = errno;
+ }
+ if (fd < 0) {
+ fprintf(stderr, "warning: could not open %s (%s): no virtual network emulation\n", dname, strerror(err));
+ return -1;
+ fprintf(stderr, "warning: could not open %s (%s): no virtual "
+ "network emulation\n", dname, strerror(err));
+ return -1;
+ }
+#else
fd = open("/dev/tap", O_RDWR);
@ -45,3 +54,37 @@ $OpenBSD: patch-vl_c,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
fstat(fd, &s);
dev = devname(s.st_rdev, S_IFCHR);
@@ -2819,6 +2844,7 @@ void help(void)
#if defined(TARGET_PPC) || defined(TARGET_SPARC)
"-g WxH[xDEPTH] Set the initial graphical resolution and depth\n"
#endif
+ "-nic-pcnet simulate an AMD PC-Net PCI ethernet adaptor\n"
"\n"
"Network options:\n"
"-nics n simulate 'n' network cards [default=1]\n"
@@ -2932,6 +2958,7 @@ enum {
QEMU_OPTION_L,
QEMU_OPTION_no_code_copy,
QEMU_OPTION_pci,
+ QEMU_OPTION_nic_pcnet,
QEMU_OPTION_isa,
QEMU_OPTION_prep,
QEMU_OPTION_k,
@@ -3020,6 +3047,7 @@ const QEMUOption qemu_options[] = {
/* temporary options */
{ "pci", 0, QEMU_OPTION_pci },
+ { "nic-pcnet", 0, QEMU_OPTION_nic_pcnet },
{ "cirrusvga", 0, QEMU_OPTION_cirrusvga },
{ NULL },
};
@@ -3425,6 +3453,9 @@ int main(int argc, char **argv)
break;
case QEMU_OPTION_pci:
pci_enabled = 1;
+ break;
+ case QEMU_OPTION_nic_pcnet:
+ nic_pcnet = 1;
break;
case QEMU_OPTION_isa:
pci_enabled = 0;

View File

@ -0,0 +1,16 @@
$OpenBSD: patch-vl_h,v 1.1 2005/08/11 01:15:17 todd Exp $
--- vl.h.orig Sun Jul 24 13:52:08 2005
+++ vl.h Wed Aug 10 15:48:42 2005
@@ -666,6 +666,12 @@ int fdctrl_get_drive_type(fdctrl_t *fdct
void isa_ne2000_init(int base, int irq, NetDriverState *nd);
void pci_ne2000_init(PCIBus *bus, NetDriverState *nd);
+/* pcnet.c */
+
+extern int nic_pcnet;
+
+void pci_pcnet_init(PCIBus *bus, NetDriverState *nd);
+
/* pckbd.c */
void kbd_init(void);

View File

@ -0,0 +1,101 @@
$OpenBSD: patch-x_keymap_c,v 1.1 2005/08/11 01:15:17 todd Exp $
--- x_keymap.c.orig Mon Apr 25 08:36:00 2005
+++ x_keymap.c Mon Apr 25 08:36:00 2005
@@ -0,0 +1,97 @@
+/*
+ * QEMU SDL display driver
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+static const uint8_t x_keycode_to_pc_keycode[61] = {
+ 0xc7, /* 97 Home */
+ 0xc8, /* 98 Up */
+ 0xc9, /* 99 PgUp */
+ 0xcb, /* 100 Left */
+ 0x4c, /* 101 KP-5 */
+ 0xcd, /* 102 Right */
+ 0xcf, /* 103 End */
+ 0xd0, /* 104 Down */
+ 0xd1, /* 105 PgDn */
+ 0xd2, /* 106 Ins */
+ 0xd3, /* 107 Del */
+ 0x9c, /* 108 Enter */
+ 0x9d, /* 109 Ctrl-R */
+ 0x0, /* 110 Pause */
+ 0xb7, /* 111 Print */
+ 0xb5, /* 112 Divide */
+ 0xb8, /* 113 Alt-R */
+ 0xc6, /* 114 Break */
+ 0x0, /* 115 */
+ 0x0, /* 116 */
+ 0x0, /* 117 */
+ 0x0, /* 118 */
+ 0x0, /* 119 */
+ 0x70, /* 120 Hiragana_Katakana */
+ 0x0, /* 121 */
+ 0x0, /* 122 */
+ 0x73, /* 123 backslash */
+ 0x0, /* 124 */
+ 0x0, /* 125 */
+ 0x0, /* 126 */
+ 0x0, /* 127 */
+ 0x0, /* 128 */
+ 0x79, /* 129 Henkan */
+ 0x0, /* 130 */
+ 0x7b, /* 131 Muhenkan */
+ 0x0, /* 132 */
+ 0x7d, /* 133 Yen */
+ 0x0, /* 134 */
+ 0x0, /* 135 */
+ 0x47, /* 136 KP_7 */
+ 0x48, /* 137 KP_8 */
+ 0x49, /* 138 KP_9 */
+ 0x4b, /* 139 KP_4 */
+ 0x4c, /* 140 KP_5 */
+ 0x4d, /* 141 KP_6 */
+ 0x4f, /* 142 KP_1 */
+ 0x50, /* 143 KP_2 */
+ 0x51, /* 144 KP_3 */
+ 0x52, /* 145 KP_0 */
+ 0x53, /* 146 KP_. */
+ 0x47, /* 147 KP_HOME */
+ 0x48, /* 148 KP_UP */
+ 0x49, /* 149 KP_PgUp */
+ 0x4b, /* 150 KP_Left */
+ 0x4c, /* 151 KP_ */
+ 0x4d, /* 152 KP_Right */
+ 0x4f, /* 153 KP_End */
+ 0x50, /* 154 KP_Down */
+ 0x51, /* 155 KP_PgDn */
+ 0x52, /* 156 KP_Ins */
+ 0x53, /* 157 KP_Del */
+};
+
+static uint8_t _native_scancode(const int key)
+{
+#if defined(_WIN32) && 0
+ return key;
+#else
+ return x_keycode_to_pc_keycode[key];
+#endif
+}
+

View File

@ -1,6 +1,7 @@
@comment $OpenBSD: PLIST,v 1.1.1.1 2005/03/07 16:41:28 todd Exp $
@comment $OpenBSD: PLIST,v 1.2 2005/08/11 01:15:17 todd Exp $
bin/qemu
bin/qemu-img
bin/qemu-system-mips
bin/qemu-system-ppc
bin/qemu-system-sparc
bin/qemu-system-x86_64
@ -52,3 +53,4 @@ share/qemu/ppc_rom.bin
share/qemu/proll.elf
share/qemu/vgabios-cirrus.bin
share/qemu/vgabios.bin
share/qemu/video.x