--- src/drivers/hostirq.c	2005-07-21 14:26:58.035942148 +0200
+++ src/drivers/hostirq.c	2005-07-21 01:26:22.964756669 +0200
@@ -26,6 +26,7 @@
 #include "thread.h"
 #include "molcpu.h"
 #include "driver_mgr.h"
+#include "plain-dump.h"
 
 #include <signal.h>
 #include <string.h>
@@ -151,6 +152,7 @@
 	for (i = first_mapping; i != -1; i = hostirq_mapping[i].next) {
 		if (hostirq_check_bit(i, irq_state->irqs)) {
 //			printm("update: raising %d\n", i);
+			pdump_write_pkt(0, 0, 1, hostirq_mapping[i].vmirq, "int");
 			irq_line_hi(hostirq_mapping[i].vmirq);
 		} else {
 //			printm("update: lowering %d\n", i);
--- src/drivers/include/pci.h	2005-07-21 14:26:58.063944350 +0200
+++ src/drivers/include/pci.h	2005-07-21 14:20:43.312479454 +0200
@@ -35,8 +35,8 @@
 	/* config space read/write hooks. the char * argument points to data to be read/written
 	 * and may be overwritten by the hook.
 	 */
-	void (*read_config)(void *, int, char *);
-	void (*write_config)(void *, int, char *);
+	void (*read_config)(void *, int, int, char *);
+	void (*write_config)(void *, int, int, char *);
 } pci_dev_hooks_t;
 
 typedef int	pci_addr_t;	/* 00 domain bus devfn */
--- src/drivers/Makefile	2005-07-21 14:26:58.005939789 +0200
+++ src/drivers/Makefile	2005-07-20 18:39:54.523735183 +0200
@@ -8,7 +8,7 @@
 drivers-OBJS		= $(obj-y)
 obj-y			+= driver_mgr.o ioports.o keycodes.o kbd.o via-cuda.o \
 			   adb.o gc.o pic.o osi_pic.o nvram.o escc.o dbdma.o pci.o \
-			   pci-bridges.o osi_mouse.o osi_driver.o usb.o rtas.o hostirq.o
+			   pci-bridges.o osi_mouse.o osi_driver.o usb.o rtas.o hostirq.o plain-dump.o
 
 obj-$(LINUX)		+= console.o
 
--- src/drivers/pci.c	2005-07-21 14:26:58.093946709 +0200
+++ src/drivers/pci.c	2005-07-21 14:37:21.326948507 +0200
@@ -470,7 +470,7 @@
 
 
 static void
-do_write_config( pci_device_t *dev, int offs, unsigned char val )
+do_write_config( pci_device_t *dev, int offs, int last, unsigned char val )
 {
 	
 	int rr = offs >>2;
@@ -478,7 +478,7 @@
 	
 	/* indeed we now call a hook here ;-) */
 	if (dev->hooks.write_config != NULL)
-		(*(dev->hooks.write_config))(dev->usr, offs, &val);
+		(*(dev->hooks.write_config))(dev->usr, offs, last, &val);
 
 	/* Base registers & rom */
 	if( rr >= (PCI_BASE_ADDRESS_0 >> 2) && rr <= (PCI_BASE_ADDRESS_5 >> 2) ) {
@@ -501,7 +501,7 @@
 }
 
 static unsigned char
-do_read_config( pci_device_t *dev, int offs )
+do_read_config( pci_device_t *dev, int offs, int last )
 {
 	int rr = offs >>2;
 	basereg_t *bp = NULL;
@@ -528,7 +528,7 @@
 
 	/* call hook */
 	if (dev->hooks.read_config != NULL)
-		(*(dev->hooks.read_config))(dev->usr, offs, &val);
+		(*(dev->hooks.read_config))(dev->usr, offs, last, &val);
 
 #if 0
 	if( offs == PCI_INTERRUPT_LINE ) {
@@ -558,7 +558,7 @@
 	 * alignment problems.
 	 */
 	for( i=len-1; i>=0; i--, val=val>>8 )
-		do_write_config( dev, offs+i, val & 0xff ); 
+		do_write_config( dev, offs+i, i==0, val & 0xff ); 
 
 	/* Handle value written */
 	if( (offs & ~3) != ((offs+len-1)&~3 ))
@@ -583,7 +583,7 @@
 
 	for( val=0, i=0; i<len; i++ ) {
 		val=val<<8;
-		val |= do_read_config( dev, offs+i ) & 0xff;
+		val |= do_read_config( dev, offs+i, i==(len-1) ) & 0xff;
 	}
 	
 	VPRINT("config-read  [%d] %04x+%02x: %08lx\n", len, addr, offs, val );
--- src/drivers/pciproxy.c	2005-07-21 14:26:58.125949225 +0200
+++ src/drivers/pciproxy.c	2005-07-21 14:34:32.137645970 +0200
@@ -42,6 +42,8 @@
 #include <sys/mman.h>
 #include <sys/poll.h>
 
+#include "plain-dump.h"
+
 SET_VERBOSE_NAME("PCIPROXY");
 
 #define PPLOG(format, args...)		LOG(format "\n", ##args)
@@ -164,8 +166,11 @@
 
 /* config space read/write hooks */
 static void
-pciproxy_config_read(void *usr, int offset, char *val)
+pciproxy_config_read(void *usr, int offset, int last, char *val)
 {
+	static int saved_value = 0;
+	static int saved_len = 0;
+
 	pciproxy_device_t *pdev = (pciproxy_device_t *) usr;
 
 	DPRINT("config_read: off %d val %d", offset, *val);
@@ -188,13 +193,24 @@
 	} else {
 		/* default: pass it through to the physical device */
 		pciproxy_do_read_config(pdev->fd_config, offset, val, 1);
+
+		saved_value = saved_value | (*val << 8*saved_len);
+		saved_len++;
+		if (last) {
+			pdump_write_pkt(offset-saved_len+1, 1, saved_len, saved_value, "pci");
+			saved_len = 0;
+			saved_value = 0;
+		}
 		return;
 	}
 }
 
 static void
-pciproxy_config_write(void *usr, int offset, char *val)
+pciproxy_config_write(void *usr, int offset, int last, char *val)
 {
+	static int saved_value = 0;
+	static int saved_len = 0;
+	
 	pciproxy_device_t *pdev = (pciproxy_device_t *) usr;
 
 	DPRINT("config_write: off %d val %d", offset, *val);
@@ -231,6 +247,14 @@
 	/* if we are still there, pass the value to our device */
 	pciproxy_do_write_config(pdev->fd_config, offset, val, 1);
 
+	saved_len++;
+	saved_value = (saved_value << 8) | *val;
+	if (last) {
+		pdump_write_pkt(offset, 0, saved_len, saved_value, "pci");
+		saved_len = 0;
+		saved_value = 0;
+	}
+
 }
 
 /* hook table */
@@ -240,7 +264,7 @@
 	pciproxy_config_write,
 };
 
-#undef BAR_ACCESS_USERSPACE
+#define BAR_ACCESS_USERSPACE 1
 
 #ifdef BAR_ACCESS_USERSPACE
 static inline int
@@ -263,6 +287,8 @@
 {
 	pciproxy_device_t *pdev = (pciproxy_device_t *) usr;
 	ulong res = 0;
+	ulong r_int, r_pass;
+	ushort r_short;
 	char *lvaddr;
 	int ind;
 
@@ -278,6 +304,12 @@
 	res = read_mem(lvaddr, len);
 
 	DPRINT("read mem @ 0x%lx: 0x%lx", addr, res);
+	r_int = res;
+	r_short = res;
+	r_pass = res;
+	if (len == 2)	r_pass = le16_to_cpu(r_short);
+	else if (len == 4)	r_pass = le32_to_cpu(r_int);
+	pdump_write_pkt(addr - pdev->bars[ind].mmum.mbase, 1, len, r_pass, "mem");
 
 	return res;
 }
@@ -288,6 +320,8 @@
 	pciproxy_device_t *pdev = (pciproxy_device_t *) usr;
 	char *lvaddr;
 	int ind;
+	ulong r_int, r_pass;
+	ushort r_short;
 
 	DPRINT("write mem @ 0x%lx: 0x%lx", addr, data);
 
@@ -300,6 +334,12 @@
 	}
 
 	lvaddr = pdev->bars[ind].lvbase + (addr - pdev->bars[ind].mmum.mbase);
+	r_int = data;
+	r_short = data;
+	r_pass = data;
+	if (len == 2)	r_pass = le16_to_cpu(r_short);
+	else if (len == 4)	r_pass = le32_to_cpu(r_int);
+	pdump_write_pkt(addr - pdev->bars[ind].mmum.mbase, 0, len, r_pass, "mem");
 	write_mem(lvaddr, data, len);
 }
 
