--- 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 #include @@ -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 #include +#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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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 #include #include +#include #ifdef LINUX_26 #include --- 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