On Tue, 10 Sep 2002, yvind Hammer wrote:

> Then I tried installing the 1.9.16 version of
> svgalib, but get "can't open /dev/svga". I have
> done make install in kernel/svga_helper, and
> put the following line in /etc/modules.conf:
> alias char-major-209 svgalib_helper
> 
> I now also get an "Unresolved symbols" error
> at boot-up. depmod -e gives
> *** Unresolved symbols in /lib/modules/2.4.18-3/misc
> ... and a long list of missing symbols.

This is probably related to modeversions. I hope it is fixed in 1.9.17,
please try the attached patch.

Those errors should not prevent insmoding the driver, though.
Please try insmod /path/to/svgalib_helper.o 


-- 
Matan Ziv-Av.                         [EMAIL PROTECTED]

diff -ru svgalib-1.9.16/kernel/svgalib_helper/Makefile 
svgalib-1.9.17/kernel/svgalib_helper/Makefile
--- svgalib-1.9.16/kernel/svgalib_helper/Makefile       Tue Jul 23 12:45:03 2002
+++ svgalib-1.9.17/kernel/svgalib_helper/Makefile       Thu Aug 22 17:23:01 2002
@@ -1,15 +1,20 @@
 include ../../Makefile.cfg
 
-ifeq ($(DEBUG),y)
-  DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" is needed to expand inlines
-else
-  DEBFLAGS = -O2
+MODVER = $(shell grep CONFIG_MODVERSIONS $(INCLUDEDIR)/linux/autoconf.h)
+
+ifeq ($(MODVER),)
+       @echo INCLUDEDIR is not set up correctly
+       exit 1
 endif
 
-CFLAGS = -D__KERNEL__ -DMODULE -Wall $(DEBFLAGS) 
+CFLAGS = -O2 -DLINUX -Dlinux -D__KERNEL__ -DMODULE -Wall $(DEBFLAGS) 
 CFLAGS += -I$(INCLUDEDIR)
 CFLAGS += -DSVGALIB_HELPER_MAJOR=$(SVGALIB_HELPER_MAJOR)
 
+ifeq (1,$(findstring 1,$(MODVER)))
+       CFLAGS += -DMODVERSIONS -include $(INCLUDEDIR)/linux/modversions.h
+endif
+
 # Extract version number from headers.
 VER = $(shell awk -F\" '/REL/ {print $$2}' $(INCLUDEDIR)/linux/version.h)
 
@@ -31,7 +36,7 @@
 
 modules_install: $(TARGET).o
        mkdir -p /lib/modules/$(VER)/kernel/misc 
-       install -c $(TARGET).o /lib/modules/$(VER)/misc
+       install -c $(TARGET).o /lib/modules/$(VER)/kernel/misc
 
 device:
        rm -f /dev/svgalib_helper* /dev/svga /dev/svga?
diff -ru svgalib-1.9.16/kernel/svgalib_helper/interrupt.c 
svgalib-1.9.17/kernel/svgalib_helper/interrupt.c
--- svgalib-1.9.16/kernel/svgalib_helper/interrupt.c    Fri Jul 26 16:23:14 2002
+++ svgalib-1.9.17/kernel/svgalib_helper/interrupt.c    Sat Jul 27 11:05:22 2002
@@ -92,6 +92,8 @@
     writeb(pb | 0x10 , dev->iobase+0x3d5);
 }
 
+static uint32_t saved_pmc;
+
 int nv3_test_vsync(struct sh_pci_device *dev) {
      return readl(dev->iobase+0x400100)&0x100;
 }
@@ -103,14 +105,13 @@
     writel(0x100,      dev->iobase + 0x400100);
     writel(0,          dev->iobase + 0x000140);
     writel(0,          dev->iobase + 0x400140);
