uninline check_signature()
Andrew Morton [Mon, 16 Jul 2007 06:41:38 +0000 (23:41 -0700)]
This is a rather bizarre thing to have inlined in io.h.  Stick it in lib/
instead.

While we're there, despaghetti it a bit, and fix its off-by-one behaviour when
passed a zero length.

Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

include/linux/io.h
lib/Makefile
lib/check_signature.c [new file with mode: 0644]

index 8423dd3..e3b2dda 100644 (file)
@@ -63,32 +63,7 @@ void __iomem * devm_ioremap(struct device *dev, unsigned long offset,
 void __iomem * devm_ioremap_nocache(struct device *dev, unsigned long offset,
                                    unsigned long size);
 void devm_iounmap(struct device *dev, void __iomem *addr);
-
-/**
- *     check_signature         -       find BIOS signatures
- *     @io_addr: mmio address to check
- *     @signature:  signature block
- *     @length: length of signature
- *
- *     Perform a signature comparison with the mmio address io_addr. This
- *     address should have been obtained by ioremap.
- *     Returns 1 on a match.
- */
-
-static inline int check_signature(const volatile void __iomem *io_addr,
-       const unsigned char *signature, int length)
-{
-       int retval = 0;
-       do {
-               if (readb(io_addr) != *signature)
-                       goto out;
-               io_addr++;
-               signature++;
-               length--;
-       } while (length);
-       retval = 1;
-out:
-       return retval;
-}
+int check_signature(const volatile void __iomem *io_addr,
+                       const unsigned char *signature, int length);
 
 #endif /* _LINUX_IO_H */
index d1b366b..d7a93ff 100644 (file)
@@ -13,7 +13,7 @@ lib-$(CONFIG_SMP) += cpumask.o
 lib-y  += kobject.o kref.o kobject_uevent.o klist.o
 
 obj-y += div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \
-        bust_spinlocks.o hexdump.o
+        bust_spinlocks.o hexdump.o check_signature.o
 
 ifeq ($(CONFIG_DEBUG_KOBJECT),y)
 CFLAGS_kobject.o += -DDEBUG
diff --git a/lib/check_signature.c b/lib/check_signature.c
new file mode 100644 (file)
index 0000000..fd6af19
--- /dev/null
@@ -0,0 +1,26 @@
+#include <linux/io.h>
+#include <linux/module.h>
+
+/**
+ *     check_signature         -       find BIOS signatures
+ *     @io_addr: mmio address to check
+ *     @signature:  signature block
+ *     @length: length of signature
+ *
+ *     Perform a signature comparison with the mmio address io_addr. This
+ *     address should have been obtained by ioremap.
+ *     Returns 1 on a match.
+ */
+
+int check_signature(const volatile void __iomem *io_addr,
+                       const unsigned char *signature, int length)
+{
+       while (length--) {
+               if (readb(io_addr) != *signature)
+                       return 0;
+               io_addr++;
+               signature++;
+       }
+       return 1;
+}
+EXPORT_SYMBOL(check_signature);