Port-amiga archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Ariadne panics: potential bugfix enclosed



Hello,

if you're a victim of the Ariadne + 1.3 panic, please:

- apply the enclosed patch to /sys/arch/amiga/dev/if_le.c
- recompile your kernel
- test
- report if it works

Regards,
        -is


--- if_le.c-1.27        Sat Oct  4 14:03:05 1997
+++ if_le.c     Sat Mar  7 22:06:28 1998
@@ -463,20 +463,26 @@
        int i;
 
        if (len > 0 && isodd(boff)) {
+               /* adjust source pointer */
                b1 = (u_short *)(a1 + 1);
+               /* compute aligned destination pointer */
                b2 = (u_short *)(a2 + 1);
-               b2[-1] = (b2[-1] & 0xff00) | (b1[-1] & 0x00ff);
+               /* copy first unaligned byte to buf */
+               b2[-1] = (b2[-1] & 0xff00) | *a1;
                --len;
        } else {
+               /* destination is aligned or length is zero */
                b1 = (u_short *)a1;
                b2 = (u_short *)a2;
        }
 
+       /* copy full words with aligned destination */
        for (i = len >> 1; i > 0; i--)
                *b2++ = *b1++;
 
+       /* copy remaining byte */
        if (isodd(len))
-               *b2 = (*b2 & 0x00ff) | (*b1 & 0xff00);
+               *b2 = (*b2 & 0x00ff) | (*(u_char *)b1) << 8;
 }
 
 integrate void
@@ -492,20 +498,26 @@
        int i;
 
        if (len > 0 && isodd(boff)) {
-               b1 = (u_short *)(a1 + 1);
-               b2 = (u_short *)(a2 + 1);
-               b2[-1] = (b2[-1] & 0xff00) | (b1[-1] & 0x00ff);
+               /* compute aligned source pointer */
+               b1  = (u_short *)(a1 + 1);
+               /* adjust destination pointer (possibly unaligned) */
+               b2  = (u_short *)(a2 + 1);
+               /* copy first unaligned byte from buf */
+               *a2 = b1[-1];
                --len;
        } else {
+               /* source is aligned or length is zero */
                b1 = (u_short *)a1;
                b2 = (u_short *)a2;
        }
 
+       /* copy full words with aligned source */
        for (i = len >> 1; i > 0; i--)
                *b2++ = *b1++;
 
+       /* copy remaining byte */
        if (isodd(len))
-               *b2 = (*b2 & 0x00ff) | (*b1 & 0xff00);
+               *(u_char *)b2 = *b1 >> 8;
 }
 
 integrate void



Home | Main Index | Thread Index | Old Index