Re: V4L2: __ucmpdi2 undefined on ppc

From: David Woodhouse
Date: Sun Dec 17 2006 - 08:30:01 EST


On Thu, 2006-12-14 at 14:58 -0500, Kyle McMartin wrote:
> I posted a patch to Paul this week to fix this,

Hm, I didn't see it on linuxppc-dev.

> Since ppc32 can't do a 64bit comparison on its own it seems, gcc
> will generate a call to a helper function from libgcc. What other
> arches do is link libgcc.a into libs-y, and export the symbol
> they want from it.

You still get to 'accidentally' do 64-bit arithmetic in-kernel that way
though. Might be better just to provide __ucmpdi2, just as we have for
the other functions which are required from libgcc

It'd be better just to fix the compiler though -- which is in fact what
they've done: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25724
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21237

I've applied this as a temporary hack to the Fedora kernel until the
compiler is updated there...

--- linux-2.6.19.ppc/arch/powerpc/kernel/misc_32.S~ 2006-11-29 21:57:37.000000000 +0000
+++ linux-2.6.19.ppc/arch/powerpc/kernel/misc_32.S 2006-12-17 12:19:48.000000000 +0000
@@ -728,6 +728,27 @@ _GLOBAL(__lshrdi3)
or r4,r4,r7 # LSW |= t2
blr

+/*
+ * __ucmpdi2: 64-bit comparison
+ *
+ * R3/R4 has 64 bit value A
+ * R5/R6 has 64 bit value B
+ * result in R3: 0 for A < B
+ * 1 for A == B
+ * 2 for A > B
+ */
+_GLOBAL(__ucmpdi2)
+ cmplw r7,r3,r5 # compare high words
+ li r3,0
+ blt r7,2f # a < b ... return 0
+ bgt r7,1f # a > b ... return 2
+ cmplw r6,r4,r6 # compare low words
+ blt r6,2f # a < b ... return 0
+ li r3,1
+ ble r6,2f # a = b ... return 1
+1: li r3,2
+2: blr
+
_GLOBAL(abs)
srawi r4,r3,31
xor r3,r3,r4
--- linux-2.6.19.ppc/arch/powerpc/kernel/ppc_ksyms.c~ 2006-12-15 17:19:56.000000000 +0000
+++ linux-2.6.19.ppc/arch/powerpc/kernel/ppc_ksyms.c 2006-12-17 12:16:54.000000000 +0000
@@ -161,9 +161,11 @@ EXPORT_SYMBOL(to_tm);
long long __ashrdi3(long long, int);
long long __ashldi3(long long, int);
long long __lshrdi3(long long, int);
+int __ucmpdi2(uint64_t, uint64_t);
EXPORT_SYMBOL(__ashrdi3);
EXPORT_SYMBOL(__ashldi3);
EXPORT_SYMBOL(__lshrdi3);
+EXPORT_SYMBOL(__ucmpdi2);
#endif

EXPORT_SYMBOL(memcpy);

--
dwmw2

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/