--- linux/arch/sparc/kernel/sparc_ksyms.c.jj    Tue Jan  4 19:12:12 2000
+++ linux/arch/sparc/kernel/sparc_ksyms.c       Fri Feb  4 15:11:48 2000
@@ -65,6 +65,7 @@ extern void bcopy (const char *, char *,
extern int __ashrdi3(int, int);
extern int __ashldi3(int, int);
extern int __lshrdi3(int, int);
+extern int __muldi3(int, int);

extern void dump_thread(struct pt_regs *, struct user *);

@@ -272,6 +273,7 @@ EXPORT_SYMBOL_NOVERS(memmove);
EXPORT_SYMBOL_NOVERS(__ashrdi3);
EXPORT_SYMBOL_NOVERS(__ashldi3);
EXPORT_SYMBOL_NOVERS(__lshrdi3);
+EXPORT_SYMBOL_NOVERS(__muldi3);

EXPORT_SYMBOL_DOT(rem);
EXPORT_SYMBOL_DOT(urem);
--- linux/arch/sparc/lib/muldi3.S.jj    Fri Feb  4 15:05:09 2000
+++ linux/arch/sparc/lib/muldi3.S       Fri Feb  4 15:04:21 2000
@@ -0,0 +1,64 @@
+/* $Id:$
+ * muldi3.S:   GCC emits these for certain drivers playing
+ *            with long longs.
+ *
+ * Copyright (C) 2000 Jakub Jelinek ([email protected])
+ */
+
+       .text
+       .align          4
+       .globl          __muldi3
+
+__muldi3:
+       save            %sp, -112, %sp
+       wr              %g0, %i1, %y
+       sra             %i3, 0x1f, %o5
+       and             %i1, %o5, %o5
+       andcc           %g0, 0, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, %i3, %g1
+       mulscc          %g1, 0, %g1
+       add             %g1, %o5, %l0
+       rd              %y, %o0
+       mov             %o0, %l1
+       mov             %i2, %o1
+       call            .umul
+        mov            %i1, %o0
+       mov             %o0, %l2
+       mov             %i0, %o0
+       call            .umul
+        mov            %i3, %o1
+       add             %l2, %o0, %l2
+       mov             %l1, %i1
+       ret
+        restore        %l0, %l2, %o0
--- linux/arch/sparc/lib/Makefile.jj    Tue Jan  4 19:12:13 2000
+++ linux/arch/sparc/lib/Makefile       Fri Feb  4 15:12:28 2000
@@ -6,7 +6,7 @@ OBJS  = mul.o rem.o sdiv.o udiv.o umul.o
        strlen.o checksum.o blockops.o memscan.o memcmp.o strncmp.o \
       strncpy_from_user.o divdi3.o udivdi3.o strlen_user.o \
       copy_user.o locks.o atomic.o bitops.o debuglocks.o lshrdi3.o \
-       ashldi3.o
+       ashldi3.o muldi3.o

ifdef CONFIG_SMP
OBJS += irqlock.o
@@ -62,6 +62,9 @@ endif

strlen.o: strlen.S
       $(CC) -D__ASSEMBLY__ -ansi -c -o strlen.o strlen.S
+
+muldi3.o: muldi3.S
+       $(CC) -D__ASSEMBLY__ -ansi -c -o muldi3.o muldi3.S

divdi3.o: divdi3.S
       $(CC) -D__ASSEMBLY__ -ansi -c -o divdi3.o divdi3.S