summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app-emulation/mol/files/mol-0.9.71-pciproxy-dump.patch')
-rw-r--r--app-emulation/mol/files/mol-0.9.71-pciproxy-dump.patch314
1 files changed, 314 insertions, 0 deletions
diff --git a/app-emulation/mol/files/mol-0.9.71-pciproxy-dump.patch b/app-emulation/mol/files/mol-0.9.71-pciproxy-dump.patch
new file mode 100644
index 000000000000..aee33ec0ff9c
--- /dev/null
+++ b/app-emulation/mol/files/mol-0.9.71-pciproxy-dump.patch
@@ -0,0 +1,314 @@
+--- 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, (char *) &val);
++ (*(dev->hooks.write_config))(dev->usr, offs, last, (char *) &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 = (char *)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((char *)buf, sizeof(buf), "%.8ld.%.6ld 0x%.8x %s %s 0x%.4x %d %*dx%.*x\n",
++ t.tv_sec, t.tv_usec, (unsigned int) 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(void) {
++ if (pdump_fd != -1) return;
++ pdump_fd = open("/tmp/test.dump", O_CREAT | O_WRONLY | O_TRUNC, 0644);
++}
++
++void
++pdump_deinit(void) {
++ 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);
++void pdump_deinit(void);
++
++#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