Hi,

 I've started preparing the attached patch backported to our version of
 the driver from the upstream workaround published in the bugzilla;
 unfortunately it fails with:
│ /usr/src/modules/fglrx/firegl_public.c:4006: warning: passing argument 1 o │
│   LD [M]  /usr/src/modules/fglrx/fglrx.o                                   │
│   Building modules, stage 2.                                               │
│   MODPOST 1 modules                                                        │
│ FATAL: modpost: GPL-incompatible module fglrx.ko uses GPL-only symbol 'par │
│ make[2]: *** [__modpost] Error 1                                           │

 I'll give a try to the new release.

   Cheers,
-- 
Loïc Minier <[EMAIL PROTECTED]>
--- fglrx-driver-8.31.5/debian/changelog
+++ fglrx-driver-8.31.5/debian/changelog
@@ -1,3 +1,13 @@
+fglrx-driver (8.31.5-1.1) experimental; urgency=low
+
+  * Non-maintainer upload.
+  * New patch, 14_2.6.20-i386-syscalls, to support 2.6.20 kernels on x86;
+    backported from
+    <http://whoopie.gmxhome.de/linux/patches/2.6.20/fglrx-8.34.8-for-2.6.20.patch>;
+    closes: #410111.
+
+ -- Loic Minier <[EMAIL PROTECTED]>  Tue, 27 Feb 2007 14:24:28 +0100
+
 fglrx-driver (8.31.5-1) experimental; urgency=low
 
   * New upstream version. (Closes: #399136, #399301)
--- fglrx-driver-8.31.5.orig/debian/patches/14_2.6.20-i386-syscalls.patch
+++ fglrx-driver-8.31.5/debian/patches/14_2.6.20-i386-syscalls.patch
@@ -0,0 +1,109 @@
+--- firegl_public.c.orig	2007-02-27 14:12:10.000000000 +0100
++++ firegl_public.c	2007-02-27 14:20:11.000000000 +0100
+@@ -187,6 +187,82 @@
+ int errno;
+ #endif // __ia64__
+ 
++#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,19)
++#if defined(__i386__)
++
++#define __syscall_return(type, res) \
++do { \
++	if ((unsigned long)(res) >= (unsigned long)(-MAX_ERRNO)) { \
++		errno = -(res); \
++		res = -1; \
++	} \
++	return (type) (res); \
++} while (0)
++
++#define _syscall2(type,name,type1,arg1,type2,arg2) \
++type name(type1 arg1,type2 arg2) \
++{ \
++long __res; \
++__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
++	: "=a" (__res) \
++	: "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)) \
++	: "memory"); \
++__syscall_return(type,__res); \
++}
++
++#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
++type name(type1 arg1,type2 arg2,type3 arg3) \
++{ \
++long __res; \
++__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
++	: "=a" (__res) \
++	: "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)), \
++		  "d" ((long)(arg3)) : "memory"); \
++__syscall_return(type,__res); \
++}
++
++#elif defined(__x86_64__)
++#define __syscall_clobber "r11","rcx","memory"
++
++#define __syscall_return(type, res) \
++do { \
++	if ((unsigned long)(res) >= (unsigned long)(-MAX_ERRNO)) { \
++		errno = -(res); \
++		res = -1; \
++	} \
++	return (type) (res); \
++} while (0)
++
++#define __syscall "syscall"
++
++#define _syscall2(type,name,type1,arg1,type2,arg2) \
++type name(type1 arg1,type2 arg2) \
++{ \
++long __res; \
++__asm__ volatile (__syscall \
++	: "=a" (__res) \
++	: "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)) : __syscall_clobber ); \
++__syscall_return(type,__res); \
++}
++
++#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
++type name(type1 arg1,type2 arg2,type3 arg3) \
++{ \
++long __res; \
++__asm__ volatile (__syscall \
++	: "=a" (__res) \
++	: "0" (__NR_##name),"D" ((long)(arg1)),"S" ((long)(arg2)), \
++		  "d" ((long)(arg3)) : __syscall_clobber); \
++__syscall_return(type,__res); \
++}
++
++#else
++
++#error "please fix the fglrx syscall mess"
++
++#endif	/* __i386__ */
++#endif	/* 2.6.19 */
++
+ // int mlock(const void *addr, size_t len);
+ _syscall2(int, mlock, const void *, addr, size_t, len )
+ // int munlock(const void *addr, size_t len);
+@@ -2514,11 +2590,23 @@
+ #else
+ static void ATI_API_CALL (*irq_handler_func)(int, void*, void*); /* function pointer variable */
+ 
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
+ static irqreturn_t ke_irq_handler_wrap(int irq, void *arg1, struct pt_regs *regs)
+ {
+     irq_handler_func(irq, arg1, regs);
+     return IRQ_HANDLED;
+ }
++#else
++static irqreturn_t ke_irq_handler_wrap(int irq, void *arg1)
++{
++    irq_handler_func(irq, arg1, get_irq_regs());
++    return IRQ_HANDLED;
++}
++#endif
++
++#ifndef SA_SHIRQ
++#define SA_SHIRQ IRQF_SHARED
++#endif
+ 
+ int ATI_API_CALL __ke_request_irq(unsigned int irq, 
+     void (*ATI_API_CALL handler)(int, void *, void *),

Reply via email to