-/* What to do with PMC_ENABLE ??? 
-    writel(0x11,       dev->iobase + 0x000200); 
-*/
+    writel(saved_pmc,  dev->iobase + 0x000200); 
 
 }
 
 void nv3_enable_vsync(struct sh_pci_device *dev) {
-    writel(0xffffffff,         dev->iobase + 0x000200);
+    saved_pmc = inl(dev->iobase + 0x200);
+    writel(saved_pmc|0x1000, dev->iobase+0x200);
     writel(0x1,        dev->iobase + 0x000140);
     writel(0x100,      dev->iobase + 0x400140);
     writel(0xffffffff,         dev->iobase + 0x000100);
@@ -128,14 +129,12 @@
     writel(0x1,        dev->iobase + 0x600100);
     writel(0,          dev->iobase + 0x000140);
     writel(0,          dev->iobase + 0x600140);
-/* What to do with PMC_ENABLE ??? 
-    writel(0x11,       dev->iobase + 0x000200); 
-*/
-
+    writel(saved_pmc,  dev->iobase + 0x000200); 
 }
 
 void nv4_enable_vsync(struct sh_pci_device *dev) {
-    writel(0xffffffff,         dev->iobase + 0x000200);
+    saved_pmc = inl(dev->iobase + 0x200);
+    writel(saved_pmc|(1<<24),dev->iobase+0x200);
     writel(0x1,        dev->iobase + 0x000140);
     writel(0x1,        dev->iobase + 0x600140);
     writel(0xffffffff,         dev->iobase + 0x000100);
diff -ru svgalib-1.9.16/kernel/svgalib_helper/main.c 
svgalib-1.9.17/kernel/svgalib_helper/main.c
--- svgalib-1.9.16/kernel/svgalib_helper/main.c Fri Jul 26 16:58:31 2002
+++ svgalib-1.9.17/kernel/svgalib_helper/main.c Thu Aug 22 12:24:38 2002
@@ -45,7 +45,9 @@
 static devfs_handle_t devfs_handle;
 #endif
 
-#define check_io_range(port,device)
+static int check_io_range(port,device) {
+    return 1;
+}
 
 static struct pci_dev *get_pci_dev(int pcipos, int minor) {
     
@@ -53,17 +55,11 @@
     if(minor>0) {
         return sh_pci_devs[minor]->dev;
     } else {
-        int i;
-        int b, d;
-
-        d=pcipos&0xff;
-        b=(pcipos>>8)&0xff;
-        for(i=1;i<num_devices;i++) {
-            if((b==sh_pci_devs[i]->dev->bus->number) && 
(d==sh_pci_devs[i]->dev->devfn)) 
-                return sh_pci_devs[i]->dev;
-        }
-        return NULL;
+        if(pcipos>0 && pcipos<num_devices)
+            return sh_pci_devs[pcipos]->dev;
     }
+    return NULL;
+
 }
 
 static int get_dev(int pcipos, int minor) {
@@ -112,7 +108,7 @@
     int minor = minor(inode->i_rdev);
     struct pci_dev *pdev;
     io_string_t iostr;
-    int i;
+    int i, ret;
     u8 pb;
     u16 pw;
     u32 pl;
@@ -122,56 +118,65 @@
     if(_IOC_TYPE(cmd)!=SVGALIB_HELPER_IOC_MAGIC) {
         return -EINVAL;
     }
+    
+    ret=0;
 
     switch(_IOC_NR(cmd)) {
 
         case _IOC_NR(SVGALIB_HELPER_IOCSREPOUTB):
             copy_from_user(&iostr,(char *)arg,sizeof(iostr));
-            if ( iostr.length > 768 ) return -EINVAL;
+            if (iostr.length>4096) return -EINVAL;
            if ( (outb_str = kmalloc(iostr.length, GFP_KERNEL )) == NULL ) return 
-ENOMEM;
            copy_from_user(outb_str,iostr.string,iostr.length);
-           check_io_range(iostr.port,minor);
-           for ( i = 0; i < iostr.length; i++ )
-                outb ( outb_str[i], iostr.port );
-            kfree ( outb_str );
+           if(check_io_range(iostr.port,minor))
+               for(i=0; i<iostr.length; i++)
+                    outb(outb_str[i], iostr.port);
+                else ret = -EPERM;
+            kfree (outb_str);
             break;
 
         case _IOC_NR(SVGALIB_HELPER_IOCSOUTB):
            copy_from_user(&iov,(char *)arg,sizeof(iov));
-           check_io_range(iov.port,minor);
-           outb(iov.val,iov.port);
+           if(check_io_range(iov.port,minor))
+               outb(iov.val,iov.port);
+               else ret = -EPERM;
         break;
 
         case _IOC_NR(SVGALIB_HELPER_IOCSOUTW):
            copy_from_user(&iov,(char *)arg,sizeof(iov));
-           check_io_range(iov.port,minor);
-           outw(iov.val,iov.port);
+           if(check_io_range(iov.port,minor))
+               outw(iov.val,iov.port);
+               else ret = -EPERM;
         break;
 
         case _IOC_NR(SVGALIB_HELPER_IOCSOUTL):
            copy_from_user(&iov,(char *)arg,sizeof(iov));
-           check_io_range(iov.port,minor);
-           outl(iov.val,iov.port);
+           if(check_io_range(iov.port,minor))
+               outl(iov.val,iov.port);
+               else ret = -EPERM;
         break;
 
         case _IOC_NR(SVGALIB_HELPER_IOCGINB):
            copy_from_user(&iov,(char *)arg,sizeof(iov));
-           check_io_range(iov.port,minor);
-           iov.val=inb(iov.port);
+           if(check_io_range(iov.port,minor))
+               iov.val=inb(iov.port);
+               else ret = -EPERM;
            copy_to_user((char *)arg,&iov,sizeof(iov));
         break;
 
         case _IOC_NR(SVGALIB_HELPER_IOCGINW):
            copy_from_user(&iov,(char *)arg,sizeof(iov));
-           check_io_range(iov.port,minor);
-           iov.val=inw(iov.port);
+           if(check_io_range(iov.port,minor))
+               iov.val=inw(iov.port);
+               else ret = -EPERM;
            copy_to_user((char *)arg,&iov,sizeof(iov));
         break;
 
         case _IOC_NR(SVGALIB_HELPER_IOCGINL):
            copy_from_user(&iov,(char *)arg,sizeof(iov));
-           check_io_range(iov.port,minor);
-           iov.val=inl(iov.port);
+           if(check_io_range(iov.port,minor))
+               iov.val=inl(iov.port);
+               else ret = -EPERM;
            copy_to_user((char *)arg,&iov,sizeof(iov));
         break;
 
@@ -322,7 +327,7 @@
         default: 
             return -EINVAL;
     }
-    return 0;
+    return ret;
 }                      
 
 
@@ -514,8 +519,8 @@
     return 0; /* succeed */
 
     nomem_error:
-        for(i=0;i<MAX_NR_DEVICES;i++) 
-            if(sh_pci_devs[i])kfree(sh_pci_devs[i]);     
+    for(i=0;i<MAX_NR_DEVICES;i++) 
+        if(sh_pci_devs[i])kfree(sh_pci_devs[i]);     
     devfs_unregister_chrdev(SVGALIB_HELPER_MAJOR, "svgalib_helper");
     return result;
 }
@@ -538,3 +543,5 @@
 MODULE_LICENSE("GPL and additional rights");
 #endif
 
+MODULE_AUTHOR("Matan Ziv-Av <[EMAIL PROTECTED]>");
+MODULE_DESCRIPTION("Generic hardware access to vga cards");

Reply via email to