@@ -961,6 +1001,8 @@
 		pciproxy_check_device(devspec, node_file, pci_node);
 	}
 
+	pdump_initialise();
+
 	return 1;
 }
 
@@ -1012,6 +1054,7 @@
 		free(temp);
 	}
 
+	pdump_deinit();
 }
 
 driver_interface_t pciproxy_driver =
--- src/drivers/plain-dump.c	1970-01-01 01:00:00.000000000 +0100
+++ src/drivers/plain-dump.c	2005-07-20 21:58:39.656827024 +0200
@@ -0,0 +1,43 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/time.h>
+#include <time.h>
+#include <string.h>
+#include "molcpu.h"
+#include "plain-dump.h"
+
+static int pdump_fd = -1;
+
+void
+pdump_write_pkt(short offset, int in, int datalen, int data, const char * type) {
+  if (pdump_fd == -1) return;
+  
+  struct timeval t;
+  u_char buf[256];
+  int len = 0;
+  
+  if (gettimeofday(&t, NULL))
+    fprintf(stderr, "gettimeofday error\n");
+
+  len = snprintf(buf, sizeof(buf), "%.8ld.%.6ld 0x%.8x %s %s 0x%.4x %d %*dx%.*x\n",
+                 t.tv_sec, t.tv_usec, mregs->nip, type, (in?"r":"w"), offset, datalen, 9-2*datalen, 0, 2*datalen, data);
+ 
+  if (len > 0)
+    write(pdump_fd, buf, len);
+}
+
+void
+pdump_initialise() {
+  if (pdump_fd != -1) return;
+  pdump_fd = open("/tmp/test.dump", O_CREAT | O_WRONLY | O_TRUNC, 0644);
+}
+
+void
+pdump_deinit() {
+  close(pdump_fd);
+}
--- src/drivers/plain-dump.h	1970-01-01 01:00:00.000000000 +0100
+++ src/drivers/plain-dump.h	2005-07-20 18:41:35.651686385 +0200
@@ -0,0 +1,8 @@
+#ifndef __plain_dump_h
+#define __plain_dump_h
+
+void pdump_write_pkt(short offset, int in, int datalen, int data, const char * type);
+void pdump_initialise();
+void pdump_deinit();
+
+#endif
--- src/kmod/Linux/alloc.h	2005-07-21 14:26:24.979343068 +0200
+++ src/kmod/Linux/alloc.h	2005-07-21 14:39:34.721436670 +0200
@@ -21,6 +21,7 @@
 #include <linux/vmalloc.h>
 #include <linux/mm.h>
 #include <asm/uaccess.h>
+#include <asm/io.h>
 
 #ifdef LINUX_26
 #include <asm/cacheflush.h>
--- util/ofdump/Makefile	2005-07-21 14:26:25.188359502 +0200
+++ util/ofdump/Makefile	2005-07-20 11:20:48.921882497 +0200
@@ -12,9 +12,9 @@
 #   it under the terms of the GNU General Public License version 2
 #
 
-include		../../Makefile.top
+include		../../config/Makefile.top
 
 PROGRAMS	= ofdump
 ofdump-OBJS	= main.o
 
-include		$(top_srcdir)/Rules.make
+include		$(top_srcdir)/config/Rules.make