parisc: Provide __ucmpdi2 to resolve undefined references in 32 bit builds. [Linux 3.9]

This Linux kernel change "parisc: Provide __ucmpdi2 to resolve undefined references in 32 bit builds" is included in the Linux 3.9 release. This change is authored by John David Anglin <dave.anglin [at] bell.net> on Sat Apr 20 19:41:06 2013 +0000. The commit for this change in Linux stable tree is ca0ad83 (patch).

parisc: Provide __ucmpdi2 to resolve undefined references in 32 bit builds.

The Debian experimental linux source package (3.8.5-1) build fails
with the following errors:
...
MODPOST 2016 modules
ERROR: "__ucmpdi2" [fs/btrfs/btrfs.ko] undefined!
ERROR: "__ucmpdi2" [drivers/md/dm-verity.ko] undefined!

The attached patch resolves this problem.  It is based on the s390
implementation of ucmpdi2.c.

Signed-off-by: John David Anglin <dave.anglin@bell.net>
Cc: "James E.J. Bottomley" <jejb@parisc-linux.org>
Signed-off-by: Helge Deller <deller@gmx.de>

There are 30 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 arch/parisc/kernel/parisc_ksyms.c |  2 ++
 arch/parisc/lib/Makefile          |  3 ++-
 arch/parisc/lib/ucmpdi2.c         | 25 +++++++++++++++++++++++++
 3 files changed, 29 insertions(+), 1 deletion(-)
 create mode 100644 arch/parisc/lib/ucmpdi2.c

diff --git a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c
index 6795dc6..568b2c6 100644
--- a/arch/parisc/kernel/parisc_ksyms.c
+++ b/arch/parisc/kernel/parisc_ksyms.c
@@ -120,11 +120,13 @@
 extern void __ashldi3(void);
 extern void __lshrdi3(void);
 extern void __muldi3(void);
+extern void __ucmpdi2(void);

 EXPORT_SYMBOL(__ashrdi3);
 EXPORT_SYMBOL(__ashldi3);
 EXPORT_SYMBOL(__lshrdi3);
 EXPORT_SYMBOL(__muldi3);
+EXPORT_SYMBOL(__ucmpdi2);

 asmlinkage void * __canonicalize_funcptr_for_compare(void *);
 EXPORT_SYMBOL(__canonicalize_funcptr_for_compare);
diff --git a/arch/parisc/lib/Makefile b/arch/parisc/lib/Makefile
index 5f2e690..5651536 100644
--- a/arch/parisc/lib/Makefile
+++ b/arch/parisc/lib/Makefile
@@ -2,6 +2,7 @@
 # Makefile for parisc-specific library files
 #

-lib-y  := lusercopy.o bitops.o checksum.o io.o memset.o fixup.o memcpy.o
+lib-y  := lusercopy.o bitops.o checksum.o io.o memset.o fixup.o memcpy.o 
+      ucmpdi2.o

 obj-y  := iomap.o
diff --git a/arch/parisc/lib/ucmpdi2.c b/arch/parisc/lib/ucmpdi2.c
new file mode 100644
index 0000000..149c016
--- /dev/null
+++ b/arch/parisc/lib/ucmpdi2.c
@@ -0,0 +1,25 @@
+#include <linux/module.h>
+
+union ull_union {
+   unsigned long long ull;
+   struct {
+       unsigned int high;
+       unsigned int low;
+   } ui;
+};
+
+int __ucmpdi2(unsigned long long a, unsigned long long b)
+{
+   union ull_union au = {.ull = a};
+   union ull_union bu = {.ull = b};
+
+   if (au.ui.high < bu.ui.high)
+       return 0;
+   else if (au.ui.high > bu.ui.high)
+       return 2;
+   if (au.ui.low < bu.ui.low)
+       return 0;
+   else if (au.ui.low > bu.ui.low)
+       return 2;
+   return 1;
+}

Leave a Reply

Your email address will not be published. Required fields are marked *