Experiences
Raphaël Doursenaud
mar. 19 octobre 2010

Here’s a patch allowing the blackmagic kernel module to

build against 2.6.36 linux kernel.

Signed-off-by: Raphaël Doursenaud 
---
diff -Nurp DeckLink-7.9rc7/blackmagic_core.c DeckLink-7.9rc7-2.6.36/blackmagic_core.c
--- DeckLink-7.9rc7/blackmagic_core.c   2010-10-19 12:08:30.153000030 +0200
+++ DeckLink-7.9rc7-2.6.36/blackmagic_core.c    2010-10-19 12:25:51.448000032 +0200
@@ -164,7 +164,12 @@ static irqreturn_t blackmagic_isr(int ir
 static int blackmagic_open(struct inode *inode, struct file *filp)
 {
    struct blackmagic_device *ddev;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
+   ddev = filp->private_data;
+#else
    ddev = blackmagic_find_device_by_minor(iminor(inode));
+#endif
+
    if (!ddev)
        return -ENODEV;
    
@@ -181,7 +186,12 @@ static int blackmagic_open(struct inode
 static int blackmagic_release(struct inode *inode, struct file *filp)
 {
    struct blackmagic_device *ddev;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
+   ddev = filp->private_data;
+#else
    ddev = blackmagic_find_device_by_minor(iminor(inode));
+#endif
+
    if (!ddev)
        return -ENODEV;
 
@@ -196,20 +206,33 @@ static int blackmagic_release(struct ino
    return 0;
 }
 
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
+static long
+blackmagic_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+#else
 static int
 blackmagic_ioctl(struct inode *inode, struct file *filp,
                unsigned int cmd, unsigned long arg)
+#endif
 {
    struct blackmagic_device *ddev;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
+   ddev = filp->private_data;
+#else
    ddev = blackmagic_find_device_by_minor(iminor(inode));
+#endif
    
    if (!ddev)
        return -ENODEV;
    
    if (!filp->private_data)
        return -ENODEV;
-   
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
+   return blackmagic_ioctl_private(filp->private_data, cmd, arg);
+#else
    return blackmagic_ioctl_private(ddev->driver, filp->private_data, cmd, arg);
+#endif
 }
 
 /*
@@ -226,7 +249,11 @@ struct file_operations blackmagic_fops =
    .owner   = THIS_MODULE,
    .open = blackmagic_open,
    .release = blackmagic_release,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
+   .unlocked_ioctl = blackmagic_ioctl,
+#else
    .ioctl = blackmagic_ioctl,
+#endif
    .poll = blackmagic_poll,
 };
 
diff -Nurp DeckLink-7.9rc7/blackmagic_iml.h DeckLink-7.9rc7-2.6.36/blackmagic_iml.h
--- DeckLink-7.9rc7/blackmagic_iml.h    2010-10-19 12:08:30.154000030 +0200
+++ DeckLink-7.9rc7-2.6.36/blackmagic_iml.h 2010-10-19 12:07:15.949000030 +0200
@@ -35,7 +35,11 @@ extern "C" {
 #endif
 
 /* Init and Startup */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
+extern int blackmagic_ioctl_private(void *, unsigned int, unsigned long);
+#else
 extern int blackmagic_ioctl_private(void *, void *, unsigned int, unsigned long);
+#endif
 extern void *dl_create_and_start_driver(void *, unsigned int *);
 extern void *dl_create_and_init_user_client(void *, void *);
 extern void dl_release_user_client(void *);
diff -Nurp DeckLink-7.9rc7/blackmagic_lib.c DeckLink-7.9rc7-2.6.36/blackmagic_lib.c
--- DeckLink-7.9rc7/blackmagic_lib.c    2010-10-19 12:08:30.154000030 +0200
+++ DeckLink-7.9rc7-2.6.36/blackmagic_lib.c 2010-10-19 12:07:15.949000030 +0200
@@ -725,7 +725,9 @@ dl_kernel_fpu_begin()
        #define FX_SAVE_INSTR   "fxsave %0; fnclex"
 #endif
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
+       asm volatile(FX_SAVE_INSTR : "=m" (thread->task->thread.fpu.state->fxsave));
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)
        asm volatile(FX_SAVE_INSTR : "=m" (thread->task->thread.xstate->fxsave));
 #else
        asm volatile(FX_SAVE_INSTR : "=m" (thread->task->thread.i387.fxsave));