]> git.zerfleddert.de Git - usb-driver/blobdiff - usb-driver.c
fix jtagkey warnings on 64 bit
[usb-driver] / usb-driver.c
index 1e1f026bbdb342c4eadae64988bf4754df35aed1..ed7893262da4be37b5daf90c2b3fb5fe27634b9e 100644 (file)
@@ -41,6 +41,7 @@
 #include <bits/wordsize.h>
 #include <sys/ipc.h>
 #include <sys/sem.h>
+#include <sys/mman.h>
 #include <syscall.h>
 #include <linux/personality.h>
 #include "usb-driver.h"
@@ -61,13 +62,15 @@ static int modules_read = 0;
 #define NO_WINDRVR 1
 
 void hexdump(unsigned char *buf, int len, char *prefix) {
-       int i;
+       int i = 0;
 
-       fprintf(stderr, "%s ", prefix);
-       for(i=0; i<len; i++) {
+       fprintf(stderr, "%s %03x: ", prefix, i);
+       for(i = 0; i<len; i++) {
                fprintf(stderr,"%02x ", buf[i]);
-               if ((i % 16) == 15)
-                       fprintf(stderr,"\n%s ", prefix);
+               if ((i % 16) == 7)
+                       fprintf(stderr," ");
+               if (((i % 16) == 15) && ((i+1) < len))
+                       fprintf(stderr,"\n%s %03x: ", prefix, i+1);
        }
        fprintf(stderr,"\n");
 }
@@ -671,6 +674,65 @@ long int _Z14isModuleLoadedPci(char *module_name, int i) {
        return 1;
 }
 
+/* XilCommNS::CPortResources::Instance() */
+void* _ZN9XilCommNS14CPortResources8InstanceEv() {
+       static void* (*func) (void) = NULL;
+       char *filename = NULL;
+       void *ret;
+       int i;
+
+       if (!func) {
+               func = (void* (*) (void)) dlsym(RTLD_NEXT, "_ZN9XilCommNS14CPortResources8InstanceEv");
+
+               DPRINTF("Searching for filename starting at %p\n", func);
+               for(i = 0; i < 16384; i++) {
+                       if (!strcmp(((char*)func)+i, "/proc/sys/dev/parport/%s/base-addr")) {
+                               filename = ((char*)func)+i;
+                               DPRINTF("Filename found at offset %p\n", (void*)(filename - ((char*)func)));
+                               break;
+                       }
+               }
+       }
+
+       if (filename) {
+               long pagesize;
+               size_t protectlen;
+               void *start;
+               int len = strlen(filename) + 1;
+               int ret;
+
+               pagesize = sysconf(_SC_PAGE_SIZE);
+               DPRINTF("You have %lu bytes sized pages!\n", pagesize);
+
+               start = (void*)((long)filename & (~(pagesize-1)));
+
+               protectlen = pagesize;
+               if ((long)(filename + len) > (long)(start + protectlen))
+                       protectlen += pagesize;
+
+               DPRINTF("Unprotecting %zd bytes starting at %p\n", protectlen, start);
+               ret = mprotect(start, protectlen, PROT_READ|PROT_WRITE);
+               if (ret == -1)
+                       perror("mprotect");
+
+               DPRINTF("Replacing %s with /dev/zero\n", filename);
+               strcpy(filename, "/dev/zero");
+
+               DPRINTF("Reprotecting %zd bytes starting at %p\n", protectlen, start);
+               ret = mprotect(start, protectlen, PROT_READ|PROT_EXEC);
+               if (ret == -1)
+                       perror("mprotect");
+       }
+
+       DPRINTF("-> XilCommNS::CPortResources::Instance()\n");
+
+       ret = func();
+
+       DPRINTF("<- XilCommNS::CPortResources::Instance()\n");
+
+       return ret;
+}
+
 static void __attribute__ ((constructor)) libusbdriver_init(void) {
        int i;
        char buf[256];
Impressum, Datenschutz